!15 feat(xispeak): 督办领导列表统一改用SzUserSelectByDeptRoleSecurityModal弹窗选人,存储use…

* feat(xispeak): 督办领导列表统一改用SzUserSelectByDeptRoleSecurityModal弹窗选人,存储use…
* feat(xispeak): 督办领导列表改用SzUserSelectByDeptRoleSecurityModal弹窗选人
* chore(xispeak): 更新 BPM_NODE_PERMISSIONS 节点权限配置
* feat(xispeak): 新增 showSelnextUser 权限控制,默认隐藏指定下一步操作人
* fix(xispeak): 修复是否报送上级报告字段显示0/1而非字典标签
* feat(xispeak): 新增 nonJiJianFieldsReadonly 权限控制,支持除纪检字段外全部只读
* fix(xispeak): 修复反馈表单标签对齐和网格布局问题
* fix(xispeak): 指定落实措施条数、措施已闭环数量、督办次数设为不可编辑
This commit is contained in:
new_new_new
2026-06-01 08:45:34 +00:00
parent c22da8a67a
commit 24739d5efc
9 changed files with 276 additions and 47 deletions
@@ -85,16 +85,16 @@
<a-input-number v-model:value="mainForm.numberOfResolutions" :disabled="mainDisabled" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="落实条数" name="implCount">
<a-input-number v-model:value="mainForm.implCount" :disabled="mainDisabled" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="已闭环数量" name="closedCount">
<a-input-number v-model:value="mainForm.closedCount" :disabled="mainDisabled" style="width: 100%" />
</a-form-item>
</a-col>
<!-- <a-col :span="12">-->
<!-- <a-form-item label="落实条数" name="implCount">-->
<!-- <a-input-number v-model:value="mainForm.implCount" :disabled="mainDisabled" style="width: 100%" />-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<!-- <a-col :span="12">-->
<!-- <a-form-item label="已闭环数量" name="closedCount">-->
<!-- <a-input-number v-model:value="mainForm.closedCount" :disabled="mainDisabled" style="width: 100%" />-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<a-col :span="12">
<a-form-item label="完成状态" name="completionStatus">
<JDictSelectTag
@@ -141,7 +141,27 @@
</a-col>
<a-col v-if="mainForm.needSdwApproval === 1" :span="12">
<a-form-item label="督导领导列表" name="sdwLeaderList">
<j-select-user v-model:value="mainForm.sdwLeaderList" :disabled="mainDisabled" :multiple="true" allow-clear />
<a-input
v-model:value="sdwLeaderNames"
placeholder="请选择督导领导"
:disabled="mainDisabled"
readonly
allow-clear
@click="openSdwLeaderModal"
@clear="handleClearSdwLeader"
>
<template #suffix>
<SearchOutlined @click="openSdwLeaderModal" />
</template>
</a-input>
<SzUserSelectByDeptRoleSecurityModal
v-model:open="sdwLeaderModalOpen"
title="请选择所党委领导"
:deptId="sdwLeaderDeptId"
:roleId="sdwLeaderRoleId"
:securityValue="sdwLeaderSecurityValue"
@confirm="handleSdwLeaderConfirm"
/>
</a-form-item>
</a-col>
<!-- <a-col :span="12">-->
@@ -225,6 +245,7 @@
ref="feedbackModalRef"
:showJiJianFields="showJiJianFields"
:jiJianFieldsReadonly="jiJianFieldsReadonly"
:nonJiJianFieldsReadonly="nonJiJianFieldsReadonly"
@success="loadFeedbackList"
/>
@@ -254,6 +275,7 @@
<TaskHandleInnerContent
:form-data="formData"
:claim="claim"
:showSelnextUser="showSelnextUser"
:beforeHandle="saveMainFormBeforeProcessHandle"
@success="handleProcessSuccess"
@claimSuccess="handleClaimSuccess"
@@ -266,6 +288,7 @@
<script lang="ts" setup>
import { computed, onMounted, reactive, ref, watch } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { getUserList } from '/@/api/common/api';
import { useMessage } from '/@/hooks/web/useMessage';
import { useUserStore } from '/@/store/modules/user';
import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue';
@@ -284,6 +307,8 @@
import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue';
import BgXiSpeakBPMFeedbackModal from './BgXiSpeakBPMFeedbackModal.vue';
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
import SzUserSelectByDeptRoleSecurityModal from '/src/components/semri/userComponent/modal/SzUserSelectByDeptRoleSecurityModal.vue';
import { SearchOutlined } from '@ant-design/icons-vue';
const { isDisabledAuth, hasPermission, initBpmFormData } = usePermission();
const userStore = useUserStore();
@@ -320,6 +345,42 @@
const subApproveUser = ref('');
const isEnd = ref(0);
// 督导领导选人弹窗
const sdwLeaderModalOpen = ref(false);
const sdwLeaderNames = ref('');
const sdwLeaderDeptId = ref('2044677562460508161');
const sdwLeaderRoleId = ref('2044676455280570370');
const sdwLeaderSecurityValue = ref(5);
function openSdwLeaderModal() {
sdwLeaderModalOpen.value = true;
}
function handleClearSdwLeader() {
mainForm.sdwLeaderList = '';
sdwLeaderNames.value = '';
}
function handleSdwLeaderConfirm(rows: Array<{ id: string; realname: string }>) {
if (rows && rows.length > 0) {
mainForm.sdwLeaderList = rows.map((r) => r.username).join(',');
sdwLeaderNames.value = rows.map((r) => r.realname).join(',');
} else {
mainForm.sdwLeaderList = '';
sdwLeaderNames.value = '';
}
}
async function resolveSdwLeaderNames(ids: string) {
try {
const res = await getUserList({ username: ids, pageSize: 999 });
const records = res?.records || res?.result?.records || [];
sdwLeaderNames.value = records.map((u: any) => u.realname).join(',');
} catch {
sdwLeaderNames.value = '';
}
}
const mainForm = reactive<Record<string, any>>({
id: '',
pid: '',
@@ -409,6 +470,8 @@
);
const showJiJianFields = computed(() => String(props.formData?.extendUrlParams?.showJiJianFields ?? '') === '1');
const jiJianFieldsReadonly = computed(() => String(props.formData?.extendUrlParams?.jiJianFieldsReadonly ?? '') === '1');
const nonJiJianFieldsReadonly = computed(() => String(props.formData?.extendUrlParams?.nonJiJianFieldsReadonly ?? '') === '1');
const showSelnextUser = computed(() => String(props.formData?.extendUrlParams?.showSelnextUser ?? '') === '1');
const showDeptFields = computed(() => String(props.formData?.extendUrlParams?.deptfields ?? '') === '1');
const showSubApproveUser = computed(
() => String(props.formData?.extendUrlParams?.showSubApproveUser ?? props.formData?.extendUrlParams?.selectuser ?? '') === '1'
@@ -468,6 +531,10 @@
Object.keys(mainForm).forEach((key) => {
mainForm[key] = record[key] ?? '';
});
sdwLeaderNames.value = record.sdwLeaderList_dictText || '';
if (!sdwLeaderNames.value && mainForm.sdwLeaderList) {
resolveSdwLeaderNames(mainForm.sdwLeaderList);
}
// 从 approveInfo JSON 初始化当前部门的 isEnd 和 subApproveUser
const approveInfo = record.approveInfo;
const deptId = getCurrentUserDeptId();