/** 企业信息管理:前后端字段与分页格式适配 */ import { formatDate, formatDateTime, toApiDate, toApiDateTime } from "../../utils/dateFormat"; import { resolveUploadFileIds } from "../../utils/mockUpload"; import { asId, isIdFieldName, normalizeQueryIds } from "./idUtil"; import { withOrgId } from "./orgContext"; const GENDER_NAME = { 1: "男", 2: "女" }; const RESIGN_AUDIT_STATUS_NAME = { 0: "未审核", 1: "已审核", 2: "已退回" }; const ENTERPRISE_STATUS_CODE = { 正常: 1, 停业: 2, 注销: 3 }; const FILING_TYPE_CODE = { 审核备案: "1", 确认备案: "2" }; const FILING_RECORD_STATUS_CODE = { 已备案: 1, 未备案: 2 }; const PERSON_TYPE_CODE = { 基础人员: "1", 专职评价师: "2" }; function parseAttachmentUrls(urls, defaultName = "附件.pdf") { if (!urls) { return []; } return String(urls) .split(",") .map((url) => url.trim()) .filter(Boolean) .map((url, index) => ({ name: `${defaultName.replace(".pdf", "")}${index + 1}.pdf`, fileName: `${defaultName.replace(".pdf", "")}${index + 1}.pdf`, url, })); } /** 分页查询参数:子表 org_id → org_info.id;机构信息管理 getInfo 不走此方法 */ export function toPageQuery(params = {}, fieldMap = {}) { const query = { current: params.pageIndex ?? params.current ?? 1, size: params.pageSize ?? params.size ?? 10, }; Object.entries(fieldMap).forEach(([from, to]) => { const value = params[from]; if (value !== undefined && value !== null && value !== "") { query[to] = isIdFieldName(to) ? asId(value) : value; } }); return withOrgId(normalizeQueryIds(query)); } export function fromPageResponse(res, mapItem) { if (!res) { return { success: false, data: [], totalCount: 0 }; } const list = Array.isArray(res.data) ? res.data : []; return { ...res, data: mapItem ? list.map(mapItem) : list, totalCount: res.totalCount ?? res.total ?? list.length, }; } export function fromSingleResponse(res, mapItem) { if (!res) { return { success: false, data: null }; } return { ...res, data: res.data && mapItem ? mapItem(res.data) : res.data, }; } function pick(obj, keys) { const next = {}; keys.forEach((key) => { if (obj[key] !== undefined) { next[key] = isIdFieldName(key) ? asId(obj[key]) : obj[key]; } }); return next; } // ─── 机构信息 ─── export function toOrgInfoForm(data = {}) { return { id: asId(data.id), orgName: data.unitName, creditCode: data.creditCode, safetyIndustryCategory: data.safetyIndustryCategoryName, regionCountyName: data.districtName, regionStreetName: data.townStreet, regionCommunityName: data.villageCommunity, longitude: data.longitude, latitude: data.latitude, registerAddress: data.registerAddress, businessAddress: data.businessAddress, ownershipType: data.ownershipTypeName, gbIndustryCode: data.economyIndustryCode, legalRepresentative: data.legalRepresentative, legalRepPhone: data.legalRepresentativePhone, principal: data.principalName, principalPhone: data.principalPhone, safetyDeptHead: data.safetyDeptManager, safetyDeptPhone: data.safetyDeptManagerPhone, safetyVpPhone: data.safetyDeputyPhone, productionDate: data.productionDate, businessStatus: data.businessStatusName, disclosureUrl: data.infoDisclosureUrl, workplaceArea: data.workplaceArea, archiveRoomArea: data.archiveRoomArea, fullTimeEvaluatorCount: data.fulltimeEvaluatorCount, registeredSafetyEngineerCount: data.registeredEngineerCount, authStatusCode: data.authStatusCode, enterpriseStatus: data.enterpriseStatusName, enterpriseScale: data.enterpriseScaleName, filingType: data.filingTypeName ?? "确认备案", filingRecordStatus: data.filingRecordStatusName ?? "未备案", attachments: parseAttachmentUrls(data.attachmentUrls), }; } export function fromOrgInfoForm(values = {}, options = {}) { const { isDraft = false } = options; const enterpriseStatus = values.enterpriseStatus; const filingType = values.filingType ?? "确认备案"; const filingRecordStatus = values.filingRecordStatus ?? "未备案"; return { ...pick(values, ["id", "tenantId"]), unitName: values.orgName, creditCode: values.creditCode, safetyIndustryCategoryName: values.safetyIndustryCategory, districtCode: values.regionCountyName, districtName: values.regionCountyName, townStreet: values.regionStreetName, villageCommunity: values.regionCommunityName, longitude: values.longitude, latitude: values.latitude, registerAddress: values.registerAddress, businessAddress: values.businessAddress, ownershipTypeName: values.ownershipType, economyIndustryCode: values.gbIndustryCode, legalRepresentative: values.legalRepresentative, legalRepresentativePhone: values.legalRepPhone, principalName: values.principal, principalPhone: values.principalPhone, safetyDeptManager: values.safetyDeptHead, safetyDeptManagerPhone: values.safetyDeptPhone, safetyDeputyPhone: values.safetyVpPhone, productionDate: values.productionDate, businessStatusName: values.businessStatus, infoDisclosureUrl: values.disclosureUrl, workplaceArea: values.workplaceArea, archiveRoomArea: values.archiveRoomArea, fulltimeEvaluatorCount: values.fullTimeEvaluatorCount, registeredEngineerCount: values.registeredSafetyEngineerCount, authStatusCode: isDraft ? 0 : 1, authStatusName: isDraft ? "草稿" : "已提交", enterpriseStatusCode: ENTERPRISE_STATUS_CODE[enterpriseStatus], enterpriseStatusName: enterpriseStatus, enterpriseScaleCode: values.enterpriseScale, enterpriseScaleName: values.enterpriseScale, filingTypeCode: FILING_TYPE_CODE[filingType] ?? filingType, filingTypeName: filingType, filingRecordStatusCode: FILING_RECORD_STATUS_CODE[filingRecordStatus], filingRecordStatusName: filingRecordStatus, attachmentUrls: resolveUploadFileIds(values.attachments), }; } // ─── 部门 / 岗位 ─── export function toDepartmentForm(data = {}) { return { id: asId(data.id), parentId: asId(data.parentId), deptName: data.deptName, leaderName: data.managerName, leaderAccount: data.managerAccount, deptLevel: data.deptLevelName ?? data.deptLevelCode, }; } export function fromDepartmentForm(values = {}) { return { ...pick(values, ["id", "parentId", "tenantId"]), deptName: values.deptName, managerName: values.leaderName, managerAccount: values.leaderAccount, deptLevelName: values.deptLevel, deptLevelCode: values.deptLevel, }; } export function buildDepartmentTree(departments = []) { const map = new Map(); departments.forEach((item) => { map.set(asId(item.id), { ...toDepartmentForm(item), children: [] }); }); const roots = []; departments.forEach((item) => { const node = map.get(asId(item.id)); const parentId = asId(item.parentId); if (parentId != null && parentId !== "0" && map.has(parentId)) { map.get(parentId).children.push(node); } else { roots.push(node); } }); return roots; } export function toPositionForm(data = {}) { return { id: asId(data.id), deptId: asId(data.deptId), deptName: data.deptName, positionName: data.positionName, dutyDesc: data.dutyDesc, remark: data.remark ?? data.remarks, }; } export function fromPositionForm(values = {}) { return { ...pick(values, ["id", "tenantId"]), deptId: asId(values.deptId), positionName: values.positionName, dutyDesc: values.dutyDesc, remark: values.remark, }; } // ─── 人员 ─── export function toStaffForm(data = {}) { return { id: asId(data.id), staffName: data.userName, account: data.account, gender: data.genderCode, birthDate: data.birthDate, deptId: asId(data.deptId), positionId: asId(data.postId), idCardNo: data.idCardNo, homeAddress: data.currentAddress, officeAddress: data.officeAddress, educationType: data.educationTypeName, educationLevel: data.educationLevelName, education: data.educationName ?? data.educationCode, graduateSchool: data.graduateSchool, major: data.major, employmentStatus: data.employmentStatusCode, personType: data.personTypeName ?? "基础人员", qualScope: data.qualScope, professionalLevel: data.professionalLevelName, evaluatorCertNo: data.evaluatorCertNo, titleName: data.titleName, registerEngineerFlag: data.registerEngineerFlag ?? 2, publications: data.publications, abilityDeclaration: data.abilityDeclaration, workExperience: data.workExperience, proofMaterials: parseAttachmentUrls(data.proofMaterialUrl, "专业能力证明.pdf"), deptName: data.deptName, positionName: data.postName ?? data.positionName, certNames: data.certNames, }; } export function fromStaffForm(values = {}) { const genderCode = values.gender; const personType = values.personType ?? "基础人员"; const educationType = values.educationType; const educationLevel = values.educationLevel; const educationName = educationType && educationLevel ? `${educationType}-${educationLevel}` : values.education; return { ...pick(values, ["id", "tenantId"]), userName: values.staffName, account: values.account, genderCode, genderName: GENDER_NAME[genderCode] ?? values.genderName, birthDate: toApiDate(values.birthDate), deptId: asId(values.deptId), postId: asId(values.positionId ?? values.postId), idCardNo: values.idCardNo, currentAddress: values.homeAddress, officeAddress: values.officeAddress, educationName, educationCode: educationName, educationTypeCode: educationType, educationTypeName: educationType, educationLevelCode: educationLevel, educationLevelName: educationLevel, graduateSchool: values.graduateSchool, major: values.major, employmentStatusCode: values.employmentStatus ?? 1, employmentStatusName: values.employmentStatus === 2 ? "离职" : "在职", personTypeCode: PERSON_TYPE_CODE[personType] ?? personType, personTypeName: personType, qualScope: values.qualScope, professionalLevelCode: values.professionalLevel, professionalLevelName: values.professionalLevel, evaluatorCertNo: values.evaluatorCertNo, titleName: values.titleName, registerEngineerFlag: values.registerEngineerFlag ?? 2, publications: values.publications, abilityDeclaration: values.abilityDeclaration, workExperience: values.workExperience, proofMaterialUrl: resolveUploadFileIds(values.proofMaterials), }; } // ─── 人员证书 ─── export function toStaffCertForm(data = {}) { const certImgs = data.certAttachmentUrl ? [{ url: data.certAttachmentUrl, fileName: data.certName }] : data.certImgFiles || []; return { id: asId(data.id), staffId: asId(data.personnelId), certName: data.certName, certCategory: data.certCategoryName ?? data.certCategoryCode, certWorkCategory: data.operationCategoryName ?? data.operationCategoryCode, certNo: data.certNo, issueOrg: data.issueOrg, validStartDate: data.validStartDate, validEndDate: data.validEndDate, reviewDate: data.reviewDate, certImgFiles: certImgs, certImgs, }; } export function fromStaffCertForm(values = {}) { const certAttachmentUrl = values.certAttachmentUrl || values.certImgs?.[0]?.url || values.certImgFiles?.[0]?.url; return { ...pick(values, ["id", "tenantId"]), personnelId: asId(values.staffId), certName: values.certName, certCategoryName: values.certCategory, certCategoryCode: values.certCategory, operationCategoryName: values.certWorkCategory, operationCategoryCode: values.certWorkCategory, certNo: values.certNo, issueOrg: values.issueOrg, validStartDate: values.validStartDate, validEndDate: values.validEndDate, reviewDate: values.reviewDate, certAttachmentUrl, }; } // ─── 机构资质证书 ─── /** 资质证书 enableFlag(1启用/2禁用) ↔ 前端 enableStatus(1启用/0禁用) */ export function mapQualificationEnableStatus(flag) { return Number(flag) === 1 ? 1 : 0; } export function mapQualificationEnableFlag(status) { return Number(status) === 1 ? 1 : 2; } /** 列表/表单统一判断:优先 enableFlag,兼容 enableStatus */ export function isQualificationEnabled(record = {}) { const flag = record.enableFlag ?? record.enableStatus; return mapQualificationEnableStatus(flag) === 1; } export function toQualificationForm(data = {}) { const certImgs = data.certImageUrl ? [{ url: data.certImageUrl, fileName: data.certName }] : data.certImgFiles || []; return { id: asId(data.id), certType: data.licenseTypeName ?? data.licenseTypeCode, certName: data.certName, certNo: data.certNo, issueOrg: data.issueOrg, issueDate: data.issueDate, validStartDate: data.validStartDate, validEndDate: data.validEndDate, remark: data.remark ?? data.remarks, enableFlag: data.enableFlag, enableStatus: mapQualificationEnableStatus(data.enableFlag), issueDate: formatDate(data.issueDate), validStartDate: formatDate(data.validStartDate), validEndDate: formatDate(data.validEndDate), certImgFiles: certImgs, certImgs, }; } export function fromQualificationForm(values = {}) { const certImageUrl = values.certImageUrl || values.certImgs?.[0]?.url || values.certImgFiles?.[0]?.url; return { ...pick(values, ["id", "tenantId"]), licenseTypeName: values.certType, licenseTypeCode: values.certType, certName: values.certName, certNo: values.certNo, issueOrg: values.issueOrg, issueDate: toApiDate(values.issueDate), validStartDate: toApiDate(values.validStartDate ?? values.validDate?.[0]), validEndDate: toApiDate(values.validEndDate ?? values.validDate?.[1]), certImageUrl, remark: values.remark, enableFlag: mapQualificationEnableFlag(values.enableStatus), }; } // ─── 装备 ─── /** 装备 enableFlag(1启用/2禁用) ↔ 前端 enableStatus(1启用/0禁用) */ export function mapEquipEnableStatus(flag) { return Number(flag) === 1 ? 1 : 0; } export function mapEquipEnableFlag(status) { return Number(status) === 1 ? 1 : 2; } export function isEquipEnabled(record = {}) { const flag = record.enableFlag ?? record.enableStatus; return mapEquipEnableStatus(flag) === 1; } export function toEquipForm(data = {}) { const instrumentType = data.instrumentTypeName ?? data.instrumentTypeCode; return { id: asId(data.id), instrumentType, instrumentCategory: instrumentType, deviceType: data.deviceTypeName ?? data.deviceTypeCode, deviceName: data.deviceName, model: data.deviceModel, flowDesc: data.flowDesc, manufacturer: data.manufacturer, minFlow: data.minFlow, maxFlow: data.maxFlow, calibrationUnit: data.calibrationUnit, calibrationInitialValue: data.calibrationInitValue, onSiteCalibrationType: data.fieldCalibrationTypeName ?? data.fieldCalibrationTypeCode, isDualChannel: data.dualChannelFlag, enableFlag: data.enableFlag, enableStatus: mapEquipEnableStatus(data.enableFlag), }; } export function fromEquipForm(values = {}) { return { ...pick(values, ["id", "tenantId"]), deviceName: values.deviceName, deviceModel: values.model, instrumentTypeName: values.instrumentCategory, instrumentTypeCode: values.instrumentCategory, deviceTypeName: values.deviceType, deviceTypeCode: values.deviceType, manufacturer: values.manufacturer, flowDesc: values.flowDesc, minFlow: values.minFlow, maxFlow: values.maxFlow, calibrationUnit: values.calibrationUnit, calibrationInitValue: values.calibrationInitialValue, fieldCalibrationTypeName: values.onSiteCalibrationType, fieldCalibrationTypeCode: values.onSiteCalibrationType, dualChannelFlag: values.isDualChannel, enableFlag: mapEquipEnableFlag(values.enableStatus), }; } // ─── 人员变更 / 离职 ─── export function toChangeLogForm(data = {}) { return { id: asId(data.id), staffId: asId(data.personnelId), changeItem: data.changeItem, changeTime: formatDateTime(data.changeTime), createBy: data.operatorName, }; } export function toResignApplyForm(data = {}) { const auditStatus = data.auditStatusCode ?? data.auditStatus ?? 0; return { id: asId(data.id), personnelId: asId(data.personnelId), applicantName: data.applicantName, applyTime: formatDateTime(data.applyTime), expectedLeaveDate: formatDate(data.expectedResignDate), leaveReason: data.resignReason, remark: data.remark ?? data.remarks, rejectReason: data.rejectReason, auditStatus, auditStatusName: data.auditStatusName ?? RESIGN_AUDIT_STATUS_NAME[auditStatus] ?? "未审核", attachmentId: data.reportFileUrl, account: data.account, deptName: data.deptName, }; } export function fromResignApplyForm(values = {}) { return { ...pick(values, ["id", "tenantId"]), personnelId: asId(values.personnelId), applicantName: values.applicantName, applyTime: toApiDateTime(values.applyTime), expectedResignDate: toApiDate(values.expectedLeaveDate), resignReason: values.leaveReason, remark: values.remark, reportFileUrl: values.attachmentId ?? values.reportFileUrl, auditStatusCode: values.auditStatus ?? 0, auditStatusName: values.auditStatus === 1 ? "已审核" : values.auditStatus === 2 ? "已退回" : "未审核", }; } export function fromResignAuditForm(values = {}) { const auditStatus = values.auditStatus; return { id: asId(values.id), personnelId: asId(values.personnelId), auditStatusCode: auditStatus, auditStatusName: auditStatus === 1 ? "已审核" : auditStatus === 2 ? "已退回" : "未审核", rejectReason: values.rejectReason, }; } export function toStaffChangeSummary(personnel = {}) { const employmentCode = Number(personnel.employmentStatusCode ?? personnel.employmentStatus ?? 1); const hasResignApply = personnel.resignApplyId != null && personnel.resignApplyId !== ""; const resignStatusRaw = personnel.resignAuditStatus; let resignStatus = null; if (hasResignApply) { resignStatus = resignStatusRaw === null || resignStatusRaw === undefined ? 0 : Number(resignStatusRaw); } return { id: asId(personnel.id), staffId: asId(personnel.id), account: personnel.account, staffName: personnel.userName ?? personnel.staffName, deptName: personnel.deptName || "", employmentStatus: employmentCode, employmentStatusCode: employmentCode, employmentStatusName: personnel.employmentStatusName || (employmentCode === 2 ? "离职" : "在职"), changeCount: Number(personnel.changeCount ?? 0), resignApplyId: asId(personnel.resignApplyId), resignAuditStatus: resignStatus, resignAuditStatusName: personnel.resignAuditStatusName ?? (resignStatus !== null ? RESIGN_AUDIT_STATUS_NAME[resignStatus] : undefined), }; }