index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. <template>
  2. <div class="processApproval">
  3. <div class="left-card">
  4. <div class="top">
  5. <div class="commons-title title">
  6. {{ route.query.flowName || "流程标题(发起)" }}
  7. </div>
  8. <SendSubscribe
  9. ref="makeDom"
  10. v-if="flowForm.flowKey == 'subscribe_flow'"
  11. ></SendSubscribe>
  12. <SendPurchase
  13. ref="makeDom"
  14. v-else-if="flowForm.flowKey == 'purchase_flow'"
  15. :queryData="queryData.data"
  16. ></SendPurchase>
  17. <SendFunds
  18. ref="makeDom"
  19. v-else-if="flowForm.flowKey == 'account_request_funds_flow'"
  20. :queryData="queryData.data"
  21. ></SendFunds>
  22. <ReturnGood
  23. ref="makeDom"
  24. v-else-if="flowForm.flowKey == 'sales_return_flow'"
  25. :queryData="queryData.data"
  26. ></ReturnGood>
  27. <PurchaseRefund
  28. ref="makeDom"
  29. v-else-if="flowForm.flowKey == 'refund_flow'"
  30. :queryData="queryData.data"
  31. ></PurchaseRefund>
  32. <PurchasePayment
  33. ref="makeDom"
  34. v-else-if="flowForm.flowKey == 'pay_flow'"
  35. :queryData="queryData.data"
  36. ></PurchasePayment>
  37. <template v-else-if="flowForm.flowKey == 'sale_quotation_flow'">
  38. <PriceSheetEHSD
  39. ref="makeDom"
  40. v-if="flowForm.tenantType === 'EHSD'"
  41. :queryData="queryData.data"
  42. ></PriceSheetEHSD>
  43. <PriceSheet
  44. ref="makeDom"
  45. v-else
  46. :queryData="queryData.data"
  47. ></PriceSheet>
  48. </template>
  49. <template v-else-if="flowForm.flowKey == 'contract_flow'">
  50. <ContractEHSD
  51. ref="makeDom"
  52. v-if="flowForm.tenantType === 'EHSD'"
  53. :queryData="queryData.data"
  54. ></ContractEHSD>
  55. <Contract ref="makeDom" v-else :queryData="queryData.data"></Contract>
  56. </template>
  57. <template v-else-if="flowForm.flowKey == 'sample_flow'">
  58. <SampleEHSD ref="makeDom" :queryData="queryData.data"></SampleEHSD>
  59. </template>
  60. <template v-else-if="flowForm.flowKey == 'ehsd_purchase_flow'">
  61. <PurchaseEHSD
  62. ref="makeDom"
  63. :queryData="queryData.data"
  64. ></PurchaseEHSD>
  65. </template>
  66. <ServiceContract
  67. ref="makeDom"
  68. v-else-if="flowForm.flowKey == 'service_contract_flow'"
  69. :queryData="queryData.data"
  70. ></ServiceContract>
  71. <!-- 维多利亚 -->
  72. <SendSubscribeWDLY
  73. ref="makeDom"
  74. v-else-if="flowForm.flowKey == 'wdly_apply_purchase'"
  75. :queryData="queryData.data"
  76. ></SendSubscribeWDLY>
  77. <SendPurchaseWDLY
  78. ref="makeDom"
  79. v-else-if="flowForm.flowKey == 'wdly_purchase'"
  80. :queryData="queryData.data"
  81. ></SendPurchaseWDLY>
  82. </div>
  83. <div class="bottom" v-if="route.query.processType != 20">
  84. <div class="commons-title title">处理意见</div>
  85. <el-form :model="flowForm" :rules="flowRules" ref="flowFormDom">
  86. <el-form-item prop="remark" label-width="0px" label="">
  87. <el-input
  88. type="textarea"
  89. placeholder="请输入"
  90. v-model="flowForm.remark"
  91. >
  92. </el-input>
  93. </el-form-item>
  94. <el-form-item label-width="80px" label="附件上传">
  95. <el-upload
  96. v-model:fileList="flowForm.fileList"
  97. action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
  98. :data="uploadData"
  99. multiple
  100. :before-upload="uploadFile"
  101. :on-success="handleSuccess"
  102. :on-preview="onPreviewFile"
  103. >
  104. <el-button>选择</el-button>
  105. </el-upload>
  106. </el-form-item>
  107. <el-form-item>
  108. <el-button
  109. type="primary"
  110. v-if="approvalRecordData.buttonInfoList.length == 0"
  111. @click="handleSubmit"
  112. >提交</el-button
  113. >
  114. <el-button
  115. type="primary"
  116. v-else
  117. v-for="i in approvalRecordData.buttonInfoList"
  118. :key="i.type"
  119. @click="handleSubmit(i.type)"
  120. >{{ i.name }}</el-button
  121. >
  122. </el-form-item>
  123. </el-form>
  124. </div>
  125. </div>
  126. <div class="right-card">
  127. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  128. <el-tab-pane label="审批记录" name="first">
  129. <ul class="flow-chart">
  130. <li
  131. v-for="item in recordList"
  132. :key="item.id"
  133. :class="
  134. !route.query.id
  135. ? ''
  136. : item.status == 2
  137. ? 'flow-orange'
  138. : item.status == 3 && !route.query.id
  139. ? 'flow-orange'
  140. : item.status == 3 && route.query.id
  141. ? 'flow-grey'
  142. : ''
  143. "
  144. >
  145. <div class="left-icon">
  146. <i class="iconfont icon-iconm_daick"></i>
  147. <i class="iconfont icon-icomx_quertj1 right-btm-status"></i>
  148. </div>
  149. <div class="right-conetnt">
  150. <div class="name">{{ item.nodeName }}</div>
  151. <div class="remark">
  152. <div class="label">
  153. <span v-if="item.status != 3">办理人:</span
  154. >{{ item.processedUser
  155. }}<span class="time">{{ item.processedDate }}</span>
  156. </div>
  157. {{ item.remark }}
  158. <div
  159. v-for="j in fileObj[item.flowExampleDetailId]"
  160. v-if="fileObj[item.flowExampleDetailId]"
  161. >
  162. <!-- :href="j.fileUrl" -->
  163. <a
  164. @click="proxy.download(j.fileUrl, j.fileName)"
  165. style="color: #409eff; line-height: 30px"
  166. >{{ j.fileName }}</a
  167. >
  168. </div>
  169. </div>
  170. </div>
  171. <div class="line"></div>
  172. </li>
  173. </ul>
  174. </el-tab-pane>
  175. <!-- <el-tab-pane label="决策辅助" name="second">
  176. <auxiliary></auxiliary>
  177. </el-tab-pane> -->
  178. </el-tabs>
  179. </div>
  180. <el-dialog title="下一处理人" width="400" v-model="dialogVisible">
  181. <el-form :model="flowForm">
  182. <el-form-item prop="remark" label="处理人">
  183. <el-select
  184. v-model="flowForm.handleUserId"
  185. placeholder="请选择"
  186. filterable
  187. style="width: 100%"
  188. >
  189. <el-option
  190. v-for="item in nextHandleUser"
  191. :label="item.name"
  192. :value="item.id"
  193. >
  194. </el-option>
  195. </el-select>
  196. </el-form-item>
  197. <el-form-item>
  198. <div style="width: 100%; text-align: center">
  199. <el-button type="primary" @click="handleSelectUser">提交</el-button>
  200. </div>
  201. </el-form-item>
  202. </el-form>
  203. </el-dialog>
  204. </div>
  205. </template>
  206. <script setup name="ProcessApproval">
  207. import useTagsViewStore from "@/store/modules/tagsView.js";
  208. import { useRouter, useRoute } from "vue-router";
  209. //决策辅助
  210. import auxiliary from "./auxiliary";
  211. //申购发起
  212. import SendSubscribe from "@/components/process/SendSubscribe";
  213. //采购发起
  214. import SendPurchase from "@/components/process/SendPurchase";
  215. //请款发起
  216. import SendFunds from "@/components/process/SendFunds";
  217. //退货
  218. import ReturnGood from "@/components/process/ReturnGood";
  219. // 消息提示
  220. import { ElMessage, ElMessageBox } from "element-plus";
  221. //退款
  222. import PurchaseRefund from "@/components/process/PurchaseRefund";
  223. // 付款
  224. import PurchasePayment from "@/components/process/PurchasePayment";
  225. // 报价单
  226. import PriceSheet from "@/components/process/PriceSheet";
  227. // 报价单-EHSD
  228. import PriceSheetEHSD from "@/components/process/EHSD/PriceSheet";
  229. // 销售合同
  230. import Contract from "@/components/process/Contract";
  231. // 销售合同-EHSD
  232. import ContractEHSD from "@/components/process/EHSD/Contract";
  233. // 样品单-EHSD
  234. import SampleEHSD from "@/components/process/EHSD/Sample";
  235. // 采购交接单-EHSD
  236. import PurchaseEHSD from "@/components/process/EHSD/Purchase";
  237. // 服务合同
  238. import ServiceContract from "@/components/process/ServiceContract";
  239. // /``````````````````````````````维多利亚专属 /
  240. //申购发起
  241. import SendSubscribeWDLY from "@/components/WDLY/process/SendSubscribeWDLY";
  242. //采购发起
  243. import SendPurchaseWDLY from "@/components/WDLY/process/SendPurchaseWDLY";
  244. import { ref } from "vue";
  245. const router = useRouter();
  246. const route = useRoute();
  247. // tab切换逻辑
  248. const activeName = ref("first");
  249. const handleClick = (tab, event) => {
  250. // console.log(tab, event);
  251. };
  252. // 意见表单
  253. const flowForm = reactive({
  254. flowKey: "",
  255. tenantType: "",
  256. handleUserId: "",
  257. remark: "",
  258. data: {},
  259. fileList: [],
  260. });
  261. const uploadData = ref({});
  262. const flowRules = reactive({
  263. // remark: [{ required: true, message: "请输入处理意见", trigger: "blur" }],
  264. });
  265. //组件实例
  266. const { proxy } = getCurrentInstance();
  267. const makeDom = ref(null);
  268. const flowFormDom = ref(null);
  269. let dialogVisible = ref(false);
  270. const nextHandleUser = ref([]);
  271. const handleSelectUser = () => {
  272. if (!flowForm.handleUserId) {
  273. return ElMessage({
  274. message: "请选择下一节点处理人!",
  275. type: "info",
  276. });
  277. }
  278. handleSubmit();
  279. };
  280. const handleResult = (res) => {
  281. if (res !== null && res.success) {
  282. skipPage();
  283. } else {
  284. dialogVisible.value = true;
  285. nextHandleUser.value = res.userList;
  286. }
  287. };
  288. // 提交逻辑
  289. const handleSubmit = async (_type) => {
  290. try {
  291. // 调用发起组件的提交事件
  292. const flag = await makeDom.value.handleSubmit();
  293. if (flag) {
  294. flowFormDom.value.validate((valid) => {
  295. if (valid) {
  296. // const data = { ...makeDom.value.submitData };
  297. const data = { ...makeDom.value.getFormData() };
  298. if (flowForm.flowKey == "subscribe_flow") {
  299. data.subscribeDetailList = data.subscribeDetailList.map((x) => ({
  300. bussinessId: x.bussinessId,
  301. count: x.count,
  302. remark: x.remark,
  303. }));
  304. } else if (flowForm.flowKey == "purchase_flow") {
  305. data.purchaseDetailList = data.purchaseDetailList.map((x) => ({
  306. bussinessId: x.bussinessId,
  307. subscribeDetailId: x.id,
  308. count: x.count,
  309. price: x.price,
  310. amount: x.amount,
  311. }));
  312. } else if (flowForm.flowKey == "account_request_funds_flow") {
  313. } else if (flowForm.flowKey == "sales_return_flow") {
  314. } else if (flowForm.flowKey == "refund_flow") {
  315. } else if (flowForm.flowKey == "wdly_apply_purchase") {
  316. // data.subscribeDetailList = data.subscribeDetailList.map((x) => ({
  317. // bussinessId: x.bussinessId,
  318. // count: x.count,
  319. // remark: x.remark,
  320. // }));
  321. const victoriatouristJson = {
  322. planArrivalTime: data.planArrivalTime,
  323. receiptWarehouseId: data.receiptWarehouseId,
  324. };
  325. data.victoriatouristJson = JSON.stringify(victoriatouristJson);
  326. } else if (flowForm.flowKey == "wdly_purchase") {
  327. if (route.query.processType && route.query.processType == 10) {
  328. data.purchaseDetailList = data.purchaseDetailList.map((x) => ({
  329. bussinessId: x.bussinessId,
  330. subscribeDetailId: x.subscribeDetailId,
  331. count: x.count,
  332. price: x.price,
  333. amount: x.amount,
  334. deptId: x.productDeptId,
  335. id: x.id,
  336. }));
  337. } else {
  338. data.purchaseDetailList = data.purchaseDetailList.map((x) => ({
  339. bussinessId: x.bussinessId,
  340. subscribeDetailId: x.subscribeDetailId,
  341. count: x.count,
  342. price: x.price,
  343. amount: x.amount,
  344. deptId: x.deptId,
  345. }));
  346. }
  347. const victoriatouristJson = {
  348. isAgreement: data.isAgreement,
  349. paymentMethod: data.paymentMethod,
  350. otherFeeList: data.otherFeeList,
  351. contractCode: data.contractCode,
  352. freight: data.freight,
  353. preferential: data.preferential,
  354. };
  355. data.victoriatouristJson = JSON.stringify(victoriatouristJson);
  356. } else if (flowForm.flowKey == "sale_quotation_flow") {
  357. if (flowForm.tenantType === "EHSD") {
  358. data.ehsdJson = JSON.stringify({
  359. deliveryTime: data.deliveryTime,
  360. });
  361. data.quotationProductList = data.quotationProductList.map(
  362. (item) => {
  363. let ehsdJson = JSON.stringify({
  364. packMethod: item.packMethod,
  365. tradeMethods: item.tradeMethods,
  366. });
  367. return {
  368. ...item,
  369. ehsdJson: ehsdJson,
  370. };
  371. }
  372. );
  373. }
  374. } else if (flowForm.flowKey == "contract_flow") {
  375. if (flowForm.tenantType === "EHSD") {
  376. if (data.fileList && data.fileList.length > 0) {
  377. data.fileList = data.fileList.map((item) => {
  378. return {
  379. id: item.raw.id,
  380. fileName: item.raw.fileName,
  381. fileUrl: item.raw.fileUrl,
  382. };
  383. });
  384. } else {
  385. data.fileList = [];
  386. }
  387. if (data.packageFileList && data.packageFileList.length > 0) {
  388. data.packageFileList = data.packageFileList.map((item) => {
  389. return {
  390. id: item.raw.id,
  391. fileName: item.raw.fileName,
  392. fileUrl: item.raw.fileUrl,
  393. };
  394. });
  395. } else {
  396. data.packageFileList = [];
  397. }
  398. data.ehsdJson = JSON.stringify({
  399. deliveryTime: data.deliveryTime,
  400. });
  401. data.contractProductList = data.contractProductList.map(
  402. (item) => {
  403. let ehsdJson = JSON.stringify({
  404. packMethod: item.packMethod,
  405. tradeMethods: item.tradeMethods,
  406. });
  407. return {
  408. ...item,
  409. ehsdJson: ehsdJson,
  410. };
  411. }
  412. );
  413. }
  414. } else if (flowForm.flowKey == "sample_flow") {
  415. if (data.fileList && data.fileList.length > 0) {
  416. data.fileList = data.fileList.map((item) => {
  417. return {
  418. id: item.raw.id,
  419. fileName: item.raw.fileName,
  420. fileUrl: item.raw.fileUrl,
  421. };
  422. });
  423. } else {
  424. data.fileList = [];
  425. }
  426. if (data.packageFileList && data.packageFileList.length > 0) {
  427. data.packageFileList = data.packageFileList.map((item) => {
  428. return {
  429. id: item.raw.id,
  430. fileName: item.raw.fileName,
  431. fileUrl: item.raw.fileUrl,
  432. };
  433. });
  434. } else {
  435. data.packageFileList = [];
  436. }
  437. data.ehsdJson = JSON.stringify({
  438. deliveryTime: data.deliveryTime,
  439. });
  440. data.sampleProductList = data.sampleProductList.map((item) => {
  441. let ehsdJson = JSON.stringify({
  442. packMethod: item.packMethod,
  443. tradeMethods: item.tradeMethods,
  444. });
  445. return {
  446. ...item,
  447. ehsdJson: ehsdJson,
  448. };
  449. });
  450. }
  451. flowForm.fileList = flowForm.fileList.map((item) => {
  452. return {
  453. ...item,
  454. ...item.raw,
  455. };
  456. });
  457. if (route.query.processType == 10) {
  458. proxy
  459. .post("/flowProcess/jump", {
  460. ...flowForm,
  461. data,
  462. handleType: _type,
  463. version: route.query.version,
  464. flowId: route.query.id,
  465. })
  466. .then((res) => {
  467. handleResult(res);
  468. });
  469. if (_type && _type == 1) {
  470. proxy
  471. .post("/flowExample/setStartData", {
  472. exampleId: route.query.id,
  473. startData: data,
  474. })
  475. .then();
  476. }
  477. return;
  478. } else {
  479. proxy
  480. .post("/flowProcess/initiate", {
  481. ...flowForm,
  482. data,
  483. })
  484. .then((res) => {
  485. handleResult(res);
  486. });
  487. }
  488. }
  489. });
  490. }
  491. } catch (err) {
  492. console.log("数据未填完整!", err);
  493. }
  494. };
  495. // 页面跳转
  496. const skipPage = () => {
  497. if (route.query.processType === 10) {
  498. router.replace({
  499. path: "/oa/1/dealWith",
  500. });
  501. } else {
  502. const useTagsStore = useTagsViewStore();
  503. useTagsStore.delVisitedView(router.currentRoute.value);
  504. ElMessage({
  505. message: "操作成功!",
  506. type: "success",
  507. });
  508. if (flowForm.flowKey == "subscribe_flow") {
  509. router.replace({
  510. path: "/ERP/purchaseManage/subscribe",
  511. });
  512. } else if (flowForm.flowKey == "purchase_flow") {
  513. router.replace({
  514. path: "/ERP/purchaseManage/purchase",
  515. });
  516. } else if (flowForm.flowKey == "sales_return_flow") {
  517. router.replace({
  518. path: "/ERP/purchaseManage/returnGoods",
  519. });
  520. } else if (flowForm.flowKey == "account_request_funds_flow") {
  521. router.replace({
  522. path: "/ERP/fundManage/funds",
  523. });
  524. } else if (flowForm.flowKey == "refund_flow") {
  525. router.replace({
  526. path: "/ERP/purchasePayment/invoice",
  527. });
  528. } else if (flowForm.flowKey == "pay_flow") {
  529. router.replace({
  530. path: "/ERP/purchasePayment/payment",
  531. });
  532. } else if (flowForm.flowKey == "sale_quotation_flow") {
  533. if (flowForm.tenantType === "EHSD") {
  534. router.replace({
  535. path: "/EHSD/saleContract/priceSheetEHSD",
  536. });
  537. } else {
  538. router.replace({
  539. path: "/ERP/saleContract/priceSheet",
  540. });
  541. }
  542. } else if (flowForm.flowKey == "contract_flow") {
  543. if (flowForm.tenantType === "EHSD") {
  544. router.replace({
  545. path: "/EHSD/saleContract/contractEHSD",
  546. });
  547. } else {
  548. router.replace({
  549. path: "/ERP/saleContract/contract",
  550. });
  551. }
  552. } else if (flowForm.flowKey == "sample_flow") {
  553. router.replace({
  554. path: "/EHSD/saleContract/sampleEHSD",
  555. });
  556. } else if (flowForm.flowKey == "ehsd_purchase_flow") {
  557. router.replace({
  558. path: "/EHSD/procurement/purchasedEHSD",
  559. });
  560. } else if (flowForm.flowKey == "service_contract_flow") {
  561. router.replace({
  562. path: "/ERP/saleContract/serviceContract",
  563. });
  564. } else if (flowForm.flowKey == "wdly_purchase") {
  565. router.replace({
  566. path: "/oa/1/backlog",
  567. });
  568. } else if (flowForm.flowKey == "wdly_apply_purchase") {
  569. router.replace({
  570. path: "/WDLY/purchaseManage/subscribe_wdly",
  571. });
  572. }
  573. }
  574. };
  575. let queryData = reactive({
  576. data: {},
  577. });
  578. // 记录
  579. const recordList = ref([]);
  580. const fileIds = ref([]);
  581. const fileObj = ref({});
  582. let isRevocation = ref(false);
  583. const approvalRecordData = ref({
  584. buttonInfoList: [],
  585. });
  586. const getRecords = (_id) => {
  587. if (_id) {
  588. proxy
  589. .post("/flowExample/getApprovalRecord", {
  590. id: _id,
  591. })
  592. .then((res) => {
  593. recordList.value = res.recordList;
  594. queryData.data.recordList = res.recordList;
  595. approvalRecordData.value = res;
  596. fileIds.value = res.recordList.map((item) => {
  597. return item.flowExampleDetailId;
  598. });
  599. for (let i = 0; i < res.recordList.length; i++) {
  600. const element = res.recordList[i];
  601. if (element.status == 2) {
  602. // 2为审批中
  603. if (element.processedUser === res.recordList[i - 1].processedUser) {
  604. // 当前审批人和上一条审批人相同,开启撤回开关
  605. isRevocation.value = true;
  606. }
  607. }
  608. }
  609. proxy
  610. .post("fileInfo/getList", { businessIdList: fileIds.value })
  611. .then((res2) => {
  612. fileObj.value = res2;
  613. });
  614. });
  615. } else {
  616. proxy
  617. .post("/flowExample/getFlowNode", {
  618. flowKey: flowForm.flowKey,
  619. })
  620. .then((res) => {
  621. recordList.value = res;
  622. });
  623. }
  624. };
  625. const uploadFile = async (file) => {
  626. const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
  627. uploadData.value = res.uploadBody;
  628. file.id = res.id;
  629. file.fileName = res.fileName;
  630. file.fileUrl = res.fileUrl;
  631. file.uploadState = true;
  632. return true;
  633. };
  634. const handleSuccess = (any, UploadFile) => {
  635. UploadFile.raw.uploadState = false;
  636. };
  637. const onPreviewFile = (file) => {
  638. window.open(file.raw.fileUrl, "_blank");
  639. };
  640. onMounted(() => {
  641. //processType 10 为修改 20为查看
  642. if (route.query.processType == 10 || route.query.processType == 20) {
  643. proxy
  644. .post("/flowProcess/getStartData", { flowId: route.query.id })
  645. .then((res) => {
  646. queryData.data = { ...res };
  647. });
  648. } else {
  649. queryData.data = { ...route.query };
  650. }
  651. flowForm.flowKey = route.query.flowKey;
  652. flowForm.tenantType = route.query.tenantType;
  653. getRecords(route.query.id);
  654. });
  655. </script>
  656. <style>
  657. .el-upload-list {
  658. float: left;
  659. margin: 0 !important;
  660. }
  661. .el-upload-list li {
  662. width: 100px;
  663. margin-left: 10px;
  664. }
  665. .el-upload--text {
  666. float: left;
  667. }
  668. </style>
  669. <style lang="scss" scoped>
  670. .processApproval {
  671. display: flex;
  672. justify-content: space-between;
  673. margin-top: 20px;
  674. padding: 0 20px;
  675. height: calc(100vh - 130px);
  676. .left-card {
  677. // background: #fff;
  678. border-radius: 4px;
  679. // padding: 20px;
  680. flex: 1;
  681. margin-right: 20px;
  682. display: flex;
  683. flex-direction: column;
  684. .top {
  685. flex: 1;
  686. overflow-y: auto;
  687. background: #fff;
  688. padding: 20px 20px 0px 20px;
  689. }
  690. .bottom {
  691. margin-top: 10px;
  692. height: 220px;
  693. background: #fff;
  694. padding: 20px 20px 0px 20px;
  695. overflow: auto;
  696. }
  697. }
  698. .right-card {
  699. background: #fff;
  700. border-radius: 4px;
  701. padding: 0 20px 20px;
  702. width: 600px;
  703. box-sizing: border-box;
  704. .flow-chart {
  705. overflow: auto;
  706. height: calc(100vh - 200px);
  707. padding: 0;
  708. margin: 0;
  709. li {
  710. margin: 0;
  711. padding: 0 0 20px;
  712. list-style: none;
  713. display: flex;
  714. justify-content: space-between;
  715. position: relative;
  716. .right-conetnt {
  717. flex: 1;
  718. .name {
  719. font-size: 12px;
  720. color: #39c55a;
  721. margin-bottom: 10px;
  722. span {
  723. color: #999;
  724. }
  725. }
  726. .time {
  727. float: right;
  728. }
  729. .remark {
  730. padding: 10px;
  731. color: #666666;
  732. font-size: 12px;
  733. background: #f1f1f1;
  734. border-radius: 2px;
  735. .label {
  736. color: #999;
  737. margin-bottom: 10px;
  738. }
  739. }
  740. }
  741. .left-icon {
  742. width: 40px;
  743. height: 40px;
  744. text-align: center;
  745. line-height: 40px;
  746. background: #0084ff;
  747. border-radius: 10px;
  748. color: #fff;
  749. font-size: 20px;
  750. position: relative;
  751. margin-right: 27px;
  752. z-index: 2;
  753. .right-btm-status {
  754. position: absolute;
  755. bottom: 0px;
  756. right: -10px;
  757. height: 20px;
  758. width: 20px;
  759. line-height: 16px;
  760. border-radius: 10px;
  761. background: #39c55a;
  762. border: 2px solid #fff;
  763. font-size: 12px;
  764. box-sizing: border-box;
  765. }
  766. }
  767. }
  768. li::before {
  769. content: "";
  770. position: absolute;
  771. top: 0;
  772. left: 20px;
  773. width: 2px;
  774. height: 100%;
  775. background: #ddd;
  776. z-index: 1;
  777. }
  778. li:last-child::before {
  779. display: none;
  780. }
  781. .flow-orange {
  782. .right-btm-status {
  783. background: #ff9a00 !important;
  784. }
  785. .name {
  786. color: #ff9a00 !important;
  787. }
  788. .left-icon {
  789. background: #ff9a00 !important;
  790. }
  791. }
  792. .flow-grey {
  793. .right-btm-status {
  794. background: #999 !important;
  795. }
  796. .name {
  797. color: #999 !important;
  798. }
  799. .left-icon {
  800. background: #999 !important;
  801. }
  802. }
  803. .flow-red {
  804. .right-btm-status {
  805. background: #ff4d4f !important;
  806. }
  807. .name {
  808. color: #ff4d4f !important;
  809. }
  810. .left-icon {
  811. background: #ff4d4f !important;
  812. }
  813. }
  814. }
  815. }
  816. }
  817. </style>