index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  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>
  95. <el-button
  96. type="primary"
  97. v-if="approvalRecordData.buttonInfoList.length == 0"
  98. @click="handleSubmit"
  99. >提交</el-button
  100. >
  101. <el-button
  102. type="primary"
  103. v-else
  104. v-for="i in approvalRecordData.buttonInfoList"
  105. :key="i.type"
  106. @click="handleSubmit(i.type)"
  107. >{{ i.name }}</el-button
  108. >
  109. </el-form-item>
  110. </el-form>
  111. </div>
  112. </div>
  113. <div class="right-card">
  114. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  115. <el-tab-pane label="审批记录" name="first">
  116. <ul class="flow-chart">
  117. <li
  118. v-for="item in recordList"
  119. :key="item.id"
  120. :class="!route.query.id ? '' :
  121. item.status == 2 ? 'flow-orange' : item.status == 3 && !route.query.id ? 'flow-orange' : item.status == 3 && route.query.id ? 'flow-grey' : ''
  122. ">
  123. <div class="left-icon">
  124. <i class="iconfont icon-iconm_daick"></i>
  125. <i class="iconfont icon-icomx_quertj1 right-btm-status"></i>
  126. </div>
  127. <div class="right-conetnt">
  128. <div class="name">{{ item.nodeName }}</div>
  129. <div class="remark">
  130. <div class="label">
  131. <span v-if="item.status != 3">办理人:</span
  132. >{{ item.processedUser
  133. }}<span class="time">{{ item.processedDate }}</span>
  134. </div>
  135. {{ item.remark }}
  136. </div>
  137. </div>
  138. <div class="line"></div>
  139. </li>
  140. </ul>
  141. </el-tab-pane>
  142. <!-- <el-tab-pane label="决策辅助" name="second">
  143. <auxiliary></auxiliary>
  144. </el-tab-pane> -->
  145. </el-tabs>
  146. </div>
  147. <el-dialog title="下一处理人" width="400" v-model="dialogVisible">
  148. <el-form :model="flowForm">
  149. <el-form-item prop="remark" label="处理人">
  150. <el-select
  151. v-model="flowForm.handleUserId"
  152. placeholder="请选择"
  153. filterable
  154. style="width: 100%"
  155. >
  156. <el-option
  157. v-for="item in nextHandleUser"
  158. :label="item.name"
  159. :value="item.id"
  160. >
  161. </el-option>
  162. </el-select>
  163. </el-form-item>
  164. <el-form-item>
  165. <div style="width: 100%; text-align: center">
  166. <el-button type="primary" @click="handleSelectUser">提交</el-button>
  167. </div>
  168. </el-form-item>
  169. </el-form>
  170. </el-dialog>
  171. </div>
  172. </template>
  173. <script setup name="ProcessApproval">
  174. import useTagsViewStore from "@/store/modules/tagsView.js";
  175. import { useRouter, useRoute } from "vue-router";
  176. //决策辅助
  177. import auxiliary from "./auxiliary";
  178. //申购发起
  179. import SendSubscribe from "@/components/process/SendSubscribe";
  180. //采购发起
  181. import SendPurchase from "@/components/process/SendPurchase";
  182. //请款发起
  183. import SendFunds from "@/components/process/SendFunds";
  184. //退货
  185. import ReturnGood from "@/components/process/ReturnGood";
  186. // 消息提示
  187. import { ElMessage, ElMessageBox } from "element-plus";
  188. //退款
  189. import PurchaseRefund from "@/components/process/PurchaseRefund";
  190. // 付款
  191. import PurchasePayment from "@/components/process/PurchasePayment";
  192. // 报价单
  193. import PriceSheet from "@/components/process/PriceSheet";
  194. // 报价单-EHSD
  195. import PriceSheetEHSD from "@/components/process/EHSD/PriceSheet";
  196. // 销售合同
  197. import Contract from "@/components/process/Contract";
  198. // 销售合同-EHSD
  199. import ContractEHSD from "@/components/process/EHSD/Contract";
  200. // 样品单-EHSD
  201. import SampleEHSD from "@/components/process/EHSD/Sample";
  202. // 采购交接单-EHSD
  203. import PurchaseEHSD from "@/components/process/EHSD/Purchase";
  204. // 服务合同
  205. import ServiceContract from "@/components/process/ServiceContract";
  206. // /``````````````````````````````维多利亚专属 /
  207. //申购发起
  208. import SendSubscribeWDLY from "@/components/WDLY/process/SendSubscribeWDLY";
  209. //采购发起
  210. import SendPurchaseWDLY from "@/components/WDLY/process/SendPurchaseWDLY";
  211. import { ref } from "vue";
  212. const router = useRouter();
  213. const route = useRoute();
  214. // tab切换逻辑
  215. const activeName = ref("first");
  216. const handleClick = (tab, event) => {
  217. // console.log(tab, event);
  218. };
  219. // 意见表单
  220. const flowForm = reactive({
  221. flowKey: "",
  222. tenantType: "",
  223. handleUserId: "",
  224. remark: "",
  225. data: {},
  226. });
  227. const flowRules = reactive({
  228. // remark: [{ required: true, message: "请输入处理意见", trigger: "blur" }],
  229. });
  230. //组件实例
  231. const { proxy } = getCurrentInstance();
  232. const makeDom = ref(null);
  233. const flowFormDom = ref(null);
  234. let dialogVisible = ref(false);
  235. const nextHandleUser = ref([]);
  236. const handleSelectUser = () => {
  237. if (!flowForm.handleUserId) {
  238. return ElMessage({
  239. message: "请选择下一节点处理人!",
  240. type: "info",
  241. });
  242. }
  243. handleSubmit();
  244. };
  245. const handleResult = (res) => {
  246. if (res !== null && res.success) {
  247. skipPage();
  248. } else {
  249. dialogVisible.value = true;
  250. nextHandleUser.value = res.userList;
  251. }
  252. };
  253. // 提交逻辑
  254. const handleSubmit = async (_type) => {
  255. try {
  256. // 调用发起组件的提交事件
  257. const flag = await makeDom.value.handleSubmit();
  258. if (flag) {
  259. flowFormDom.value.validate((valid) => {
  260. if (valid) {
  261. const data = { ...makeDom.value.submitData };
  262. if (flowForm.flowKey == "subscribe_flow") {
  263. data.subscribeDetailList = data.subscribeDetailList.map((x) => ({
  264. bussinessId: x.bussinessId,
  265. count: x.count,
  266. remark: x.remark,
  267. }));
  268. } else if (flowForm.flowKey == "purchase_flow") {
  269. data.purchaseDetailList = data.purchaseDetailList.map((x) => ({
  270. bussinessId: x.bussinessId,
  271. subscribeDetailId: x.id,
  272. count: x.count,
  273. price: x.price,
  274. amount: x.amount,
  275. }));
  276. } else if (flowForm.flowKey == "account_request_funds_flow") {
  277. } else if (flowForm.flowKey == "sales_return_flow") {
  278. } else if (flowForm.flowKey == "refund_flow") {
  279. } else if (flowForm.flowKey == "wdly_apply_purchase") {
  280. data.subscribeDetailList = data.subscribeDetailList.map((x) => ({
  281. bussinessId: x.bussinessId,
  282. count: x.count,
  283. remark: x.remark,
  284. }));
  285. const victoriatouristJson = {
  286. planArrivalTime: data.planArrivalTime,
  287. receiptWarehouseId: data.receiptWarehouseId,
  288. };
  289. data.victoriatouristJson = JSON.stringify(victoriatouristJson);
  290. } else if (flowForm.flowKey == "wdly_purchase") {
  291. data.purchaseDetailList = data.purchaseDetailList.map((x) => ({
  292. bussinessId: x.bussinessId,
  293. subscribeDetailId: x.id,
  294. count: x.count,
  295. price: x.price,
  296. amount: x.amount,
  297. deptId: x.deptId,
  298. }));
  299. const victoriatouristJson = {
  300. isAgreement: data.isAgreement,
  301. paymentMethod: data.paymentMethod,
  302. otherFeeList: data.otherFeeList,
  303. contractCode: data.contractCode,
  304. };
  305. data.victoriatouristJson = JSON.stringify(victoriatouristJson);
  306. } else if (flowForm.flowKey == "sale_quotation_flow") {
  307. if (flowForm.tenantType === "EHSD") {
  308. data.ehsdJson = JSON.stringify({
  309. deliveryTime: data.deliveryTime,
  310. });
  311. data.quotationProductList = data.quotationProductList.map(
  312. (item) => {
  313. let ehsdJson = JSON.stringify({
  314. packMethod: item.packMethod,
  315. tradeMethods: item.tradeMethods,
  316. });
  317. return {
  318. ...item,
  319. ehsdJson: ehsdJson,
  320. };
  321. }
  322. );
  323. }
  324. } else if (flowForm.flowKey == "contract_flow") {
  325. if (flowForm.tenantType === "EHSD") {
  326. if (data.fileList && data.fileList.length > 0) {
  327. data.fileList = data.fileList.map((item) => {
  328. return {
  329. id: item.raw.id,
  330. fileName: item.raw.fileName,
  331. fileUrl: item.raw.fileUrl,
  332. };
  333. });
  334. } else {
  335. data.fileList = [];
  336. }
  337. if (data.packageFileList && data.packageFileList.length > 0) {
  338. data.packageFileList = data.packageFileList.map((item) => {
  339. return {
  340. id: item.raw.id,
  341. fileName: item.raw.fileName,
  342. fileUrl: item.raw.fileUrl,
  343. };
  344. });
  345. } else {
  346. data.packageFileList = [];
  347. }
  348. data.ehsdJson = JSON.stringify({
  349. deliveryTime: data.deliveryTime,
  350. });
  351. data.contractProductList = data.contractProductList.map(
  352. (item) => {
  353. let ehsdJson = JSON.stringify({
  354. packMethod: item.packMethod,
  355. tradeMethods: item.tradeMethods,
  356. });
  357. return {
  358. ...item,
  359. ehsdJson: ehsdJson,
  360. };
  361. }
  362. );
  363. }
  364. } else if (flowForm.flowKey == "sample_flow") {
  365. if (data.fileList && data.fileList.length > 0) {
  366. data.fileList = data.fileList.map((item) => {
  367. return {
  368. id: item.raw.id,
  369. fileName: item.raw.fileName,
  370. fileUrl: item.raw.fileUrl,
  371. };
  372. });
  373. } else {
  374. data.fileList = [];
  375. }
  376. if (data.packageFileList && data.packageFileList.length > 0) {
  377. data.packageFileList = data.packageFileList.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.packageFileList = [];
  386. }
  387. data.ehsdJson = JSON.stringify({
  388. deliveryTime: data.deliveryTime,
  389. });
  390. data.sampleProductList = data.sampleProductList.map((item) => {
  391. let ehsdJson = JSON.stringify({
  392. packMethod: item.packMethod,
  393. tradeMethods: item.tradeMethods,
  394. });
  395. return {
  396. ...item,
  397. ehsdJson: ehsdJson,
  398. };
  399. });
  400. }
  401. if (route.query.processType == 10) {
  402. proxy
  403. .post("/flowProcess/jump", {
  404. ...flowForm,
  405. data,
  406. handleType: _type,
  407. version: route.query.version,
  408. flowId: route.query.id,
  409. })
  410. .then((res) => {
  411. handleResult(res);
  412. });
  413. return;
  414. } else {
  415. proxy
  416. .post("/flowProcess/initiate", {
  417. ...flowForm,
  418. data,
  419. })
  420. .then((res) => {
  421. handleResult(res);
  422. });
  423. }
  424. }
  425. });
  426. }
  427. } catch (err) {
  428. console.log("数据未填完整!", err);
  429. }
  430. };
  431. // 页面跳转
  432. const skipPage = () => {
  433. if (route.query.processType === 10) {
  434. router.replace({
  435. path: "/oa/1/dealWith",
  436. });
  437. } else {
  438. const useTagsStore = useTagsViewStore();
  439. console.log(useTagsStore);
  440. useTagsStore.delVisitedView(router.currentRoute.value);
  441. ElMessage({
  442. message: "操作成功!",
  443. type: "success",
  444. });
  445. if (flowForm.flowKey == "subscribe_flow") {
  446. router.replace({
  447. path: "/ERP/purchaseManage/subscribe",
  448. });
  449. } else if (flowForm.flowKey == "purchase_flow") {
  450. router.replace({
  451. path: "/ERP/purchaseManage/purchase",
  452. });
  453. } else if (flowForm.flowKey == "sales_return_flow") {
  454. router.replace({
  455. path: "/ERP/purchaseManage/returnGoods",
  456. });
  457. } else if (flowForm.flowKey == "account_request_funds_flow") {
  458. router.replace({
  459. path: "/ERP/fundManage/funds",
  460. });
  461. } else if (flowForm.flowKey == "refund_flow") {
  462. router.replace({
  463. path: "/ERP/purchasePayment/invoice",
  464. });
  465. } else if (flowForm.flowKey == "pay_flow") {
  466. router.replace({
  467. path: "/ERP/purchasePayment/payment",
  468. });
  469. } else if (flowForm.flowKey == "sale_quotation_flow") {
  470. if (flowForm.tenantType === "EHSD") {
  471. router.replace({
  472. path: "/EHSD/saleContract/priceSheetEHSD",
  473. });
  474. } else {
  475. router.replace({
  476. path: "/ERP/saleContract/priceSheet",
  477. });
  478. }
  479. } else if (flowForm.flowKey == "contract_flow") {
  480. if (flowForm.tenantType === "EHSD") {
  481. router.replace({
  482. path: "/EHSD/saleContract/contractEHSD",
  483. });
  484. } else {
  485. router.replace({
  486. path: "/ERP/saleContract/contract",
  487. });
  488. }
  489. } else if (flowForm.flowKey == "sample_flow") {
  490. router.replace({
  491. path: "/EHSD/saleContract/sampleEHSD",
  492. });
  493. } else if (flowForm.flowKey == "ehsd_purchase_flow") {
  494. router.replace({
  495. path: "/EHSD/procurement/purchasedEHSD",
  496. });
  497. } else if (flowForm.flowKey == "service_contract_flow") {
  498. router.replace({
  499. path: "/ERP/saleContract/serviceContract",
  500. });
  501. } else if (flowForm.flowKey == "wdly_purchase") {
  502. router.replace({
  503. path: "/WDLY/purchaseManage/alreadyPurchase_wdly",
  504. });
  505. } else if (flowForm.flowKey == "wdly_apply_purchase") {
  506. router.replace({
  507. path: "/WDLY/purchaseManage/subscribe_wdly",
  508. });
  509. }
  510. }
  511. };
  512. let queryData = reactive({
  513. data: {},
  514. });
  515. // 记录
  516. const recordList = ref([]);
  517. const approvalRecordData = ref({
  518. buttonInfoList: [],
  519. });
  520. const getRecords = (_id) => {
  521. if (_id) {
  522. proxy
  523. .post("/flowExample/getApprovalRecord", {
  524. id: _id,
  525. })
  526. .then((res) => {
  527. console.log(res, "ass");
  528. recordList.value = res.recordList;
  529. approvalRecordData.value = res;
  530. });
  531. } else {
  532. proxy
  533. .post("/flowExample/getFlowNode", {
  534. flowKey: flowForm.flowKey,
  535. })
  536. .then((res) => {
  537. console.log(res, "ass");
  538. recordList.value = res;
  539. });
  540. }
  541. };
  542. onMounted(() => {
  543. //processType 10 为修改 20为查看
  544. if (route.query.processType == 10 || route.query.processType == 20) {
  545. proxy
  546. .post("/flowProcess/getStartData", { flowId: route.query.id })
  547. .then((res) => {
  548. queryData.data = { ...res };
  549. });
  550. } else {
  551. queryData.data = { ...route.query };
  552. }
  553. flowForm.flowKey = route.query.flowKey;
  554. flowForm.tenantType = route.query.tenantType;
  555. getRecords(route.query.id);
  556. });
  557. </script>
  558. <style lang="scss" scoped>
  559. .processApproval {
  560. display: flex;
  561. justify-content: space-between;
  562. margin-top: 20px;
  563. padding: 0 20px;
  564. height: calc(100vh - 130px);
  565. .left-card {
  566. // background: #fff;
  567. border-radius: 4px;
  568. // padding: 20px;
  569. flex: 1;
  570. margin-right: 20px;
  571. display: flex;
  572. flex-direction: column;
  573. .top {
  574. flex: 1;
  575. overflow-y: auto;
  576. background: #fff;
  577. padding: 20px 20px 0px 20px;
  578. }
  579. .bottom {
  580. margin-top: 10px;
  581. height: 170px;
  582. background: #fff;
  583. padding: 20px 20px 0px 20px;
  584. }
  585. }
  586. .right-card {
  587. background: #fff;
  588. border-radius: 4px;
  589. padding: 0 20px 20px;
  590. width: 600px;
  591. box-sizing: border-box;
  592. .flow-chart {
  593. overflow: auto;
  594. height: calc(100vh - 200px);
  595. padding: 0;
  596. margin: 0;
  597. li {
  598. margin: 0;
  599. padding: 0 0 20px;
  600. list-style: none;
  601. display: flex;
  602. justify-content: space-between;
  603. position: relative;
  604. .right-conetnt {
  605. flex: 1;
  606. .name {
  607. font-size: 12px;
  608. color: #39c55a;
  609. margin-bottom: 10px;
  610. span {
  611. color: #999;
  612. }
  613. }
  614. .time {
  615. float: right;
  616. }
  617. .remark {
  618. padding: 10px;
  619. color: #666666;
  620. font-size: 12px;
  621. background: #f1f1f1;
  622. border-radius: 2px;
  623. .label {
  624. color: #999;
  625. margin-bottom: 10px;
  626. }
  627. }
  628. }
  629. .left-icon {
  630. width: 40px;
  631. height: 40px;
  632. text-align: center;
  633. line-height: 40px;
  634. background: #0084ff;
  635. border-radius: 10px;
  636. color: #fff;
  637. font-size: 20px;
  638. position: relative;
  639. margin-right: 27px;
  640. z-index: 2;
  641. .right-btm-status {
  642. position: absolute;
  643. bottom: 0px;
  644. right: -10px;
  645. height: 20px;
  646. width: 20px;
  647. line-height: 16px;
  648. border-radius: 10px;
  649. background: #39c55a;
  650. border: 2px solid #fff;
  651. font-size: 12px;
  652. box-sizing: border-box;
  653. }
  654. }
  655. }
  656. li::before {
  657. content: "";
  658. position: absolute;
  659. top: 0;
  660. left: 20px;
  661. width: 2px;
  662. height: 100%;
  663. background: #ddd;
  664. z-index: 1;
  665. }
  666. li:last-child::before {
  667. display: none;
  668. }
  669. .flow-orange {
  670. .right-btm-status {
  671. background: #ff9a00 !important;
  672. }
  673. .name {
  674. color: #ff9a00 !important;
  675. }
  676. .left-icon {
  677. background: #ff9a00 !important;
  678. }
  679. }
  680. .flow-grey {
  681. .right-btm-status {
  682. background: #999 !important;
  683. }
  684. .name {
  685. color: #999 !important;
  686. }
  687. .left-icon {
  688. background: #999 !important;
  689. }
  690. }
  691. .flow-red {
  692. .right-btm-status {
  693. background: #ff4d4f !important;
  694. }
  695. .name {
  696. color: #ff4d4f !important;
  697. }
  698. .left-icon {
  699. background: #ff4d4f !important;
  700. }
  701. }
  702. }
  703. }
  704. }
  705. </style>