实现密炼物料种类配置关联解析功能,新增种类查找表加载与解析接口,优化选料弹窗层级与刷新功能,增强用户体验与系统稳定性。

This commit is contained in:
geht
2026-05-25 20:29:07 +08:00
parent dc3f305303
commit 441c19e87a
13 changed files with 556 additions and 170 deletions

View File

@@ -967,52 +967,135 @@ export function sanitizeMixingMaterialPickerHiddenCategoryIds(allMinorIds: strin
}
//update-end---author:cursor ---date:20260525 for【XSLMES-20260525-A50】选料弹窗小类树为空时重置隐藏配置-----------
/** 解析混炼示方明细种类:小类勾选胶料则显示「胶料」,否则显示小类名 */
export function resolveMixingMaterialKindFromCategory(isRubber?: unknown, minorName?: string) {
if (isRubber === '1' || isRubber === 1 || isRubber === true) {
return '胶料';
//update-begin---author:cursor ---date:20260525 for【XSLMES-20260525-A52】混炼示方种类改读密炼物料种类配置-----------
export interface MixerMaterialKindLookup {
byRefId: Record<string, string>;
byRefCode: Record<string, string>;
rubberKindName?: string;
}
export const EMPTY_MIXER_MATERIAL_KIND_LOOKUP: MixerMaterialKindLookup = {
byRefId: {},
byRefCode: {},
rubberKindName: '胶料',
};
let mixingMaterialKindLookupCache: MixerMaterialKindLookup | null = null;
let mixingMaterialKindLookupPromise: Promise<MixerMaterialKindLookup> | null = null;
/** 加载密炼物料种类配置查找表(带内存缓存) */
export async function loadMixingMaterialKindLookup(forceReload = false): Promise<MixerMaterialKindLookup> {
if (!forceReload && mixingMaterialKindLookupCache) {
return mixingMaterialKindLookupCache;
}
if (!forceReload && mixingMaterialKindLookupPromise) {
return mixingMaterialKindLookupPromise;
}
mixingMaterialKindLookupPromise = (async () => {
try {
const { loadKindLookup } = await import('../mesXslMixerMaterialKindCfg/MesXslMixerMaterialKindCfg.api');
const raw = await loadKindLookup();
const lookup: MixerMaterialKindLookup = {
byRefId: raw?.byRefId || {},
byRefCode: raw?.byRefCode || {},
rubberKindName: raw?.rubberKindName || '胶料',
};
mixingMaterialKindLookupCache = lookup;
return lookup;
} catch {
return EMPTY_MIXER_MATERIAL_KIND_LOOKUP;
} finally {
mixingMaterialKindLookupPromise = null;
}
})();
return mixingMaterialKindLookupPromise;
}
/** 清除种类配置缓存(配置变更后可调用) */
export function clearMixingMaterialKindLookupCache() {
mixingMaterialKindLookupCache = null;
mixingMaterialKindLookupPromise = null;
}
function matchKindFromLookup(lookup: MixerMaterialKindLookup | null | undefined, key?: string) {
if (!lookup || key == null || String(key).trim() === '') {
return '';
}
const normalized = String(key).trim();
if (lookup.byRefId?.[normalized]) {
return lookup.byRefId[normalized];
}
if (lookup.byRefCode?.[normalized]) {
return lookup.byRefCode[normalized];
}
const lower = normalized.toLowerCase();
if (lookup.byRefCode?.[lower]) {
return lookup.byRefCode[lower];
}
for (const [code, kindName] of Object.entries(lookup.byRefCode || {})) {
if (code && normalized.includes(code)) {
return kindName;
}
}
return '';
}
/** 解析混炼示方明细种类:称量方式优先,其次物料小类 ID最后小类名称兜底 */
export function resolveMixingMaterialKindFromLookup(
lookup: MixerMaterialKindLookup | null | undefined,
weighMode?: string,
minorCategoryId?: string,
minorCategoryName?: string,
) {
const fromWeighMode = matchKindFromLookup(lookup, weighMode);
if (fromWeighMode) {
return fromWeighMode;
}
const fromMinorId = matchKindFromLookup(lookup, minorCategoryId);
if (fromMinorId) {
return fromMinorId;
}
if (minorCategoryName != null && String(minorCategoryName).trim() !== '') {
return String(minorCategoryName).trim();
}
return '';
}
/** @deprecated 保留兼容,请改用 resolveMixingMaterialKindFromLookup */
export function resolveMixingMaterialKindFromCategory(_isRubber?: unknown, minorName?: string) {
return minorName != null && String(minorName).trim() !== '' ? String(minorName).trim() : '';
}
/** @deprecated 保留兼容,请改用 resolveMixingMaterialKindFromLookup */
export function resolveMixingMaterialKindFromWeighMode(_weighMode?: string) {
return '';
}
/** 选料确认时种类:读密炼物料种类配置表 */
export function resolveMixingMaterialKindForPicker(
lookup: MixerMaterialKindLookup | null | undefined,
weighMode: string | undefined,
minorCategoryId?: string,
minorCategoryName?: string,
) {
return resolveMixingMaterialKindFromLookup(lookup, weighMode, minorCategoryId, minorCategoryName);
}
//update-end---author:cursor ---date:20260525 for【XSLMES-20260525-A52】混炼示方种类改读密炼物料种类配置-----------
//update-begin---author:cursor ---date:20260525 for【XSLMES-20260525-A50】选料弹窗自动/人工称量列与种类映射-----------
/** 与配合示方「自动/人工」列相同字典 */
export const MIXING_MATERIAL_PICKER_WEIGH_MODE_DICT = 'xslmes_formula_spec_weigh_mode';
/** 选料弹窗表格列(隐藏 ERP 编号,新增仅本次有效的自动/人工称量) */
/** 选料弹窗表格列(隐藏 ERP 编号,新增种类列与自动/人工称量) */
export const mixingMaterialPickerTableColumns: BasicColumn[] = [
{ title: '物料编码', align: 'center', width: 120, dataIndex: 'materialCode' },
{ title: '物料名称', align: 'center', width: 160, dataIndex: 'materialName' },
{ title: '自动/人工称量', align: 'center', width: 132, dataIndex: 'pickerWeighMode' },
{ title: '种类', align: 'center', width: 100, dataIndex: 'pickerMaterialKind' },
{ title: '物料大类', align: 'center', width: 120, dataIndex: 'majorCategoryId_dictText' },
{ title: '物料小类', align: 'center', width: 120, dataIndex: 'minorCategoryId_dictText' },
{ title: '物料描述', align: 'center', width: 180, ellipsis: true, dataIndex: 'materialDesc' },
];
/** 配合示方称量方式 -> 混炼示方种类(与后端 resolveWeighModeMaterialKind 一致) */
export function resolveMixingMaterialKindFromWeighMode(weighMode?: string) {
if (weighMode == null || String(weighMode).trim() === '') {
return '';
}
const normalized = String(weighMode).trim();
const lower = normalized.toLowerCase();
if (lower.startsWith('auto') || normalized.includes('自动')) {
return '自动';
}
if (lower === 'manual' || normalized.includes('人工')) {
return '人工';
}
return '';
}
/** 选料确认时种类:称量方式优先,否则按小类胶料/小类名 */
export function resolveMixingMaterialKindForPicker(weighMode: string | undefined, isRubber?: unknown, minorName?: string) {
const fromWeighMode = resolveMixingMaterialKindFromWeighMode(weighMode);
if (fromWeighMode) {
return fromWeighMode;
}
return resolveMixingMaterialKindFromCategory(isRubber, minorName);
}
//update-end---author:cursor ---date:20260525 for【XSLMES-20260525-A50】选料弹窗自动/人工称量列与种类映射-----------
/** 选择密炼物料后回填混炼示方橡胶及配合剂明细行 */