!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 {
const params = {
roleId: props.roleId,
searchSecurityLevel: 5,
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 || [];
userList.value = records.sort((a, b) => (a.sortno ?? Infinity) - (b.sortno ?? Infinity));
} catch {
+32 -5
View File
@@ -462,6 +462,7 @@
title: '发起整改任务流程',
payload: { record },
deptOptions: getDeptOptions(record),
measureResLeader: record.measureResLeader,
showSuoleaderFields: true,
isNeedAppro: record.isNeedAppro,
supDeptleaderid: record.supDeptleaderid,
@@ -478,6 +479,7 @@
title: '发起销号流程',
payload: { record },
deptOptions: getDeptOptions(record),
measureResLeader: record.measureResLeader,
showSuoleaderFields: true,
isNeedAppro: record.isNeedAppro,
supDeptleaderid: record.supDeptleaderid,
@@ -495,6 +497,17 @@
const flowName = isDeleteFlow ? DELETE_FLOW_NAME : FLOW_NAME;
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 = {
intervalType: options.intervalType,
startCount: options.startCount,
@@ -504,21 +517,35 @@
flowCode,
formUrl,
flowName,
jsonData: { ...record },
jsonData: flowJsonData,
businessTablename: BUSINESS_TABLE_NAME,
businessId: record.id,
title: record.improveMeasure || '',
content: record.improveMeasure || '',
deptId: options.deptId || record.measureResDept || '',
deptLeaderId: record.measureResLeader || '',
requireFinishDate: record.deadline || undefined,
deadline: record.deadline || undefined,
deptLeaderId: options.measureResLeader ?? record.measureResLeader ?? '',
requireFinishDate: selectedDeadline,
deadline: selectedDeadline,
},
};
await startProcessSchedules(params);
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('发起成功');
handleSuccess();
}
@@ -1,6 +1,12 @@
<template>
<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-radio-group v-model:value="formData.triggerMode">
<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>
</a-form-item>
<a-form-item v-if="deptOptions.length" label="牵头部门">
<a-form-item v-if="deptOptions.length" label="措施责任部门">
<a-select
v-model:value="formData.deptIds"
mode="multiple"
:options="deptOptions"
placeholder="请选择牵头部门"
placeholder="请选择措施责任部门"
allow-clear
style="width: 100%"
:getPopupContainer="(node) => node?.parentNode"
/>
</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-date-picker
v-model:value="formData.deadline"
@@ -33,7 +49,10 @@
<template v-if="showSuoleaderFields">
<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 v-show="formData.isNeedAppro === '1'" label="党群领导">
@@ -80,11 +99,11 @@
</template>
<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 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 DeptRoleUserSelectDropDown from '/@/components/semri/userComponent/DeptRoleUserSelectDropDown.vue';
import { useMessage } from '/src/hooks/web/useMessage';
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;
showDeadlineField?: boolean;
deadline?: string | Date;
measureResLeader?: string;
}
interface DeptOption {
@@ -121,17 +141,21 @@ import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/su
startCount: undefined as number | undefined,
intervalStartTime: undefined as string | undefined,
deptIds: [] as string[],
measureResLeader: '' as string,
isNeedAppro: '0',
supDeptleaderid: '' as string | string[],
deadline: undefined as string | undefined,
});
const measureResDeptId = computed(() => String(formData.deptIds?.[0] || ''));
function resetForm() {
formData.triggerMode = 'immediate';
formData.intervalType = undefined;
formData.startCount = undefined;
formData.intervalStartTime = undefined;
formData.deptIds = [];
formData.measureResLeader = '';
formData.isNeedAppro = '0';
formData.supDeptleaderid = '';
formData.deadline = undefined;
@@ -174,6 +198,7 @@ import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/su
contextData.value = data.payload || {};
deptOptions.value = normalizeDeptOptions(data.deptOptions || []);
formData.deptIds = deptOptions.value.map((item) => item.value);
formData.measureResLeader = data.measureResLeader || '';
showSuoleaderFields.value = !!data.showSuoleaderFields;
formData.isNeedAppro = String(data.isNeedAppro ?? '0');
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) {
createMessage.warning('请选择责任部门');
createMessage.warning('请选择措施责任部门');
return;
}
if (deptOptions.value.length && !formData.measureResLeader) {
createMessage.warning('请选择措施责任部门负责人');
return;
}
@@ -222,6 +251,7 @@ import { PARTY_MASSES_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/su
deptIds: [...formData.deptIds],
isNeedAppro: showSuoleaderFields.value ? formData.isNeedAppro : undefined,
supDeptleaderid: showSuoleaderFields.value ? (String(formData.isNeedAppro) === '1' ? formData.supDeptleaderid : '') : undefined,
measureResLeader: formData.measureResLeader,
deadline: showDeadlineField.value ? formData.deadline : undefined,
},
});
@@ -3,6 +3,14 @@
<JFormContainer :disabled="disabled">
<template #detail>
<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-row :gutter="[16, 0]">
@@ -80,7 +88,7 @@
<a-row :gutter="[16, 0]">
<a-col :span="12">
<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-col>
<a-col :span="12">
@@ -281,6 +289,9 @@
return props.formDisabled;
});
// 已发起流程的记录编辑时提示修改可能变更审批人
const showFlowEditWarning = computed(() => !!formData.id && String(formData.bpmStatus) === '2');
onMounted(() => {
loadSpecificProblemOptions();
initFormData();
@@ -434,6 +445,7 @@
labelCol,
wrapperCol,
disabled,
showFlowEditWarning,
showFlowSubmitButton,
CHARGE_LEADER_DEPT_ID,
CHARGE_LEADER_ROLE_ID,