carry-spot-checks.vue 25 KB

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