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

概要

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

整体架构流程

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>

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VueFlowable是两个独立的技术,可以结合使用来构建一个完整的前后端应用程序。Vue是一个行的JavaScript框架,用于构建用户界面,而Flowable是一个开源的工作流引擎,用于管理和执行业务程。 结合VueFlowable可以实现以下功能: 1. 前端界面:使用Vue构建用户界面,包括表单、列表、按钮等组件,以及与后端交互的逻辑。 2. 后端程管理:使用Flowable定义和管理业务程,包括程的创建、启动、审批、撤销等操作。 3. 前后端交互:通过RESTful API或其他方式,将前端界面与后端的Flowable引擎进行交互,实现程的执行和数据的传递。 具体实现步骤如下: 1. 搭建Vue项目:使用Vue CLI等工具创建一个Vue项目,并安装所需的依赖。 2. 设计前端界面:根据业务需求,设计并实现前端界面,包括表单、列表、按钮等组件。 3. 集成Flowable:将Flowable的相关依赖添加到Vue项目中,并配置与Flowable引擎的连接。 4. 定义程:使用Flowable的设计器或代码方式定义业务程,包括程节点、程变量、程表单等。 5. 前后端交互:通过API调用,将前端界面与Flowable引擎进行交互,实现程的启动、审批等操作。 6. 测试和调试:对整个应用进行测试和调试,确保前后端的功能和交互正常。 通过Vue+Flowable的组合,可以实现一个完整的前后端应用程序,包括用户界面的设计和开发,以及业务程的定义和管理。这样的应用程序可以用于各种场景,如请假审批、订单处理、工作流程管理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值