From f1bc584fb51ea39cbda9590275c92e3246737561 Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期一, 20 一月 2025 18:22:52 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/views/projectProcess/detail/index.vue | 141 ++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 133 insertions(+), 8 deletions(-) diff --git a/src/views/projectProcess/detail/index.vue b/src/views/projectProcess/detail/index.vue index adf4bc1..3f615c0 100644 --- a/src/views/projectProcess/detail/index.vue +++ b/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}">浠e姙浜嬮」<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}">鐫e姙浜嬮」锛�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 @@ -115,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> @@ -124,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: "Detail", + components: { + BpmnViewer + }, data() { return { + processRecordShow: false, // 娴佽浆璁板綍鏄剧ず + flowRecordList: [], // 娴佺▼娴佽浆鏁版嵁 + recordLoading: false, // 娴佽浆璁板綍鍔犺浇 + // 妯″瀷xml鏁版嵁 + flowData: {}, + processImgShow: false, // 娴佺▼鍥炬樉绀� + imgLoading: false, // 娴佺▼鍥惧姞杞� loading: false, tableLoading: false, detailData: {}, @@ -142,18 +228,21 @@ currentPage: 1, projectId: null, processDefId: null, + processInsId: null, + deployId: null, processName: '' // 娴佺▼鍚嶇О } } }, mounted() { console.log(this.$route.query, "鍙傛暟") - 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 { @@ -163,6 +252,43 @@ 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; @@ -186,7 +312,7 @@ if (row.taskStatus !== '宸插畬鎴�') { return null } else { - return row.handlerName + return row.actualHandlerUserName } }, showHandle(row) { @@ -199,7 +325,7 @@ 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 @@ -256,11 +382,12 @@ 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 }) }, // 鏌ヨ璇︽儏 @@ -273,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() } - } } } -- Gitblit v1.8.0