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

文章目录
    • 概要
    • 整体架构流程
    • 技术细节
    • 小结

概要

vue2+Flowable工作流,审批流前端展示组件。
本人已实现activiti工作流引入vue2,
如有需求请移步activiti工作流单独引入vue2方法, 全网最全!!!

vue全局日期格式化成年月日 时分秒
如有需求请移步vue+moment转化日期格式为年月日时分秒!最简洁版

整体架构流程

vue2版本展示组件封装,vue3会出

技术细节

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

实现效果:
在这里插入图片描述

1.父组件代码

   <ApprovalProcess
        :tasks-data="tasksData"
        :start-user="startUser"
        :start-time="startTime"
        process-definition-key="appropriate_reporting"
        :add-form-flow-data="addFormFlowData"
        :approval-flow-status="approvalFlowStatus"
        :process-instance-id="processInstanceId"
        is-history="false"
      />
      import ApprovalProcess from '../components/ApprovalProcess.vue'
  components: {
    ApprovalProcess,
    ColumnTip
  },

关键参数approvalFlowStatus,字典里可配置不同审批状态,传递的参数都是工作流中存在的字段
2.子组件代码

<template>
  <div class="history-container">
    <!-- 审批流程、历史审批弹框内容 -->
    <div class="approval-flow">
      <div v-if="isHistory == 'true' ? false : true" class="flow-label">
        审批流程
      </div>
      <div class="flow-box">
        <!-- 待提交状态 -->
        <el-timeline v-if="approvalFlowStatus == 0">
          <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
            <div class="add-line-name">发起</div>
            <label
              v-if="startUser"
              style="color: black; font-weight: normal; margin-right: 30px"
            >
              {{ startUser.nickname }}
              <span>/</span>
              {{ startUser.deptName }}
            </label>
            <p style="color: #ffc600">待提交</p>
          </el-timeline-item>
          <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
            <div class="add-line-name">企业审核</div>
            <label
              v-for="(item, index) in addFormFlowDataS.qyUserList"
              :key="index"
              style="font-weight: 400; color: black; margin-right: 30px"
            >
              {{ item.nickname }}
              <span>/</span>
              {{ item.deptName }}
            </label>
            <p style="color: #ffc600">待审批</p>
          </el-timeline-item>

          <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
            <div class="add-line-name">经办人</div>
            <label
              v-for="(item, index) in addFormFlowDataS.gzUserList"
              :key="index"
              style="font-weight: 400; color: black; margin-right: 30px"
            >
              {{ item.nickname }}
              <span>/</span>
              {{ item.deptName }}
            </label>
            <p style="color: #ffc600">待审批</p>
          </el-timeline-item>
          <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
            <div class="add-line-name">领导审核</div>
            <label
              v-for="(item, index) in addFormFlowDataS.gzldUserList"
              :key="index"
              style="font-weight: 400; color: black; margin-right: 30px"
            >
              {{ item.nickname }}
              <span>/</span>
              {{ item.deptName }}
            </label>
            <p style="color: #ffc600">待审批</p>
          </el-timeline-item>

          <el-timeline-item style="margin-left: 60px">
            <div class="add-line-name">结束</div>
          </el-timeline-item>
        </el-timeline>
        <!-- 待审批 -->
        <el-timeline v-if="approvalFlowStatus == 1">
          <el-timeline-item icon="el-icon-check" type="success">
            <div class="add-line-name">发起</div>
            <label
              v-if="startUser"
              style="color: black; font-weight: 400; margin-right: 30px"
            >
              {{ startUser.nickname }}
              <span>/</span>
              {{ startUser.deptName }}
            </label>
            <label
              v-if="startTime"
              style="font-weight: normal; font-weight: 400"
            >{{ parseTime(startTime ? startTime : '') }}</label>

            <p style="color: #13ce66">已提交</p>
          </el-timeline-item>
          <el-timeline-item
            v-for="(task, index) in tasksData"
            :key="index"
            :color="task.timeLineCorlor"
            :type="task.result ? task.istype : ''"
          >
            <div class="add-line-name">
              {{ task.name }}
            </div>
            <label
              v-if="task.result === 2 && task.assigneeUser.nickname"
              style="color: black; font-weight: normal; margin-right: 30px"
            >
              {{ task.assigneeUser.nickname }}
              <span v-if="task.assigneeUser.deptName">/</span>
              {{ task.assigneeUser.deptName }}
            </label>
            <div
              v-else-if="task.result === 1 || task.assigneeUser == null"
              style="
                display: block;
                color: black;
                font-weight: normal;
                margin-right: 30px;
              "
            >
              {{ task.assigneeUser.nickname }}
              <span v-if="task.assigneeUser.deptName">/</span>
              {{ task.assigneeUser.deptName }}
            </div>

            <p v-if="task.name" style="color: #ffc600">待审批</p>
          </el-timeline-item>

          <el-timeline-item>
            <div class="add-line-name">结束</div>
          </el-timeline-item>
        </el-timeline>
        <!-- 审批中 -->
        <el-timeline v-if="approvalFlowStatus == 7">
          <el-timeline-item icon="el-icon-check" type="success">
            <div class="add-line-name">发起</div>
            <label
              v-if="startUser"
              style="font-weight: normal; margin-right: 30px"
            >
              {{ startUser.nickname }}
              <span>/</span>
              {{ startUser.deptName }}
            </label>
            <label v-if="startTime" style="color: black; font-weight: 400">{{
              parseTime(startTime)
            }}</label>
            <p style="color: #13ce66">已提交</p>
          </el-timeline-item>

          <el-timeline-item
            v-for="(task, index) in tasksData"
            :key="index"
            :color="task.timeLineCorlor"
            :icon="task.ischeck"
            :type="task.istype"
          >
            <div v-if="task.name" class="add-line-name">
              {{ task.name }}
            </div>
            <label
              v-if="
                task &&
                  task.assigneeUser &&
                  task.assigneeUser.nickname &&
                  task.endTime
              "
              style="color: black; font-weight: normal; margin-right: 30px"
            >
              {{ task.assigneeUser.nickname }}
              <span
                v-if="task && task.assigneeUser && task.assigneeUser.deptName"
              >/</span>
              {{ task.assigneeUser.deptName }}
            </label>
            <div
              v-else-if="task.result == 1"
              style="
                display: block;
                color: black;
                font-weight: normal;
                margin-right: 30px;
              "
               v-for="(item, index) in task.assigneeUserList"
            >
              {{ item.nickname }}
              <span>/</span>
              {{ item.deptName }}
            </div>

            <label
              v-if="task && task.endTime"
              style="color: black; font-weight: normal"
            >
              {{ parseTime(task.endTime) }}
            </label>
            <p v-if="task.endTime" style="color: #13ce66">已通过</p>
            <p v-if="!task.endTime" style="color: #ffc600">待审批</p>
          </el-timeline-item>

          <el-timeline-item>
            <div class="add-line-name">结束</div>
          </el-timeline-item>
        </el-timeline>

        <!-- 已完结 -->
        <el-timeline v-if="approvalFlowStatus == 2">
          <el-timeline-item icon="el-icon-check" type="success">
            <div class="add-line-name">发起</div>
            <label
              v-if="startUser"
              style="color: black; font-weight: normal; margin-right: 30px"
            >
              {{ startUser.nickname }}
              <span>/</span>
              {{ startUser.deptName }}
            </label>
            <label v-if="startTime" style="font-weight: 400">{{
              parseTime(startTime)
            }}</label>

            <p style="color: #13ce66">已提交</p>
          </el-timeline-item>
          <el-timeline-item icon="el-icon-check" type="success">
            <div v-if="tasksData[0] && tasksData[0].name" class="add-line-name">
              {{ tasksData[0].name }}
            </div>
            <label
              v-if="tasksData[0] && tasksData[0].assigneeUser.nickname"
              style="font-weight: normal; margin-right: 30px"
            >
              {{ tasksData[0].assigneeUser.nickname }}
              <span v-if="tasksData[0].assigneeUser.deptName">/</span>
              {{ tasksData[0].assigneeUser.deptName }}
            </label>
            <label
              v-if="tasksData[0] && tasksData[0].endTime"
              style="font-weight: normal"
            >{{ parseTime(tasksData[0].endTime) }}</label>
            <p style="color: #13ce66">已通过</p>
          </el-timeline-item>
          <el-timeline-item icon="el-icon-check" type="success">
            <div v-if="tasksData[1] && tasksData[1].name" class="add-line-name">
              {{ tasksData[1].name }}
            </div>
            <label
              v-if="tasksData[1] && tasksData[1].assigneeUser.nickname"
              style="font-weight: normal; margin-right: 30px"
            >
              {{ tasksData[1].assigneeUser.nickname }}
              <span v-if="tasksData[1].assigneeUser.deptName">/</span>
              {{ tasksData[1].assigneeUser.deptName }}
            </label>
            <label
              v-if="tasksData[1] && tasksData[1].endTime"
              style="font-weight: normal"
            >{{ parseTime(tasksData[1].endTime) }}</label>
            <p style="color: #13ce66">已通过</p>
          </el-timeline-item>
          <el-timeline-item icon="el-icon-check" type="success">
            <div v-if="tasksData[2] && tasksData[2].name" class="add-line-name">
              {{ tasksData[2].name }}
            </div>
            <label
              v-if="tasksData[2] && tasksData[2].assigneeUser.nickname"
              style="font-weight: normal; margin-right: 30px"
            >
              {{ tasksData[2].assigneeUser.nickname }}
              <span v-if="tasksData[2].assigneeUser.deptName">/</span>
              {{ tasksData[2].assigneeUser.deptName }}
            </label>
            <label
              v-if="tasksData[2] && tasksData[2].endTime"
              style="font-weight: normal"
            >{{ parseTime(tasksData[2].endTime) }}</label>
            <p style="color: #13ce66">已通过</p>
          </el-timeline-item>

          <el-timeline-item icon="el-icon-check" type="success">
            <div class="add-line-name">结束</div>
            <label>
              <span
                style="
                  display: inline-block;
                  color: #13ce66;

                  margin-right: 30px;
                "
              >已完结</span>
            </label>
            <!-- <span v-if="tasksData[1] && tasksData[1].endTime">{{
              parseTime(tasksData[1].endTime)
            }}</span> -->
          </el-timeline-item>
        </el-timeline>

        <!-- 退回流程状态 -->
        <el-timeline v-if="approvalFlowStatus == 3">
          <el-timeline-item icon="el-icon-check" type="success">
            <div class="add-line-name">发起</div>
            <label
              v-if="startUser"
              style="color: black; font-weight: normal; margin-right: 30px"
            >
              {{ startUser.nickname }}
              <span>/</span>
              {{ startUser.deptName }}
            </label>
            <label v-if="startTime" style="font-weight: 400">{{
              parseTime(startTime)
            }}</label>
            <p style="color: #13ce66">已提交</p>
          </el-timeline-item>
          <el-timeline-item
            v-for="(task, index) in tasksData"
            :key="index"
            :color="task.timeLineCorlor"
            :icon="task.ischeck"
            :type="task.istype"
          >
            <div v-if="task.name" class="add-line-name">
              {{ task.name }}
            </div>
            <label
              v-if="task.assigneeUser && task.assigneeUser.nickname"
              style="color: black; font-weight: normal; margin-right: 30px"
            >
              {{ task.assigneeUser.nickname }}
              <span v-if="task.assigneeUser.deptName">/</span>
              {{ task.assigneeUser.deptName }}
            </label>
            <label
              v-if="task.reviewerList && !task.assigneeUser"
              style="color: black; font-weight: normal; margin-right: 30px"
            >
              {{ task.reviewerList[0].nickname }}
              <span v-if="task.reviewerList[0].deptName">/</span>
              {{ task.reviewerList[0].deptName }}
            </label>
            <label
              v-if="task.endTime"
              style="color: black; font-weight: normal"
            >
              {{ parseTime(task.endTime) }}
            </label>
            <p
              v-if="task.assigneeUser"
              style="color: #13ce66; font-weight: normal"
            >
              {{ task.result == 2 ? '已通过' : '' }}
            </p>
            <p v-if="task.assigneeUser" style="color: red; font-weight: normal">
              {{
                task.result === 3 ? '已退回' : task.result === 4 ? '已撤回' : ''
              }}
              <span v-if="task.reason" style="margin-left: 20px">
                <span>{{ task.reason }}</span>
              </span>
            </p>
          </el-timeline-item>

          <el-timeline-item>
            <div class="add-line-name">结束</div>
            <!-- <label>
              <span
                style="
                  display: inline-block;
                  color: red;

                  margin-right: 30px;
                "
                >已完结</span
              >
            </label> -->
            <!-- <span v-if="tasksData[1] && tasksData[1].endTime">{{
              parseTime(tasksData[1].endTime)
            }}</span> -->
          </el-timeline-item>
        </el-timeline>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'ApprovalProcess',
  props: {
    startUser: {
      type: Object
    },
    createTime: {
      type: String,
      default: ''
    },
    startTime: {
      type: Number,
      default: null
    },

    isHistory: {
      type: String,
      default: ''
    },

    approvalFlowStatus: {
      // 审批流程状态
    },
    addFormFlowData: {
      // 表单的数据
    },
    processDefinitionKey: {
      type: String,
      default: `appropriate_reporting1` // decision_matter
    },
    tasksData: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      reviewerList: [], // 流程审批人列表
      // 审批流程激活的tab标签
      activeName: 'first',
      timeLineCorlor: '',
      ischeck: '',
      addFormFlowDataS: {}
    }
  },
  computed: {
    labelName() {
      return this.isHistory == 'true' ? '(历史审批)集团' : '集团'
    }
  },
  watch: {
    addFormFlowData: {
      immediate: true, // 第一次进入页面时也触发
      handler(newData) {
        // console.log(newData)
        // 子组件接收到新的属性值时执行的逻辑
        this.addFormFlowDataS = newData
      }
    },
    tasksData(val) {
      // console.log(val)
      this.getTimelineColor(val)
    },
    startUser: {
      deep: true,
      handler(val) {
        return val
      }
    }
  },
  created() {},
  mounted() {
    // console.log(`this.tasksData`, this.tasksData)
  },
  methods: {
    getTimelineColor(isTasksData) {
      // console.log(`isTasksData`, isTasksData)
      isTasksData.forEach((item, index) => {
        // 判断每一项的endTime是否有值
        if (item.endTime && item.result === 2) {
          item.timeLineCorlor = '#13ce66'
          item.ischeck = 'el-icon-check'
          item.istype = 'success'
        }
        if (
          item.result === 7 ||
          item.result === 1 ||
          item.assigneeUser == null
        ) {
          item.timeLineCorlor = '#ffc600'
          item.ischeck = ''
          item.istype = ''
        }
        if (item.result === 3 || item.result === 4) {
          item.timeLineCorlor = 'red'
          item.ischeck = ''
          item.istype = ''
        }
        if (item.result == null) {
          item.timeLineCorlor = ''
          item.ischeck = ''
          item.istype = ''
          isTasksData.splice(index, 1)
        }
      })
      return isTasksData
    }
  }
}
</script>

<style scoped>
.approval-flow {
  display: flex;
}
.history-container .flow-label {
  width: 140px;
  padding-top: 10px;
  display: flex;
  justify-content: flex-end;
  /* font-weight: 700; */
}
.flow-box {
  margin-left: 20px;
  width: 645px;
  min-height: 330px;
  height: auto;
}
.history-container /deep/ .el-timeline {
  padding-left: 37px;
  padding-top: 10px;
}
.history-container /deep/ .el-timeline-item {
  min-height: 60px;
  height: auto;
}
.line-name {
  position: absolute;
  left: -35px;
  top: -1px;
  color: #aaa;
}
.add-line-name {
  width: 100px;
  position: absolute;
  text-align: right;
  left: -110px;
  font-weight: normal;
  top: 0px;
  color: #aaa;
}
</style>

可根据后台数据进行适当修改,已适配待提交状态/待审批/审批中/已完结/退回等流程

小结

自己使用过程中遇到的场景,可自己修改样式在ColumnTip使用。
代码案例:
父组件

  <el-table-column
                label="流程状态"
                align="center"
                prop="apply.status"
              >
                <template slot-scope="scope">
                  <el-tooltip placement="bottom">
                    <div slot="content">
                      <ColumnTip
                        :tasks-data="tasksData"
                        :start-user="startUser"
                        :start-time="startTime"
                        :approval-level="approvalLevel"
                        :reject-level="rejectLevel"
                        :add-form-flow-data="addFormFlowData"
                        :approval-flow-status="approvalFlowStatus"
                        :process-instance-id="scope.row.processInstanceId"
                      />
                    </div>
                    <div
                      @mouseenter="
                        (e) => {
                          handleClick(scope.row.apply, e)
                        }
                      "
                    >
                      <dict-tag
                        :type="DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS"
                        :value="scope.row.apply.status"
                      />
                    </div>
                  </el-tooltip>
                </template>
              </el-table-column>
      import ColumnTip from '../components/ColumnTip.vue'        
  components: {
    ApprovalProcess,
    ColumnTip
  },

子组件代码

<template>
  <div class="history-container">
    <!-- 状态栏tips内容 -->
    <div class="flow-box">
      <!-- 待提交状态 -->
      <el-timeline v-if="approvalFlowStatus == 0">
        <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
          <div class="add-line-name">发起</div>
          <label
            v-for="(item, index) in addFormFlowDataS.startUserList"
            :key="index"
            style="color: #fff; font-weight: 500; margin-right: 30px"
          >
            {{ item.nickname }}
            <span>/</span>
            {{ item.deptName }}
          </label>
          <p style="color: #ffc600">待提交</p>
        </el-timeline-item>
        <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
          <div class="add-line-name">企业审核</div>
          <label
            v-for="(item, index) in addFormFlowDataS.qyUserList"
            :key="index"
            style="color: #fff; font-weight: 500; margin-right: 30px"
          >
            {{ item.nickname }}
            <span>/</span>
            {{ item.deptName }}
          </label>
          <p style="color: #ffc600">待审批</p>
        </el-timeline-item>

        <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
          <div class="add-line-name">经办人</div>
          <label
            v-for="(item, index) in addFormFlowDataS.gzUserList"
            :key="index"
            style="color: #fff; font-weight: 500; margin-right: 30px"
          >
            {{ item.nickname }}
            <span>/</span>
            {{ item.deptName }}
          </label>
          <p style="color: #ffc600">待审批</p>
        </el-timeline-item>
        <el-timeline-item style="margin-left: 60px" :color="'#FFC600'">
          <div class="add-line-name">领导审核</div>
          <label
            v-for="(item, index) in addFormFlowDataS.gzldUserList"
            :key="index"
            style="color: #fff; font-weight: 500; margin-right: 30px"
          >
            {{ item.nickname }}
            <span>/</span>
            {{ item.deptName }}
          </label>
          <p style="color: #ffc600">待审批</p>
        </el-timeline-item>

        <el-timeline-item style="margin-left: 60px">
          <div class="add-line-name">结束</div>
        </el-timeline-item>
      </el-timeline>

      <!-- 待审批 -->
      <el-timeline v-if="approvalFlowStatus == 1">
        <el-timeline v-if="approvalFlowStatus == 1 && tasksData.length > 0">
          <el-timeline-item
            style="margin-left: 60px"
            icon="el-icon-check"
            type="success"
          >
            <div class="add-line-name">发起</div>
            <label
              v-if="startUser"
              style="color: #fff; font-weight: 500; margin-right: 30px"
            >
              {{ startUser.nickname }}
              <span>/</span>
              {{ startUser.deptName }}
            </label>
            <label
              v-if="tasksData[0] && tasksData[0].createTime"
              style="color: #fff; font-weight: normal"
            >{{ parseTime(tasksData[0].createTime) }}</label>
            <p style="color: #13ce66">已提交</p>
          </el-timeline-item>
          <el-timeline-item
            v-for="(task, index) in tasksData"
            :key="index"
            style="margin-left: 60px"
            :color="task.timeLineCorlor"
            :type="task.result ? task.istype : ''"
          >
            <div class="add-line-name">
              {{ task.name }}
            </div>
            <label
              v-if="task.result === 2 && task.assigneeUser.nickname"
              style="color: #fff; font-weight: normal; margin-right: 30px"
            >
              {{ task.assigneeUser.nickname }}
              <span v-if="task.assigneeUser.deptName">/</span>
              {{ task.assigneeUser.deptName }}
            </label>
            <div
              v-else-if="task.result === 1 || task.assigneeUser == null"
              style="
                display: block;
                color: #fff;
                font-weight: normal;
                margin-right: 30px;
              "
            >
              {{ task.assigneeUser.nickname }}
              <span v-if="task.assigneeUser.deptName">/</span>
              {{ task.assigneeUser.deptName }}
            </div>

            <p v-if="task.name" style="color: #ffc600">待审批</p>
          </el-timeline-item>

          <el-timeline-item style="margin-left: 60px">
            <div class="add-line-name">结束</div>
          </el-timeline-item>
        </el-timeline>
      </el-timeline>

      <!-- 审批中 -->
      <el-timeline v-if="approvalFlowStatus == 7 && addFormFlowData != {}">
        <el-timeline-item
          style="margin-left: 60px"
          icon="el-icon-check"
          type="success"
        >
          <div class="add-line-name">发起</div>
          <label
            v-if="startUser"
            style="color: #fff; font-weight: 500; margin-right: 30px"
          >
            {{ startUser.nickname }}
            <span>/</span>
            {{ startUser.deptName }}
          </label>
          <label
            v-if="tasksData[0] && tasksData[0].createTime"
            style="color: #fff; font-weight: normal"
          >{{ parseTime(tasksData[0].createTime) }}</label>
          <p style="color: #13ce66">已提交</p>
        </el-timeline-item>

        <el-timeline-item
          v-for="(task, index) in tasksData"
          :key="index"
          style="margin-left: 60px"
          :color="task.timeLineCorlor"
          :icon="task.ischeck"
          :type="task.istype"
        >
          <div v-if="task.name" class="add-line-name">
            {{ task.name }}
          </div>
          <label
            v-if="
              task &&
                task.assigneeUser &&
                task.assigneeUser.nickname &&
                task.endTime
            "
            style="color: #fff; font-weight: normal; margin-right: 30px"
          >
            {{ task.assigneeUser.nickname }}
            <span
              v-if="task && task.assigneeUser && task.assigneeUser.deptName"
            >/</span>
            {{ task.assigneeUser.deptName }}
          </label>
          <div
              v-else-if="task.result == 1"
              style="
                display: block;
                color: black;
                font-weight: normal;
                margin-right: 30px;
                color: white;
              "
               v-for="(item, index) in task.assigneeUserList"
            >
              {{ item.nickname }}
              <span>/</span>
              {{ item.deptName }}
            </div>


          <label
            v-if="task && task.endTime"
            style="color: #fff; font-weight: normal"
          >
            {{ parseTime(task.endTime) }}
          </label>
          <p v-if="task.endTime" style="color: #13ce66">已通过</p>
          <p v-if="!task.endTime" style="color: #ffc600">待审批</p>
        </el-timeline-item>

        <el-timeline-item style="margin-left: 60px">
          <div class="add-line-name">结束</div>
        </el-timeline-item>
      </el-timeline>

      <!-- 已完结 -->
      <el-timeline v-if="approvalFlowStatus == 2">
        <el-timeline-item
          style="margin-left: 60px"
          icon="el-icon-check"
          type="success"
        >
          <div class="add-line-name">发起</div>
          <label
            v-if="startUser"
            style="color: #fff; font-weight: 500; margin-right: 30px"
          >
            {{ startUser.nickname }}
            <span>/</span>
            {{ startUser.deptName }}
          </label>
          <label
            v-if="startTime"
            style=" color: #fff; font-weight: 400"
          >{{ parseTime(startTime) }}</label>

          <p style="color: #13ce66">已提交</p>
        </el-timeline-item>
        <el-timeline-item
          style="margin-left: 60px"
          icon="el-icon-check"
          type="success"
        >
          <div v-if="tasksData[0] && tasksData[0].name" class="add-line-name">
            {{ tasksData[0].name }}
          </div>
          <label
            v-if="tasksData[0] && tasksData[0].assigneeUser.nickname"
            style="color: #fff; font-weight: normal; margin-right: 35px"
          >
            {{ tasksData[0].assigneeUser.nickname }}
            <span v-if="tasksData[0].assigneeUser.deptName">/</span>
            {{ tasksData[0].assigneeUser.deptName }}
          </label>
          <label
            v-if="tasksData[0] && tasksData[0].endTime"
            style="color: #fff; font-weight: normal"
          >{{ parseTime(tasksData[0].endTime) }}</label>
          <p style="color: #13ce66">已审批</p>
        </el-timeline-item>
        <el-timeline-item
          style="margin-left: 60px"
          icon="el-icon-check"
          type="success"
        >
          <div v-if="tasksData[1] && tasksData[1].name" class="add-line-name">
            {{ tasksData[1].name }}
          </div>
          <label
            v-if="tasksData[1] && tasksData[1].assigneeUser.nickname"
            style="color: #fff; font-weight: normal; margin-right: 40px"
          >
            {{ tasksData[1].assigneeUser.nickname }}
            <span v-if="tasksData[1].assigneeUser.deptName">/</span>
            {{ tasksData[1].assigneeUser.deptName }}
          </label>
          <label
            v-if="tasksData[1] && tasksData[1].endTime"
            style="color: #fff; font-weight: normal"
          >{{ parseTime(tasksData[1].endTime) }}</label>
          <p style="color: #13ce66">已审批</p>
        </el-timeline-item>
        <el-timeline-item
          style="margin-left: 60px"
          icon="el-icon-check"
          type="success"
        >
          <div v-if="tasksData[2] && tasksData[2].name" class="add-line-name">
            {{ tasksData[2].name }}
          </div>
          <label
            v-if="tasksData[2] && tasksData[2].assigneeUser.nickname"
            style="color: #fff; font-weight: normal; margin-right: 12px"
          >
            {{ tasksData[2].assigneeUser.nickname }}
            <span v-if="tasksData[2].assigneeUser.deptName">/</span>
            {{ tasksData[2].assigneeUser.deptName }}
          </label>
          <label
            v-if="tasksData[2] && tasksData[2].endTime"
            style="color: #fff; font-weight: normal"
          >{{ parseTime(tasksData[2].endTime) }}</label>
          <p style="color: #13ce66">已审批</p>
        </el-timeline-item>

        <el-timeline-item
          style="margin-left: 60px"
          icon="el-icon-check"
          type="success"
        >
          <div class="add-line-name">结束</div>
          <label>
            <span
              style="
                display: inline-block;
                color: #13ce66;
                font-weight: 500;
                margin-right: 30px;
              "
            >已完结</span>
          </label>
          <span v-if="tasksData[1] && tasksData[1].endTime">{{
            parseTime(tasksData[1].endTime)
          }}</span>
        </el-timeline-item>
      </el-timeline>

      <!-- 退回流程状态 -->
      <el-timeline v-if="approvalFlowStatus == 3 && tasksData.length > 0">
        <el-timeline-item
          style="margin-left: 60px"
          icon="el-icon-check"
          type="success"
        >
          <div class="add-line-name">发起</div>
          <label
            v-if="startUser"
            style="color: #fff; font-weight: 500; margin-right: 30px"
          >
            {{ startUser.nickname }}
            <span>/</span>
            {{ startUser.deptName }}
          </label>
          <label
            v-if="tasksData[0] && tasksData[0].createTime"
            style="color: #fff; font-weight: normal"
          >{{ parseTime(tasksData[0].createTime) }}</label>
          <p style="color: #13ce66">已提交</p>
        </el-timeline-item>
        <el-timeline-item
          v-for="(task, index) in tasksData"
          :key="index"
          style="margin-left: 60px"
          :color="task.timeLineCorlor"
          :icon="task.ischeck"
          :type="task.istype"
        >
          <div v-if="task.name" class="add-line-name">
            {{ task.name }}
          </div>
          <label
            v-if="task.assigneeUser && task.assigneeUser.nickname"
            style="color: #fff; font-weight: normal; margin-right: 30px"
          >
            {{ task.assigneeUser.nickname }}
            <span v-if="task.assigneeUser.deptName">/</span>
            {{ task.assigneeUser.deptName }}
          </label>
          <!-- <label
              v-if="task.reviewerList && !task.assigneeUser"
              style="color: #fff; font-weight: normal; margin-right: 30px"
            >
              {{ task.reviewerList[0].nickname }}
              <span v-if="task.reviewerList[0].deptName">/</span>
              {{ task.reviewerList[0].deptName }}
            </label> -->
          <label v-if="task.endTime" style="color: #fff; font-weight: normal">
            {{ parseTime(task.endTime) }}
          </label>
          <p
            v-if="task.assigneeUser"
            style="color: #13ce66; font-weight: normal"
          >
            {{ task.result == 2 ? '已通过' : '' }}
          </p>
          <p v-if="task.assigneeUser" style="color: red; font-weight: normal">
            {{
              task.result === 3 ? '已退回' : task.result === 4 ? '已撤回' : ''
            }}
            <span v-if="task.reason" style="margin-left: 20px">
              <span>{{ task.reason }}</span>
            </span>
          </p>
        </el-timeline-item>

        <el-timeline-item style="margin-left: 60px" :color="'red'">
          <div class="add-line-name">结束</div>
          <label>
            <span
              style="
                display: inline-block;
                color: red;
                font-weight: 500;
                margin-right: 30px;
              "
            >已退回</span>
          </label>
          <span v-if="tasksData[1] && tasksData[1].endTime">{{
            parseTime(tasksData[1].endTime)
          }}</span>
        </el-timeline-item>
      </el-timeline>
    </div>
  </div>
</template>

<script>
import { getDate } from '@/utils/dateUtils'

export default {
  name: 'ColumnTip',
  props: {
    startUser: {
      type: Object
    },
    approvalFlowStatus: {},
    addFormFlowData: {
      type: Object,
      required: true
    },
    tasksData: {
      type: Array,
      default: () => []
    },
    startTime: {
      type: Number
    },

    approvalLevel: {
      type: Number,
      default: null
    },
    rejectLevel: {
      type: Number,
      default: null
    }
  },
  data() {
    return {
      timeLineCorlor: '',
      ischeck: '',
      addFormFlowDataS: {}
    }
  },
  computed: {
    isShowReason() {
      return this.tasksData[2]?.str?.[1] !== 'null'
    }
  },
  watch: {
    addFormFlowData: {
      immediate: true, // 第一次进入页面时也触发
      handler(newData) {
        // console.log(newData)
        // 子组件接收到新的属性值时执行的逻辑
        this.addFormFlowDataS = newData
      }
    },
    tasksData(val) {
      this.getTimelineColor(val)
    },
    startTime(newVal) {
      return newVal
    }
  },
  created() {},
  mounted() {
    console.log('taskdata', this.startTime)
  },

  methods: {
    getTimelineColor(isTasksData) {
      // console.log(`isTasksData`, isTasksData)
      isTasksData.forEach((item, index) => {
        // 判断每一项的endTime是否有值
        if (item.endTime && item.result === 2) {
          item.timeLineCorlor = '#13ce66'
          item.ischeck = 'el-icon-check'
          item.istype = 'success'
        }
        if (
          item.result === 7 ||
          item.result === 1 ||
          item.assigneeUser == null
        ) {
          item.timeLineCorlor = '#ffc600'
          item.ischeck = ''
          item.istype = ''
        }
        if (item.result === 3 || item.result === 4) {
          item.timeLineCorlor = 'red'
          item.ischeck = ''
          item.istype = ''
        }
        if (item.result == null) {
          item.timeLineCorlor = ''
          item.ischeck = ''
          item.istype = ''
          isTasksData.splice(index, 1)
        }
      })
      return isTasksData
    },
    // 审批流程图标
    getTimelineItemIcon(item) {
      if (!item) {
        return
      }
      if (item.result === 1) {
        return 'el-icon-time'
      }
      if (item.result === 2) {
        return 'el-icon-check'
      }
      if (item.result === 3) {
        return 'el-icon-close'
      }
      if (item.result === 4) {
        return 'el-icon-remove-outline'
      }
      return ''
    },
    getTimelineItemType(item) {
      if (!item) {
        return
      }
      if (item.result === 1) {
        return 'primary'
      }
      if (item.result === 2) {
        return 'success'
      }
      if (item.result === 3) {
        return 'danger'
      }
      if (item.result === 4) {
        return 'info'
      }
      return ''
    },
    // 审批耗时秒数
    getDateStar(ms) {
      return getDate(ms)
    }
  }
}
</script>

<style scoped>
.flow-box {
  margin-right: 100px;
  width: 500px;
  height: auto;
  /* height: 380px; */
  color: #fff;
}

.history-container /deep/ .el-timeline {
  margin-left: 20px;
  margin: 10px;
}

.history-container /deep/ .el-timeline-item {
  min-height: 60px;
  display: flex;
  height: auto;
}

.line-name {
  position: absolute;
  left: -65px;
  top: -1px;
  color: #fff;
  text-align: right;
}
.add-line-name {
  width: 100px;
  position: absolute;
  text-align: right;
  left: -110px;
  top: 0px;
  color: #fff;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936629.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app多环境配置动态修改

前言 这篇文章主要介绍uniapp在Hbuilderx 中&#xff0c;通过工程化&#xff0c;区分不同环境、动态修改小程序appid以及自定义条件编译&#xff0c;解决代码发布和运行时手动切换问题。 背景 当我们使用uniapp开发同一个项目发布不同的环境二级路径不同时&#xff0c;这时候…

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述

最近参与某海外大型车企&#xff08;T&#xff09;的 Wi-Fi 功能需求开发&#xff0c;T 提出了一个 Cabin Wi-Fi 的概念&#xff0c;首先我们先对 Cabin Wi-Fi 进行一个较全面的了解。 1. Cabin Wi-Fi 概念概述 Cabin Wi-Fi 通常指用于飞机客舱、火车车厢、豪华巴士或船舶上的无…

如何在 Ubuntu 22.04 上安装和使用 Rust 编程语言环境

简介 Rust 是一门由 Mozilla 开发的系统编程语言&#xff0c;专注于性能、可靠性和内存安全。它在没有垃圾收集的情况下实现了内存安全&#xff0c;这使其成为构建对性能要求苛刻的应用程序&#xff08;如操作系统、游戏引擎和嵌入式系统&#xff09;的理想选择。 接下来&…

MATLAB图卷积神经网络GCN处理分子数据集节点分类研究

全文链接&#xff1a;https://tecdat.cn/?p38570 本文主要探讨了如何利用图卷积网络&#xff08;GCN&#xff09;对图中的节点进行分类。介绍了相关的数据处理、模型构建、训练及测试等环节&#xff0c;通过对分子数据集的操作实践&#xff0c;展示了完整的节点分类流程&#…

简易CPU设计入门:本系统所写入的指令

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff0c;我…

rabbitMq举例

新来个技术总监&#xff0c;把 RabbitMQ 讲的那叫一个透彻&#xff0c;佩服&#xff01; 生产者 代码举例 public String sendMsg(final String exchangeName,final String routingKey,final String msg) {} /*** 发送消息* param exchangeName exchangeName* param routin…

对话小系统(智能图书助手)

对话小系统&#xff08;智能图书助手&#xff09; 文章说明核心代码效果展示源码下载 文章说明 现在GPT的功能十分强大&#xff0c;是否可以利用开源的接口来实现自己的智能小助手呢&#xff0c;我想到可以提供一些能力接口&#xff0c;然后对问询内容进行意图识别&#xff0c;…

数智读书笔记系列006 协同进化:人类与机器融合的未来

书名:协同进化&#xff1a;人类与机器融合的未来 作者:[美]爱德华阿什福德李 译者:李杨 出版时间:2022-06-01 ISBN:9787521741476 中信出版集团制作发行 爱德华・阿什福德・李&#xff08;Edward Ashford Lee&#xff09;是一位在计算机科学与工程领域颇具影响力的学者&am…

C# 探险之旅:第二十七节 - 类型class(属性) —— 给你的类穿上“属性”的外衣

嘿&#xff0c;探险家们&#xff01;欢迎再次踏上我们的C#奇幻之旅。今天&#xff0c;我们要聊聊一个超级有趣的话题——类的“属性”。想象一下&#xff0c;如果我们要给类穿上一件酷炫的外衣&#xff0c;那属性就是这件外衣上的各种口袋和装饰&#xff0c;让类变得既实用又拉…

数据保护策略:如何保障重要信息的安全

一、什么是数据安全&#xff1f; 数据安全是保护数字信息免遭盗窃、未经授权的访问和恶意修改的过程。这是一个持续的过程&#xff0c;负责监督信息的收集、存储和传输。 机密性&#xff1a;保护数据免遭未授权方访问。 完整性&#xff1a;保护数据免遭未经授权的修改、损坏…

Mvc、Springmvc框架

一.Mvc&#xff1a; 1.概念&#xff1a; MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 、View视图 、Controller控制层&#xff1b; 结构图&#xff1a; 二.Springmvc: 1.概念&#xff1a; springmvc框架它是spring框架的一个分支。它是按照mvc架构思想设计…

【CSS in Depth 2 精译_078】12.6 调整字间距,提升可读性 + 12.7 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…

Python高性能web框架-FastApi教程:(2)路径操作装饰器方法

路径操作装饰器方法 1. fastapi支持的各种请求方式 app.get() app.post() app.put() app.patch() app.delete() app.options() app.head() app.trace()2. 定义不同请求方式的路由 # 定义GET请求的路由 app.get(/get) def get_test():return {method: get方法} app.get(/get)…

PostgreSQL 入门

下载与安装 部分国产数据库采用PostgreSQL作为基础进行研发&#xff0c;因此先尝试了解一下原始数据库情况。 PostgreSQL 简称 PG 官网&#xff1a;https://www.postgresql.org/ PostgreSQL “世界上最先进的开源关系型数据库” 这是官网上的口号。 PostgreSQL: The World…

Java-26 深入浅出 Spring - 实现简易Ioc-02 无IoC与AOP场景下实现业务

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

工作流审批功能全解析:提升流程效率的关键要素

1. 引言 在当今数字化时代&#xff0c;企业与组织的运营效率在很大程度上依赖于高效、精准的工作流审批系统。随着业务日益复杂且多样化&#xff0c;审批流程变得愈加细致和灵活。一个完善的工作流审批系统不仅能确保任务在组织内部有序流转、协调各方资源&#xff0c;还能实现…

API接口示例:电商商品评论数据

当然&#xff0c;以下是一个简化的电商商品评论数据API接口的示例。请注意&#xff0c;这只是一个示例&#xff0c;实际的API接口可能会更加复杂&#xff0c;并且会包含更多的验证、错误处理和安全措施。 API接口示例&#xff1a;电商商品评论数据 基础信息 API名称&#xf…

HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由

网络层数据封装 首先IP地址封装在网络层&#xff0c;它用于标识一台网络设备&#xff0c;其中IP地址分为两个部分&#xff0c;网络地址和主机地址&#xff0c;通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言&#xff0c;它细分为五类&#xff0c;A,B,C,D,E,…

Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示

调用串口IP核CoreUARTAPB&#xff0c;并例化到顶层设计&#xff0c;发现UART_RX管脚在进行管脚分配时没有显示出来&#xff0c;最后发现是CoreAPB3总线IP核配置不对导致&#xff0c;改为如下配置后正常。

SEGGER | 基于STM32F405 + Keil - RTT组件01 - 移植SEGGER RTT

导言 RTT(Real Time Transfer)是一种用于嵌入式中与用户进行交互的技术&#xff0c;它结合了SWO和半主机的优点&#xff0c;具有极高的性能。 使用RTT可以从MCU非常快速输出调试信息和数据&#xff0c;且不影响MCU实时性。这个功能可以用于很多支持J-Link的设备和MCU&#xff0…