Merge branch 'gaoang2025-06' into 'dev'

人员选择器增加组织机构全选, 时间范围选择器,设置可以返回数组或字符串形式

See merge request itc-framework/ma/2024/front!85
This commit is contained in:
890147
2025-07-10 08:50:42 +00:00
2 changed files with 80 additions and 6 deletions

View File

@ -29,6 +29,12 @@
</div> </div>
</div> </div>
<div class="user-select-box"> <div class="user-select-box">
<div class="select-depart-all" @click="selectAll">
<span>全选</span>
<div class="select-circle" :class="departAllSelected ? 'selected' : ''" v-if="!viewList">
<check-outlined v-if="departAllSelected" />
</div>
</div>
<SelectUserListV2 :multiple="multiple" :data="searchDepartMemberList" emptyDescription="暂无人员" @selectId="changeDepMemberSelect"></SelectUserListV2> <SelectUserListV2 :multiple="multiple" :data="searchDepartMemberList" emptyDescription="暂无人员" @selectId="changeDepMemberSelect"></SelectUserListV2>
<div v-if="false" class="user-select-pagination"> <div v-if="false" class="user-select-pagination">
<a-pagination v-model:current="searchDepartMemberParams.limit" :pageSize="searchDepartMemberParams.size" :total="searchDepartMemberTotal" /> <a-pagination v-model:current="searchDepartMemberParams.limit" :pageSize="searchDepartMemberParams.size" :total="searchDepartMemberTotal" />
@ -75,6 +81,7 @@
import { camelCaseString } from '/@/utils/stringUtil'; import { camelCaseString } from '/@/utils/stringUtil';
import { useUserStore } from '/@/store/modules/user'; import { useUserStore } from '/@/store/modules/user';
import { Icon } from '/@/components/Icon'; import { Icon } from '/@/components/Icon';
import { CheckOutlined } from '@ant-design/icons-vue';
const emits = defineEmits(['update:value', 'selectedId', 'change']); const emits = defineEmits(['update:value', 'selectedId', 'change']);
const { t } = useI18n(); const { t } = useI18n();
@ -128,6 +135,7 @@
let resetMemberList = []; let resetMemberList = [];
const searchPlaceholder = '请输入姓名或工号搜索'; const searchPlaceholder = '请输入姓名或工号搜索';
const defaultDepts = ref('') const defaultDepts = ref('')
const departAllSelected = ref(false)
if(props.onlyUserCompany) { if(props.onlyUserCompany) {
const userStore = useUserStore(); const userStore = useUserStore();
const userInfo = userStore.getUserInfo; const userInfo = userStore.getUserInfo;
@ -224,6 +232,21 @@
const searchAllMemberTotal = ref(0); const searchAllMemberTotal = ref(0);
const searchAllMemberList = ref([]); const searchAllMemberList = ref([]);
watch(searchDepartMemberList, (val) => {
let allSelected = true
searchDepartMemberList.value.forEach(item => {
if(!item.selected) {
allSelected = false
}
})
if(!searchDepartMemberList.value.length) {
allSelected = false
}
departAllSelected.value = allSelected
},
{
deep: true
})
async function departChange(e) { async function departChange(e) {
searchDepartMemberParams.value.departmentId = e.id; searchDepartMemberParams.value.departmentId = e.id;
let res = await getUserList(searchDepartMemberParams.value); let res = await getUserList(searchDepartMemberParams.value);
@ -260,6 +283,25 @@
return await getUserPageListNew(params); return await getUserPageListNew(params);
} }
function selectAll() {
departAllSelected.value = !departAllSelected.value
if(departAllSelected.value) {
searchDepartMemberList.value.forEach(item => {
if(!item.selected) {
selectedMemberList.value.push(item)
}
item.selected = true
})
} else {
searchDepartMemberList.value.forEach(item => {
if(item.selected) {
selectedMemberList.value = selectedMemberList.value.filter(m => m.id !== item.id)
}
item.selected = false
})
}
}
function departCompleted() { function departCompleted() {
treeLoading.value = false; treeLoading.value = false;
} }
@ -441,6 +483,34 @@
height: 100%; height: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.select-depart-all {
height: 30px;
padding-left: 14px;
padding-right: 21px;
padding-bottom: 5px;
display: flex;
justify-content: space-between;
align-items: center;
border-radius: 2px;
margin-top: 5px;
border-bottom: 1px solid #eaeaea;
color: #111111;
.select-circle {
width: 16px;
height: 16px;
border: 1px solid rgba(144, 147, 153, 0.7);
border-radius: 50%;
}
.selected {
border: none;
background-color: #5d9cec;
display: flex;
justify-content: center;
align-items: center;
color: white;
font-size: 10px
}
}
.user-select-title { .user-select-title {
} }

View File

@ -26,6 +26,10 @@
mainKey: String, mainKey: String,
//组件在子表中的Index //组件在子表中的Index
tableIndex: Number, tableIndex: Number,
valueType: {
default: 'Array',
type: String
}
}); });
const formModel = inject<any>('formModel', null); const formModel = inject<any>('formModel', null);
@ -34,7 +38,7 @@
watch( watch(
() => props.value, () => props.value,
(val: any) => { (val: any) => {
modelValue.value = val || []; modelValue.value = props.valueType == 'Array' ? (val || []) : (val ? val.split(',') : '');
}, },
{ {
immediate: true, immediate: true,
@ -56,20 +60,20 @@
formModel[props.mainKey][props.tableIndex!]?.[props.startField!], formModel[props.mainKey][props.tableIndex!]?.[props.startField!],
formModel[props.mainKey][props.tableIndex!]?.[props.endField!], formModel[props.mainKey][props.tableIndex!]?.[props.endField!],
]; ];
emit('update:value', emitData); emit('update:value', props.valueType == 'Array' || !emitData ? emitData : emitData.join(','));
} else { } else {
if (props.startField && props.endField && Object.keys(formModel).length) { if (props.startField && props.endField && Object.keys(formModel).length) {
const emitData = const emitData =
!formModel[props.startField] || !formModel[props.endField] !formModel[props.startField] || !formModel[props.endField]
? null ? null
: [formModel[props.startField], formModel[props.endField]]; : [formModel[props.startField], formModel[props.endField]];
emit('update:value', emitData); emit('update:value', props.valueType == 'Array' || !emitData ? emitData : emitData.join(','));
} }
} }
}); });
const handleChange = (time) => { const handleChange = (time) => {
emit('update:value', time); emit('update:value', props.valueType == 'Array' || !time ? time : time.join(','));
emit('change', time); emit('change', props.valueType == 'Array' || !time ? time : time.join(','));
if (formModel && props.startField && props.endField) { if (formModel && props.startField && props.endField) {
if (props.mainKey) { if (props.mainKey) {
formModel[props.mainKey][props.tableIndex!][props.startField!] = time?.length formModel[props.mainKey][props.tableIndex!][props.startField!] = time?.length