index.vue 22 KB

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