【vue2+Flowable工作流,审批流前端展示组件】

饭宝  金牌会员 | 2024-8-15 21:01:14 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 576|帖子 576|积分 1728

概要

vue2+Flowable工作流,审批流前端展示组件。
团体架构流程

  vue2版本展示组件封装,vue3会出
技术细节

  通过父组件传流程展示需要的各种参数,可根据自己使用流程组件举行对应。
实现结果:

1.父组件代码
  1.    <ApprovalProcess
  2.         :tasks-data="tasksData"
  3.         :start-user="startUser"
  4.         :start-time="startTime"
  5.         process-definition-key="appropriate_reporting"
  6.         :add-form-flow-data="addFormFlowData"
  7.         :approval-flow-status="approvalFlowStatus"
  8.         :process-instance-id="processInstanceId"
  9.         is-history="false"
  10.       />
  11.       import ApprovalProcess from '../components/ApprovalProcess.vue'
  12.   components: {
  13.     ApprovalProcess,
  14.     ColumnTip
  15.   },
复制代码
关键参数approvalFlowStatus,字典里可设置不同审批状态,转达的参数都是工作流中存在的字段
2.子组件代码
  1. <template>
  2.   <div class="history-container">
  3.     <!-- 审批流程、历史审批弹框内容 -->
  4.     <div class="approval-flow">
  5.       <div v-if="isHistory == 'true' ? false : true" class="flow-label">
  6.         审批流程
  7.       </div>
  8.       <div class="flow-box">
  9.         <!-- 待提交状态 -->
  10.         <el-timeline v-if="approvalFlowStatus == 0">
  11.           <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
  12.             <div class="add-line-name">发起</div>
  13.             <label
  14.               v-if="startUser"
  15.               style="color: black; font-weight: normal; margin-right: 30px"
  16.             >
  17.               {{ startUser.nickname }}
  18.               <span>/</span>
  19.               {{ startUser.deptName }}
  20.             </label>
  21.             <p style="color: #ffc600">待提交</p>
  22.           </el-timeline-item>
  23.           <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
  24.             <div class="add-line-name">企业审核</div>
  25.             <label
  26.               v-for="(item, index) in addFormFlowDataS.qyUserList"
  27.               :key="index"
  28.               style="font-weight: 400; color: black; margin-right: 30px"
  29.             >
  30.               {{ item.nickname }}
  31.               <span>/</span>
  32.               {{ item.deptName }}
  33.             </label>
  34.             <p style="color: #ffc600">待审批</p>
  35.           </el-timeline-item>
  36.           <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
  37.             <div class="add-line-name">经办人</div>
  38.             <label
  39.               v-for="(item, index) in addFormFlowDataS.gzUserList"
  40.               :key="index"
  41.               style="font-weight: 400; color: black; margin-right: 30px"
  42.             >
  43.               {{ item.nickname }}
  44.               <span>/</span>
  45.               {{ item.deptName }}
  46.             </label>
  47.             <p style="color: #ffc600">待审批</p>
  48.           </el-timeline-item>
  49.           <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
  50.             <div class="add-line-name">领导审核</div>
  51.             <label
  52.               v-for="(item, index) in addFormFlowDataS.gzldUserList"
  53.               :key="index"
  54.               style="font-weight: 400; color: black; margin-right: 30px"
  55.             >
  56.               {{ item.nickname }}
  57.               <span>/</span>
  58.               {{ item.deptName }}
  59.             </label>
  60.             <p style="color: #ffc600">待审批</p>
  61.           </el-timeline-item>
  62.           <el-timeline-item style="margin-left: 60px">
  63.             <div class="add-line-name">结束</div>
  64.           </el-timeline-item>
  65.         </el-timeline>
  66.         <!-- 待审批 -->
  67.         <el-timeline v-if="approvalFlowStatus == 1">
  68.           <el-timeline-item icon="el-icon-check" type="success">
  69.             <div class="add-line-name">发起</div>
  70.             <label
  71.               v-if="startUser"
  72.               style="color: black; font-weight: 400; margin-right: 30px"
  73.             >
  74.               {{ startUser.nickname }}
  75.               <span>/</span>
  76.               {{ startUser.deptName }}
  77.             </label>
  78.             <label
  79.               v-if="startTime"
  80.               style="font-weight: normal; font-weight: 400"
  81.             >{{ parseTime(startTime ? startTime : '') }}</label>
  82.             <p style="color: #13ce66">已提交</p>
  83.           </el-timeline-item>
  84.           <el-timeline-item
  85.             v-for="(task, index) in tasksData"
  86.             :key="index"
  87.             :color="task.timeLineCorlor"
  88.             :type="task.result ? task.istype : ''"
  89.           >
  90.             <div class="add-line-name">
  91.               {{ task.name }}
  92.             </div>
  93.             <label
  94.               v-if="task.result === 2 && task.assigneeUser.nickname"
  95.               style="color: black; font-weight: normal; margin-right: 30px"
  96.             >
  97.               {{ task.assigneeUser.nickname }}
  98.               <span v-if="task.assigneeUser.deptName">/</span>
  99.               {{ task.assigneeUser.deptName }}
  100.             </label>
  101.             <div
  102.               v-else-if="task.result === 1 || task.assigneeUser == null"
  103.               style="
  104.                 display: block;
  105.                 color: black;
  106.                 font-weight: normal;
  107.                 margin-right: 30px;
  108.               "
  109.             >
  110.               {{ task.assigneeUser.nickname }}
  111.               <span v-if="task.assigneeUser.deptName">/</span>
  112.               {{ task.assigneeUser.deptName }}
  113.             </div>
  114.             <p v-if="task.name" style="color: #ffc600">待审批</p>
  115.           </el-timeline-item>
  116.           <el-timeline-item>
  117.             <div class="add-line-name">结束</div>
  118.           </el-timeline-item>
  119.         </el-timeline>
  120.         <!-- 审批中 -->
  121.         <el-timeline v-if="approvalFlowStatus == 7">
  122.           <el-timeline-item icon="el-icon-check" type="success">
  123.             <div class="add-line-name">发起</div>
  124.             <label
  125.               v-if="startUser"
  126.               style="font-weight: normal; margin-right: 30px"
  127.             >
  128.               {{ startUser.nickname }}
  129.               <span>/</span>
  130.               {{ startUser.deptName }}
  131.             </label>
  132.             <label v-if="startTime" style="color: black; font-weight: 400">{{
  133.               parseTime(startTime)
  134.             }}</label>
  135.             <p style="color: #13ce66">已提交</p>
  136.           </el-timeline-item>
  137.           <el-timeline-item
  138.             v-for="(task, index) in tasksData"
  139.             :key="index"
  140.             :color="task.timeLineCorlor"
  141.             :icon="task.ischeck"
  142.             :type="task.istype"
  143.           >
  144.             <div v-if="task.name" class="add-line-name">
  145.               {{ task.name }}
  146.             </div>
  147.             <label
  148.               v-if="
  149.                 task &&
  150.                   task.assigneeUser &&
  151.                   task.assigneeUser.nickname &&
  152.                   task.endTime
  153.               "
  154.               style="color: black; font-weight: normal; margin-right: 30px"
  155.             >
  156.               {{ task.assigneeUser.nickname }}
  157.               <span
  158.                 v-if="task && task.assigneeUser && task.assigneeUser.deptName"
  159.               >/</span>
  160.               {{ task.assigneeUser.deptName }}
  161.             </label>
  162.             <div
  163.               v-else-if="task.result == 1"
  164.               style="
  165.                 display: block;
  166.                 color: black;
  167.                 font-weight: normal;
  168.                 margin-right: 30px;
  169.               "
  170.                v-for="(item, index) in task.assigneeUserList"
  171.             >
  172.               {{ item.nickname }}
  173.               <span>/</span>
  174.               {{ item.deptName }}
  175.             </div>
  176.             <label
  177.               v-if="task && task.endTime"
  178.               style="color: black; font-weight: normal"
  179.             >
  180.               {{ parseTime(task.endTime) }}
  181.             </label>
  182.             <p v-if="task.endTime" style="color: #13ce66">已通过</p>
  183.             <p v-if="!task.endTime" style="color: #ffc600">待审批</p>
  184.           </el-timeline-item>
  185.           <el-timeline-item>
  186.             <div class="add-line-name">结束</div>
  187.           </el-timeline-item>
  188.         </el-timeline>
  189.         <!-- 已完结 -->
  190.         <el-timeline v-if="approvalFlowStatus == 2">
  191.           <el-timeline-item icon="el-icon-check" type="success">
  192.             <div class="add-line-name">发起</div>
  193.             <label
  194.               v-if="startUser"
  195.               style="color: black; font-weight: normal; margin-right: 30px"
  196.             >
  197.               {{ startUser.nickname }}
  198.               <span>/</span>
  199.               {{ startUser.deptName }}
  200.             </label>
  201.             <label v-if="startTime" style="font-weight: 400">{{
  202.               parseTime(startTime)
  203.             }}</label>
  204.             <p style="color: #13ce66">已提交</p>
  205.           </el-timeline-item>
  206.           <el-timeline-item icon="el-icon-check" type="success">
  207.             <div v-if="tasksData[0] && tasksData[0].name" class="add-line-name">
  208.               {{ tasksData[0].name }}
  209.             </div>
  210.             <label
  211.               v-if="tasksData[0] && tasksData[0].assigneeUser.nickname"
  212.               style="font-weight: normal; margin-right: 30px"
  213.             >
  214.               {{ tasksData[0].assigneeUser.nickname }}
  215.               <span v-if="tasksData[0].assigneeUser.deptName">/</span>
  216.               {{ tasksData[0].assigneeUser.deptName }}
  217.             </label>
  218.             <label
  219.               v-if="tasksData[0] && tasksData[0].endTime"
  220.               style="font-weight: normal"
  221.             >{{ parseTime(tasksData[0].endTime) }}</label>
  222.             <p style="color: #13ce66">已通过</p>
  223.           </el-timeline-item>
  224.           <el-timeline-item icon="el-icon-check" type="success">
  225.             <div v-if="tasksData[1] && tasksData[1].name" class="add-line-name">
  226.               {{ tasksData[1].name }}
  227.             </div>
  228.             <label
  229.               v-if="tasksData[1] && tasksData[1].assigneeUser.nickname"
  230.               style="font-weight: normal; margin-right: 30px"
  231.             >
  232.               {{ tasksData[1].assigneeUser.nickname }}
  233.               <span v-if="tasksData[1].assigneeUser.deptName">/</span>
  234.               {{ tasksData[1].assigneeUser.deptName }}
  235.             </label>
  236.             <label
  237.               v-if="tasksData[1] && tasksData[1].endTime"
  238.               style="font-weight: normal"
  239.             >{{ parseTime(tasksData[1].endTime) }}</label>
  240.             <p style="color: #13ce66">已通过</p>
  241.           </el-timeline-item>
  242.           <el-timeline-item icon="el-icon-check" type="success">
  243.             <div v-if="tasksData[2] && tasksData[2].name" class="add-line-name">
  244.               {{ tasksData[2].name }}
  245.             </div>
  246.             <label
  247.               v-if="tasksData[2] && tasksData[2].assigneeUser.nickname"
  248.               style="font-weight: normal; margin-right: 30px"
  249.             >
  250.               {{ tasksData[2].assigneeUser.nickname }}
  251.               <span v-if="tasksData[2].assigneeUser.deptName">/</span>
  252.               {{ tasksData[2].assigneeUser.deptName }}
  253.             </label>
  254.             <label
  255.               v-if="tasksData[2] && tasksData[2].endTime"
  256.               style="font-weight: normal"
  257.             >{{ parseTime(tasksData[2].endTime) }}</label>
  258.             <p style="color: #13ce66">已通过</p>
  259.           </el-timeline-item>
  260.           <el-timeline-item icon="el-icon-check" type="success">
  261.             <div class="add-line-name">结束</div>
  262.             <label>
  263.               <span
  264.                 style="
  265.                   display: inline-block;
  266.                   color: #13ce66;
  267.                   margin-right: 30px;
  268.                 "
  269.               >已完结</span>
  270.             </label>
  271.             <!-- <span v-if="tasksData[1] && tasksData[1].endTime">{{
  272.               parseTime(tasksData[1].endTime)
  273.             }}</span> -->
  274.           </el-timeline-item>
  275.         </el-timeline>
  276.         <!-- 退回流程状态 -->
  277.         <el-timeline v-if="approvalFlowStatus == 3">
  278.           <el-timeline-item icon="el-icon-check" type="success">
  279.             <div class="add-line-name">发起</div>
  280.             <label
  281.               v-if="startUser"
  282.               style="color: black; font-weight: normal; margin-right: 30px"
  283.             >
  284.               {{ startUser.nickname }}
  285.               <span>/</span>
  286.               {{ startUser.deptName }}
  287.             </label>
  288.             <label v-if="startTime" style="font-weight: 400">{{
  289.               parseTime(startTime)
  290.             }}</label>
  291.             <p style="color: #13ce66">已提交</p>
  292.           </el-timeline-item>
  293.           <el-timeline-item
  294.             v-for="(task, index) in tasksData"
  295.             :key="index"
  296.             :color="task.timeLineCorlor"
  297.             :icon="task.ischeck"
  298.             :type="task.istype"
  299.           >
  300.             <div v-if="task.name" class="add-line-name">
  301.               {{ task.name }}
  302.             </div>
  303.             <label
  304.               v-if="task.assigneeUser && task.assigneeUser.nickname"
  305.               style="color: black; font-weight: normal; margin-right: 30px"
  306.             >
  307.               {{ task.assigneeUser.nickname }}
  308.               <span v-if="task.assigneeUser.deptName">/</span>
  309.               {{ task.assigneeUser.deptName }}
  310.             </label>
  311.             <label
  312.               v-if="task.reviewerList && !task.assigneeUser"
  313.               style="color: black; font-weight: normal; margin-right: 30px"
  314.             >
  315.               {{ task.reviewerList[0].nickname }}
  316.               <span v-if="task.reviewerList[0].deptName">/</span>
  317.               {{ task.reviewerList[0].deptName }}
  318.             </label>
  319.             <label
  320.               v-if="task.endTime"
  321.               style="color: black; font-weight: normal"
  322.             >
  323.               {{ parseTime(task.endTime) }}
  324.             </label>
  325.             <p
  326.               v-if="task.assigneeUser"
  327.               style="color: #13ce66; font-weight: normal"
  328.             >
  329.               {{ task.result == 2 ? '已通过' : '' }}
  330.             </p>
  331.             <p v-if="task.assigneeUser" style="color: red; font-weight: normal">
  332.               {{
  333.                 task.result === 3 ? '已退回' : task.result === 4 ? '已撤回' : ''
  334.               }}
  335.               <span v-if="task.reason" style="margin-left: 20px">
  336.                 <span>{{ task.reason }}</span>
  337.               </span>
  338.             </p>
  339.           </el-timeline-item>
  340.           <el-timeline-item>
  341.             <div class="add-line-name">结束</div>
  342.             <!-- <label>
  343.               <span
  344.                 style="
  345.                   display: inline-block;
  346.                   color: red;
  347.                   margin-right: 30px;
  348.                 "
  349.                 >已完结</span
  350.               >
  351.             </label> -->
  352.             <!-- <span v-if="tasksData[1] && tasksData[1].endTime">{{
  353.               parseTime(tasksData[1].endTime)
  354.             }}</span> -->
  355.           </el-timeline-item>
  356.         </el-timeline>
  357.       </div>
  358.     </div>
  359.   </div>
  360. </template>
  361. <script>
  362. export default {
  363.   name: 'ApprovalProcess',
  364.   props: {
  365.     startUser: {
  366.       type: Object
  367.     },
  368.     createTime: {
  369.       type: String,
  370.       default: ''
  371.     },
  372.     startTime: {
  373.       type: Number,
  374.       default: null
  375.     },
  376.     isHistory: {
  377.       type: String,
  378.       default: ''
  379.     },
  380.     approvalFlowStatus: {
  381.       // 审批流程状态
  382.     },
  383.     addFormFlowData: {
  384.       // 表单的数据
  385.     },
  386.     processDefinitionKey: {
  387.       type: String,
  388.       default: `appropriate_reporting1` // decision_matter
  389.     },
  390.     tasksData: {
  391.       type: Array,
  392.       default: () => []
  393.     }
  394.   },
  395.   data() {
  396.     return {
  397.       reviewerList: [], // 流程审批人列表
  398.       // 审批流程激活的tab标签
  399.       activeName: 'first',
  400.       timeLineCorlor: '',
  401.       ischeck: '',
  402.       addFormFlowDataS: {}
  403.     }
  404.   },
  405.   computed: {
  406.     labelName() {
  407.       return this.isHistory == 'true' ? '(历史审批)集团' : '集团'
  408.     }
  409.   },
  410.   watch: {
  411.     addFormFlowData: {
  412.       immediate: true, // 第一次进入页面时也触发
  413.       handler(newData) {
  414.         // console.log(newData)
  415.         // 子组件接收到新的属性值时执行的逻辑
  416.         this.addFormFlowDataS = newData
  417.       }
  418.     },
  419.     tasksData(val) {
  420.       // console.log(val)
  421.       this.getTimelineColor(val)
  422.     },
  423.     startUser: {
  424.       deep: true,
  425.       handler(val) {
  426.         return val
  427.       }
  428.     }
  429.   },
  430.   created() {},
  431.   mounted() {
  432.     // console.log(`this.tasksData`, this.tasksData)
  433.   },
  434.   methods: {
  435.     getTimelineColor(isTasksData) {
  436.       // console.log(`isTasksData`, isTasksData)
  437.       isTasksData.forEach((item, index) => {
  438.         // 判断每一项的endTime是否有值
  439.         if (item.endTime && item.result === 2) {
  440.           item.timeLineCorlor = '#13ce66'
  441.           item.ischeck = 'el-icon-check'
  442.           item.istype = 'success'
  443.         }
  444.         if (
  445.           item.result === 7 ||
  446.           item.result === 1 ||
  447.           item.assigneeUser == null
  448.         ) {
  449.           item.timeLineCorlor = '#ffc600'
  450.           item.ischeck = ''
  451.           item.istype = ''
  452.         }
  453.         if (item.result === 3 || item.result === 4) {
  454.           item.timeLineCorlor = 'red'
  455.           item.ischeck = ''
  456.           item.istype = ''
  457.         }
  458.         if (item.result == null) {
  459.           item.timeLineCorlor = ''
  460.           item.ischeck = ''
  461.           item.istype = ''
  462.           isTasksData.splice(index, 1)
  463.         }
  464.       })
  465.       return isTasksData
  466.     }
  467.   }
  468. }
  469. </script>
  470. <style scoped>
  471. .approval-flow {
  472.   display: flex;
  473. }
  474. .history-container .flow-label {
  475.   width: 140px;
  476.   padding-top: 10px;
  477.   display: flex;
  478.   justify-content: flex-end;
  479.   /* font-weight: 700; */
  480. }
  481. .flow-box {
  482.   margin-left: 20px;
  483.   width: 645px;
  484.   min-height: 330px;
  485.   height: auto;
  486. }
  487. .history-container /deep/ .el-timeline {
  488.   padding-left: 37px;
  489.   padding-top: 10px;
  490. }
  491. .history-container /deep/ .el-timeline-item {
  492.   min-height: 60px;
  493.   height: auto;
  494. }
  495. .line-name {
  496.   position: absolute;
  497.   left: -35px;
  498.   top: -1px;
  499.   color: #aaa;
  500. }
  501. .add-line-name {
  502.   width: 100px;
  503.   position: absolute;
  504.   text-align: right;
  505.   left: -110px;
  506.   font-weight: normal;
  507.   top: 0px;
  508.   color: #aaa;
  509. }
  510. </style>
复制代码
可根据后台数据举行得当修改,已适配待提交状态/待审批/审批中/已完结/退回等流程
小结

自己使用过程中遇到的场景,可自己修改样式在ColumnTip使用。
代码案例:
父组件
  1.   <el-table-column
  2.                 label="流程状态"
  3.                 align="center"
  4.                 prop="apply.status"
  5.               >
  6.                 <template slot-scope="scope">
  7.                   <el-tooltip placement="bottom">
  8.                     <div slot="content">
  9.                       <ColumnTip
  10.                         :tasks-data="tasksData"
  11.                         :start-user="startUser"
  12.                         :start-time="startTime"
  13.                         :approval-level="approvalLevel"
  14.                         :reject-level="rejectLevel"
  15.                         :add-form-flow-data="addFormFlowData"
  16.                         :approval-flow-status="approvalFlowStatus"
  17.                         :process-instance-id="scope.row.processInstanceId"
  18.                       />
  19.                     </div>
  20.                     <div
  21.                       @mouseenter="
  22.                         (e) => {
  23.                           handleClick(scope.row.apply, e)
  24.                         }
  25.                       "
  26.                     >
  27.                       <dict-tag
  28.                         :type="DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS"
  29.                         :value="scope.row.apply.status"
  30.                       />
  31.                     </div>
  32.                   </el-tooltip>
  33.                 </template>
  34.               </el-table-column>
  35.       import ColumnTip from '../components/ColumnTip.vue'        
  36.   components: {
  37.     ApprovalProcess,
  38.     ColumnTip
  39.   },
复制代码
子组件代码
  1. <template>
  2.   <div class="history-container">
  3.     <!-- 状态栏tips内容 -->
  4.     <div class="flow-box">
  5.       <!-- 待提交状态 -->
  6.       <el-timeline v-if="approvalFlowStatus == 0">
  7.         <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
  8.           <div class="add-line-name">发起</div>
  9.           <label
  10.             v-for="(item, index) in addFormFlowDataS.startUserList"
  11.             :key="index"
  12.             style="color: #fff; font-weight: 500; margin-right: 30px"
  13.           >
  14.             {{ item.nickname }}
  15.             <span>/</span>
  16.             {{ item.deptName }}
  17.           </label>
  18.           <p style="color: #ffc600">待提交</p>
  19.         </el-timeline-item>
  20.         <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
  21.           <div class="add-line-name">企业审核</div>
  22.           <label
  23.             v-for="(item, index) in addFormFlowDataS.qyUserList"
  24.             :key="index"
  25.             style="color: #fff; font-weight: 500; margin-right: 30px"
  26.           >
  27.             {{ item.nickname }}
  28.             <span>/</span>
  29.             {{ item.deptName }}
  30.           </label>
  31.           <p style="color: #ffc600">待审批</p>
  32.         </el-timeline-item>
  33.         <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
  34.           <div class="add-line-name">经办人</div>
  35.           <label
  36.             v-for="(item, index) in addFormFlowDataS.gzUserList"
  37.             :key="index"
  38.             style="color: #fff; font-weight: 500; margin-right: 30px"
  39.           >
  40.             {{ item.nickname }}
  41.             <span>/</span>
  42.             {{ item.deptName }}
  43.           </label>
  44.           <p style="color: #ffc600">待审批</p>
  45.         </el-timeline-item>
  46.         <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
  47.           <div class="add-line-name">领导审核</div>
  48.           <label
  49.             v-for="(item, index) in addFormFlowDataS.gzldUserList"
  50.             :key="index"
  51.             style="color: #fff; font-weight: 500; margin-right: 30px"
  52.           >
  53.             {{ item.nickname }}
  54.             <span>/</span>
  55.             {{ item.deptName }}
  56.           </label>
  57.           <p style="color: #ffc600">待审批</p>
  58.         </el-timeline-item>
  59.         <el-timeline-item style="margin-left: 60px">
  60.           <div class="add-line-name">结束</div>
  61.         </el-timeline-item>
  62.       </el-timeline>
  63.       <!-- 待审批 -->
  64.       <el-timeline v-if="approvalFlowStatus == 1">
  65.         <el-timeline v-if="approvalFlowStatus == 1 && tasksData.length > 0">
  66.           <el-timeline-item
  67.             style="margin-left: 60px"
  68.             icon="el-icon-check"
  69.             type="success"
  70.           >
  71.             <div class="add-line-name">发起</div>
  72.             <label
  73.               v-if="startUser"
  74.               style="color: #fff; font-weight: 500; margin-right: 30px"
  75.             >
  76.               {{ startUser.nickname }}
  77.               <span>/</span>
  78.               {{ startUser.deptName }}
  79.             </label>
  80.             <label
  81.               v-if="tasksData[0] && tasksData[0].createTime"
  82.               style="color: #fff; font-weight: normal"
  83.             >{{ parseTime(tasksData[0].createTime) }}</label>
  84.             <p style="color: #13ce66">已提交</p>
  85.           </el-timeline-item>
  86.           <el-timeline-item
  87.             v-for="(task, index) in tasksData"
  88.             :key="index"
  89.             style="margin-left: 60px"
  90.             :color="task.timeLineCorlor"
  91.             :type="task.result ? task.istype : ''"
  92.           >
  93.             <div class="add-line-name">
  94.               {{ task.name }}
  95.             </div>
  96.             <label
  97.               v-if="task.result === 2 && task.assigneeUser.nickname"
  98.               style="color: #fff; font-weight: normal; margin-right: 30px"
  99.             >
  100.               {{ task.assigneeUser.nickname }}
  101.               <span v-if="task.assigneeUser.deptName">/</span>
  102.               {{ task.assigneeUser.deptName }}
  103.             </label>
  104.             <div
  105.               v-else-if="task.result === 1 || task.assigneeUser == null"
  106.               style="
  107.                 display: block;
  108.                 color: #fff;
  109.                 font-weight: normal;
  110.                 margin-right: 30px;
  111.               "
  112.             >
  113.               {{ task.assigneeUser.nickname }}
  114.               <span v-if="task.assigneeUser.deptName">/</span>
  115.               {{ task.assigneeUser.deptName }}
  116.             </div>
  117.             <p v-if="task.name" style="color: #ffc600">待审批</p>
  118.           </el-timeline-item>
  119.           <el-timeline-item style="margin-left: 60px">
  120.             <div class="add-line-name">结束</div>
  121.           </el-timeline-item>
  122.         </el-timeline>
  123.       </el-timeline>
  124.       <!-- 审批中 -->
  125.       <el-timeline v-if="approvalFlowStatus == 7 && addFormFlowData != {}">
  126.         <el-timeline-item
  127.           style="margin-left: 60px"
  128.           icon="el-icon-check"
  129.           type="success"
  130.         >
  131.           <div class="add-line-name">发起</div>
  132.           <label
  133.             v-if="startUser"
  134.             style="color: #fff; font-weight: 500; margin-right: 30px"
  135.           >
  136.             {{ startUser.nickname }}
  137.             <span>/</span>
  138.             {{ startUser.deptName }}
  139.           </label>
  140.           <label
  141.             v-if="tasksData[0] && tasksData[0].createTime"
  142.             style="color: #fff; font-weight: normal"
  143.           >{{ parseTime(tasksData[0].createTime) }}</label>
  144.           <p style="color: #13ce66">已提交</p>
  145.         </el-timeline-item>
  146.         <el-timeline-item
  147.           v-for="(task, index) in tasksData"
  148.           :key="index"
  149.           style="margin-left: 60px"
  150.           :color="task.timeLineCorlor"
  151.           :icon="task.ischeck"
  152.           :type="task.istype"
  153.         >
  154.           <div v-if="task.name" class="add-line-name">
  155.             {{ task.name }}
  156.           </div>
  157.           <label
  158.             v-if="
  159.               task &&
  160.                 task.assigneeUser &&
  161.                 task.assigneeUser.nickname &&
  162.                 task.endTime
  163.             "
  164.             style="color: #fff; font-weight: normal; margin-right: 30px"
  165.           >
  166.             {{ task.assigneeUser.nickname }}
  167.             <span
  168.               v-if="task && task.assigneeUser && task.assigneeUser.deptName"
  169.             >/</span>
  170.             {{ task.assigneeUser.deptName }}
  171.           </label>
  172.           <div
  173.               v-else-if="task.result == 1"
  174.               style="
  175.                 display: block;
  176.                 color: black;
  177.                 font-weight: normal;
  178.                 margin-right: 30px;
  179.                 color: white;
  180.               "
  181.                v-for="(item, index) in task.assigneeUserList"
  182.             >
  183.               {{ item.nickname }}
  184.               <span>/</span>
  185.               {{ item.deptName }}
  186.             </div>
  187.           <label
  188.             v-if="task && task.endTime"
  189.             style="color: #fff; font-weight: normal"
  190.           >
  191.             {{ parseTime(task.endTime) }}
  192.           </label>
  193.           <p v-if="task.endTime" style="color: #13ce66">已通过</p>
  194.           <p v-if="!task.endTime" style="color: #ffc600">待审批</p>
  195.         </el-timeline-item>
  196.         <el-timeline-item style="margin-left: 60px">
  197.           <div class="add-line-name">结束</div>
  198.         </el-timeline-item>
  199.       </el-timeline>
  200.       <!-- 已完结 -->
  201.       <el-timeline v-if="approvalFlowStatus == 2">
  202.         <el-timeline-item
  203.           style="margin-left: 60px"
  204.           icon="el-icon-check"
  205.           type="success"
  206.         >
  207.           <div class="add-line-name">发起</div>
  208.           <label
  209.             v-if="startUser"
  210.             style="color: #fff; font-weight: 500; margin-right: 30px"
  211.           >
  212.             {{ startUser.nickname }}
  213.             <span>/</span>
  214.             {{ startUser.deptName }}
  215.           </label>
  216.           <label
  217.             v-if="startTime"
  218.             style=" color: #fff; font-weight: 400"
  219.           >{{ parseTime(startTime) }}</label>
  220.           <p style="color: #13ce66">已提交</p>
  221.         </el-timeline-item>
  222.         <el-timeline-item
  223.           style="margin-left: 60px"
  224.           icon="el-icon-check"
  225.           type="success"
  226.         >
  227.           <div v-if="tasksData[0] && tasksData[0].name" class="add-line-name">
  228.             {{ tasksData[0].name }}
  229.           </div>
  230.           <label
  231.             v-if="tasksData[0] && tasksData[0].assigneeUser.nickname"
  232.             style="color: #fff; font-weight: normal; margin-right: 35px"
  233.           >
  234.             {{ tasksData[0].assigneeUser.nickname }}
  235.             <span v-if="tasksData[0].assigneeUser.deptName">/</span>
  236.             {{ tasksData[0].assigneeUser.deptName }}
  237.           </label>
  238.           <label
  239.             v-if="tasksData[0] && tasksData[0].endTime"
  240.             style="color: #fff; font-weight: normal"
  241.           >{{ parseTime(tasksData[0].endTime) }}</label>
  242.           <p style="color: #13ce66">已审批</p>
  243.         </el-timeline-item>
  244.         <el-timeline-item
  245.           style="margin-left: 60px"
  246.           icon="el-icon-check"
  247.           type="success"
  248.         >
  249.           <div v-if="tasksData[1] && tasksData[1].name" class="add-line-name">
  250.             {{ tasksData[1].name }}
  251.           </div>
  252.           <label
  253.             v-if="tasksData[1] && tasksData[1].assigneeUser.nickname"
  254.             style="color: #fff; font-weight: normal; margin-right: 40px"
  255.           >
  256.             {{ tasksData[1].assigneeUser.nickname }}
  257.             <span v-if="tasksData[1].assigneeUser.deptName">/</span>
  258.             {{ tasksData[1].assigneeUser.deptName }}
  259.           </label>
  260.           <label
  261.             v-if="tasksData[1] && tasksData[1].endTime"
  262.             style="color: #fff; font-weight: normal"
  263.           >{{ parseTime(tasksData[1].endTime) }}</label>
  264.           <p style="color: #13ce66">已审批</p>
  265.         </el-timeline-item>
  266.         <el-timeline-item
  267.           style="margin-left: 60px"
  268.           icon="el-icon-check"
  269.           type="success"
  270.         >
  271.           <div v-if="tasksData[2] && tasksData[2].name" class="add-line-name">
  272.             {{ tasksData[2].name }}
  273.           </div>
  274.           <label
  275.             v-if="tasksData[2] && tasksData[2].assigneeUser.nickname"
  276.             style="color: #fff; font-weight: normal; margin-right: 12px"
  277.           >
  278.             {{ tasksData[2].assigneeUser.nickname }}
  279.             <span v-if="tasksData[2].assigneeUser.deptName">/</span>
  280.             {{ tasksData[2].assigneeUser.deptName }}
  281.           </label>
  282.           <label
  283.             v-if="tasksData[2] && tasksData[2].endTime"
  284.             style="color: #fff; font-weight: normal"
  285.           >{{ parseTime(tasksData[2].endTime) }}</label>
  286.           <p style="color: #13ce66">已审批</p>
  287.         </el-timeline-item>
  288.         <el-timeline-item
  289.           style="margin-left: 60px"
  290.           icon="el-icon-check"
  291.           type="success"
  292.         >
  293.           <div class="add-line-name">结束</div>
  294.           <label>
  295.             <span
  296.               style="
  297.                 display: inline-block;
  298.                 color: #13ce66;
  299.                 font-weight: 500;
  300.                 margin-right: 30px;
  301.               "
  302.             >已完结</span>
  303.           </label>
  304.           <span v-if="tasksData[1] && tasksData[1].endTime">{{
  305.             parseTime(tasksData[1].endTime)
  306.           }}</span>
  307.         </el-timeline-item>
  308.       </el-timeline>
  309.       <!-- 退回流程状态 -->
  310.       <el-timeline v-if="approvalFlowStatus == 3 && tasksData.length > 0">
  311.         <el-timeline-item
  312.           style="margin-left: 60px"
  313.           icon="el-icon-check"
  314.           type="success"
  315.         >
  316.           <div class="add-line-name">发起</div>
  317.           <label
  318.             v-if="startUser"
  319.             style="color: #fff; font-weight: 500; margin-right: 30px"
  320.           >
  321.             {{ startUser.nickname }}
  322.             <span>/</span>
  323.             {{ startUser.deptName }}
  324.           </label>
  325.           <label
  326.             v-if="tasksData[0] && tasksData[0].createTime"
  327.             style="color: #fff; font-weight: normal"
  328.           >{{ parseTime(tasksData[0].createTime) }}</label>
  329.           <p style="color: #13ce66">已提交</p>
  330.         </el-timeline-item>
  331.         <el-timeline-item
  332.           v-for="(task, index) in tasksData"
  333.           :key="index"
  334.           style="margin-left: 60px"
  335.           :color="task.timeLineCorlor"
  336.           :icon="task.ischeck"
  337.           :type="task.istype"
  338.         >
  339.           <div v-if="task.name" class="add-line-name">
  340.             {{ task.name }}
  341.           </div>
  342.           <label
  343.             v-if="task.assigneeUser && task.assigneeUser.nickname"
  344.             style="color: #fff; font-weight: normal; margin-right: 30px"
  345.           >
  346.             {{ task.assigneeUser.nickname }}
  347.             <span v-if="task.assigneeUser.deptName">/</span>
  348.             {{ task.assigneeUser.deptName }}
  349.           </label>
  350.           <!-- <label
  351.               v-if="task.reviewerList && !task.assigneeUser"
  352.               style="color: #fff; font-weight: normal; margin-right: 30px"
  353.             >
  354.               {{ task.reviewerList[0].nickname }}
  355.               <span v-if="task.reviewerList[0].deptName">/</span>
  356.               {{ task.reviewerList[0].deptName }}
  357.             </label> -->
  358.           <label v-if="task.endTime" style="color: #fff; font-weight: normal">
  359.             {{ parseTime(task.endTime) }}
  360.           </label>
  361.           <p
  362.             v-if="task.assigneeUser"
  363.             style="color: #13ce66; font-weight: normal"
  364.           >
  365.             {{ task.result == 2 ? '已通过' : '' }}
  366.           </p>
  367.           <p v-if="task.assigneeUser" style="color: red; font-weight: normal">
  368.             {{
  369.               task.result === 3 ? '已退回' : task.result === 4 ? '已撤回' : ''
  370.             }}
  371.             <span v-if="task.reason" style="margin-left: 20px">
  372.               <span>{{ task.reason }}</span>
  373.             </span>
  374.           </p>
  375.         </el-timeline-item>
  376.         <el-timeline-item style="margin-left: 60px" :color="'red'">
  377.           <div class="add-line-name">结束</div>
  378.           <label>
  379.             <span
  380.               style="
  381.                 display: inline-block;
  382.                 color: red;
  383.                 font-weight: 500;
  384.                 margin-right: 30px;
  385.               "
  386.             >已退回</span>
  387.           </label>
  388.           <span v-if="tasksData[1] && tasksData[1].endTime">{{
  389.             parseTime(tasksData[1].endTime)
  390.           }}</span>
  391.         </el-timeline-item>
  392.       </el-timeline>
  393.     </div>
  394.   </div>
  395. </template>
  396. <script>
  397. import { getDate } from '@/utils/dateUtils'
  398. export default {
  399.   name: 'ColumnTip',
  400.   props: {
  401.     startUser: {
  402.       type: Object
  403.     },
  404.     approvalFlowStatus: {},
  405.     addFormFlowData: {
  406.       type: Object,
  407.       required: true
  408.     },
  409.     tasksData: {
  410.       type: Array,
  411.       default: () => []
  412.     },
  413.     startTime: {
  414.       type: Number
  415.     },
  416.     approvalLevel: {
  417.       type: Number,
  418.       default: null
  419.     },
  420.     rejectLevel: {
  421.       type: Number,
  422.       default: null
  423.     }
  424.   },
  425.   data() {
  426.     return {
  427.       timeLineCorlor: '',
  428.       ischeck: '',
  429.       addFormFlowDataS: {}
  430.     }
  431.   },
  432.   computed: {
  433.     isShowReason() {
  434.       return this.tasksData[2]?.str?.[1] !== 'null'
  435.     }
  436.   },
  437.   watch: {
  438.     addFormFlowData: {
  439.       immediate: true, // 第一次进入页面时也触发
  440.       handler(newData) {
  441.         // console.log(newData)
  442.         // 子组件接收到新的属性值时执行的逻辑
  443.         this.addFormFlowDataS = newData
  444.       }
  445.     },
  446.     tasksData(val) {
  447.       this.getTimelineColor(val)
  448.     },
  449.     startTime(newVal) {
  450.       return newVal
  451.     }
  452.   },
  453.   created() {},
  454.   mounted() {
  455.     console.log('taskdata', this.startTime)
  456.   },
  457.   methods: {
  458.     getTimelineColor(isTasksData) {
  459.       // console.log(`isTasksData`, isTasksData)
  460.       isTasksData.forEach((item, index) => {
  461.         // 判断每一项的endTime是否有值
  462.         if (item.endTime && item.result === 2) {
  463.           item.timeLineCorlor = '#13ce66'
  464.           item.ischeck = 'el-icon-check'
  465.           item.istype = 'success'
  466.         }
  467.         if (
  468.           item.result === 7 ||
  469.           item.result === 1 ||
  470.           item.assigneeUser == null
  471.         ) {
  472.           item.timeLineCorlor = '#ffc600'
  473.           item.ischeck = ''
  474.           item.istype = ''
  475.         }
  476.         if (item.result === 3 || item.result === 4) {
  477.           item.timeLineCorlor = 'red'
  478.           item.ischeck = ''
  479.           item.istype = ''
  480.         }
  481.         if (item.result == null) {
  482.           item.timeLineCorlor = ''
  483.           item.ischeck = ''
  484.           item.istype = ''
  485.           isTasksData.splice(index, 1)
  486.         }
  487.       })
  488.       return isTasksData
  489.     },
  490.     // 审批流程图标
  491.     getTimelineItemIcon(item) {
  492.       if (!item) {
  493.         return
  494.       }
  495.       if (item.result === 1) {
  496.         return 'el-icon-time'
  497.       }
  498.       if (item.result === 2) {
  499.         return 'el-icon-check'
  500.       }
  501.       if (item.result === 3) {
  502.         return 'el-icon-close'
  503.       }
  504.       if (item.result === 4) {
  505.         return 'el-icon-remove-outline'
  506.       }
  507.       return ''
  508.     },
  509.     getTimelineItemType(item) {
  510.       if (!item) {
  511.         return
  512.       }
  513.       if (item.result === 1) {
  514.         return 'primary'
  515.       }
  516.       if (item.result === 2) {
  517.         return 'success'
  518.       }
  519.       if (item.result === 3) {
  520.         return 'danger'
  521.       }
  522.       if (item.result === 4) {
  523.         return 'info'
  524.       }
  525.       return ''
  526.     },
  527.     // 审批耗时秒数
  528.     getDateStar(ms) {
  529.       return getDate(ms)
  530.     }
  531.   }
  532. }
  533. </script>
  534. <style scoped>
  535. .flow-box {
  536.   margin-right: 100px;
  537.   width: 500px;
  538.   height: auto;
  539.   /* height: 380px; */
  540.   color: #fff;
  541. }
  542. .history-container /deep/ .el-timeline {
  543.   margin-left: 20px;
  544.   margin: 10px;
  545. }
  546. .history-container /deep/ .el-timeline-item {
  547.   min-height: 60px;
  548.   display: flex;
  549.   height: auto;
  550. }
  551. .line-name {
  552.   position: absolute;
  553.   left: -65px;
  554.   top: -1px;
  555.   color: #fff;
  556.   text-align: right;
  557. }
  558. .add-line-name {
  559.   width: 100px;
  560.   position: absolute;
  561.   text-align: right;
  562.   left: -110px;
  563.   top: 0px;
  564.   color: #fff;
  565. }
  566. </style>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表