This commit is contained in:
那些花儿
2025-07-29 14:25:33 +08:00
parent 72546696fa
commit 9d8002ec93
40 changed files with 1410 additions and 13555 deletions
@@ -6,13 +6,13 @@
<div class="title-section">
<h2 class="page-title">{{ pageTitle }}</h2>
<div class="page-breadcrumb">
<span>工作流管理</span>
<span class="separator">></span>
<!-- <span>工作流管理</span>-->
<!-- <span class="separator">></span>-->
<span>{{ isNewApplication ? "发起申请" : "任务处理" }}</span>
</div>
</div>
<div class="status-section">
<span class="status-label">状态</span>
<span class="status-label">流程状态</span>
<span class="status-badge" :class="statusClass">{{ processStatusText }}</span>
</div>
</div>
@@ -69,7 +69,7 @@
<!-- 历史办理过程面板 -->
<div v-if="shouldShowHistoryProcess" class="history-panel">
<div class="panel-header">
<h3 class="panel-title">办理过程</h3>
<h3 class="panel-title">详细办理过程</h3>
</div>
<div class="panel-content">
<div id="history-process-container" class="form-content">
@@ -330,7 +330,6 @@ module.exports = {
// 加载申请表单
async loadApplicationForm() {
debugger
if (!this.defineKey || !this.processDefinition.instanceUrl) return
this.pjaxLoading.apply = true
@@ -401,23 +400,25 @@ module.exports = {
// 加载历史办理过程
async loadHistoryProcess() {
if (!this.businessId) return
const { instanceViewUrl } = this.processInstance.jsonObject
this.pjaxLoading.historyProcess = true
$.pjax({
url: `/platform/article/common/fullForm?businessId=${this.businessId}`,
container: "#history-process-container",
push: false,
replace: false,
timeout: 10000
})
.done(() => {
this.pjaxLoading.historyProcess = false
})
.fail(() => {
this.pjaxLoading.historyProcess = false
console.log("历史办理过程加载失败")
if (instanceViewUrl) {
$.pjax({
url: `${instanceViewUrl}?businessId=${this.businessId}&instanceId=${this.instanceId}`,
container: "#history-process-container",
push: false,
replace: false,
timeout: 10000
})
.done(() => {
this.pjaxLoading.historyProcess = false
})
.fail(() => {
this.pjaxLoading.historyProcess = false
console.log("历史办理过程加载失败")
})
}
},
// 显示流程图
@@ -1,5 +1,18 @@
<template>
<div class="snaker-task-action" v-if="!loading || taskInfo">
<!-- 指定下一节点处理人 -->
<div class="next-handler-section" v-if="!isFirstTaskNodeOrNew && supportCandidate">
<el-checkbox v-model="specifyNextHandler" @change="onSpecifyNextHandlerChange">指定下一节点处理人</el-checkbox>
<div class="handler-select-wrapper" v-if="specifyNextHandler">
<el-select v-model="selectedHandler" placeholder="请选择处理人" clearable filterable class="handler-select">
<el-option v-for="candidate in candidates" :key="candidate.userId" :label="candidate.userName" :value="candidate.userId">
<span style="float: left">{{ candidate.userName }}({{ candidate.ext?.loginName }})</span>
<span style="float: right; color: #8492a6; font-size: 13px">{{ candidate.ext?.unitName }}</span>
</el-option>
</el-select>
</div>
</div>
<!-- 第一个任务节点或新申请显示提交保存草稿取消 -->
<template v-if="isFirstTaskNodeOrNew">
<el-button type="primary" @click="handleSubmit" :loading="actionLoading" icon="el-icon-upload2">提交</el-button>
@@ -75,6 +88,11 @@ module.exports = {
NORMAL: 0, // 普通任务
COUNTERSIGN: 1 // 会签任务
},
// 指定下一节点处理人相关
specifyNextHandler: false, // 是否指定下一节点处理人
selectedHandler: null, // 选中的处理人ID
candidates: [], // 候选人列表
supportCandidate: false,
taskId: GetQueryString("taskId"),
instanceId: GetQueryString("instanceId"),
@@ -104,6 +122,7 @@ module.exports = {
// 只有当有任务ID时才加载任务信息
if (this.taskId) {
this.loadTaskInfo()
this.loadCandidates()
}
},
methods: {
@@ -149,8 +168,8 @@ module.exports = {
handleAction(actionKey) {
if (this.actionLoading || !this.taskInfo) return
// 触发父组件事件,传递操作类型和任务信息
this.$emit("task-action", {
// 构建操作数据
const actionData = {
submitType: this.actionEnum[actionKey],
taskId: this.taskId,
processTaskId: this.taskId,
@@ -158,7 +177,15 @@ module.exports = {
defineId: this.defineId,
defineKey: this.defineKey,
businessId: this.businessId
})
}
// 如果指定了下一节点处理人,添加到操作数据中
if (this.specifyNextHandler && this.selectedHandler) {
actionData.tf_nextNodeOperator = this.selectedHandler
}
// 触发父组件事件,传递操作类型和任务信息
this.$emit("task-action", actionData)
},
// 保存草稿
@@ -168,7 +195,7 @@ module.exports = {
this.$emit("save-draft", {
submitType: this.actionEnum.APPLY,
defineKey: this.defineKey,
defineId: this.defineId,
defineId: this.defineId
})
},
@@ -182,6 +209,25 @@ module.exports = {
if (this.taskId) {
this.loadTaskInfo()
}
},
// 处理指定下一节点处理人勾选框变化
onSpecifyNextHandlerChange(checked) {
if (!checked) {
this.selectedHandler = null
}
},
// 加载候选人列表
loadCandidates() {
$.get("/flow/common/candidate", {
taskId: this.taskId
}).then((res) => {
if (res.code === 0) {
this.candidates = res.data.candidates
this.supportCandidate = res.data.support
}
})
}
}
}
@@ -208,6 +254,25 @@ module.exports = {
min-height: 60px;
}
/* 指定下一节点处理人样式 */
.next-handler-section {
margin-bottom: 20px;
padding: 15px;
background: #f8f9fa;
border: 1px solid #e9ecef;
border-radius: 4px;
text-align: left;
}
.handler-select-wrapper {
margin-top: 10px;
}
.handler-select {
width: 100%;
max-width: 300px;
}
/* 响应式 */
@media (max-width: 768px) {
.snaker-task-action {
@@ -221,5 +286,14 @@ module.exports = {
width: 100%;
margin: 0;
}
.next-handler-section {
margin-bottom: 15px;
padding: 10px;
}
.handler-select {
max-width: 100%;
}
}
</style>