!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
@@ -36,7 +36,27 @@
</a-form-item>
<a-form-item label="所党委领导">
<j-select-user v-model:value="formData.supDeptleaderid" :disabled="String(formData.isNeedAppro) !== '1'" allow-clear />
<a-input
v-model:value="supDeptleaderName"
placeholder="请选择所党委领导"
:disabled="String(formData.isNeedAppro) !== '1'"
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>
</template>
@@ -79,7 +99,9 @@
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 JSelectUser from '/src/components/Form/src/jeecg/components/JSelectUser.vue';
import SzUserSelectByDeptRoleSecurityModal from '/src/components/semri/userComponent/modal/SzUserSelectByDeptRoleSecurityModal.vue';
import { SearchOutlined } from '@ant-design/icons-vue';
import { getUserList } from '/src/api/common/api';
import { useMessage } from '/src/hooks/web/useMessage';
interface ModalPayload {
@@ -89,6 +111,7 @@
showSuoleaderFields?: boolean;
isNeedAppro?: string | number;
supDeptleaderid?: string | string[];
supDeptleaderName?: string;
showDeadlineField?: boolean;
deadline?: string | Date;
}
@@ -107,6 +130,44 @@
const deptOptions = ref<DeptOption[]>([]);
const showSuoleaderFields = ref(false);
const showDeadlineField = ref(false);
// 所党委领导选人弹窗
const sdwLeaderModalOpen = ref(false);
const supDeptleaderName = ref('');
const sdwLeaderDeptId = ref('2044677562460508161');
const sdwLeaderRoleId = ref('2044676455280570370');
const sdwLeaderSecurityValue = ref(5);
function openSdwLeaderModal() {
if (String(formData.isNeedAppro) !== '1') return;
sdwLeaderModalOpen.value = true;
}
function handleClearSdwLeader() {
formData.supDeptleaderid = '';
supDeptleaderName.value = '';
}
function handleSdwLeaderConfirm(rows: Array<{ id: string; realname: string }>) {
if (rows && rows.length > 0) {
formData.supDeptleaderid = rows.map((r) => r.username).join(',');
supDeptleaderName.value = rows.map((r) => r.realname).join(',');
} else {
formData.supDeptleaderid = '';
supDeptleaderName.value = '';
}
}
async function resolveSdwLeaderNames(ids: string) {
try {
const res = await getUserList({ username: ids, pageSize: 999 });
const records = res?.records || res?.result?.records || [];
supDeptleaderName.value = records.map((u: any) => u.realname).join(',');
} catch {
supDeptleaderName.value = '';
}
}
const formData = reactive({
triggerMode: 'immediate',
intervalType: undefined as number | string | undefined,
@@ -126,6 +187,7 @@
formData.deptIds = [];
formData.isNeedAppro = '0';
formData.supDeptleaderid = '';
supDeptleaderName.value = '';
formData.deadline = undefined;
deptOptions.value = [];
showSuoleaderFields.value = false;
@@ -169,6 +231,10 @@
showSuoleaderFields.value = !!data.showSuoleaderFields;
formData.isNeedAppro = String(data.isNeedAppro ?? '0');
formData.supDeptleaderid = data.supDeptleaderid || '';
supDeptleaderName.value = data.supDeptleaderName || '';
if (!supDeptleaderName.value && formData.supDeptleaderid) {
resolveSdwLeaderNames(formData.supDeptleaderid as string);
}
showDeadlineField.value = !!data.showDeadlineField;
formData.deadline = normalizeDeadlineValue(data.deadline);
if (String(formData.isNeedAppro) !== '1') {
@@ -228,6 +294,7 @@
(value) => {
if (String(value) !== '1') {
formData.supDeptleaderid = '';
supDeptleaderName.value = '';
}
}
);
@@ -1,6 +1,6 @@
<template>
<a-modal :open="open" title="选择用户(部门+角色+密级)" :width="1000" :mask-closable="false" @cancel="handleCancel" @ok="handleOk" destroyOnClose>
<BasicForm @register="registerForm" />
<a-modal :open="open" :title="title" :width="1000" :mask-closable="false" @cancel="handleCancel" @ok="handleOk" destroyOnClose>
<BasicForm v-if="!hasFixedParams" @register="registerForm" />
<a-table
ref="tableRef"
@@ -18,7 +18,7 @@
</template>
<script setup>
import { ref, reactive, watch, nextTick } from 'vue';
import { ref, reactive, computed, watch, nextTick } from 'vue';
import { BasicForm, useForm } from '@/components/Form/index';
import { queryDepartRoleUserPageList } from '../api/user';
@@ -29,10 +29,13 @@
deptId: { type: String, default: null },
roleId: { type: String, default: null },
securityValue: { type: Number, default: null },
title: { type: String, default: '选择用户(部门+角色+密级)' },
});
const emit = defineEmits(['update:open', 'confirm']);
const hasFixedParams = computed(() => !!(props.deptId && props.roleId && props.securityValue));
// --- 状态定义 ---
const loading = ref(false);
const userList = ref([]);
@@ -99,8 +102,8 @@
});
const columns = [
{ title: '用户名', dataIndex: 'username', key: 'username', width: 120 },
{ title: '真实姓名', dataIndex: 'realname', key: 'realname', width: 120 },
{ title: '工号', dataIndex: 'username', key: 'username', width: 120 },
{ title: '姓名', dataIndex: 'realname', key: 'realname', width: 120 },
{ title: '部门', dataIndex: 'orgCodeTxt', key: 'orgCodeTxt', width: 200 },
{ title: '密级', dataIndex: 'userSecurityLevel_dictText', key: 'userSecurityLevel', width: 100 },
];
@@ -109,12 +112,19 @@
async function loadData() {
loading.value = true;
try {
const values = getFieldsValue() || {};
const params = {
...values,
pageNo: pagination.current,
pageSize: pagination.pageSize,
};
let params;
if (hasFixedParams.value) {
params = {
departId: props.deptId,
roleId: props.roleId,
searchSecurityLevel: props.securityValue,
pageNo: pagination.current,
pageSize: pagination.pageSize,
};
} else {
const values = getFieldsValue() || {};
params = { ...values, pageNo: pagination.current, pageSize: pagination.pageSize };
}
const res = await queryDepartRoleUserPageList(params);
@@ -174,12 +184,13 @@
() => props.open,
async (val) => {
if (val) {
// 必须在 nextTick 后执行,确保 BasicForm 实例已挂载,getFieldsValue 可用
await nextTick();
loadData();
await loadData();
} else {
// 弹窗关闭时建议重置表单和选中项
resetFields();
if (!hasFixedParams.value) {
resetFields();
}
selectedRowKeys.value = [];
selectedRows.value = [];
}
+8 -4
View File
@@ -13,12 +13,14 @@
edit → 基础信息是否可编辑(1=可编辑, 缺省=只读)
showProcessHandle → 流程办理区域
── showSubApproveUser → 是否办结 + 部门经办人选人
── showSubApproveUser → 是否办结 + 部门经办人选人
└── showSelnextUser → 指定下一步操作人(默认隐藏,=1 显示)
showFeedbackInfo → 反馈信息区域(表格 + 表头)
├── showAddFeedback → 新增反馈按钮
├── showEditFeedback → 编辑/删除操作列
── jiJianFieldsReadonly → 弹窗内纪检字段只读(需 showEditFeedback=1 或 showAddFeedback=1
── jiJianFieldsReadonly → 弹窗内纪检字段只读(需 showEditFeedback=1 或 showAddFeedback=1
│ └── nonJiJianFieldsReadonly → 弹窗内非纪检字段只读(仅纪检字段可编辑,需 showEditFeedback=1 或 showAddFeedback=1
├── showDeptFeedback → 按部门过滤反馈数据
└── showJiJianFields → 纪检字段列(检查情况/监督意见/措施数量)
```
@@ -195,9 +197,10 @@ showFeedbackInfo → 反馈信息区域(表格 + 表头)
* **showAddFeedback** `0` —— 新增反馈按钮
* **showEditFeedback** `1` —— 编辑/删除操作列
* **jiJianFieldsReadonly** `0` —— 弹窗内纪检字段只读
* **nonJiJianFieldsReadonly** `1` —— 弹窗内非纪检字段只读
* **showDeptFeedback** `0` —— 按部门过滤反馈
* **showJiJianFields** `1` —— 纪检字段列
* bg/xispeak/components/BgXiSpeakBPMForm?showProcessHandle=1&showFeedbackInfo=1&showEditFeedback=1&showJiJianFields=1
* bg/xispeak/components/BgXiSpeakBPMForm?showProcessHandle=1&showFeedbackInfo=1&showEditFeedback=1&nonJiJianFieldsReadonly=1&showJiJianFields=1
---
### 节点: <反馈流程纪检负责人审批>
@@ -299,9 +302,10 @@ showFeedbackInfo → 反馈信息区域(表格 + 表头)
* **showAddFeedback** `0` —— 新增反馈按钮
* **showEditFeedback** `1` —— 编辑/删除操作列
* **jiJianFieldsReadonly** `0` —— 弹窗内纪检字段只读
* **nonJiJianFieldsReadonly** `1` —— 弹窗内非纪检字段只读
* **showDeptFeedback** `0` —— 按部门过滤反馈
* **showJiJianFields** `1` —— 纪检字段列
* bg/xispeak/components/BgXiSpeakBPMForm?showProcessHandle=1&showFeedbackInfo=1&showEditFeedback=1&showJiJianFields=1
* bg/xispeak/components/BgXiSpeakBPMForm?showProcessHandle=1&showFeedbackInfo=1&showEditFeedback=1&nonJiJianFieldsReadonly=1&showJiJianFields=1
---
+2
View File
@@ -575,6 +575,7 @@
showSuoleaderFields: true,
isNeedAppro: record?.needSdwApproval,
supDeptleaderid: record?.sdwLeaderList,
supDeptleaderName: record?.sdwLeaderList_dictText,
});
}
@@ -586,6 +587,7 @@
showSuoleaderFields: true,
isNeedAppro: record?.needSdwApproval,
supDeptleaderid: record?.sdwLeaderList,
supDeptleaderName: record?.sdwLeaderList_dictText,
});
}
@@ -13,7 +13,7 @@
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="反馈部门" name="responDeptid">
<j-select-dept v-model:value="formData.responDeptid" :multiple="true" checkStrictly allow-clear @change="handleDeptChange" />
<j-select-dept v-model:value="formData.responDeptid" :multiple="true" :disabled="nonJiJianFieldsReadonly" checkStrictly allow-clear @change="handleDeptChange" />
</a-form-item>
</a-col>
<a-col :span="12">
@@ -29,33 +29,33 @@
<a-col :span="24">
<a-form-item label="具体措施" name="method" :labelCol="wideLabelCol" :wrapperCol="wideWrapperCol">
<a-textarea v-model:value="formData.method" :rows="3" allow-clear />
<a-textarea v-model:value="formData.method" :rows="3" :disabled="nonJiJianFieldsReadonly" allow-clear />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="完成期限" name="deadline">
<a-date-picker v-model:value="formData.deadline" value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" allow-clear />
<a-date-picker v-model:value="formData.deadline" value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" :disabled="nonJiJianFieldsReadonly" allow-clear />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="成果形式" name="outcomeForm">
<a-input v-model:value="formData.outcomeForm" allow-clear />
<a-input v-model:value="formData.outcomeForm" :disabled="nonJiJianFieldsReadonly" allow-clear />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="完成状态" name="completionStatus">
<JDictSelectTag v-model:value="formData.completionStatus" dictCode="measure_complete_status" placeholder="请选择完成状态" type="select" allow-clear />
<JDictSelectTag v-model:value="formData.completionStatus" dictCode="measure_complete_status" placeholder="请选择完成状态" type="select" :disabled="nonJiJianFieldsReadonly" allow-clear />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="是否有报送上级报告" name="isReportedToHigher">
<JDictSelectTag v-model:value="formData.isReportedToHigher" dictCode="need_report_higher" placeholder="请选择" type="select" allow-clear />
<JDictSelectTag v-model:value="formData.isReportedToHigher" dictCode="need_report_higher" placeholder="请选择" type="select" :stringToNumber="true" :disabled="nonJiJianFieldsReadonly" allow-clear />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="进展情况" name="progress" :labelCol="wideLabelCol" :wrapperCol="wideWrapperCol">
<a-textarea v-model:value="formData.progress" :rows="3" allow-clear />
<a-textarea v-model:value="formData.progress" :rows="3" :disabled="nonJiJianFieldsReadonly" allow-clear />
</a-form-item>
</a-col>
<!-- <a-col :span="24">-->
@@ -114,6 +114,7 @@
const props = defineProps({
showJiJianFields: { type: Boolean, default: false },
jiJianFieldsReadonly: { type: Boolean, default: false },
nonJiJianFieldsReadonly: { type: Boolean, default: false },
});
const { createMessage } = useMessage();
const userStore = useUserStore();
@@ -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();
@@ -2,7 +2,7 @@
<a-spin :spinning="confirmLoading">
<JFormContainer :disabled="disabled">
<template #detail>
<a-form class="antd-modal-form" v-bind="formItemLayout" ref="formRef" :model="formData" :rules="validatorRules" name="BgXiSpeakFeedbackForm">
<a-form class="antd-modal-form" labelAlign="left" :labelCol="formItemLayout.labelCol" :wrapperCol="formItemLayout.wrapperCol" ref="formRef" :model="formData" :rules="validatorRules" name="BgXiSpeakFeedbackForm">
<!-- 基本信息 -->
<a-divider orientation="left" plain>基本信息</a-divider>
<a-row :gutter="[16, 0]">
@@ -42,6 +42,8 @@
<a-textarea v-model:value="formData.method" placeholder="请输入措施内容" :rows="3" allow-clear></a-textarea>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="[16, 0]">
<a-col :span="12">
<a-form-item label="完成期限" name="deadline">
<a-date-picker
@@ -58,6 +60,8 @@
<a-input v-model:value="formData.outcomeForm" placeholder="请输入成果形式" allow-clear></a-input>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="[16, 0]">
<a-col :span="24">
<a-form-item label="进展情况" v-bind="validateInfos.progress" name="progress">
<a-textarea v-model:value="formData.progress" placeholder="请输入进展情况" :rows="3" allow-clear></a-textarea>
@@ -83,6 +87,8 @@
/>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="[16, 0]">
<a-col :span="12">
<a-form-item label="是否报送上级报告" name="isReportedToHigher">
<JDictSelectTag
@@ -90,6 +96,7 @@
dictCode="need_report_higher"
placeholder="请选择"
type="select"
:stringToNumber="true"
allow-clear
/>
</a-form-item>
@@ -99,11 +106,15 @@
<a-input v-model:value="formData.checkStatus" placeholder="请输入检查情况" allow-clear></a-input>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="[16, 0]">
<a-col :span="24">
<a-form-item label="落实计划" name="completionPlan">
<a-textarea v-model:value="formData.completionPlan" placeholder="请输入落实计划" :rows="3" allow-clear></a-textarea>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="[16, 0]">
<a-col :span="12">
<a-form-item label="总措施号" name="sumMethodNum">
<a-input v-model:value="formData.sumMethodNum" placeholder="请输入总措施号" allow-clear></a-input>
@@ -114,6 +125,8 @@
<a-input-number v-model:value="formData.measureNum" placeholder="请输入措施数量" style="width: 100%" allow-clear />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="[16, 0]">
<a-col :span="24">
<a-form-item label="监督意见" name="inspectionAdvice">
<a-textarea v-model:value="formData.inspectionAdvice" placeholder="请输入监督意见" :rows="3" allow-clear></a-textarea>
@@ -212,8 +225,6 @@
startTime: '',
});
const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
const confirmLoading = ref<boolean>(false);
const validatorRules = reactive({
completionStatus: [{ required: true, message: '请选择完成状态' }],
@@ -67,8 +67,27 @@
</a-form-item>
</a-col>
<a-col v-if="formData.needSdwApproval === 1" :span="12">
<a-form-item label="督办领导列表" v-bind="validateInfos.sdwLeaderList" id="BgXiSpeakForm-sdwLeaderList" name="sdwLeaderList">
<j-select-user v-model:value="formData.sdwLeaderList" :multiple="true" allow-clear placeholder="请选择督办领导" />
<a-form-item label="督办领导列表" id="BgXiSpeakForm-sdwLeaderList" name="sdwLeaderList">
<a-input
v-model:value="sdwLeaderNames"
placeholder="请选择督办领导"
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-row>
@@ -78,12 +97,12 @@
<a-row :gutter="[16, 0]">
<a-col :span="12">
<a-form-item label="指定落实措施条数" v-bind="validateInfos.implCount" id="BgXiSpeakForm-implCount" name="implCount">
<a-input-number v-model:value="formData.implCount" placeholder="每增加一条反馈数量加1" style="width: 100%" />
<a-input-number v-model:value="formData.implCount" placeholder="每增加一条反馈数量加1" style="width: 100%" disabled />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="措施已闭环数量" v-bind="validateInfos.closedCount" id="BgXiSpeakForm-closedCount" name="closedCount">
<a-input-number v-model:value="formData.closedCount" placeholder="完成反馈全流程后增加" style="width: 100%" />
<a-input-number v-model:value="formData.closedCount" placeholder="完成反馈全流程后增加" style="width: 100%" disabled />
</a-form-item>
</a-col>
<a-col :span="12">
@@ -103,7 +122,7 @@
</a-col>
<a-col :span="12">
<a-form-item label="督办次数" v-bind="validateInfos.supervisionCount" id="BgXiSpeakForm-supervisionCount" name="supervisionCount">
<a-input-number v-model:value="formData.supervisionCount" placeholder="每次发起督办流程自动加1" style="width: 100%" />
<a-input-number v-model:value="formData.supervisionCount" placeholder="每次发起督办流程自动加1" style="width: 100%" disabled />
</a-form-item>
</a-col>
</a-row>
@@ -125,6 +144,9 @@
import JSelectUser from '/@/components/Form/src/jeecg/components/JSelectUser.vue';
import JTreeSelect from '/@/components/Form/src/jeecg/components/JTreeSelect.vue';
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import SzUserSelectByDeptRoleSecurityModal from '/src/components/semri/userComponent/modal/SzUserSelectByDeptRoleSecurityModal.vue';
import { SearchOutlined } from '@ant-design/icons-vue';
import { getUserList } from '/@/api/common/api';
import { getValueType } from '/@/utils';
import { loadTreeData, saveOrUpdateDict } from '../BgXiSpeak.api';
import { Form } from 'ant-design-vue';
@@ -174,6 +196,42 @@
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 18 } });
const confirmLoading = ref<boolean>(false);
// 督办领导选人弹窗
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() {
formData.sdwLeaderList = '';
sdwLeaderNames.value = '';
}
function handleSdwLeaderConfirm(rows: Array<{ id: string; realname: string }>) {
if (rows && rows.length > 0) {
formData.sdwLeaderList = rows.map((r) => r.username).join(',');
sdwLeaderNames.value = rows.map((r) => r.realname).join(',');
} else {
formData.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 validatorRules = reactive({
speakStatus: [{ required: true, message: '请输入重要讲话指示批示情况' }],
time: [{ required: true, message: '请选择时间' }],
@@ -254,6 +312,10 @@
});
Object.assign(formData, tmpData);
sdwLeaderNames.value = data.sdwLeaderList_dictText || '';
if (!sdwLeaderNames.value && formData.sdwLeaderList) {
resolveSdwLeaderNames(formData.sdwLeaderList);
}
model = { ...tmpData };
});
}
@@ -14,7 +14,7 @@
:historyList="historyList"
:turnbackTaskId="turnbackTaskId"
:branchList="branchList"
:selnextUserStatus="selnextUserStatus"
:selnextUserStatus="showSelnextUser ? selnextUserStatus : false"
:ccStatus="ccStatus"
:allowAddSign="allowAddSign"
:allowCounterSignAddUser="allowCounterSignAddUser"
@@ -60,6 +60,10 @@
beforeHandle: {
type: Function,
default: undefined
},
showSelnextUser: {
type: Boolean,
default: true,
}
},
emits: ['success', 'claimSuccess'],