!155 feat(dq): 编辑已发起流程的记录时提示修改可能变更审批人

* feat(dq): 编辑已发起流程的记录时提示修改可能变更审批人
* feat(dq): 发起整改流程弹窗支持修改措施责任部门及负责人并回写台账
* fix(dq): 措施责任部门改为单选
* feat(user): 角色用户下拉切换按角色查询接口并加载全量
This commit is contained in:
wsm
2026-08-14 07:15:51 +00:00
parent 029adc61b0
commit e530779894
4 changed files with 84 additions and 16 deletions
@@ -40,11 +40,10 @@ async function fetchUserList() {
try { try {
const params = { const params = {
roleId: props.roleId, roleId: props.roleId,
searchSecurityLevel: 5,
pageNo: 1, pageNo: 1,
pageSize: 999, pageSize: -1,
}; };
const res = await defHttp.get({ url: '/sys/user/queryUserRoleComponentData', params }); const res = await defHttp.get({ url: '/sys/user/queryUserByRoleId', params });
const records = res?.records || res?.result?.records || []; const records = res?.records || res?.result?.records || [];
userList.value = records.sort((a, b) => (a.sortno ?? Infinity) - (b.sortno ?? Infinity)); userList.value = records.sort((a, b) => (a.sortno ?? Infinity) - (b.sortno ?? Infinity));
} catch { } catch {
+32 -5
View File
@@ -462,6 +462,7 @@
title: '发起整改任务流程', title: '发起整改任务流程',
payload: { record }, payload: { record },
deptOptions: getDeptOptions(record), deptOptions: getDeptOptions(record),
measureResLeader: record.measureResLeader,
showSuoleaderFields: true, showSuoleaderFields: true,
isNeedAppro: record.isNeedAppro, isNeedAppro: record.isNeedAppro,
supDeptleaderid: record.supDeptleaderid, supDeptleaderid: record.supDeptleaderid,
@@ -478,6 +479,7 @@
title: '发起销号流程', title: '发起销号流程',
payload: { record }, payload: { record },
deptOptions: getDeptOptions(record), deptOptions: getDeptOptions(record),
measureResLeader: record.measureResLeader,
showSuoleaderFields: true, showSuoleaderFields: true,
isNeedAppro: record.isNeedAppro, isNeedAppro: record.isNeedAppro,
supDeptleaderid: record.supDeptleaderid, supDeptleaderid: record.supDeptleaderid,
@@ -495,6 +497,17 @@
const flowName = isDeleteFlow ? DELETE_FLOW_NAME : FLOW_NAME; const flowName = isDeleteFlow ? DELETE_FLOW_NAME : FLOW_NAME;
const formUrl = isDeleteFlow ? DELETE_FORM_URL : FORM_URL; const formUrl = isDeleteFlow ? DELETE_FORM_URL : FORM_URL;
const selectedDeadline = options.deadline || record.deadline || undefined;
// 弹窗可修改字段覆盖进流程变量,保证流程表单展示与弹窗选择一致
const flowJsonData = {
...record,
measureResDept: options.deptId || record.measureResDept || '',
measureResLeader: options.measureResLeader ?? record.measureResLeader ?? '',
isNeedAppro: options.isNeedAppro ?? record.isNeedAppro ?? '',
supDeptleaderid: options.supDeptleaderid ?? record.supDeptleaderid ?? '',
deadline: selectedDeadline,
};
const params = { const params = {
intervalType: options.intervalType, intervalType: options.intervalType,
startCount: options.startCount, startCount: options.startCount,
@@ -504,21 +517,35 @@
flowCode, flowCode,
formUrl, formUrl,
flowName, flowName,
jsonData: { ...record }, jsonData: flowJsonData,
businessTablename: BUSINESS_TABLE_NAME, businessTablename: BUSINESS_TABLE_NAME,
businessId: record.id, businessId: record.id,
title: record.improveMeasure || '', title: record.improveMeasure || '',
content: record.improveMeasure || '', content: record.improveMeasure || '',
deptId: options.deptId || record.measureResDept || '', deptId: options.deptId || record.measureResDept || '',
deptLeaderId: record.measureResLeader || '', deptLeaderId: options.measureResLeader ?? record.measureResLeader ?? '',
requireFinishDate: record.deadline || undefined, requireFinishDate: selectedDeadline,
deadline: record.deadline || undefined, deadline: selectedDeadline,
}, },
}; };
await startProcessSchedules(params); await startProcessSchedules(params);
const nextStage = (record.completedStage || 0) + 1; const nextStage = (record.completedStage || 0) + 1;
await saveOrUpdate({ id: record.id, problemId: record.problemId, bpmStatus: '2', completedStage: nextStage }, true); // 后端审批人匹配从数据库读取台账字段,弹窗修改需回写台账才能生效
await saveOrUpdate(
{
id: record.id,
problemId: record.problemId,
bpmStatus: '2',
completedStage: nextStage,
measureResDept: options.deptId || record.measureResDept || '',
measureResLeader: options.measureResLeader ?? record.measureResLeader ?? '',
deadline: selectedDeadline,
isNeedAppro: options.isNeedAppro ?? record.isNeedAppro ?? '',
supDeptleaderid: options.supDeptleaderid ?? record.supDeptleaderid ?? '',
},
true
);
createMessage.success('发起成功'); createMessage.success('发起成功');
handleSuccess(); handleSuccess();
} }
@@ -1,6 +1,12 @@
<template> <template>
<j-modal :title="title" :width="720" :visible="visible" @ok="handleOk" @cancel="handleCancel" cancelText="取消"> <j-modal :title="title" :width="720" :visible="visible" @ok="handleOk" @cancel="handleCancel" cancelText="取消">
<a-form :model="formData" :label-col="{ style: { width: '120px' } }" :wrapper-col="{ span: 16 }"> <a-form :model="formData" :label-col="{ style: { width: '160px' } }" :wrapper-col="{ span: 16 }">
<a-alert
type="warning"
show-icon
message="提示:在此窗口修改的信息(措施责任部门、措施责任部门负责人、截止时间、党群领导等)将同步更新到台账记录,并影响后续审批人匹配"
style="margin-bottom: 12px"
/>
<a-form-item label="发起类型"> <a-form-item label="发起类型">
<a-radio-group v-model:value="formData.triggerMode"> <a-radio-group v-model:value="formData.triggerMode">
<a-radio value="immediate">立即发起</a-radio> <a-radio value="immediate">立即发起</a-radio>
@@ -9,18 +15,28 @@
<div style="color: #999; font-size: 12px; line-height: 1.6; margin-top: 4px">立即发起仅发起一次重复发起按周期重复发起</div> <div style="color: #999; font-size: 12px; line-height: 1.6; margin-top: 4px">立即发起仅发起一次重复发起按周期重复发起</div>
</a-form-item> </a-form-item>
<a-form-item v-if="deptOptions.length" label="牵头部门"> <a-form-item v-if="deptOptions.length" label="措施责任部门">
<a-select <a-select
v-model:value="formData.deptIds" v-model:value="formData.deptIds"
mode="multiple" mode="multiple"
:options="deptOptions" :options="deptOptions"
placeholder="请选择牵头部门" placeholder="请选择措施责任部门"
allow-clear allow-clear
style="width: 100%" style="width: 100%"
:getPopupContainer="(node) => node?.parentNode" :getPopupContainer="(node) => node?.parentNode"
/> />
</a-form-item> </a-form-item>
<a-form-item v-if="deptOptions.length" label="措施责任部门负责人">
<DeptRoleUserSelectDropDown
v-model:value="formData.measureResLeader"
:deptId="measureResDeptId"
:roleId="MEASURE_RES_LEADER_ROLE_ID"
:disabled="!measureResDeptId"
placeholder="请选择措施责任部门负责人"
/>
</a-form-item>
<a-form-item v-if="showDeadlineField" label="事项截止时间"> <a-form-item v-if="showDeadlineField" label="事项截止时间">
<a-date-picker <a-date-picker
v-model:value="formData.deadline" v-model:value="formData.deadline"
@@ -33,7 +49,10 @@
<template v-if="showSuoleaderFields"> <template v-if="showSuoleaderFields">
<a-form-item label="党群领导是否审批"> <a-form-item label="党群领导是否审批">
<j-switch v-model:value="formData.isNeedAppro" /> <a-radio-group v-model:value="formData.isNeedAppro">
<a-radio value="1"></a-radio>
<a-radio value="0"></a-radio>
</a-radio-group>
</a-form-item> </a-form-item>
<a-form-item v-show="formData.isNeedAppro === '1'" label="党群领导"> <a-form-item v-show="formData.isNeedAppro === '1'" label="党群领导">
@@ -80,11 +99,11 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { reactive, ref, computed } from 'vue';
import JModal from '/src/components/Modal/src/JModal/JModal.vue'; import JModal from '/src/components/Modal/src/JModal/JModal.vue';
import JDictSelectTag from '/src/components/Form/src/jeecg/components/JDictSelectTag.vue'; import JDictSelectTag from '/src/components/Form/src/jeecg/components/JDictSelectTag.vue';
import JSwitch from '/src/components/Form/src/jeecg/components/JSwitch.vue';
import DeptRoleUserSelectRadioGroup from '/@/components/semri/userComponent/DeptRoleUserSelectRadioGroup.vue'; import DeptRoleUserSelectRadioGroup from '/@/components/semri/userComponent/DeptRoleUserSelectRadioGroup.vue';
import DeptRoleUserSelectDropDown from '/@/components/semri/userComponent/DeptRoleUserSelectDropDown.vue';
import { useMessage } from '/src/hooks/web/useMessage'; import { useMessage } from '/src/hooks/web/useMessage';
import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/supervision'; import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/supervision';
@@ -98,6 +117,7 @@ import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/su
supDeptleaderName?: string; supDeptleaderName?: string;
showDeadlineField?: boolean; showDeadlineField?: boolean;
deadline?: string | Date; deadline?: string | Date;
measureResLeader?: string;
} }
interface DeptOption { interface DeptOption {
@@ -121,17 +141,21 @@ import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/su
startCount: undefined as number | undefined, startCount: undefined as number | undefined,
intervalStartTime: undefined as string | undefined, intervalStartTime: undefined as string | undefined,
deptIds: [] as string[], deptIds: [] as string[],
measureResLeader: '' as string,
isNeedAppro: '0', isNeedAppro: '0',
supDeptleaderid: '' as string | string[], supDeptleaderid: '' as string | string[],
deadline: undefined as string | undefined, deadline: undefined as string | undefined,
}); });
const measureResDeptId = computed(() => String(formData.deptIds?.[0] || ''));
function resetForm() { function resetForm() {
formData.triggerMode = 'immediate'; formData.triggerMode = 'immediate';
formData.intervalType = undefined; formData.intervalType = undefined;
formData.startCount = undefined; formData.startCount = undefined;
formData.intervalStartTime = undefined; formData.intervalStartTime = undefined;
formData.deptIds = []; formData.deptIds = [];
formData.measureResLeader = '';
formData.isNeedAppro = '0'; formData.isNeedAppro = '0';
formData.supDeptleaderid = ''; formData.supDeptleaderid = '';
formData.deadline = undefined; formData.deadline = undefined;
@@ -174,6 +198,7 @@ import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/su
contextData.value = data.payload || {}; contextData.value = data.payload || {};
deptOptions.value = normalizeDeptOptions(data.deptOptions || []); deptOptions.value = normalizeDeptOptions(data.deptOptions || []);
formData.deptIds = deptOptions.value.map((item) => item.value); formData.deptIds = deptOptions.value.map((item) => item.value);
formData.measureResLeader = data.measureResLeader || '';
showSuoleaderFields.value = !!data.showSuoleaderFields; showSuoleaderFields.value = !!data.showSuoleaderFields;
formData.isNeedAppro = String(data.isNeedAppro ?? '0'); formData.isNeedAppro = String(data.isNeedAppro ?? '0');
formData.supDeptleaderid = data.supDeptleaderid || ''; formData.supDeptleaderid = data.supDeptleaderid || '';
@@ -202,7 +227,11 @@ import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/su
} }
} }
if (deptOptions.value.length && !formData.deptIds.length) { if (deptOptions.value.length && !formData.deptIds.length) {
createMessage.warning('请选择责任部门'); createMessage.warning('请选择措施责任部门');
return;
}
if (deptOptions.value.length && !formData.measureResLeader) {
createMessage.warning('请选择措施责任部门负责人');
return; return;
} }
@@ -222,6 +251,7 @@ import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/su
deptIds: [...formData.deptIds], deptIds: [...formData.deptIds],
isNeedAppro: showSuoleaderFields.value ? formData.isNeedAppro : undefined, isNeedAppro: showSuoleaderFields.value ? formData.isNeedAppro : undefined,
supDeptleaderid: showSuoleaderFields.value ? (String(formData.isNeedAppro) === '1' ? formData.supDeptleaderid : '') : undefined, supDeptleaderid: showSuoleaderFields.value ? (String(formData.isNeedAppro) === '1' ? formData.supDeptleaderid : '') : undefined,
measureResLeader: formData.measureResLeader,
deadline: showDeadlineField.value ? formData.deadline : undefined, deadline: showDeadlineField.value ? formData.deadline : undefined,
}, },
}); });
@@ -3,6 +3,14 @@
<JFormContainer :disabled="disabled"> <JFormContainer :disabled="disabled">
<template #detail> <template #detail>
<a-form ref="formRef" class="antd-modal-form" labelAlign="left" :labelCol="labelCol" :wrapperCol="wrapperCol" name="DqInspectTaskForm"> <a-form ref="formRef" class="antd-modal-form" labelAlign="left" :labelCol="labelCol" :wrapperCol="wrapperCol" name="DqInspectTaskForm">
<a-alert
v-if="showFlowEditWarning"
type="warning"
show-icon
message="注意:该事项已发起流程,修改表单内容可能变更流程审批人,请谨慎操作"
description="例如:修改“需党群负责人审批”及党群领导会改变审批流程走向;"
style="margin-bottom: 12px"
/>
<!-- 基本信息 --> <!-- 基本信息 -->
<a-divider orientation="left" plain>基本信息</a-divider> <a-divider orientation="left" plain>基本信息</a-divider>
<a-row :gutter="[16, 0]"> <a-row :gutter="[16, 0]">
@@ -80,7 +88,7 @@
<a-row :gutter="[16, 0]"> <a-row :gutter="[16, 0]">
<a-col :span="12"> <a-col :span="12">
<a-form-item label="措施责任部门" v-bind="validateInfos.measureResDept" id="DqInspectTaskForm-measureResDept" name="measureResDept"> <a-form-item label="措施责任部门" v-bind="validateInfos.measureResDept" id="DqInspectTaskForm-measureResDept" name="measureResDept">
<SzSelectDept v-model:value="formData.measureResDept" :multiple="true" checkStrictly allow-clear /> <SzSelectDept v-model:value="formData.measureResDept" :multiple="false" checkStrictly allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :span="12">
@@ -281,6 +289,9 @@
return props.formDisabled; return props.formDisabled;
}); });
// 已发起流程的记录编辑时提示修改可能变更审批人
const showFlowEditWarning = computed(() => !!formData.id && String(formData.bpmStatus) === '2');
onMounted(() => { onMounted(() => {
loadSpecificProblemOptions(); loadSpecificProblemOptions();
initFormData(); initFormData();
@@ -434,6 +445,7 @@
labelCol, labelCol,
wrapperCol, wrapperCol,
disabled, disabled,
showFlowEditWarning,
showFlowSubmitButton, showFlowSubmitButton,
CHARGE_LEADER_DEPT_ID, CHARGE_LEADER_DEPT_ID,
CHARGE_LEADER_ROLE_ID, CHARGE_LEADER_ROLE_ID,