table-form.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. <template>
  2. <div class="hc-table-form-content">
  3. <div class="hc-content-box">
  4. <div class="hc-table-forem-box">
  5. <el-scrollbar v-if="excelIdVal && isTableForm">
  6. <div class="hc-excel-table-form-view" :id="`table-form-${excelIdVal}`"></div>
  7. </el-scrollbar>
  8. <HcStatus :desc="statusDesc" v-else/>
  9. </div>
  10. <div class="hc-fixed-page" v-if="formLogDataList.length > 1">
  11. <el-scrollbar>
  12. <div class="hc-fixed-page-list-box">
  13. <template v-for="(item,index) in formLogDataList">
  14. <div class="fixed-page-item" :class="index === formLogIndex ? 'primary' : ''" @click="getBussDataInfo(index)">
  15. <div class="name-box">
  16. <HcIcon name="sticky-note"/>
  17. <span class="page">第{{index + 1}}页</span>
  18. </div>
  19. <div class="close-box" @click.stop="closeBussDataInfo(index)">
  20. <HcIcon name="close"/>
  21. </div>
  22. </div>
  23. </template>
  24. </div>
  25. </el-scrollbar>
  26. </div>
  27. <div class="hc-right-pian-box hc-flex-column">
  28. <DateCalendar :dateData="dateData" @choice-date="dateCalendarChoice"/>
  29. <el-alert title="蓝色代表当天已填写过日志" type="warning" show-icon/>
  30. <div class="my-4" v-if="menuItem?.nodeType === 7 || menuItem?.nodeType === 11">
  31. <el-button type="primary" hc-btn @click="showProcessModal">
  32. <HcIcon name="add-circle"/>
  33. <span>关联工序</span>
  34. </el-button>
  35. </div>
  36. <div class="hc-process-box" v-if="menuItem?.nodeType === 7 || menuItem?.nodeType === 11">
  37. <el-scrollbar>
  38. <div class="process-item-box" v-for="(item,index) in processDataList">
  39. <div class="process-item">{{item.path}}</div>
  40. <HcIcon name="close-circle" fill class="process-icon" @click="deleProcess(index)"/>
  41. </div>
  42. </el-scrollbar>
  43. </div>
  44. </div>
  45. </div>
  46. <div class="hc-footer-box">
  47. <HcTooltip keys="ledger_query_save_form">
  48. <el-button type="primary" hc-btn :disabled="!isTableForm || taskStatus === 3 || taskStatus === 4" :loading="tableFormSaveLoading" @click="tableFormSaveClick">
  49. <HcIcon name="save"/>
  50. <span>保存</span>
  51. </el-button>
  52. </HcTooltip>
  53. <HcTooltip keys="ledger_query_report_form">
  54. <el-button hc-btn :disabled="!isTableForm || taskStatus === 3 || taskStatus === 4" @click="reportModalClick">
  55. <HcIcon name="send-plane-2"/>
  56. <span>上报</span>
  57. </el-button>
  58. </HcTooltip>
  59. <HcTooltip keys="ledger_query_preview_form">
  60. <el-button hc-btn :disabled="!isTableForm" :loading="previewLoading" @click="previewBussPdf">
  61. <HcIcon name="eye"/>
  62. <span>预览</span>
  63. </el-button>
  64. </HcTooltip>
  65. <HcTooltip keys="ledger_query_copy_form">
  66. <el-button hc-btn :disabled="!isTableForm || taskStatus === 3 || taskStatus === 4" @click="copyTableFormClick">
  67. <HcIcon name="file-copy-2"/>
  68. <span>复制当前表格及内容</span>
  69. </el-button>
  70. </HcTooltip>
  71. <HcTooltip keys="ledger_query_time_form">
  72. <el-button hc-btn :disabled="!isTableForm || taskStatus === 3 || taskStatus === 4" @click="copyTimeLogModal">
  73. <HcIcon name="file-copy-2"/>
  74. <span>复制任意时间</span>
  75. </el-button>
  76. </HcTooltip>
  77. <HcTooltip keys="ledger_query_add_form">
  78. <el-button hc-btn :disabled="!isTableForm || taskStatus === 3 || taskStatus === 4" @click="addTableFormClick">
  79. <HcIcon name="add-circle"/>
  80. <span>新增表格</span>
  81. </el-button>
  82. </HcTooltip>
  83. <HcTooltip keys="ledger_query_abolish_form">
  84. <el-button hc-btn :disabled="!isTableForm || taskStatus === 1 || taskStatus === 2" @click="abolishTableFormClick">
  85. <HcIcon name="delete-bin-3"/>
  86. <span>废除</span>
  87. </el-button>
  88. </HcTooltip>
  89. </div>
  90. <!--关联工序-->
  91. <HcDialog :show="processNodeModal" title="选择关联工序" widths="62rem" @close="processNodeModal = false" @save="processNodeClick">
  92. <div class="node-many-tree">
  93. <el-tree :load="ElTreeLoadNode" lazy class="my-tree" :props="processTreeProps" show-checkbox node-key="primaryKeyId"
  94. :default-checked-keys="defaultChecked" :default-expanded-keys="defaultExpanded" check-strictly ref="processElTree"/>
  95. </div>
  96. </HcDialog>
  97. <!--复制任意时间-->
  98. <HcDialog :show="copyTimeModal" title="复制任意时间" widths="360px" bg-color="#f1f5f8" saveText="复制" @close="copyTimeModal = false" :loading="copyTimeLoading" @save="copyTimeSaveClick">
  99. <el-alert title="等接口中..." type="warning" show-icon/>
  100. </HcDialog>
  101. <!--批量上报审批-->
  102. <HcReportModal title="日志填报上报" url="contractLog/startTaskTheLog" :show="showReportModal" :projectId="projectId" :contractId="contractId"
  103. :taskName="reportTaskName" :addition="reportAddition" @hide="showReportModal = false" @finish="showReportFinish"/>
  104. </div>
  105. </template>
  106. <script setup>
  107. import {ref, watch, nextTick} from "vue";
  108. import queryApi from '~api/ledger/query';
  109. import wbsQueryApi from '~api/data-fill/query';
  110. import HTableForm from "~src/plugins/HTableForm"
  111. import DateCalendar from "./dateCalendar/index.vue"
  112. import {getObjValue, getObjNullValue, isString, getArrValue, isValueNull} from "vue-utils-plus"
  113. //参数
  114. const props = defineProps({
  115. projectId: {
  116. type: [String,Number],
  117. default: ''
  118. },
  119. contractId: {
  120. type: [String,Number],
  121. default: ''
  122. },
  123. items: {
  124. type: Object,
  125. default: () => ({})
  126. },
  127. userName: {
  128. type: [String,Number],
  129. default: ''
  130. }
  131. })
  132. //变量
  133. const projectId = ref(props.projectId);
  134. const contractId = ref(props.contractId);
  135. const menuItem = ref(props.items);
  136. const userName = ref(props.userName);
  137. const excelIdVal = ref('');
  138. const statusDesc = ref('');
  139. //监听
  140. watch(() => [
  141. props.projectId,
  142. props.contractId,
  143. props.items,
  144. props.userName,
  145. ], ([pid, cid, item, name]) => {
  146. projectId.value = pid
  147. contractId.value = cid
  148. menuItem.value = item
  149. userName.value = name
  150. getQueryData()
  151. })
  152. //渲染完成
  153. nextTick(() => {
  154. getQueryData()
  155. })
  156. //获取相关数据
  157. const getQueryData = () => {
  158. const {excelId} = menuItem.value
  159. excelIdVal.value = excelId > 0 ? excelId + '' : ''
  160. const date = recordDate.value, time = recordTime.value
  161. if (date && time) {
  162. getExcelBusinessData(date,time)
  163. }
  164. }
  165. //日期日历回调
  166. const recordTime = ref('')
  167. const recordDate = ref('')
  168. const dateCalendarChoice = ({date, choices}) => {
  169. recordTime.value = choices
  170. recordDate.value = date
  171. getExcelBusinessData(date,choices)
  172. }
  173. //获取数据
  174. const getExcelBusinessData = (date,choices) => {
  175. const {primaryKeyId} = menuItem.value
  176. getExcelHtml(excelIdVal.value)
  177. getTheLogBusinessData(excelIdVal.value, choices)
  178. getSubmitLogDateList(date,primaryKeyId)
  179. checkTheLogTaskStatus(choices,primaryKeyId)
  180. }
  181. //获取模板标签数据
  182. const isTableForm = ref(false)
  183. const excelHtmlData = ref('')
  184. const getExcelHtml = async (excelId) => {
  185. if (excelId) {
  186. //获取数据
  187. const { error, code, data } = await queryApi.getExcelHtml({
  188. contractId: contractId.value || '',
  189. pkeyId: excelId
  190. }, false)
  191. //处理数据
  192. const resData = isString(data) ? data || '' : ''
  193. excelHtmlData.value = resData
  194. if (!error && code === 200 && resData) {
  195. setHTableForm(resData,excelId)
  196. } else {
  197. isTableForm.value = false
  198. statusDesc.value = '暂无表单'
  199. window?.$message?.warning('暂无表单')
  200. }
  201. } else {
  202. statusDesc.value = `excelId: ${excelId || '-1 或 空'}`
  203. isTableForm.value = false
  204. }
  205. }
  206. //渲染表单
  207. const tableFormApp = ref(null)
  208. const setHTableForm = (resData, excelId) => {
  209. //先卸载
  210. if (tableFormApp.value) {
  211. tableFormApp.value?.unmount()
  212. }
  213. if (resData) {
  214. isTableForm.value = true
  215. nextTick(() => {
  216. tableFormApp.value = HTableForm.createForm({
  217. template: resData,
  218. tableForm: tableFormData.value,
  219. appId: `#table-form-${excelId}`
  220. })
  221. })
  222. } else {
  223. isTableForm.value = false
  224. statusDesc.value = '暂无表单'
  225. window?.$message?.warning('暂无表单')
  226. }
  227. }
  228. //表单数据
  229. const formLogDataList = ref([])
  230. const getTheLogBusinessData = async (excelId, recordDate) => {
  231. const {primaryKeyId} = menuItem.value
  232. const { data } = await queryApi.getTheLogBusinessData({
  233. contractId: contractId.value || '',
  234. pkeyId: excelId,
  235. nodePrimaryKeyId: primaryKeyId,
  236. recordTime: recordDate,
  237. theLogId: ""
  238. }, false)
  239. //设置默认数据
  240. let formArrData = getArrValue(data)
  241. if (formArrData.length > 0) {
  242. for (let i = 0; i < formArrData.length; i++) {
  243. formArrData[i] = setFormDefaultData(formArrData[i])
  244. }
  245. } else {
  246. formArrData = [setFormDefaultData()]
  247. }
  248. formLogDataList.value = formArrData
  249. getBussDataInfo()
  250. }
  251. //获取表单初始数据
  252. const formLogIndex = ref(0)
  253. const tableFormData = ref({})
  254. const getBussDataInfo = (index = 0) => {
  255. const formLog = formLogDataList.value
  256. const info = getObjValue(formLog[index])
  257. formLogIndex.value = index
  258. if (getObjNullValue(info)) {
  259. HTableForm.setPickerKey(info)
  260. tableFormData.value = info
  261. } else {
  262. tableFormData.value = {}
  263. }
  264. if (excelHtmlData.value) {
  265. setHTableForm(excelHtmlData.value, excelIdVal.value)
  266. }
  267. queryCurrentLogSelectProcessList(info?.id ?? '')
  268. }
  269. //获取日期记录
  270. const dateData = ref([])
  271. const getSubmitLogDateList = async ({year},pid) => {
  272. if (pid > 0) {
  273. const { data } = await queryApi.getSubmitLogDateList({
  274. projectId: projectId.value,
  275. contractId: contractId.value,
  276. primaryKeyId: pid,
  277. year: year
  278. }, false)
  279. //处理数据
  280. dateData.value = getArrValue(data)
  281. } else {
  282. dateData.value = []
  283. }
  284. }
  285. //获取当前资料的任务状态
  286. const taskStatus = ref(1)
  287. const checkTheLogTaskStatus = async (choices,primaryKeyId) => {
  288. if (primaryKeyId > 0) {
  289. const { error, code, data } = await queryApi.checkTheLogTaskStatus({
  290. projectId: projectId.value,
  291. contractId: contractId.value,
  292. nodePrimaryKeyId: primaryKeyId,
  293. recordTime: choices
  294. }, false)
  295. //处理数据
  296. const res = isValueNull(data) ? '' : data || ''
  297. if (!error && code === 200 && res) {
  298. //1和2的时候所有按钮皆可操作,废除 除外
  299. //3和4时, 除了预览和废除 都不行
  300. taskStatus.value = data
  301. } else {
  302. taskStatus.value = 1
  303. }
  304. } else {
  305. taskStatus.value = 1
  306. }
  307. }
  308. //关联工序
  309. const processNodeModal = ref(false)
  310. const showProcessModal = () => {
  311. processNodeModal.value = true
  312. }
  313. //树的配置
  314. const processElTree = ref(null)
  315. const processTreeProps = {label: 'title', children: 'children', isLeaf: 'notExsitChild'}
  316. const defaultExpanded = ref([]) //默认展开
  317. const defaultChecked = ref([]) //默认选中
  318. //树形结构异步加载数据
  319. const ElTreeLoadNode = async (node, resolve) => {
  320. if (node.level === 0) {
  321. const {error, code, data} = await wbsQueryApi.queryWbsTreeData({
  322. contractId: contractId.value ||'',
  323. contractIdRelation: '',
  324. primaryKeyId: '',
  325. parentId: ''
  326. })
  327. //处理数据
  328. if (!error && code === 200) {
  329. const resData = getArrValue(data)
  330. resolve(resData)
  331. defaultExpanded.value = [resData[0]?.primaryKeyId]
  332. } else {
  333. resolve([])
  334. }
  335. } else {
  336. const {id, contractIdRelation, primaryKeyId} = node.data
  337. const {error, code, data} = await wbsQueryApi.queryWbsTreeData({
  338. contractId: contractId.value || '',
  339. contractIdRelation: contractIdRelation,
  340. primaryKeyId: id,
  341. parentId: contractIdRelation ? primaryKeyId : id
  342. })
  343. //处理数据
  344. if (!error && code === 200) {
  345. resolve(getArrValue(data))
  346. } else {
  347. resolve([])
  348. }
  349. }
  350. }
  351. //确认关联工序
  352. const processDataList = ref([])
  353. const processNodeClick = () => {
  354. const keys = processElTree.value.getCheckedKeys()
  355. const formIndex = formLogIndex.value
  356. const formData = formLogDataList.value[formIndex]
  357. const linkTabIds = getArrValue(formData?.linkTabIds)
  358. for (let index = 0; index < keys.length; index++) {
  359. let pathArr = [];
  360. let node = processElTree.value.getNode(keys[index]);
  361. getPathName(node, pathArr);
  362. linkTabIds.push({
  363. path: pathArr.join('/'),
  364. primaryKeyId: keys[index]
  365. });
  366. }
  367. formLogDataList.value[formIndex]['linkTabIds'] = linkTabIds
  368. processDataList.value = linkTabIds
  369. processNodeModal.value = false
  370. }
  371. //获取节点的路径名字
  372. const getPathName = (node, pathArr) => {
  373. if (node.parent?.parent) {
  374. pathArr.unshift(node.data?.title.replace(/(^\s*)|(\s*$)/g, "")); //去掉头尾空格
  375. getPathName(node.parent, pathArr);
  376. } else {
  377. return; //根节点结束
  378. }
  379. }
  380. //移除工序
  381. const deleProcess = (index) => {
  382. const formIndex = formLogIndex.value
  383. const formData = formLogDataList.value[formIndex]
  384. const linkTabIds = getArrValue(formData?.linkTabIds)
  385. linkTabIds.splice(index, 1)
  386. formLogDataList.value[formIndex]['linkTabIds'] = linkTabIds
  387. processDataList.value = linkTabIds
  388. }
  389. //保存数据
  390. const tableFormSaveLoading = ref(false)
  391. const tableFormSaveClick = async () => {
  392. const res = await saveExcelBussData()
  393. if (res) {
  394. await getBussPdfInfo()
  395. }
  396. }
  397. //保存
  398. const saveExcelBussData = async () => {
  399. let isLinkTabIds = getLinkTabIds(); //处理工序ID
  400. if (isLinkTabIds) {
  401. tableFormSaveLoading.value = true
  402. const { error, code } = await queryApi.saveExcelBussData({
  403. dataInfo: {orderList: formLogDataList.value}
  404. },false)
  405. tableFormSaveLoading.value = false
  406. if (!error && code === 200) {
  407. window?.$message?.success('保存成功')
  408. return true
  409. } else {
  410. window?.$message?.warning('保存失败')
  411. return false
  412. }
  413. }
  414. }
  415. //处理工序数据
  416. const getLinkTabIds = () => {
  417. let {nodeType} = menuItem.value;
  418. if (nodeType === 7 || nodeType === 11) {
  419. const formIndex = formLogIndex.value
  420. const formData = formLogDataList.value[formIndex]
  421. const linkTabIds = getArrValue(formData?.linkTabIds)
  422. if (linkTabIds.length > 0) {
  423. return true
  424. } else {
  425. window?.$message?.warning('请先关联工序')
  426. return false
  427. }
  428. } else {
  429. return true
  430. }
  431. }
  432. //预览
  433. const previewLoading = ref(false)
  434. const previewBussPdf = () => {
  435. getBussPdfInfo()
  436. }
  437. //预览PDF
  438. const getBussPdfInfo = async () => {
  439. previewLoading.value = true
  440. const {primaryKeyId} = menuItem.value
  441. const { error, code, data } = await queryApi.getBussPdfInfo({
  442. contractId: contractId.value || '',
  443. pkeyId: excelIdVal.value,
  444. nodePrimaryKeyId: primaryKeyId,
  445. recordTime: recordTime.value,
  446. theLogId: ""
  447. }, false)
  448. //处理数据
  449. previewLoading.value = false
  450. const resData = isString(data) ? data || '' : ''
  451. if (!error && code === 200 && resData) {
  452. window.open(resData,'_blank')
  453. } else {
  454. window?.$message?.warning('暂无PDF,无法预览')
  455. }
  456. }
  457. //获取当前日志资料关联的工序节点信息
  458. const queryCurrentLogSelectProcessList = async (bid) => {
  459. if (bid) {
  460. const { error, code, data, msg } = await queryApi.queryCurrentLogSelectProcessList({
  461. contractId: contractId.value || '',
  462. businessId: bid ?? ''
  463. }, false)
  464. //处理数据
  465. const formIndex = formLogIndex.value
  466. if (!error && code === 200) {
  467. let linkTabIds = getArrValue(data)
  468. formLogDataList.value[formIndex]['linkTabIds'] = linkTabIds
  469. processDataList.value = linkTabIds
  470. } else {
  471. processDataList.value = []
  472. if(msg) window?.$message?.warning(msg)
  473. }
  474. } else {
  475. const formIndex = formLogIndex.value
  476. const formData = formLogDataList.value[formIndex]
  477. processDataList.value = getArrValue(formData?.linkTabIds)
  478. }
  479. }
  480. //新增表格
  481. const addTableFormClick = () => {
  482. const defaultData = setFormDefaultData({})
  483. formLogDataList.value.push(defaultData)
  484. const index = formLogDataList.value.length - 1
  485. getBussDataInfo(index)
  486. }
  487. //复制表格内容
  488. const copyTableFormClick = () => {
  489. const formLog = formLogDataList.value
  490. const logIndex = formLogIndex.value
  491. const defaultData = setFormDefaultData(formLog[logIndex])
  492. formLogDataList.value.push(defaultData)
  493. const index = formLogDataList.value.length - 1
  494. getBussDataInfo(index)
  495. }
  496. //复制任意时间
  497. const copyTimeLogModal = () => {
  498. copyTimeModal.value = true
  499. copyTimeLoading.value = false
  500. }
  501. const copyTimeModal = ref(false)
  502. //选择日期
  503. const copyTimeChoices = ref('')
  504. const copyTimeChoice = ({choices}) => {
  505. copyTimeChoices.value = choices
  506. }
  507. //确认复制
  508. const copyTimeLoading = ref(false)
  509. const copyTimeSaveClick = async () => {
  510. copyTimeModal.value = false
  511. /*copyTimeLoading.value = true
  512. const {primaryKeyId} = menuItem.value
  513. const { error, code } = await queryApi.copyTheLogBusinessData({
  514. contractId: contractId.value || '',
  515. nodePrimaryKeyId: primaryKeyId,
  516. currentTime: recordTime.value,
  517. targetTime: copyTimeChoices.value
  518. }, false)
  519. //处理数据
  520. copyTimeLoading.value = false
  521. if (!error && code === 200) {
  522. window?.location?.reload() //刷新页面
  523. } else {
  524. window?.$message?.warning('复制失败')
  525. }*/
  526. }
  527. //设置表单默认数据
  528. const setFormDefaultData = (formInfo = {}) => {
  529. return {
  530. linkTabIds: [],
  531. ...formInfo,
  532. projectId: projectId.value,
  533. contractId: contractId.value,
  534. recordTime: recordTime.value,
  535. pkeyId: excelIdVal.value,
  536. isTheLog: "1",
  537. theLogId: "",
  538. classify: 1
  539. }
  540. }
  541. //删除记录
  542. const closeBussDataInfo = (index) => {
  543. formLogDataList.value.splice(index, 1)
  544. formLogIndex.value = index <= 0 ? 0 : index - 1
  545. }
  546. //批量上报
  547. const reportTaskName = ref('')
  548. const reportAddition = ref({})
  549. const showReportModal = ref(false)
  550. const reportModalClick = () => {
  551. const {primaryKeyId,title} = menuItem.value
  552. reportTaskName.value = `${recordTime.value} ${title} ${userName.value}`
  553. reportAddition.value = {
  554. nodePrimaryKeyId: primaryKeyId,
  555. recordTime: recordTime.value,
  556. }
  557. showReportModal.value = true
  558. }
  559. //上报完成
  560. const showReportFinish = () => {
  561. showReportModal.value = false
  562. window?.location?.reload() //刷新页面
  563. }
  564. //废除
  565. const abolishTableFormClick = () => {
  566. window?.$messageBox?.alert('是否废除已上报的文件?', '废除文件', {
  567. showCancelButton: true,
  568. confirmButtonText: '确定废除',
  569. cancelButtonText: '取消',
  570. callback: (action) => {
  571. if (action === 'confirm') {
  572. theLogOneAbolish()
  573. }
  574. }
  575. })
  576. }
  577. //确认废除
  578. const theLogOneAbolish = async () => {
  579. const {primaryKeyId} = menuItem.value
  580. const { error, code } = await queryApi.theLogOneAbolish({
  581. projectId: projectId.value,
  582. contractId: contractId.value,
  583. nodePrimaryKeyId: primaryKeyId,
  584. recordTime: recordTime.value
  585. })
  586. //处理数据
  587. if (!error && code === 200) {
  588. window.$message?.success('废除成功')
  589. window?.location?.reload() //刷新页面
  590. }
  591. }
  592. </script>
  593. <style lang="scss" scoped>
  594. .hc-table-form-content {
  595. flex: 1;
  596. display: flex;
  597. flex-direction: column;
  598. position: relative;
  599. margin-left: 24px;
  600. height: 100%;
  601. .hc-table-forem-box, .hc-fixed-page, .hc-right-pian-box, .hc-footer-box {
  602. padding: 24px;
  603. background: #f1f5f8;
  604. border-radius: 10px;
  605. box-shadow: -2px 0px 10px 0px rgba(32,37,50,0.03), 0px 10px 21px 20px rgba(32,37,50,0.03);
  606. }
  607. .hc-content-box {
  608. flex: 1;
  609. display: flex;
  610. position: relative;
  611. margin-bottom: 24px;
  612. height: calc(100% - 105px);
  613. .hc-table-forem-box {
  614. flex: 1;
  615. margin-right: 24px;
  616. position: relative;
  617. }
  618. .hc-fixed-page {
  619. position: relative;
  620. margin-right: 24px;
  621. padding: 0;
  622. .hc-fixed-page-list-box {
  623. position: relative;
  624. padding: 24px;
  625. user-select: none;
  626. .fixed-page-item {
  627. position: relative;
  628. display: flex;
  629. align-items: center;
  630. justify-content: space-between;
  631. border-radius: 3px;
  632. padding: 6px 10px;
  633. font-size: 14px;
  634. background: #f1f5f8;
  635. border: 1px solid #f1f5f8;
  636. color: var(--el-color-primary-light-3);
  637. box-shadow: 4px 4px 8px 0 rgba(54,92,167,0.15), -4px -4px 8px 0 #ffffff;
  638. transition: .1s;
  639. .name-box {
  640. position: relative;
  641. display: flex;
  642. align-items: center;
  643. margin-right: 24px;
  644. cursor: pointer;
  645. .page {
  646. margin-left: 5px;
  647. }
  648. }
  649. .close-box {
  650. position: relative;
  651. display: flex;
  652. align-items: center;
  653. justify-content: center;
  654. cursor: pointer;
  655. font-size: 16px;
  656. }
  657. &.primary {
  658. background: var(--el-color-primary);
  659. color: var(--el-color-white);
  660. box-shadow: var(--hc-shadow);
  661. border: 1px solid #f1f5f8;
  662. }
  663. &+.fixed-page-item{
  664. margin-top: 20px;
  665. }
  666. }
  667. }
  668. }
  669. .hc-right-pian-box {
  670. width: 360px;
  671. position: relative;
  672. padding: 24px 20px;
  673. .hc-process-box {
  674. position: relative;
  675. flex: 1;
  676. overflow: hidden;
  677. .hc-scrollbar-box {
  678. display: contents;
  679. }
  680. .process-item-box {
  681. position: relative;
  682. color: #838791;
  683. font-size: 14px;
  684. padding: 8px 0;
  685. display: flex;
  686. align-items: flex-start;
  687. .process-item {
  688. position: relative;
  689. flex: 1;
  690. }
  691. .process-icon {
  692. font-size: 20px;
  693. cursor: pointer;
  694. margin-left: 16px;
  695. transition: color 0.2s;
  696. &:hover {
  697. color: var(--el-color-primary-light-3);
  698. }
  699. }
  700. }
  701. .process-item-box + .process-item-box {
  702. border-top: 0.5px solid #e9e9e9;
  703. }
  704. }
  705. }
  706. }
  707. .hc-footer-box {
  708. position: relative;
  709. height: 80px;
  710. display: flex;
  711. align-items: center;
  712. padding: 20px 24px;
  713. overflow: hidden;
  714. }
  715. }
  716. </style>
  717. <style lang="scss">
  718. .node-many-tree {
  719. position: relative;
  720. .my-tree .el-tree-node .el-checkbox .el-checkbox__inner {
  721. display: none;
  722. }
  723. .my-tree .el-tree-node .is-leaf + .el-checkbox .el-checkbox__inner {
  724. display: inline-block;
  725. }
  726. }
  727. .hc-table-form-content .hc-content-box .hc-table-forem-box .hc-fixed-page {
  728. .el-button {
  729. display: block;
  730. margin: 20px;
  731. }
  732. }
  733. </style>