fuliqi
2025-02-07 01ae48bc5f7e63e27aa7338cbc2794e30535fd66
src/views/projectProcess/detail/index.vue
@@ -18,7 +18,7 @@
      </div>
      <div class="search-warp">
        <div @click="changeTab(1, 'all')" :class="{'item-warm': true, 'all-color': true, 'active': 1 === selectTabId}">全部事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.totalTaskNum}})</span></div>
        <div @click="changeTab(2, 'todo')" :class="{'item-warm': true, 'all-color': true, 'active': 2 === selectTabId}">代办事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.todoTaskNum}})</span></div>
        <div @click="changeTab(2, 'todo')" :class="{'item-warm': true, 'all-color': true, 'active': 2 === selectTabId}">待办事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.todoTaskNum}})</span></div>
        <div @click="changeTab(3, 'todo')" :class="{'item-warm': true, 'current-color': true, 'active': 3 === selectTabId}">当前环节</div>
        <div @click="changeTab(4, 'remaining')" :class="{'item-warm': true, 'remaining-color': true, 'active': 4 === selectTabId}">剩余事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.remainingTaskNum}})</span></div>
        <div @click="changeTab(5, 'timely')" :class="{'item-warm': true, 'timely-color': true, 'active': 5 === selectTabId}">按时完成(0)</div>
@@ -26,7 +26,7 @@
        <div @click="changeTab(7, 'willOvertime')" :class="{'item-warm': true, 'willOvertime-color': true, 'active': 7 === selectTabId}">临期事项(0)</div>
        <div @click="changeTab(8, 'urge')" :class="{'item-warm': true, 'urge-color': true, 'active': 8 === selectTabId}">督办事项(0)</div>
      </div>
      <div style="display: flex;justify-content: center;align-items: center;margin-top: 20px">
      <div style="display: flex;justify-content: center;align-items: center;margin-top: 20px; position: relative">
        <el-form :inline="true" :model="queryParams" class="demo-form-inline">
          <el-form-item label="任务名称">
            <el-input v-model="queryParams.taskName" placeholder="任务名称"></el-input>
@@ -35,6 +35,10 @@
            <el-button type="primary" @click="search">查询</el-button>
          </el-form-item>
        </el-form>
        <div style="position: absolute; right: 0; top: 0">
          <el-button @click="openProcessImg" v-loading="imgLoading" type="primary">流程图</el-button>
          <el-button @click="openRecord" type="info" v-loading="recordLoading">流转记录</el-button>
        </div>
      </div>
      <div class="table">
        <el-table
@@ -45,11 +49,6 @@
          <el-table-column
            prop="taskName"
            label="任务名称"
          >
          </el-table-column>
          <el-table-column
            prop="processName"
            label="流程名称"
          >
          </el-table-column>
          <el-table-column
@@ -120,6 +119,75 @@
        </el-pagination>
      </div>
    </div>
    <el-dialog
      :title="`${this.queryParams.processName}:流程图`"
      :visible.sync="processImgShow"
      :fullscreen="true"
      :close-on-click-modal="false"
      :destroy-on-close="true"
    >
      <div>
        <bpmn-viewer :flowData="flowData" :procInsId="queryParams.processInsId"/>
      </div>
    </el-dialog>
    <el-dialog
      :title="`${this.queryParams.processName}:流转记录`"
      :visible.sync="processRecordShow"
      :fullscreen="true"
      :close-on-click-modal="false"
      :destroy-on-close="true"
    >
      <div>
        <div class="block">
          <el-timeline>
            <el-timeline-item
              v-for="(item,index ) in flowRecordList"
              :key="index"
              :icon="setIcon(item.finishTime)"
              :color="setColor(item.finishTime)"
            >
              <p style="font-weight: 700">{{item.taskName}}
                <span v-if="item.comment && item.comment.type === '3'" style="color: red">(执行了驳回)</span>
                <span v-if="item.overtime && item.overtime==='red'" style="color: red">(已超时)</span>
                <span v-if="item.overtime && item.overtime==='yellow'" style="color: orange">(即将超时)</span>
              </p>
              <el-card :body-style="{ padding: '10px' }">
                <el-descriptions class="margin-top" :column="1" size="small" border>
                  <el-descriptions-item v-if="item.assigneeName" label-class-name="my-label">
                    <template slot="label"><i class="el-icon-user"></i>办理人</template>
                    {{item.assigneeName}}
                    <el-tag type="info" size="mini">{{item.deptName}}</el-tag>
                  </el-descriptions-item>
                  <el-descriptions-item v-if="item.candidate" label-class-name="my-label">
                    <template slot="label"><i class="el-icon-user"></i>候选办理</template>
                    {{item.candidate}}
                  </el-descriptions-item>
                  <el-descriptions-item label-class-name="my-label">
                    <template slot="label"><i class="el-icon-date"></i>接收时间</template>
                    {{item.createTime}}
                  </el-descriptions-item>
                  <el-descriptions-item v-if="item.finishTime" label-class-name="my-label">
                    <template slot="label"><i class="el-icon-date"></i>处理时间</template>
                    {{item.finishTime}}
                  </el-descriptions-item>
                  <el-descriptions-item v-if="item.duration"  label-class-name="my-label">
                    <template slot="label"><i class="el-icon-time"></i>耗时</template>
                    {{item.duration}}
                  </el-descriptions-item>
                  <el-descriptions-item v-if="item.comment" label-class-name="my-label">
                    <template slot="label"><i class="el-icon-tickets"></i>处理意见</template>
                    {{item.comment.comment}}
                  </el-descriptions-item>
                </el-descriptions>
              </el-card>
            </el-timeline-item>
          </el-timeline>
        </div>
      </div>
    </el-dialog>
  </div>
</template>
@@ -129,11 +197,24 @@
  getProjectProcessDetailTaskList,
  getTaskIsAuditing
} from "@/api/projectProcess/projectProcess";
import {flowXmlAndNode} from "@/api/flowable/definition";
import BpmnViewer from '@/components/Process/viewer';
import {flowRecord} from "@/api/flowable/finished";
export default {
  name: "index",
  name: "Detail",
  components: {
    BpmnViewer
  },
  data() {
    return {
      processRecordShow: false, // 流转记录显示
      flowRecordList: [], // 流程流转数据
      recordLoading: false, // 流转记录加载
      // 模型xml数据
      flowData: {},
      processImgShow: false, // 流程图显示
      imgLoading: false, // 流程图加载
      loading: false,
      tableLoading: false,
      detailData: {},
@@ -147,19 +228,67 @@
        currentPage: 1,
        projectId: null,
        processDefId: null,
        processInsId: null,
        deployId: null,
        processName: '' // 流程名称
      }
    }
  },
  mounted() {
    console.log(this.$route.query, "参数")
    this.queryParams.projectId = this.$route.query.projectId
    this.queryParams.processDefId = this.$route.query.processDefId
    this.queryParams.processName = this.$route.query.processName
    let params = JSON.parse(sessionStorage.getItem("projectProDetail"))
    console.log(params, "参数")
    if (!params || ! params.projectId) {
      this.queryParams.projectId = this.$route.query.projectId
      this.queryParams.processDefId = this.$route.query.processDefId
      this.queryParams.processInsId = this.$route.query.processInsId
      this.queryParams.deployId = this.$route.query.deployId
      this.queryParams.processName = this.$route.query.processName
      sessionStorage.setItem("projectProDetail", JSON.stringify(this.queryParams))
    } else {
      this.queryParams = params
    }
    this.loading = true
    this.getProjectProcessInfo()
  },
  methods: {
    setIcon(val) {
      if (val) {
        return "el-icon-check";
      } else {
        return "el-icon-time";
      }
    },
    setColor(val) {
      if (val) {
        return "#2bc418";
      } else {
        return "#b3bdbb";
      }
    },
    openRecord() {
      this.getFlowRecordList(this.queryParams.processInsId);
    },
    openProcessImg() {
      this.imgLoading = true
      flowXmlAndNode({processInsId:this.queryParams.processInsId,deployId:this.queryParams.deployId}).then(res => {
        this.imgLoading = false
        this.processImgShow = true
        this.$nextTick(() => {
          this.flowData = res.data;
        })
      })
    },
    /** 流程流转记录 */
    getFlowRecordList(procInsId) {
      const params = {procInsId: procInsId}
      this.recordLoading = true
      flowRecord(params).then(res => {
        this.flowRecordList = res.data.flowList;
        this.recordLoading = false
        this.processRecordShow = true
      })
    },
    unitFormatter(row) {
      if (row.handlerType === 'USER') {
        return null;
@@ -179,22 +308,24 @@
      }
    },
    finalFinishedFormatter(row) {
      if (row.taskStatus === '未开始') {
      // 不是已完成的状态没有实际处理人,已完成的状态只有一个人
      if (row.taskStatus !== '已完成') {
        return null
      } else {
        return row.actualHandlerUserName
      }
      return row.handlerName.join('、')
    },
    showHandle(row) {
      console.log(this.$store.state.user, "用户信息")
      if (row.taskStatus === '待办') {
        if (row.handlerType === "USER") {
          return this.$store.state.user.id === row.handlerId
          console.log(row.handlerId.indexOf(this.$store.state.user.id) !== -1, "我是不是")
          return row.handlerId.indexOf(this.$store.state.user.id) !== -1
        } else if (row.handlerType === "DEPT") {
          console.log(this.$store.state.user.deptId, "部门id", row.handlerUnitId)
          return this.$store.state.user.deptId === row.handlerUnitId
          return row.handlerUnitId.indexOf(this.$store.state.user.deptId) !== -1
          // return this.$store.state.user.name === '市发展改革委' || this.$store.state.user.name === '市住建局'
        } else if (row.handlerType === "ROLE") {
          return this.$auth.hasRole(row.handlerUnitName)
          return row.handlerUnitId.some(roleId => this.$store.state.user.roleIds.indexOf(roleId) !== -1)
        }
      } else {
        return false
@@ -207,12 +338,16 @@
        taskId: row.taskId
      }
      getTaskIsAuditing(params).then(res => {
        console.log("row",row)
        this.$router.push({
          path: '/flowable/task/myProcess/send/index',
          query: {
            deployId: row.deployId,
            procDefId: row.processDefId,
            procInsId: row.processInsId,
            processName: row.taskName,
            flowName: this.queryParams.processName,
            projectName: this.detailData.projectName,
            taskId: row.taskId,
            showAuditing: res.data,
            goBackParams: this.queryParams
@@ -223,6 +358,8 @@
    goToProcessDetail(row) {
      this.$router.push({ path: '/flowable/task/myProcess/detail/index',
        query: {
          projectName: this.detailData.projectName,
          flowName: this.queryParams.processName,
          procInsId: row.processInsId,
          deployId: row.deployId,
          taskId: row.taskId,
@@ -231,22 +368,26 @@
    },
    search() {
      this.queryParams.currentPage = 1;
      this.tableLoading = true
      this.getList()
    },
    sizeChange(pageSize) {
      this.tableLoading = true
      this.queryParams.pageSize = pageSize;
      this.getList()
    },
    pageChange(pageNum) {
      this.tableLoading = true
      this.queryParams.currentPage = pageNum;
      this.getList()
    },
    getList() {
      this.tableLoading = true
      // 获取任务列表
      getProjectProcessDetailTaskList(this.queryParams).then(res => {
        this.tableLoading =false
        this.taskList = res.data
        this.total = res.total
        this.tableLoading =false
      })
    },
    // 查询详情
@@ -259,14 +400,12 @@
      })
    },
    changeTab(id, event) {
      this.tableLoading = true
      let beforeId = this.selectTabId
      this.selectTabId = id
      this.queryParams.taskType = event
      if (beforeId !== id) {
        this.getList()
      }
    }
  }
}