From 534394e00cfcc6b4f3dc3073add3ccd9fa937eee Mon Sep 17 00:00:00 2001 From: zxl <763096477@qq.com> Date: 星期五, 21 三月 2025 10:57:16 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/views/flowable/task/myProcess/send/index.vue | 113 +++++----- src/views/flowable/task/myProcess/detail/index.vue | 81 +++---- src/api/flowable/definition.js | 11 + src/components/Process/style/flow-viewer.scss | 65 ++++- src/components/Process/index.vue | 40 ++++ src/views/flowable/definition/model.vue | 18 + src/components/Process/viewer/index.vue | 80 +++++-- src/views/projectProcess/components/LogTimeLine.vue | 151 +++++++++++++++ 8 files changed, 414 insertions(+), 145 deletions(-) diff --git a/src/api/flowable/definition.js b/src/api/flowable/definition.js index b280346..03fb263 100644 --- a/src/api/flowable/definition.js +++ b/src/api/flowable/definition.js @@ -95,7 +95,7 @@ }) } -// 璇诲彇xml鏂囦欢 +// 淇濆瓨xml鏂囦欢 export function saveXml(data) { return request({ url: '/flowable/definition/save', @@ -104,6 +104,15 @@ }) } +// 鏇存柊xml鏂囦欢 +export function updateXml(data) { + return request({ + url: '/flowable/definition/update', + method: 'post', + data: data + }) +} + // 鏂板娴佺▼瀹氫箟 export function addDeployment(data) { return request({ diff --git a/src/components/Process/index.vue b/src/components/Process/index.vue index 56e62f3..290cb9b 100644 --- a/src/components/Process/index.vue +++ b/src/components/Process/index.vue @@ -39,6 +39,7 @@ <el-button size="mini" icon="el-icon-download" @click="saveXML(true)">涓嬭浇xml</el-button> <el-button size="mini" icon="el-icon-picture" @click="saveImg('svg', true)">涓嬭浇svg</el-button> <el-button size="mini" type="primary" @click="save">淇濆瓨妯″瀷</el-button> + <el-button size="mini" type="warning" @click="update">鏇存柊妯″瀷</el-button> <el-button size="mini" type="danger" @click="goBack">鍏抽棴</el-button> </el-button-group> </div> @@ -68,6 +69,7 @@ // 寮曞叆flowable鐨勮妭鐐规枃浠� import FlowableModule from './flowable/flowable.json' import customControlsModule from './customPanel' +import {taskWait} from "@/api/projectProcess/projectProcess"; export default { name: "BpmnModel", components: {Designer}, @@ -256,6 +258,39 @@ this.goBack(); }, + update() { + this.$prompt('鏇存柊娴佺▼涓嶄細浜х敓鏂扮増鏈紝閲嶈鐨勬槸浣犱笉鑳戒慨鏀规祦绋嬫帹杩涗腑宸茬粡鎵ц杩囩殑浠诲姟鑺傜偣锛屽惁鍒欎細寮曡捣鏁版嵁闂锛侊紒锛�<span style="color: red">璇峰湪涓嬫柟杈撳叆锛氭垜宸茬煡鏅�</span>', '鏇存柊娴佺▼', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning', + customClass: 'updateC', + dangerouslyUseHTMLString: true, + inputType: 'textarea', + inputValidator: (value) => { + if (!value || value.trim() === '') { + return "璇疯緭鍏ワ細鎴戝凡鐭ユ檽" + } + if (value !== "鎴戝凡鐭ユ檽") { + return "杈撳叆閿欒锛岃杈撳叆锛氭垜宸茬煡鏅�" + } + return true + }, + inputErrorMessage: '璇疯緭鍏ワ細鎴戝凡鐭ユ檽' + }).then(async ({value}) => { + const process = this.getProcess() + const xml = await this.saveXML() + const svg = await this.saveImg() + const result = {process, xml, svg} + this.$emit('update', result) + window.parent.postMessage(result, '*') + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堟搷浣�' + }); + }); + }, + // 鎵撳紑娴佺▼鏂囦欢 openBpmn(file) { const reader = new FileReader() @@ -348,5 +383,10 @@ width: 100%; margin: 0 0 5px; } + +} + +.updateC { + width: 500px; } </style> diff --git a/src/components/Process/style/flow-viewer.scss b/src/components/Process/style/flow-viewer.scss index 76fb85c..15c6b67 100644 --- a/src/components/Process/style/flow-viewer.scss +++ b/src/components/Process/style/flow-viewer.scss @@ -99,7 +99,7 @@ right: 10px; } - // 瀹屾垚娴佺▼绾� + /* ---------瀹屾垚棰滆壊---------- */ .highlight.djs-shape .djs-visual > :nth-child(1) { fill: #56bb56 !important; stroke: #56bb56 !important; @@ -120,7 +120,7 @@ stroke: #56bb56 !important; } - // 浠e姙娴佺▼绾� + /* ----------浠e姙棰滆壊---------- */ .highlight-todo.djs-shape .djs-visual > :nth-child(1) { fill: #559db0 !important; stroke: #559db0 !important; @@ -141,29 +141,51 @@ stroke: #559db0 !important; } - // 宸茶秴鏃舵祦绋嬬嚎 + /* --------瀹圭己棰滆壊-------- */ //鏂瑰潡鍐呴儴棰滆壊 - .highlight-overtime.djs-shape .djs-visual > :nth-child(1) { - fill: #ff5353 !important; - stroke: #ff5353 !important; + .highlight-wait.djs-shape .djs-visual > :nth-child(1) { + fill: #F56C6C !important; + stroke: #F56C6C !important; fill-opacity: 0.2 !important; } //鏂囧瓧棰滆壊 - .highlight-overtime.djs-shape .djs-visual > :nth-child(2) { - fill: #ff5353 !important; + .highlight-wait.djs-shape .djs-visual > :nth-child(2) { + fill: #F56C6C !important; } //浜虹墿ui棰滆壊 - .highlight-overtime.djs-shape .djs-visual > path { - fill: #ff5353 !important; + .highlight-wait.djs-shape .djs-visual > path { + fill: #F56C6C !important; fill-opacity: 0.2 !important; - stroke: #ff5353 !important; + stroke: #F56C6C !important; } //鍓嶉潰閭f潯绾跨殑棰滆壊 - .highlight-overtime.djs-connection > .djs-visual > path { - stroke: #ff5353 !important; + .highlight-wait.djs-connection > .djs-visual > path { + stroke: #F56C6C !important; } - // 鍗冲皢瓒呮椂娴佺▼绾� + /* --------璺宠繃棰滆壊--------- */ + .highlight-jump.djs-shape .djs-visual > :nth-child(1) { + fill: #909399 !important; + stroke: #909399 !important; + fill-opacity: 0.2 !important; + } + //鏂囧瓧棰滆壊 + .highlight-jump.djs-shape .djs-visual > :nth-child(2) { + fill: #909399 !important; + } + //浜虹墿ui棰滆壊 + .highlight-jump.djs-shape .djs-visual > path { + fill: #909399 !important; + fill-opacity: 0.2 !important; + stroke: #909399 !important; + } + //鍓嶉潰閭f潯绾跨殑棰滆壊 + .highlight-jump.djs-connection > .djs-visual > path { + stroke: #909399 !important; + } + + + /* --------瓒呮椂棰滆壊 */ .highlight-willOvertime.djs-shape .djs-visual > :nth-child(1) { fill: #eab24a !important; stroke: #eab24a !important; @@ -234,12 +256,21 @@ margin-right: 8px; } - .todo { + .jump { padding: 4px; - background: #ECEDEE; + background: #909399; border: 1px solid rgba(204, 204, 204, 0.1); border-radius: 3px; - color: #666666; + color: #4f4f4f; + margin-right: 5px; + } + + .wait { + padding: 4px; + background: #F56C6C; + border: 1px solid rgba(204, 204, 204, 0.1); + border-radius: 3px; + color: #eae9e9; margin-right: 5px; } diff --git a/src/components/Process/viewer/index.vue b/src/components/Process/viewer/index.vue index ed21bd3..5558f6b 100644 --- a/src/components/Process/viewer/index.vue +++ b/src/components/Process/viewer/index.vue @@ -6,9 +6,9 @@ <span class="intro">鐘舵�侊細</span> <div class="finish">宸插姙鐞�</div> <div class="processing">澶勭悊涓�</div> - <div class="todo">鏈繘琛�</div> <div class="overtime">宸茶秴鏃�</div> -<!-- <div class="overtime">宸茶秴鏃�</div>--> + <div class="jump">璺� 杩�</div> + <div class="wait">瀹� 缂�</div> </div> <!-- 娴佺▼鍥炬樉绀� --> <div v-loading="loading" class="canvas" ref="flowCanvas"></div> @@ -110,25 +110,34 @@ const endTask = nodeData[nodeData.length - 1] if (n.$type === 'bpmn:UserTask') { if (completeTask) { - canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo') - if(completeTask.overtime && completeTask.overtime==='red'){ - canvas.addMarker(n.id, 'highlight-willOvertime') - } - // else if(completeTask.overtime && completeTask.overtime==='yellow'){ - // canvas.addMarker(n.id, 'highlight-willOvertime') - // } - n.outgoing?.forEach(nn => { - const targetTask = nodeData.find(m => m.key === nn.targetRef.id) - if (targetTask) { - if (todoTask && completeTask.key === todoTask.key && !todoTask.completed) { - canvas.addMarker(nn.id, todoTask.completed ? 'highlight' : 'highlight-todo') - canvas.addMarker(nn.targetRef.id, todoTask.completed ? 'highlight' : 'highlight-todo') - } else { - canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo') - canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo') - } - + if (completeTask.hasJump) { + canvas.addMarker(n.id, 'highlight-jump') + } else if (completeTask.hasWait) { + canvas.addMarker(n.id, 'highlight-wait') + } else { + canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo') + if(completeTask.overtime && completeTask.overtime==='red' || completeTask.overtime==='yellow'){ + canvas.addMarker(n.id, 'highlight-willOvertime') } + } + n.outgoing?.forEach(nn => { + if (completeTask.hasJump) { + canvas.addMarker(nn.id, 'highlight-jump') + } else if (completeTask.hasWait) { + canvas.addMarker(nn.id, 'highlight-wait') + } else { + const targetTask = nodeData.find(m => m.key === nn.targetRef.id) + if (targetTask) { + if (todoTask && completeTask.key === todoTask.key && !todoTask.completed) { + canvas.addMarker(nn.id, todoTask.completed ? 'highlight' : 'highlight-todo') + canvas.addMarker(nn.targetRef.id, todoTask.completed ? 'highlight' : 'highlight-todo') + } else { + canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo') + canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo') + } + } + } + }) } } @@ -139,9 +148,14 @@ n.outgoing?.forEach(nn => { const targetTask = nodeData.find(m => m.key === nn.targetRef.id) if (targetTask) { - - canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo') - canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo') + if (targetTask.hasJump) { + canvas.addMarker(nn.id, 'highlight-jump') + } else if (targetTask.hasWait) { + canvas.addMarker(nn.id, 'highlight-wait') + } else { + canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo') + canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo') + } } }) } @@ -153,8 +167,14 @@ n.outgoing?.forEach(nn => { const targetTask = nodeData.find(m => m.key === nn.targetRef.id) if (targetTask) { - canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo') - canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo') + if (targetTask.hasJump) { + canvas.addMarker(nn.id, 'highlight-jump') + } else if (targetTask.hasWait) { + canvas.addMarker(nn.id, 'highlight-wait') + } else { + canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo') + canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo') + } } }) } @@ -162,8 +182,14 @@ n.outgoing.forEach(nn => { const completeTask = nodeData.find(m => m.key === nn.targetRef.id) if (completeTask) { - canvas.addMarker(nn.id, 'highlight') - canvas.addMarker(n.id, 'highlight') + if (completeTask.hasJump) { + canvas.addMarker(nn.id, 'highlight-jump') + } else if (completeTask.hasWait) { + canvas.addMarker(nn.id, 'highlight-wait') + } else { + canvas.addMarker(nn.id, 'highlight') + canvas.addMarker(n.id, 'highlight') + } return; } }) diff --git a/src/views/flowable/definition/model.vue b/src/views/flowable/definition/model.vue index 3ef28fd..93ca8e3 100644 --- a/src/views/flowable/definition/model.vue +++ b/src/views/flowable/definition/model.vue @@ -5,6 +5,7 @@ :xml="xml" :is-view="false" @save="save" + @update="update" @showXML="showXML" /> <!--鍦ㄧ嚎鏌ョ湅xml--> @@ -17,7 +18,7 @@ </div> </template> <script> -import {readXml, roleList, saveXml, userList,expList} from "@/api/flowable/definition"; +import {readXml, roleList, saveXml, userList, expList, updateXml} from "@/api/flowable/definition"; import BpmnModel from '@/components/Process' import vkBeautify from 'vkbeautify' import hljs from 'highlight.js' @@ -101,6 +102,21 @@ this.$tab.closeOpenPage(obj); }) }, + /** 鏇存柊xml */ + update(data) { + const params = { + deploymentId: this.$route.query && this.$route.query.deployId, + name: data.process.name, + category: data.process.category, + xml: data.xml + } + updateXml(params).then(res => { + this.$modal.msgSuccess(res.msg) + // 鍏抽棴褰撳墠鏍囩椤靛苟杩斿洖涓婁釜椤甸潰 + const obj = { path: "/flowable/definition", query: { t: Date.now()} }; + this.$tab.closeOpenPage(obj); + }) + }, /** 鎸囧畾娴佺▼鍔炵悊浜哄憳鍒楄〃 */ getDataList() { userList().then(res => { diff --git a/src/views/flowable/task/myProcess/detail/index.vue b/src/views/flowable/task/myProcess/detail/index.vue index b8e9952..6dc7580 100644 --- a/src/views/flowable/task/myProcess/detail/index.vue +++ b/src/views/flowable/task/myProcess/detail/index.vue @@ -3,55 +3,49 @@ <el-card class="box-card" > <div slot="header" class="clearfix" style="display: flex"> <div style="flex: 1" class="el-icon-document">{{`浠诲姟璇︽儏锛歚 + this.goBackParams.processName}}</div> - <div style="flex: 2">{{projectName + '鈥斺��' + flowName}}</div> + <div style="flex: 2; color: #303133">{{projectName + '鈥斺��' + flowName}}</div> <el-button style="float: right;" size="mini" type="danger" @click="goBack">鍏抽棴</el-button> </div> <el-tabs tab-position="top" v-model="activeName" @tab-click="handleClick"> <!--琛ㄥ崟淇℃伅--> <el-tab-pane label="琛ㄥ崟淇℃伅" name="1"> <!--鍒濆鍖栨祦绋嬪姞杞借〃鍗曚俊鎭�--> - <el-col :span="16" :offset="4" v-loading="formLoading" class="tab-min-height"> + <el-col :span="24" v-loading="formLoading" class="tab-min-height"> <div v-if="formDataList && formDataList.length > 0"> <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp" style="position: relative"> - <div v-if="formDataObj.current"> - <div class="current">褰撳墠闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div> - </div> - <div v-else-if="formDataList.length > 1"> - <div class="before">鍓嶇疆闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div> - </div> - <div v-if="formDataObj != null && formDataObj.formJsonObj != null"> - <v-form-render :form-data="formDataObj.formJsonObj.formJson" :ref="'form' + index"/> - </div> - <div v-else> - <el-alert - title="鏈粦瀹氳〃鍗�" - type="warning" - :closable="false" - > - </el-alert> - </div> - <div style="position: absolute;top: 10px; right: 20px" v-if="formDataObj.events.length > 0"> - <el-popover - placement="right-start" - title="浠诲姟鏃ュ織" - width="800" - trigger="hover" - > - <div v-if="formDataObj.events.length > 0"> - <log-view :log-list="formDataObj.events"/> + <el-row> + <el-col :span="18"> + <div v-if="formDataObj.current"> + <div class="current">褰撳墠闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div> </div> - <el-button slot="reference">浠诲姟鏃ュ織</el-button> - </el-popover> - </div> - <div v-if="formDataList.length <= 1"> - <div class="before_none">鍓嶇疆闃舵锛�<span>涓嶅瓨鍦ㄥ墠缃樁娈�</span></div> - <el-alert - title="涓嶅瓨鍦ㄥ墠缃樁娈�" - type="warning" - :closable="false" - > - </el-alert> - </div> + <div v-else-if="formDataList.length > 1"> + <div class="before">鍓嶇疆闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div> + </div> + <div v-if="formDataObj != null && formDataObj.formJsonObj != null"> + <v-form-render :form-data="formDataObj.formJsonObj.formJson" :ref="'form' + index"/> + </div> + <div v-else> + <el-alert + title="鏈粦瀹氳〃鍗�" + type="warning" + :closable="false" + > + </el-alert> + </div> + <div v-if="formDataList.length <= 1"> + <div class="before_none">鍓嶇疆闃舵锛�<span>涓嶅瓨鍦ㄥ墠缃樁娈�</span></div> + <el-alert + title="涓嶅瓨鍦ㄥ墠缃樁娈�" + type="warning" + :closable="false" + > + </el-alert> + </div> + </el-col> + <el-col :span="6"> + <log-time-line v-if="formDataObj.events.length > 0" :log-list="formDataObj.events"/> + </el-col> + </el-row> </div> </div> </el-col> @@ -123,12 +117,13 @@ import {flowTaskForm, flowTaskFormDetail} from "@/api/flowable/todo"; import BpmnViewer from '@/components/Process/viewer'; import LogView from "@/views/projectProcess/components/LogView"; +import LogTimeLine from "@/views/projectProcess/components/LogTimeLine"; import "@riophae/vue-treeselect/dist/vue-treeselect.css"; export default { name: "Record", components: { - BpmnViewer, LogView + BpmnViewer, LogView, LogTimeLine }, props: {}, data() { @@ -293,7 +288,9 @@ padding: 20px; margin-top: 5px; margin-bottom: 20px; - box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.25em, rgba(90, 125, 188, 0.05) 0px 0.25em 1em; + margin-left: 3px; + margin-right: 3px; + box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.1em, rgba(90, 125, 188, 0.05) 0px 0.1em 0.5em; } .before { span { diff --git a/src/views/flowable/task/myProcess/send/index.vue b/src/views/flowable/task/myProcess/send/index.vue index e50e92b..32bbe07 100644 --- a/src/views/flowable/task/myProcess/send/index.vue +++ b/src/views/flowable/task/myProcess/send/index.vue @@ -3,68 +3,63 @@ <el-card class="box-card" > <div slot="header" class="clearfix" style="display: flex"> <div style="flex: 1" class="el-icon-document">{{`浠诲姟鍔炵悊锛歚 + processName}}</div> - <div style="flex: 2">{{projectName + '鈥斺��' + flowName}}</div> + <div style="flex: 2; color: #303133">{{projectName + '鈥斺��' + flowName}}</div> <el-button style="float: right;" size="mini" type="danger" @click="goBack">鍏抽棴</el-button> </div> <el-tabs tab-position="top" v-model="activeName" @tab-click="handleClick"> <!--琛ㄥ崟淇℃伅--> <el-tab-pane label="琛ㄥ崟淇℃伅" name="1"> <!--鍒濆鍖栨祦绋嬪姞杞借〃鍗曚俊鎭�--> - <el-col :span="16" :offset="4" v-loading="formLoading" class="tab-min-height"> + <el-col :span="24" v-loading="formLoading" class="tab-min-height"> <div v-if="formDataList && formDataList.length > 0"> - <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp" style="position: relative"> - <div v-if="formDataObj.current"> - <!-- 褰撳墠鑺傜偣鍙崗鍚屻�佽浆鍔炵瓑鎿嶄綔 --> - <div class="op-list"> - <el-button size="small" type="primary" :disabled="formDataObj.taskStatus === '鎸傝捣' || submitLoading" v-loading="submitLoading" @click="submitForm">纭骞舵彁浜�</el-button> -<!-- <el-button size="small" type="primary" disabled @click="submitForm">鍗忓悓鍔炵悊(鍔熻兘寮�鍙戜腑)</el-button>--> - <el-button size="small" type="primary" v-if="!isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" @click="openDelegation(formDataList[0].beforeNodeName)">杞姙</el-button> - <el-button v-if="formDataObj.canJump && !isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" size="small" type="primary" @click="jumpTask()">璺宠繃</el-button> - <el-button v-if="formDataObj.canWait && !isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" size="small" type="primary" @click="waitTask()">瀹圭己</el-button> - <el-button v-if="formDataObj.canHangup && formDataObj.taskStatus !== '鎸傝捣' && !isWait" size="small" type="primary" @click="hangup">鎸傝捣</el-button> - <el-button v-if="formDataObj.canHangup && formDataObj.taskStatus === '鎸傝捣' && !isWait" size="small" type="primary" @click="cancelHangup">缁撴潫鎸傝捣</el-button> - </div> - <div class="current">褰撳墠闃舵锛�<span>{{formDataObj.beforeNodeName}}</span><span v-if="formDataObj.taskStatus === 'HANGUP'">锛堟寕璧蜂腑锛�</span></div> - </div> - <div v-else-if="formDataList.length > 1"> - <!-- 鍓嶇疆鑺傜偣鍙┏鍥� --> - <div class="reject-but"> - <el-button type="danger" size="small" @click="openRejectTask(formDataObj.beforeNodeName)">椹� 鍥�</el-button> - <el-popover - style="margin-left: 10px" v-if="formDataObj.events.length > 0" - placement="right-start" - title="浠诲姟鏃ュ織" - width="800" - trigger="hover" - > - <div v-if="formDataObj.events.length > 0"> - <log-view :log-list="formDataObj.events"/> + <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp"> + <el-row> + <el-col :span="18" style="position: relative"> + <div v-if="formDataObj.current"> + <!-- 褰撳墠鑺傜偣鍙崗鍚屻�佽浆鍔炵瓑鎿嶄綔 --> + <div class="op-list"> + <el-button size="small" type="primary" :disabled="formDataObj.taskStatus === '鎸傝捣' || submitLoading" v-loading="submitLoading" @click="submitForm">纭骞舵彁浜�</el-button> + <!-- <el-button size="small" type="primary" disabled @click="submitForm">鍗忓悓鍔炵悊(鍔熻兘寮�鍙戜腑)</el-button>--> + <el-button size="small" type="primary" v-if="!isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" @click="openDelegation(formDataList[0].beforeNodeName)">杞姙</el-button> + <el-button v-if="formDataObj.canJump && !isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" size="small" type="primary" @click="jumpTask()">璺宠繃</el-button> + <el-button v-if="formDataObj.canWait && !isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" size="small" type="primary" @click="waitTask()">瀹圭己</el-button> + <el-button v-if="formDataObj.canHangup && formDataObj.taskStatus !== '鎸傝捣' && !isWait" size="small" type="primary" @click="hangup">鎸傝捣</el-button> + <el-button v-if="formDataObj.canHangup && formDataObj.taskStatus === '鎸傝捣' && !isWait" size="small" type="primary" @click="cancelHangup">缁撴潫鎸傝捣</el-button> </div> - <el-button slot="reference">浠诲姟鏃ュ織</el-button> - </el-popover> - </div> - <div class="before">鍓嶇疆闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div> - </div> - <div v-if="formDataObj != null && formDataObj.formJsonObj != null"> - <v-form-render :form-data="formDataObj.formJsonObj.formJson" :ref="'form' + index"/> - </div> - <div v-else> - <el-alert - title="鏈粦瀹氳〃鍗�" - type="warning" - :closable="false" - > - </el-alert> - </div> - <div v-if="formDataList.length <= 1"> - <div class="before_none">鍓嶇疆闃舵锛�<span>涓嶅瓨鍦ㄥ墠缃樁娈�</span></div> - <el-alert - title="涓嶅瓨鍦ㄥ墠缃樁娈�" - type="warning" - :closable="false" - > - </el-alert> - </div> + <div class="current">褰撳墠闃舵锛�<span>{{formDataObj.beforeNodeName}}</span><span v-if="formDataObj.taskStatus === 'HANGUP'">锛堟寕璧蜂腑锛�</span></div> + </div> + <div v-else-if="formDataList.length > 1"> + <!-- 鍓嶇疆鑺傜偣鍙┏鍥� --> + <div class="reject-but"> + <el-button type="danger" size="small" @click="openRejectTask(formDataObj.beforeNodeName)">椹� 鍥�</el-button> + </div> + <div class="before">鍓嶇疆闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div> + </div> + <div v-if="formDataObj != null && formDataObj.formJsonObj != null"> + <v-form-render :form-data="formDataObj.formJsonObj.formJson" :ref="'form' + index"/> + </div> + <div v-else> + <el-alert + title="鏈粦瀹氳〃鍗�" + type="warning" + :closable="false" + > + </el-alert> + </div> + <div v-if="formDataList.length <= 1"> + <div class="before_none">鍓嶇疆闃舵锛�<span>涓嶅瓨鍦ㄥ墠缃樁娈�</span></div> + <el-alert + title="涓嶅瓨鍦ㄥ墠缃樁娈�" + type="warning" + :closable="false" + > + </el-alert> + </div> + </el-col> + <el-col :span="6"> + <log-time-line v-if="formDataObj.events.length > 0" :log-list="formDataObj.events"/> + </el-col> + </el-row> </div> </div> </el-col> @@ -189,6 +184,7 @@ import { flowTaskForm } from "@/api/flowable/todo"; import {getNextFlowNodeByStart} from "@/api/flowable/todo"; import LogView from "@/views/projectProcess/components/LogView"; +import LogTimeLine from "@/views/projectProcess/components/LogTimeLine"; import {rejectTask} from "@/api/flowable/process"; import {cancelTaskHangup, taskDelegation, taskHangup, taskJump, taskWait} from "@/api/projectProcess/projectProcess"; @@ -200,7 +196,8 @@ MyDept, SingleUser, MultUser, - LogView + LogView, + LogTimeLine }, props: {}, data() { @@ -824,6 +821,8 @@ padding: 20px; margin-top: 5px; margin-bottom: 20px; + margin-left: 3px; + margin-right: 3px; box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.25em, rgba(90, 125, 188, 0.05) 0px 0.25em 1em; } .before { @@ -843,7 +842,7 @@ } .reject-but { position: absolute; - top: 4px; + top: -4px; right: 4px } .current { @@ -855,7 +854,7 @@ } .op-list { position: absolute; - top: 4px; + top: -4px; right: 4px; display: flex; justify-content: center; diff --git a/src/views/projectProcess/components/LogTimeLine.vue b/src/views/projectProcess/components/LogTimeLine.vue new file mode 100644 index 0000000..bda6f6b --- /dev/null +++ b/src/views/projectProcess/components/LogTimeLine.vue @@ -0,0 +1,151 @@ +<template> + <div> + <el-timeline> + <el-timeline-item + v-for="(log, index) in logList" + :key="index" + :color="getColor(log)" + placement="top" + :timestamp="log.gmtCreate"> + <div class="log" v-if="log.eventType === 'FINISHED'"> + <div> + <span class="tag name">{{log.nickName}}</span> + <span class="tag op">瀹屾垚</span> + 浜嗕换鍔� + <span class="tag taskName">{{log.taskName}}</span> + </div> + </div> + <div class="log" v-else-if="log.eventType === 'REJECT'"> + <div> + <span class="tag name">{{log.nickName}}</span> + <span class="tag reject">椹冲洖</span> + 浜嗕换鍔� + <span class="tag taskName">{{log.taskName}}</span> + 锛� + <span class="tag reject">椹冲洖鍘熷洜</span> + 锛� + <span class="tag">{{log.eventDataObj.reason}}</span> + </div> + </div> + <div class="log" v-else-if="log.eventType === 'HANGUP'"> + <div> + <span class="tag name">{{log.nickName}}</span> + <span class="tag reject">鎸傝捣</span> + 浜嗕换鍔� + <span class="tag taskName">{{log.taskName}}</span> + 锛� + <span class="tag reject">鎸傝捣鍘熷洜</span> + 锛� + <span class="tag">{{log.eventDataObj.reason}}</span> + </div> + </div> + <div class="log" v-else-if="log.eventType === 'CANCEL_HANGUP'"> + <div> + <span class="tag name">{{log.nickName}}</span> + <span class="tag reject">鍙栨秷鎸傝捣</span> + 浜嗕换鍔� + <span class="tag taskName">{{log.taskName}}</span> + </div> + </div> + <div class="log" v-else-if="log.eventType === 'DELEGATE'"> + <div> + <span class="tag name">{{log.nickName}}</span> + 灏嗕换鍔� + <span class="tag taskName">{{log.taskName}}</span> + <span class="tag op">杞姙</span> + 缁欎簡 + <span class="tag">{{log.eventDataObj.afterHandlerNames.join('銆�')}}</span> + </div> + </div> + <div class="log" v-else-if="log.eventType === 'JUMP'"> + <div> + <span class="tag name">{{log.nickName}}</span> + <span class="tag jump">璺宠繃</span> + 浜嗕换鍔� + <span class="tag taskName">{{log.taskName}}</span> + 锛� + <span class="tag jump">璺宠繃璇存槑</span> + 锛� + <span class="tag">{{log.eventDataObj.desc}}</span> + </div> + </div> + <div class="log" v-else-if="log.eventType === 'WAIT'"> + <div> + <span class="tag name">{{log.nickName}}</span> + <span class="tag jump">瀹圭己</span> + 浜嗕换鍔� + <span class="tag taskName">{{log.taskName}}</span> + 锛� + <span class="tag jump">瀹圭己璇存槑</span> + 锛� + <span class="tag">{{log.eventDataObj.desc}}</span> + </div> + </div> + <div class="log" v-else-if="log.eventType === 'SUPERVISE'"> + <div> + <span class="tag name">{{log.nickName}}</span> + <span class="tag db">鐫e姙</span> + 浜嗕换鍔� + <span class="tag taskName">{{log.taskName}}</span> + 锛� + <span class="tag db">鐫e姙淇℃伅</span> + 锛� + <span class="tag">{{log.eventDataObj.content}}</span> + </div> + </div> + <div class="log" v-else-if="log.eventType === 'TEAM_WORK'"> + <div> + <span class="tag name">{{log.nickName}}</span> + 閭�璇蜂簡璋佽皝璋� + <span class="tag op">鍗忓悓鍔炵悊</span> + <span class="tag taskName">{{log.taskName}}</span> + </div> + </div> + </el-timeline-item> + </el-timeline> + </div> +</template> + +<script> +export default { + name: "LogTimeLine", + props: { + logList: { + require: true, + type: Array + } + }, + data() { + return { + + } + }, + methods: { + getColor(log) { + if (log.eventType === 'FINISHED') { + return "#67C23A" + } else if (log.eventType === 'REJECT') { + return "#F56C6C" + } else if (log.eventType === 'HANGUP') { + return "#409EFF" + } else if (log.eventType === 'CANCEL_HANGUP') { + return "#409EFF" + } else if (log.eventType === 'DELEGATE') { + return "#53b1d3" + } else if (log.eventType === 'JUMP' || log.eventType === 'WAIT') { + return "#E6A23C" + } else if (log.eventType === 'SUPERVISE') { + return "#F56C6C" + } else if (log.eventType === 'TEAM_WORK') { + return "#909399" + } + } + } +} +</script> + +<style scoped> +.log { + color: #606266; +} +</style> -- Gitblit v1.8.0