refactor(xispeak): 抽取督办领导选择为DeptRoleSelectUser组件
- 去除弹窗选人模式,改为按部门+角色查询后直接radio-group展示 - 两个表单复用同一组件,净减少约110行代码 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -141,26 +141,11 @@
|
||||
</a-col>
|
||||
<a-col v-if="mainForm.needSdwApproval === 1" :span="12">
|
||||
<a-form-item label="督导领导列表" name="sdwLeaderList">
|
||||
<a-input
|
||||
v-model:value="sdwLeaderNames"
|
||||
placeholder="请选择督导领导"
|
||||
<DeptRoleSelectUser
|
||||
v-model:value="mainForm.sdwLeaderList"
|
||||
deptId="2044677562460508161"
|
||||
roleId="2044676455280570370"
|
||||
: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>
|
||||
@@ -288,7 +273,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';
|
||||
@@ -307,8 +292,7 @@
|
||||
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';
|
||||
import DeptRoleSelectUser from './DeptRoleSelectUser.vue';
|
||||
|
||||
const { isDisabledAuth, hasPermission, initBpmFormData } = usePermission();
|
||||
const userStore = useUserStore();
|
||||
@@ -345,42 +329,6 @@
|
||||
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: '',
|
||||
@@ -540,10 +488,6 @@
|
||||
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();
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="是否需要督办领导" v-bind="validateInfos.needSdwApproval" id="BgXiSpeakForm-needSdwApproval" name="needSdwApproval">
|
||||
<a-form-item label="是否需要所党委领导督办" v-bind="validateInfos.needSdwApproval" id="BgXiSpeakForm-needSdwApproval" name="needSdwApproval">
|
||||
<a-radio-group v-model:value="formData.needSdwApproval">
|
||||
<a-radio :value="1">是</a-radio>
|
||||
<a-radio :value="0">否</a-radio>
|
||||
@@ -67,26 +67,11 @@
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col v-if="formData.needSdwApproval === 1" :span="12">
|
||||
<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 label="所党委领导列表" id="BgXiSpeakForm-sdwLeaderList" name="sdwLeaderList">
|
||||
<DeptRoleSelectUser
|
||||
v-model:value="formData.sdwLeaderList"
|
||||
deptId="2044677562460508161"
|
||||
roleId="2044676455280570370"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
@@ -144,9 +129,7 @@
|
||||
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 DeptRoleSelectUser from './DeptRoleSelectUser.vue';
|
||||
import { getValueType } from '/@/utils';
|
||||
import { loadTreeData, saveOrUpdateDict } from '../BgXiSpeak.api';
|
||||
import { Form } from 'ant-design-vue';
|
||||
@@ -200,42 +183,6 @@
|
||||
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: '请选择时间' }],
|
||||
@@ -299,7 +246,6 @@
|
||||
for (const key of Object.keys(formData)) {
|
||||
formData[key] = defaults[key];
|
||||
}
|
||||
sdwLeaderNames.value = '';
|
||||
model = {};
|
||||
return;
|
||||
}
|
||||
@@ -327,10 +273,6 @@
|
||||
});
|
||||
|
||||
Object.assign(formData, tmpData);
|
||||
sdwLeaderNames.value = data.sdwLeaderList_dictText || '';
|
||||
if (!sdwLeaderNames.value && formData.sdwLeaderList) {
|
||||
resolveSdwLeaderNames(formData.sdwLeaderList);
|
||||
}
|
||||
model = { ...tmpData };
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
<template>
|
||||
<a-radio-group v-model:value="modelValue" :disabled="disabled">
|
||||
<a-radio v-for="user in userList" :key="user.username" :value="user.username">
|
||||
{{ user.realname }}
|
||||
</a-radio>
|
||||
</a-radio-group>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref, onMounted } from 'vue';
|
||||
import { defHttp } from '/@/utils/http/axios';
|
||||
|
||||
const props = defineProps<{
|
||||
deptId: string;
|
||||
roleId: string;
|
||||
disabled?: boolean;
|
||||
}>();
|
||||
|
||||
const modelValue = defineModel<string>('value', { default: '' });
|
||||
|
||||
const userList = ref<Array<{ username: string; realname: string }>>([]);
|
||||
|
||||
onMounted(async () => {
|
||||
try {
|
||||
const params = {
|
||||
departId: props.deptId,
|
||||
roleId: props.roleId,
|
||||
searchSecurityLevel: 5,
|
||||
pageNo: 1,
|
||||
pageSize: 999,
|
||||
};
|
||||
const res = await defHttp.get({ url: '/sys/user/queryUserRoleComponentData', params });
|
||||
const records = res?.records || res?.result?.records || [];
|
||||
userList.value = records;
|
||||
} catch {
|
||||
userList.value = [];
|
||||
}
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user