diff --git a/src/api/demo/data.js b/src/api/demo/data.js index fa45178..4541d14 100644 --- a/src/api/demo/data.js +++ b/src/api/demo/data.js @@ -54,6 +54,15 @@ export default { url: '/custom/engineParamDetailPojo/selectParamListAndModelForFilledBy', method: 'get' }, + GET_ENGINE_TABLE_DETAIL_FOR_FILLED_BY_HISTORY: { + url: '/custom/engineParamDetailPojo/selectParamListAndModelForFilledByHistory', + method: 'get' + }, + // 责任人分发填写人时获取参数树(传参与 GET_ENGINE_TABLE_DETAIL 相同,userID 为责任人 ID) + GET_ENGINE_TABLE_DETAIL_FOR_RESPONSIBLE_PERSON: { + url: '/custom/engineParamDetailPojo/selectParamListAndModelForResponsiblePerson', + method: 'get' + }, GET_NEW_MODEL_VERSION: { url: '/custom/dataEntryEngineModel/synchronizeParams', method: 'get' diff --git a/src/custom/apaas-custom-mydemo/custom-page/batch-modify-responsible-modal.vue b/src/custom/apaas-custom-mydemo/custom-page/batch-modify-responsible-modal.vue index 3bc633b..9c4d490 100644 --- a/src/custom/apaas-custom-mydemo/custom-page/batch-modify-responsible-modal.vue +++ b/src/custom/apaas-custom-mydemo/custom-page/batch-modify-responsible-modal.vue @@ -16,8 +16,10 @@ @@ -31,7 +33,7 @@ clearable multiple style="width: 100%" - :disabled="!formData.subsystem" + :disabled="!hasSelectedSubsystem" @change="handlePartsNameChange" > - + import api from '@/api' + +const WHOLE_ENGINE_PARAMS_LEGACY_KEYS = ['整车参数', '发动机基本信息'] + export default { name: 'BatchModifyResponsibleModal', props: { @@ -151,6 +149,21 @@ export default { currentVersionId: { type: String, default: '' + }, + // 由父组件 engineDetail 传入,解析部门 departmentId(含中轻/中重动力平台映射) + resolveDepartmentId: { + type: Function, + default: null + }, + // 左侧参数树第一级(项目名称),用于匹配责任人/填写人 + projectPartsName: { + type: String, + default: '' + }, + // 左侧参数树展示的子系统名称列表 + treeSubsystemNames: { + type: Array, + default: () => [] } }, data() { @@ -174,6 +187,7 @@ export default { availablePartsNames: [], // 根据子系统筛选出的零部件名称列表(仅用于批量修改填写人) availableDepartments: [], // 根据子系统筛选出的部门列表 allManagerData: [], // 所有责任人数据(用于查找现责任人和部门) + allFillerData: [], // 所有填写人数据(用于查找现填写人) departmentTreeData: [], // 部门树数据(用于根据部门名称查找部门ID) userOptions: [], // 人员选项列表 userLoading: false // 人员搜索loading状态 @@ -183,9 +197,16 @@ export default { modalTitle() { return this.dispatchType === 'update_param' ? '批量修改填写人' : '批量修改责任人' }, + hasSelectedSubsystem() { + if (this.dispatchType === 'update_param') { + return ( + Array.isArray(this.formData.subsystem) && this.formData.subsystem.length > 0 + ) + } + return !!this.formData.subsystem + }, formRules() { const rules = { - subsystem: [{ required: true, message: '请选择子系统', trigger: 'change' }], userId: [ { required: true, @@ -194,10 +215,16 @@ export default { } ] } - // 添加部门验证(两种模式都需要) - rules.department = [{ required: true, message: '请选择部门', trigger: 'change' }] - // 如果是批量修改填写人,添加零部件名称验证 if (this.dispatchType === 'update_param') { + rules.subsystem = [ + { + required: true, + type: 'array', + min: 1, + message: '请至少选择一个子系统', + trigger: 'change' + } + ] rules.partsName = [ { required: true, @@ -207,6 +234,9 @@ export default { trigger: 'change' } ] + } else { + rules.subsystem = [{ required: true, message: '请选择子系统', trigger: 'change' }] + rules.department = [{ required: true, message: '请选择部门', trigger: 'change' }] } return rules } @@ -228,10 +258,26 @@ export default { // 否则显示全部 return normalizedDept }, + getEmptySubsystemValue() { + return this.dispatchType === 'update_param' ? [] : '' + }, + getSelectedSubsystems() { + if (this.dispatchType === 'update_param') { + return Array.isArray(this.formData.subsystem) ? this.formData.subsystem : [] + } + return this.formData.subsystem ? [this.formData.subsystem] : [] + }, + isParamSubsystemMatched(paramSubsystemName, selectedSubsystems) { + const subsystems = selectedSubsystems || this.getSelectedSubsystems() + if (!subsystems.length) { + return false + } + return subsystems.some((name) => this.isSubsystemNameMatch(paramSubsystemName, name)) + }, showModal() { // 重置表单数据 this.formData = { - subsystem: '', + subsystem: this.getEmptySubsystemValue(), partsName: [], department: '', currentResponsibleId: '', @@ -264,7 +310,7 @@ export default { closeModal() { this.visible = false this.formData = { - subsystem: '', + subsystem: this.getEmptySubsystemValue(), partsName: [], department: '', currentResponsibleId: '', @@ -289,25 +335,65 @@ export default { } this.$request(request) .asyncThen((resp) => { - if (resp && resp.data) { - this.subsystemList = resp.data - } else { - this.subsystemList = [] - } + const apiList = resp && resp.data ? resp.data : [] + this.filterSubsystemListByTree(apiList) }) .asyncErrorCatch((err) => { console.error('加载子系统列表失败:', err) this.subsystemList = [] }) }, + // 子系统名称是否匹配(兼容整车参数/发动机基本信息) + isSubsystemNameMatch(nameA, nameB) { + if (!nameA || !nameB) { + return false + } + if (nameA === nameB) { + return true + } + return ( + WHOLE_ENGINE_PARAMS_LEGACY_KEYS.includes(nameA) && + WHOLE_ENGINE_PARAMS_LEGACY_KEYS.includes(nameB) + ) + }, + // 根据左侧树展示的子系统,从接口返回的列表中删减 + filterSubsystemListByTree(apiList) { + const list = Array.isArray(apiList) ? apiList : [] + const treeNames = (this.treeSubsystemNames || []).filter(Boolean) + if (!treeNames.length) { + this.subsystemList = list + return + } + const filtered = [] + list.forEach((apiName) => { + const matchedTreeName = treeNames.find((treeName) => + this.isSubsystemNameMatch(apiName, treeName) + ) + if (matchedTreeName && !filtered.includes(matchedTreeName)) { + filtered.push(matchedTreeName) + } + }) + this.subsystemList = filtered + }, + // 是否匹配当前项目名称(partsName) + isProjectPartsNameMatch(item) { + if (!this.projectPartsName || !item) { + return true + } + return (item.partsName || '') === this.projectPartsName + }, // 加载所有责任人数据(用于查找现责任人和部门) loadAllManagerData() { + const params = { + pageNumber: 1, + pageSize: 9999 // 获取所有数据 + } + if (this.projectPartsName) { + params.partsName = this.projectPartsName + } const request = { ...api.GET_MANAGER_DATA, - params: { - pageNumber: 1, - pageSize: 9999 // 获取所有数据 - }, + params, disableSuccessMsg: true } this.$request(request) @@ -323,8 +409,35 @@ export default { this.allManagerData = [] }) }, + // 加载所有填写人数据(用于查找现填写人) + loadAllFillerData() { + const params = { + pageNumber: 1, + pageSize: 9999 + } + if (this.projectPartsName) { + params.partsName = this.projectPartsName + } + const request = { + ...api.GET_FILLER_DATA, + params, + disableSuccessMsg: true + } + this.$request(request) + .asyncThen((resp) => { + if (resp && resp.data) { + this.allFillerData = resp.data.result || [] + } else { + this.allFillerData = [] + } + }) + .asyncErrorCatch((err) => { + console.error('加载填写人数据失败:', err) + this.allFillerData = [] + }) + }, // 处理子系统选择变化 - handleSubsystemChange(subsystem) { + handleSubsystemChange() { // 清空零部件名称、部门和现责任人/现填写人 this.formData.partsName = [] this.formData.department = '' @@ -339,113 +452,54 @@ export default { this.availablePartsNames = [] this.availableDepartments = [] this.userOptions = [] - // 根据子系统筛选零部件名称和部门列表 - if (subsystem) { - const currentVersionData = this.versionData[this.currentVersionId] || {} - const partsNameSet = new Set() - const departmentSet = new Set() - // 遍历所有零部件名称(partsName) - Object.keys(currentVersionData).forEach((partsName) => { - const params = currentVersionData[partsName] || [] - // 遍历该零部件下的所有参数 - params.forEach((param) => { - // 检查参数是否属于选中的子系统 - if (param.subsystemName === subsystem) { - // 如果是批量修改填写人,收集零部件名称(包括 /) - if (this.dispatchType === 'update_param') { - const paramPartsName = param.partsName || partsName - if (paramPartsName) { - partsNameSet.add(paramPartsName) - } - } - // 收集部门名称(两种模式都需要) - if (param.department) { - departmentSet.add(param.department) - } - } - }) - }) - - // 如果是批量修改填写人,设置零部件名称列表(添加 / 作为默认项) - if (this.dispatchType === 'update_param') { - const partsNamesArray = Array.from(partsNameSet).sort() - // 如果 / 不在列表中,添加到开头 - if (!partsNamesArray.includes('/')) { - partsNamesArray.unshift('/') - } - this.availablePartsNames = partsNamesArray - // 对于批量修改填写人,部门列表应该在选择了零部件名称之后才筛选 - this.availableDepartments = [] - } else { - // 批量修改责任人:设置部门列表(转换为数组格式) - this.availableDepartments = Array.from(departmentSet).map((dept) => ({ - department: dept - })) - } - } else { + const selectedSubsystems = this.getSelectedSubsystems() + if (!selectedSubsystems.length) { this.availablePartsNames = [] this.availableDepartments = [] - } - }, - // 处理零部件名称选择变化(仅用于批量修改填写人) - handlePartsNameChange(partsNames) { - // partsNames 现在是数组 - // 清空部门、现填写人和新填写人 - this.formData.department = '' - this.formData.currentFillerId = '' - this.formData.currentFillerName = '' - this.formData.userId = '' - this.formData.userNumber = '' - this.formData.username = '' - this.availableDepartments = [] - this.userOptions = [] - // 根据子系统和零部件名称筛选部门列表 - if ( - partsNames && - Array.isArray(partsNames) && - partsNames.length > 0 && - this.formData.subsystem - ) { - this.filterDepartmentsByPartsName() - } - }, - // 根据子系统和零部件名称筛选部门列表(仅用于批量修改填写人) - filterDepartmentsByPartsName() { - if ( - !this.formData.subsystem || - !this.formData.partsName || - !Array.isArray(this.formData.partsName) || - this.formData.partsName.length === 0 - ) { - this.availableDepartments = [] return } const currentVersionData = this.versionData[this.currentVersionId] || {} + const partsNameSet = new Set() const departmentSet = new Set() - // 遍历所有零部件名称(partsName) - Object.keys(currentVersionData).forEach((dataPartsName) => { - const params = currentVersionData[dataPartsName] || [] - // 遍历该零部件下的所有参数 + Object.keys(currentVersionData).forEach((partsName) => { + const params = currentVersionData[partsName] || [] params.forEach((param) => { - // 检查参数是否属于选中的子系统和任意一个选中的零部件名称 - const paramPartsName = param.partsName || dataPartsName - if ( - param.subsystemName === this.formData.subsystem && - this.formData.partsName.includes(paramPartsName) && - param.department - ) { + if (!this.isParamSubsystemMatched(param.subsystemName, selectedSubsystems)) { + return + } + if (this.dispatchType === 'update_param') { + const paramPartsName = param.partsName || partsName + if (paramPartsName) { + partsNameSet.add(paramPartsName) + } + } + if (param.department) { departmentSet.add(param.department) } }) }) - // 转换为数组格式 - this.availableDepartments = Array.from(departmentSet).map((dept) => ({ - department: dept - })) + if (this.dispatchType === 'update_param') { + const partsNamesArray = Array.from(partsNameSet).sort() + if (!partsNamesArray.includes('/')) { + partsNamesArray.unshift('/') + } + this.availablePartsNames = partsNamesArray + } else { + this.availableDepartments = Array.from(departmentSet).map((dept) => ({ + department: dept + })) + } + }, + // 处理零部件名称选择变化(仅用于批量修改填写人) + handlePartsNameChange() { + this.formData.userId = '' + this.formData.userNumber = '' + this.formData.username = '' + this.userOptions = [] }, // 处理部门选择变化 handleDepartmentChange(department) { @@ -457,7 +511,6 @@ export default { this.formData.userNumber = '' this.formData.username = '' this.userOptions = [] - // 如果是批量修改填写人,不需要查找现填写人 if (this.dispatchType === 'update_param') { return } @@ -466,7 +519,13 @@ export default { const matchedItem = this.allManagerData.find((item) => { // 检查子系统是否匹配 const itemSubsystems = item.subsystem ? item.subsystem.split(',') : [] - return itemSubsystems.includes(this.formData.subsystem) && item.department === department + return ( + itemSubsystems.some((name) => + this.isSubsystemNameMatch(name.trim(), this.formData.subsystem) + ) && + item.department === department && + this.isProjectPartsNameMatch(item) + ) }) if (matchedItem) { // 找到现责任人 @@ -483,8 +542,7 @@ export default { }, // 远程搜索责任人/填写人 handleRemoteSearch(query) { - // 两种模式都需要检查部门 - if (!this.formData.department) { + if (this.dispatchType !== 'update_param' && !this.formData.department) { this.userOptions = [] return } @@ -584,15 +642,6 @@ export default { handleSubmit() { this.$refs.form.validate((valid) => { if (valid) { - // 验证必填字段 - if (!this.formData.subsystem) { - this.$message.warning('请选择子系统') - return - } - if (!this.formData.department) { - this.$message.warning('请选择部门') - return - } if (!this.formData.userId) { const fieldName = this.dispatchType === 'update_param' ? '人员' : '责任人' this.$message.warning(`请选择${fieldName}`) @@ -601,7 +650,11 @@ export default { // 如果是批量修改填写人,不调用接口,直接触发确认事件 if (this.dispatchType === 'update_param') { - // 验证零部件名称 + const selectedSubsystems = this.getSelectedSubsystems() + if (!selectedSubsystems.length) { + this.$message.warning('请至少选择一个子系统') + return + } if ( !this.formData.partsName || !Array.isArray(this.formData.partsName) || @@ -610,14 +663,11 @@ export default { this.$message.warning('请至少选择一个零部件名称') return } - // 确保所有必要参数都有值 - // 如果 userNumber 为空,使用 userId 作为 userNumber(降级处理) const confirmData = { - subsystem: this.formData.subsystem, - partsName: this.formData.partsName, // 现在是数组 - department: this.formData.department, - userId: this.formData.userId, // 确保传递userId - userNumber: this.formData.userNumber || this.formData.userId, // 如果没有 userNumber,使用 userId + subsystem: selectedSubsystems, + partsName: this.formData.partsName, + userId: this.formData.userId, + userNumber: this.formData.userNumber || this.formData.userId, username: this.formData.username || '' } console.log('批量修改填写人 - 提交数据:', confirmData) @@ -658,6 +708,7 @@ export default { departmentId: this.getDepartmentIdByDepartment(this.formData.department), department: this.formData.department, subsystem: this.formData.subsystem, + partsName: this.projectPartsName || '', userId: this.formData.userId, // 使用 userNumber rowId: this.formData.rowId }, @@ -697,6 +748,7 @@ export default { departmentId: this.getDepartmentIdByDepartment(this.formData.department), department: this.formData.department, subsystem: this.formData.subsystem, + partsName: this.projectPartsName || '', userId: this.formData.userId }, disableSuccessMsg: true @@ -764,6 +816,12 @@ export default { }, // 根据部门名称获取部门ID(从部门树中查找) getDepartmentIdByDepartment(department) { + if (typeof this.resolveDepartmentId === 'function') { + const resolvedId = this.resolveDepartmentId(department) + if (resolvedId) { + return resolvedId + } + } if (!department || !this.departmentTreeData || this.departmentTreeData.length === 0) { // 如果部门树没有加载,尝试从 allManagerData 中查找 if (this.allManagerData && this.allManagerData.length > 0) { diff --git a/src/custom/apaas-custom-mydemo/custom-page/checkPersonPermission.vue b/src/custom/apaas-custom-mydemo/custom-page/checkPersonPermission.vue index 335c0f3..b27629c 100644 --- a/src/custom/apaas-custom-mydemo/custom-page/checkPersonPermission.vue +++ b/src/custom/apaas-custom-mydemo/custom-page/checkPersonPermission.vue @@ -463,7 +463,7 @@ export default { -webkit-box-flex: 1; -ms-flex: 1; flex: 1; - font-size: 12px; + font-size: 18px; } } diff --git a/src/custom/apaas-custom-mydemo/custom-page/engineDetail.vue b/src/custom/apaas-custom-mydemo/custom-page/engineDetail.vue index c12bd0c..a1e6bad 100644 --- a/src/custom/apaas-custom-mydemo/custom-page/engineDetail.vue +++ b/src/custom/apaas-custom-mydemo/custom-page/engineDetail.vue @@ -30,7 +30,7 @@ size="small" :loading="rejecting" @click="handleReject" - >拒绝退回 {{ dispatchType === 'update_param' ? '批量修改填写人' : '批量修改责任人' }} @@ -90,7 +90,9 @@ accept=".xlsx,.xls" @change="handleFileChange" /> -