carry-spot-checks.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. <template>
  2. <div>
  3. <HcDrawer v-model="isDrawer" to-id="carry-spot-checks-layout-target" ui="hc-carry-spot-checks-target" flex @close="onCarrySpotChecksDrawerClose">
  4. <div class="hc-carry-spot-checks-pdf">
  5. <div v-loading="pdfLoading" class="h-full">
  6. <HcPdf v-if="ishowPdf" :src="pdfUrl" @rendered="getPdfTime" />
  7. </div>
  8. <el-tooltip :disabled="!isBubble" content="展开/收起 右侧目录" placement="top">
  9. <div class="hc-csc-pdf-btn" @click="onCarryDataShow">
  10. <HcIcon v-show="isCarryDataShow" name="arrow-right-s" />
  11. <HcIcon v-show="!isCarryDataShow" name="arrow-left-s" />
  12. </div>
  13. </el-tooltip>
  14. </div>
  15. <div v-show="isCarryDataShow" class="hc-carry-spot-checks-data">
  16. <div class="hc-csc-switch">
  17. <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" :round="false" size="default" @change="tabTypeChange" />
  18. </div>
  19. <div class="hc-csc-info-box">
  20. <el-scrollbar>
  21. <div class="hc-info-text-item">
  22. <div class="title">案卷题名:</div>
  23. <div class="content">{{ fileInfo.name }}</div>
  24. </div>
  25. <div class="hc-info-text-item">
  26. <div class="title">
  27. <span>密</span>
  28. <span class="ml-7">级:</span>
  29. </div>
  30. <div class="content"> {{ fileInfo.secretLevelValue }}</div>
  31. </div>
  32. <div class="hc-info-text-item">
  33. <div class="title">保管期限:</div>
  34. <div class="content"> {{ fileInfo.storageTimeValue }}</div>
  35. </div>
  36. <div class="hc-info-text-item">
  37. <div class="title">卷内文件:</div>
  38. <div class="content"> {{ fileInfo.pageNumber }}</div>
  39. </div>
  40. <div class="hc-info-text-item">
  41. <div class="title">起止日期:</div>
  42. <div v-if="fileInfo?.endDate !== '' || fileInfo?.startDate !== null" class="content">
  43. {{ `${splitDate(fileInfo?.startDate)}~${splitDate(fileInfo?.endDate)}` }}
  44. </div>
  45. <div v-else class="content" />
  46. </div>
  47. <div class="hc-info-text-item">
  48. <div class="title">立卷单位:</div>
  49. <div class="content"> {{ fileInfo.unit }}</div>
  50. </div>
  51. </el-scrollbar>
  52. </div>
  53. <div :style="{ height: checkId ? '' : 'calc(100% - 363px)' }" class="hc-csc-data-box">
  54. <HcTable
  55. v-if="tabTypeKey === 'tab1'" :column="cscTableColumn1" :datas="cscTableData1"
  56. :index-style="{ width: 60 }" :is-index="false" :loading="cscTableLoading" is-new
  57. >
  58. <template #name="{ row }">
  59. <div :class="row.id === checkId ? 'bg-orange-400' : 'text-hover'" @click="changePdf(row)">{{ row?.fileName }}</div>
  60. </template>
  61. </HcTable>
  62. <HcTable v-if="tabTypeKey === 'tab2'" :column="cscTableColumn2" :datas="cscTableData2" :is-index="false" :loading="cscTableLoading" is-new>
  63. <template #name="{ row }">
  64. <div :class="row.id === 2 ? 'text-link' : 'text-hover'">{{ row?.name }}</div>
  65. </template>
  66. </HcTable>
  67. <HcTable
  68. v-if="tabTypeKey === 'tab3'" :column="cscTableColumn3" :datas="cscTableData3"
  69. :is-index="false" :loading="cscTableLoading" is-new
  70. >
  71. <template #name="{ row }">
  72. <div :class="row.id === 2 ? 'text-link' : 'text-hover'">{{ row?.name }}</div>
  73. </template>
  74. </HcTable>
  75. <HcTable
  76. v-if="tabTypeKey === 'tab4'" :column="cscTableColumn4" :datas="cscTableData4"
  77. :is-index="false" :loading="cscTableLoading" is-new
  78. >
  79. <template #name="{ row }">
  80. <div :class="row.id === 2 ? 'text-link' : 'text-hover'" class="hc-csc-associated-row">
  81. <el-tag effect="dark">{{ row?.tag }}</el-tag>
  82. <span class="ml-3">{{ row?.name }}</span>
  83. </div>
  84. </template>
  85. </HcTable>
  86. <MetaTable
  87. v-if="tabTypeKey === 'tab5'" :ishow-file="ishowFile"
  88. :loading="cscmetaTableLoading" :meta-data-table="cscmetaDataTabledata"
  89. />
  90. <HcTable
  91. v-if="tabTypeKey === 'tab6'" :column="cscTableColumn5" :datas="cscTableData5"
  92. :loading="cscTableLoading" is-new
  93. />
  94. <el-tooltip
  95. v-if="tabTypeKey === 'tab6' || tabTypeKey === 'tab5'" :disabled="!isBubble"
  96. content="使用弹窗查看数据"
  97. placement="top"
  98. >
  99. <div class="hc-table-info-btn" @click="cscTableDataModalShow">
  100. <HcIcon name="airplay" />
  101. </div>
  102. </el-tooltip>
  103. </div>
  104. <div v-if="checkId" class="hc-csc-action-box">
  105. <div class="header-box">
  106. <div class="title">抽检意见:</div>
  107. <!-- <div class="extra">
  108. <el-checkbox v-model="reform.type" class="size-xl">需要整改</el-checkbox>
  109. </div> -->
  110. </div>
  111. <div class="textarea-box">
  112. <div v-if="ishowAllopinion">
  113. <el-input
  114. v-model="reform.content" :autosize="{ minRows: 1, maxRows: 2 }" placeholder="请填写抽检意见" resize="none"
  115. type="textarea" @focus="contentClick"
  116. />
  117. </div>
  118. <div v-else>
  119. <el-input
  120. ref="saveTagInput" v-model="reform.myOpinion" :autosize="{ minRows: 1, maxRows: 2 }"
  121. placeholder="请填写抽检意见" resize="none" type="textarea"
  122. />
  123. </div>
  124. </div>
  125. <div class="btn-box">
  126. <el-button hc-btn style="height: 40px; padding: 0 15px;" type="warning" @click="onCarrySpotChecksDrawerClose">
  127. <HcIcon name="close" />
  128. <span>{{ closeText }}</span>
  129. </el-button>
  130. <el-button :loading="submitLoading" hc-btn type="primary" style="height: 40px; padding: 0 15px;" @click="submitOpinion">
  131. <HcIcon name="check" />
  132. <span>{{ checkText }}</span>
  133. </el-button>
  134. </div>
  135. </div>
  136. <div v-if="checkId.length == 0" class="btn-box" style="text-align: center;">
  137. <el-button hc-btn style="height: 40px; padding: 0 15px;" type="warning" @click="onCarrySpotChecksDrawerClose">
  138. <HcIcon name="close" />
  139. <span>取消查阅</span>
  140. </el-button>
  141. </div>
  142. </div>
  143. </HcDrawer>
  144. <!-- 使用弹窗查看数据 -->
  145. <hc-new-dialog
  146. v-model="cscTableDataModal" :footer="false" :title="cscTableDataTitle" is-table widths="1080px"
  147. @close="cscTableDataModalClose"
  148. >
  149. <MetaTable
  150. v-if="tabTypeKey === 'tab5'" :ishow-file="ishowFile"
  151. :loading="cscmetaTableLoading" :meta-data-table="cscmetaDataTabledata"
  152. />
  153. <HcTable
  154. v-if="tabTypeKey === 'tab6'" :column="cscTableColumn51" :datas="cscTableData5"
  155. :index-style="{ width: 60 }" :loading="cscTableLoading" is-new
  156. />
  157. </hc-new-dialog>
  158. </div>
  159. </template>
  160. <script setup>
  161. import { nextTick, onMounted, ref, watch } from 'vue'
  162. import { useAppStore } from '~src/store'
  163. import MetaTable from './meta-table.vue'
  164. import archiveQueryApi from '~api/using/query.js'
  165. import { getArrValue, getObjValue, getRandom } from 'js-fast-way'
  166. import tuningApi from '~api/archiveConfig/tuning.js'
  167. import initialgApi from '~api/initial/initial'
  168. import { useRouter } from 'vue-router'
  169. //参数
  170. const props = defineProps({
  171. projectId: {
  172. type: [String, Number],
  173. default: '',
  174. },
  175. contractId: {
  176. type: [String, Number],
  177. default: '',
  178. },
  179. show: {
  180. type: Boolean,
  181. default: false,
  182. },
  183. closeText: {
  184. type: [String, Number],
  185. default: '取消查阅',
  186. },
  187. checkText: {
  188. type: [String, Number],
  189. default: '保存抽检意见',
  190. },
  191. fileId: {
  192. type: [String, Number],
  193. default: '', //案卷ID
  194. },
  195. fileInfo: {
  196. type: Object,
  197. default: () => ({}),
  198. },
  199. isOpinion: {
  200. type: Boolean,
  201. default: false,
  202. },
  203. currentId: {
  204. type: [String, Number],
  205. default: '',
  206. },
  207. })
  208. //事件
  209. const emit = defineEmits(['close', 'check'])
  210. const useAppState = useAppStore()
  211. //变量
  212. const projectId = ref(props.projectId)
  213. const contractId = ref(props.contractId)
  214. const isOpinion = ref(props.isOpinion)
  215. const isBubble = ref(useAppState.getBubble)
  216. const isDrawer = ref(props.show)
  217. const fileId = ref(props.fileId)//案卷ID
  218. const fileInfo = ref(props.fileInfo)//案卷ID
  219. const userInfo = ref(useAppState.getUserInfo)
  220. const currentId = ref(props.currentId)
  221. const router = useRouter()
  222. //监听
  223. watch(() => [
  224. props.show,
  225. useAppState.getBubble,
  226. props.fileId,
  227. props.fileInfo,
  228. props.projectId,
  229. props.isOpinion,
  230. props.currentId,
  231. ], ([show, bubble, FileId, FileInfo, ProjectId, isO, curId]) => {
  232. isDrawer.value = show
  233. isBubble.value = bubble
  234. fileId.value = FileId
  235. fileInfo.value = FileInfo
  236. projectId.value = ProjectId
  237. isOpinion.value = isO
  238. currentId.value = curId
  239. if (fileId.value && isDrawer.value) {
  240. getArchiveFileListData()
  241. }
  242. if (isO) {
  243. // checkId.value = fileInfo.value.fileId || ''
  244. checkId.value = fileInfo.value.id || ''
  245. ishowAllopinion.value = true
  246. getopiniondata()
  247. } else {
  248. checkId.value = ''
  249. }
  250. })
  251. onMounted(() => {
  252. console.log(fileId.value, 'fileId.value')
  253. })
  254. //类型tab数据和相关处理
  255. const tabTypeKey = ref('tab1')
  256. const tabTypeTab = ref([
  257. { key: 'tab1', name: '卷内文件' },
  258. { key: 'tab2', name: '竣工资料' },
  259. { key: 'tab3', name: '计量资料' },
  260. { key: 'tab4', name: '关联资料' },
  261. { key: 'tab5', name: '元数据' },
  262. { key: 'tab6', name: '验签包' },
  263. ])
  264. const tabTypeChange = ({ key }) => {
  265. tabTypeKey.value = key
  266. }
  267. const cscTableLoading = ref(false)
  268. //卷内目录
  269. const cscTableColumn1 = [
  270. { key: 'name', name: '卷内文件题名', align: 'center' },
  271. ]
  272. const cscTableData1 = ref([])
  273. //获取卷内文件数据
  274. const getArchiveFileListData = async () => {
  275. cscTableLoading.value = true
  276. const { error, code, msg, data } = await archiveQueryApi.getArchiveFileList({
  277. id: fileId.value, //案卷id
  278. })
  279. cscTableLoading.value = false
  280. //处理返回数据
  281. if (!error && code === 200) {
  282. // fileInfo.value = data
  283. fileInfo.value.pageNumber = data.pageNumber
  284. fileInfo.value.storageTimeValue = data.storageTimeValue
  285. fileInfo.value.secretLevelValue = data.secretLevelValue
  286. fileInfo.value.endDate = data.endDate
  287. fileInfo.value.startDate = data.startDate
  288. fileInfo.value.name = data.name
  289. fileInfo.value.unit = data.unit
  290. cscTableData1.value = getArrValue(data['approvalFileList'])
  291. if (cscTableData1.value.length > 0) {
  292. checkmetaFileId.value = cscTableData1.value[0].id
  293. // pdfUrl.value = cscTableData1.value[0].pdfFileUrl
  294. let rawUrl = cscTableData1.value[0].pdfFileUrl
  295. pdfUrl.value = rawUrl
  296. checkId.value = cscTableData1.value[0].id
  297. getmetaInfo()
  298. }
  299. } else {
  300. cscTableData1.value = []
  301. pdfUrl.value = ''
  302. checkId.value = ''
  303. }
  304. }
  305. const ishowFile = ref(false)
  306. const pdfLoading = ref(false)
  307. const pdfUrl = ref('')
  308. const ishowPdf = ref(true)
  309. const checkId = ref('')
  310. const checkmetaFileId = ref('')
  311. const ishowAllopinion = ref(false)
  312. const saveTagInput = ref(null)
  313. const contentClick = () => {
  314. console.log(11111)
  315. ishowAllopinion.value = false
  316. nextTick(() => {
  317. saveTagInput.value?.focus()
  318. })
  319. }
  320. const changePdf = (row) => {
  321. console.log(row, 'row')
  322. ishowFile.value = true
  323. pdfLoading.value = false
  324. pdfShowTime.value = 0
  325. ishowPdf.value = false
  326. setTimeout(() => {
  327. ishowPdf.value = true
  328. }, 100)
  329. // pdfUrl.value = row['pdfFileUrl'] || ''
  330. let rawUrl = row['pdfFileUrl'] || ''
  331. pdfUrl.value = rawUrl
  332. checkId.value = row.id
  333. checkmetaFileId.value = row.id
  334. getmetaInfo()
  335. ishowAllopinion.value = true
  336. getopiniondata()
  337. }
  338. const pdfShowTime = ref(0)
  339. const getPdfTime = (val)=>{
  340. pdfShowTime.value = val
  341. }
  342. const pdfTimer = ref(null)
  343. // 方案1:监听路由离开(最可靠)
  344. router.beforeEach((to, from, next) => {
  345. // 判断是否从专家页面离开
  346. if (from.path === '/transfer/leader-sampling' && pdfTimer.value) {
  347. clearTimeout(pdfTimer.value)
  348. pdfTimer.value = null
  349. }
  350. next()
  351. })
  352. watch([pdfUrl, isDrawer], ([newPdfUrl, newShouldCarryOutSpotChecks]) => {
  353. // 清除之前的定时器
  354. if (pdfTimer.value) {
  355. clearTimeout(pdfTimer.value)
  356. pdfTimer.value = null
  357. }
  358. if (newPdfUrl && newPdfUrl.length > 0 && newShouldCarryOutSpotChecks) {
  359. // 设置新的定时器并保存ID
  360. pdfTimer.value = setTimeout(() => {
  361. if (pdfUrl.value === newPdfUrl && newShouldCarryOutSpotChecks.value) {
  362. serReviewFile()
  363. }
  364. }, pdfShowTime.value ? pdfShowTime.value + 30000 : 30000)
  365. }
  366. }, { deep: true })
  367. //设置为已查阅
  368. const serReviewFile = async () => {
  369. const { error, code, data, msg } = await initialgApi.updateInspectStatus({
  370. archiveId: fileId.value,
  371. projectId: projectId.value,
  372. conclusionId: currentId.value,
  373. })
  374. if (!error && code === 200) {
  375. window.$message.success(data)
  376. } else {
  377. window.$message.error(msg)
  378. }
  379. }
  380. const opid = ref('')
  381. //获取抽检意见
  382. const getopiniondata = async () => {
  383. const { error, code, data, msg } = await initialgApi.getArchiveFileOpinion({
  384. fileId: checkId.value,
  385. projectId: projectId.value,
  386. conclusionId: currentId.value,
  387. })
  388. if (!error && code === 200) {
  389. console.log(data, 'data')
  390. let opiniondata = getObjValue(data)
  391. reform.value.content = opiniondata?.allOpinion
  392. // reform.value.type = opiniondata?.allOpinion?.length > 0 ? true : false
  393. reform.value.myOpinion = opiniondata?.opinion
  394. opid.value = opiniondata?.id
  395. }
  396. }
  397. //获取元数据信息
  398. //获取元数据
  399. const cscmetaTableLoading = ref(false)
  400. const cscmetaDataTabledata = ref([])
  401. const getmetaInfo = async (fileId) => {
  402. cscmetaTableLoading.value = true
  403. const { error, code, data } = await tuningApi.getMetadataFileByid({
  404. fileId: checkmetaFileId.value,
  405. })
  406. cscmetaTableLoading.value = false
  407. if (!error && code === 200) {
  408. cscmetaDataTabledata.value = getArrValue(data)
  409. } else {
  410. cscmetaDataTabledata.value = []
  411. }
  412. }
  413. //竣工资料
  414. const cscTableColumn2 = [
  415. { key: 'name', name: '竣工图资料', align: 'center' },
  416. ]
  417. const cscTableData2 = ref([
  418. ])
  419. //计量资料
  420. const cscTableColumn3 = [
  421. { key: 'name', name: '计量资料', align: 'center' },
  422. ]
  423. const cscTableData3 = ref([
  424. ])
  425. //计量资料
  426. const cscTableColumn4 = [
  427. { key: 'name', name: '关联文件', align: 'center' },
  428. ]
  429. const cscTableData4 = ref([
  430. ])
  431. //验签包
  432. const cscTableColumn5 = [
  433. { key: 'user', name: '签名者' },
  434. { key: 'time', name: '签名时间' },
  435. { key: 'val', name: '摘要' },
  436. ]
  437. const cscTableColumn51 = [
  438. { key: 'user', name: '签名者', width: 300 },
  439. { key: 'time', name: '签名时间', width: 200 },
  440. { key: 'val', name: '摘要' },
  441. ]
  442. const cscTableData5 = ref([
  443. ])
  444. //抽检意见
  445. const reform = ref({
  446. // type: false,
  447. content: '',
  448. })
  449. //显示右侧目录
  450. const isCarryDataShow = ref(true)
  451. const onCarryDataShow = () => {
  452. isCarryDataShow.value = !isCarryDataShow.value
  453. }
  454. //使用弹窗查看数据
  455. const cscTableDataModal = ref(false)
  456. const cscTableDataTitle = ref('')
  457. //显示弹窗
  458. const cscTableDataModalShow = () => {
  459. const key = tabTypeKey.value
  460. if (key === 'tab5') {
  461. cscTableDataTitle.value = '元数据'
  462. } else if (key === 'tab6') {
  463. cscTableDataTitle.value = '验签包'
  464. }
  465. cscTableDataModal.value = true
  466. }
  467. //关闭弹窗
  468. const cscTableDataModalClose = () => {
  469. cscTableDataModal.value = false
  470. }
  471. //关闭抽查
  472. const onCarrySpotChecksDrawerClose = () => {
  473. if (pdfTimer.value) {
  474. clearTimeout(pdfTimer.value)
  475. pdfTimer.value = null
  476. }
  477. isDrawer.value = false
  478. ishowFile.value = false
  479. checkmetaFileId.value = ''
  480. checkId.value = ''
  481. pdfUrl.value = ''
  482. pdfShowTime.value = 0
  483. cscTableData1.value = []
  484. emit('close', false)
  485. }
  486. const checkClick = () => {
  487. emit('check')
  488. }
  489. const submitLoading = ref(false)
  490. const submitOpinion = async () => {
  491. submitLoading.value = true
  492. const { error, code, data, msg } = await initialgApi.saveInspect({
  493. fileId: checkId.value,
  494. archiveId: fileId.value,
  495. // opinion:reform.value.content,
  496. opinion: reform.value.myOpinion,
  497. projectId: projectId.value,
  498. userId: userInfo.value.user_id,
  499. archiveName: fileInfo.value.name,
  500. id: opid.value || null,
  501. conclusionId: currentId.value,
  502. })
  503. submitLoading.value = false
  504. if (!error && code === 200) {
  505. window.$message.success(msg)
  506. serReviewFile()
  507. } else {
  508. window.$message?.error(msg || '操作失败')
  509. }
  510. // addOpinion
  511. }
  512. //截取日期
  513. const splitDate = (val) => {
  514. if (val) {
  515. return val?.substring(0, 10)
  516. } else {
  517. return ''
  518. }
  519. }
  520. //查阅案卷pdf
  521. const viewPdf = async (id) => {
  522. window.$message?.info('预览案卷需要合并pdf,需要一点时间')
  523. pdfLoading.value = true
  524. const { error, code, data, msg } = await tuningApi.printArchive({
  525. id: id,
  526. })
  527. pdfLoading.value = false
  528. if (!error && code === 200) {
  529. if (data) {
  530. return data
  531. } else {
  532. window.$message?.warning('文件不存在')
  533. }
  534. }
  535. }
  536. </script>
  537. <style lang="scss" scoped>
  538. .hc-carry-spot-checks-pdf {
  539. position: relative;
  540. flex: 1 1 auto;
  541. height: 100%;
  542. transition: 0.2s;
  543. .hc-csc-pdf-btn {
  544. position: absolute;
  545. right: 0;
  546. top: 50%;
  547. color: white;
  548. font-size: 25px;
  549. z-index: 111;
  550. cursor: pointer;
  551. width: 36px;
  552. height: 40px;
  553. display: flex;
  554. padding-left: 6px;
  555. align-items: center;
  556. justify-content: center;
  557. border-radius: 150px 0 0 150px;
  558. background: linear-gradient(to right, var(--el-color-primary-light-5), var(--el-color-primary), var(--el-color-primary-dark-2));
  559. box-shadow: -2px 0 10px 0 rgba(32, 37, 50, 0.03), 0 10px 21px 20px rgba(32, 37, 50, 0.03);
  560. background-size: 200%;
  561. transition: background-position 0.5s;
  562. &:hover {
  563. background-position: 100% 0;
  564. }
  565. }
  566. }
  567. .hc-carry-spot-checks-data {
  568. position: relative;
  569. height: 100%;
  570. width: 480px;
  571. padding-left: 14px;
  572. border-left: 1px solid #e9e9e9;
  573. transition: 0.2s;
  574. .hc-csc-switch {
  575. position: relative;
  576. margin-bottom: 10px;
  577. }
  578. .hc-csc-info-box {
  579. position: relative;
  580. background: #E7EEF4;
  581. border-radius: 10px;
  582. padding: 12px;
  583. height: 224px;
  584. margin-bottom: 10px;
  585. .hc-info-text-item {
  586. position: relative;
  587. font-size: 14px;
  588. display: flex;
  589. align-items: flex-start;
  590. .title {
  591. font-weight: bold;
  592. }
  593. .content {
  594. flex: 1;
  595. position: relative;
  596. color: #101010;
  597. }
  598. }
  599. .hc-info-text-item + .hc-info-text-item {
  600. margin-top: 8px;
  601. }
  602. }
  603. .hc-csc-data-box {
  604. position: relative;
  605. background: #E7EEF4;
  606. border-radius: 10px;
  607. padding: 12px;
  608. height: calc(100% - 420px);
  609. margin-bottom: 16px;
  610. .hc-csc-associated-row {
  611. position: relative;
  612. text-align: left;
  613. display: flex;
  614. align-items: center;
  615. }
  616. .hc-table-info-btn {
  617. position: absolute;
  618. right: -5px;
  619. top: -12px;
  620. color: white;
  621. font-size: 20px;
  622. z-index: 111;
  623. cursor: pointer;
  624. border-radius: 50px;
  625. width: 34px;
  626. height: 34px;
  627. display: flex;
  628. align-items: center;
  629. justify-content: center;
  630. background: linear-gradient(to right, var(--el-color-primary-light-5), var(--el-color-primary), var(--el-color-primary-dark-2));
  631. box-shadow: -2px 0 10px 0 rgba(32, 37, 50, 0.03), 0 10px 21px 20px rgba(32, 37, 50, 0.03);
  632. background-size: 200%;
  633. transition: background-position 0.5s;
  634. &:hover {
  635. background-position: 100% 0;
  636. }
  637. }
  638. }
  639. .hc-csc-action-box {
  640. position: relative;
  641. background: white;
  642. border-radius: 10px;
  643. padding: 12px;
  644. // height: 240px;
  645. .header-box {
  646. position: relative;
  647. display: flex;
  648. align-items: center;
  649. .title {
  650. flex: 1;
  651. color: #9A9A9A;
  652. font-size: 15px;
  653. }
  654. }
  655. .textarea-box {
  656. margin-top: 12px;
  657. }
  658. .btn-box {
  659. position: relative;
  660. margin-top: 10px;
  661. text-align: center;
  662. }
  663. }
  664. }
  665. </style>
  666. <style lang="scss">
  667. .hc-carry-spot-checks-target.el-overlay {
  668. position: absolute;
  669. margin: -24px;
  670. height: revert;
  671. background-color: transparent;
  672. .hc-drawer-box.el-drawer {
  673. --el-drawer-bg-color: transparent;
  674. .el-drawer__body {
  675. padding: 24px;
  676. overflow: hidden;
  677. .el-card__body {
  678. padding: 10px;
  679. }
  680. .hc-card-main-box {
  681. display: flex;
  682. }
  683. }
  684. }
  685. }
  686. .hc-csc-action-box .btn-box {
  687. .el-button + .el-button {
  688. margin-left: 50px;
  689. }
  690. }
  691. html.dark {
  692. .hc-carry-spot-checks-pdf {
  693. position: relative;
  694. flex: 1 1 auto;
  695. height: 100%;
  696. transition: 0.2s;
  697. .hc-csc-pdf-btn {
  698. position: absolute;
  699. right: 0;
  700. top: 50%;
  701. color: white;
  702. font-size: 25px;
  703. z-index: 111;
  704. cursor: pointer;
  705. width: 36px;
  706. height: 40px;
  707. display: flex;
  708. padding-left: 6px;
  709. align-items: center;
  710. justify-content: center;
  711. border-radius: 150px 0 0 150px;
  712. background: linear-gradient(to right, var(--el-color-primary-light-5), var(--el-color-primary), var(--el-color-primary-dark-2));
  713. box-shadow: -2px 0 10px 0 rgba(32,37,50,0.03), 0 10px 21px 20px rgba(32,37,50,0.03);
  714. background-size: 200%;
  715. transition: background-position 0.5s;
  716. &:hover {
  717. background-position: 100% 0;
  718. }
  719. }
  720. }
  721. .hc-carry-spot-checks-data {
  722. position: relative;
  723. height: 100%;
  724. width: 480px;
  725. padding-left: 14px;
  726. border-left: 1px solid #e9e9e9;
  727. transition: 0.2s;
  728. .hc-csc-switch {
  729. position: relative;
  730. margin-bottom: 10px;
  731. }
  732. .hc-csc-info-box {
  733. position: relative;
  734. // background: #E7EEF4;
  735. border: 1px solid var(--el-color-primary);
  736. color: white;
  737. background: transparent;
  738. border-radius: 10px;
  739. padding: 12px;
  740. height: 224px;
  741. margin-bottom: 20px;
  742. .hc-info-text-item {
  743. position: relative;
  744. font-size: 14px;
  745. display: flex;
  746. align-items: flex-start;
  747. .title {
  748. font-weight: bold;
  749. }
  750. .content {
  751. flex: 1;
  752. position: relative;
  753. color: white;
  754. }
  755. }
  756. .hc-info-text-item + .hc-info-text-item {
  757. margin-top: 8px;
  758. }
  759. }
  760. .hc-csc-data-box {
  761. position: relative;
  762. // background: #E7EEF4;
  763. background: transparent;
  764. border-radius: 10px;
  765. padding: 12px;
  766. height: calc(100% - 420px);
  767. margin-bottom: 16px;
  768. .hc-csc-associated-row {
  769. position: relative;
  770. text-align: left;
  771. display: flex;
  772. align-items: center;
  773. }
  774. .hc-table-info-btn {
  775. position: absolute;
  776. right: -5px;
  777. top: -12px;
  778. color: white;
  779. font-size: 20px;
  780. z-index: 111;
  781. cursor: pointer;
  782. border-radius: 50px;
  783. width: 34px;
  784. height: 34px;
  785. display: flex;
  786. align-items: center;
  787. justify-content: center;
  788. background: linear-gradient(to right, var(--el-color-primary-light-5), var(--el-color-primary), var(--el-color-primary-dark-2));
  789. box-shadow: -2px 0 10px 0 rgba(32,37,50,0.03), 0 10px 21px 20px rgba(32,37,50,0.03);
  790. background-size: 200%;
  791. transition: background-position 0.5s;
  792. &:hover {
  793. background-position: 100% 0;
  794. }
  795. }
  796. }
  797. .hc-csc-action-box {
  798. position: relative;
  799. background: transparent;
  800. border-radius: 10px;
  801. padding: 12px;
  802. // height: 240px;
  803. .header-box {
  804. position: relative;
  805. display: flex;
  806. align-items: center;
  807. .title {
  808. flex: 1;
  809. color: #9A9A9A;
  810. font-size: 15px;
  811. }
  812. }
  813. .textarea-box {
  814. margin-top: 12px;
  815. }
  816. .btn-box {
  817. position: relative;
  818. margin-top: 10px;
  819. text-align: center;
  820. }
  821. }
  822. }
  823. }
  824. </style>