carry-spot-checks.vue 24 KB

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