Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -1257,6 +1257,7 @@ export default {
|
||||
dialogReadonly: false,
|
||||
crudDialogType: '',
|
||||
standaloneFormKey: '',
|
||||
copyingRow: null,
|
||||
detailBox: false,
|
||||
detailLoading: false,
|
||||
detailRow: {},
|
||||
@@ -1427,7 +1428,7 @@ export default {
|
||||
String(item.value).toUpperCase() ===
|
||||
String(this.shippingTemplateFreight.currency || '').toUpperCase()
|
||||
);
|
||||
return this.currencyName(option?.label || this.shippingTemplateFreight.currency);
|
||||
return this.currencyUnit(option?.label || this.shippingTemplateFreight.currency);
|
||||
},
|
||||
roadFreightTotal() {
|
||||
const total = this.shippingTemplateFreight.freightItems.reduce(
|
||||
@@ -1498,7 +1499,8 @@ export default {
|
||||
if (
|
||||
this.isStandaloneFormPage &&
|
||||
(to.query.mode !== from?.query?.mode ||
|
||||
String(to.query.id || '') !== String(from?.query.id || ''))
|
||||
String(to.query.id || '') !== String(from?.query.id || '') ||
|
||||
to.query.copy !== from?.query?.copy)
|
||||
)
|
||||
this.$nextTick(() => this.initStandaloneFormPage());
|
||||
},
|
||||
@@ -1608,13 +1610,21 @@ export default {
|
||||
},
|
||||
openBusinessForm(mode, row = {}) {
|
||||
if (this.isStandaloneBusinessPage) {
|
||||
const query = {
|
||||
mode,
|
||||
...(mode === 'edit' && row.id ? { id: row.id } : {}),
|
||||
name: `${mode === 'edit' ? '编辑' : '新增'}${this.config.title}`,
|
||||
};
|
||||
// 如果是复制模式,添加标识
|
||||
console.log('openBusinessForm, mode:', mode, 'copyingRow:', this.copyingRow);
|
||||
if (mode === 'add' && this.copyingRow) {
|
||||
query.copy = Date.now().toString();
|
||||
console.log('添加 copy 参数:', query.copy);
|
||||
}
|
||||
console.log('最终的 query:', query);
|
||||
this.$router.push({
|
||||
path: '/business/shipping-template/form',
|
||||
query: {
|
||||
mode,
|
||||
...(mode === 'edit' && row.id ? { id: row.id } : {}),
|
||||
name: `${mode === 'edit' ? '编辑' : '新增'}${this.config.title}`,
|
||||
},
|
||||
query,
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -1624,10 +1634,29 @@ export default {
|
||||
if (!this.isStandaloneFormPage) return;
|
||||
const mode = this.$route.query.mode;
|
||||
const id = this.$route.query.id || '';
|
||||
const key = `${mode}:${id}`;
|
||||
const copy = this.$route.query.copy || '';
|
||||
const key = `${mode}:${id}:${copy}`;
|
||||
console.log('initStandaloneFormPage 被调用, key:', key, 'standaloneFormKey:', this.standaloneFormKey);
|
||||
if (this.standaloneFormKey === key) return;
|
||||
this.standaloneFormKey = key;
|
||||
|
||||
// 检查是否是复制模式
|
||||
if (mode === 'add' && copy) {
|
||||
const copyData = sessionStorage.getItem('shipping-template-copy-data');
|
||||
console.log('复制模式检测到,从 sessionStorage 读取数据:', copyData);
|
||||
if (copyData) {
|
||||
try {
|
||||
this.copyingRow = JSON.parse(copyData);
|
||||
console.log('解析后的 copyingRow:', this.copyingRow);
|
||||
sessionStorage.removeItem('shipping-template-copy-data');
|
||||
} catch (e) {
|
||||
console.error('解析复制数据失败', e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mode === 'edit') this.form = { id };
|
||||
console.log('调用 beforeOpen 前,copyingRow:', this.copyingRow);
|
||||
this.beforeOpen(() => {}, mode);
|
||||
},
|
||||
parseJsonArray(value) {
|
||||
@@ -1752,9 +1781,37 @@ export default {
|
||||
.catch(() => loading?.());
|
||||
},
|
||||
beforeOpen(done, type) {
|
||||
console.log('beforeOpen 被调用,type:', type, 'copyingRow:', this.copyingRow);
|
||||
this.crudDialogType = type;
|
||||
this.dialogReadonly = type === 'view';
|
||||
if (type === 'add') {
|
||||
// 检查是否是复制模式
|
||||
if (this.copyingRow) {
|
||||
console.log('进入复制模式分支');
|
||||
const copyData = { ...this.copyingRow };
|
||||
this.copyingRow = null;
|
||||
this.form = { ...(this.config.defaultForm || {}), ...copyData };
|
||||
console.log('合并后的 form:', this.form);
|
||||
// 删除模板编号,等待系统生成
|
||||
delete this.form.templateCode;
|
||||
this.applyFormDetail(this.form);
|
||||
console.log('applyFormDetail 调用完成');
|
||||
// 生成新的模板编号
|
||||
if (typeof this.api.nextCode === 'function') {
|
||||
this.api
|
||||
.nextCode()
|
||||
.then(res => {
|
||||
this.form.templateCode = res?.data?.data || '';
|
||||
console.log('生成的新模板编号:', this.form.templateCode);
|
||||
})
|
||||
.finally(() => done?.());
|
||||
} else {
|
||||
done?.();
|
||||
}
|
||||
return;
|
||||
}
|
||||
console.log('进入正常新增模式分支');
|
||||
// 正常新增模式
|
||||
this.form = { ...(this.config.defaultForm || {}) };
|
||||
this.selectedProjectId = '';
|
||||
this.contractOptions = [];
|
||||
@@ -1791,9 +1848,12 @@ export default {
|
||||
this.normalizeCargo(item)
|
||||
);
|
||||
if (!this.transportCargoRows.length) this.transportCargoRows = [defaultCargo()];
|
||||
this.restoreCargoTypePaths();
|
||||
// 编辑时先加载货物类型树,保证已有货物类型可以回显为级联路径。
|
||||
this.ensureCargoTypeOptions().catch(() => {});
|
||||
// 先加载货物类型树,保证已有货物类型可以回显为级联路径,然后再恢复路径。
|
||||
this.ensureCargoTypeOptions()
|
||||
.then(() => {
|
||||
this.restoreCargoTypePaths();
|
||||
})
|
||||
.catch(() => {});
|
||||
this.attachmentRows = this.parseJsonArray(this.form.attachmentsJson);
|
||||
this.shippingTemplateFreight = {
|
||||
...defaultFreight(),
|
||||
@@ -1937,11 +1997,42 @@ export default {
|
||||
});
|
||||
},
|
||||
handleCopy(row) {
|
||||
if (typeof this.api.copy !== 'function') return;
|
||||
this.api.copy(row.id).then(() => {
|
||||
this.$message.success('复制成功');
|
||||
this.onLoad(this.page, this.query);
|
||||
});
|
||||
this.api
|
||||
.getDetail(row.id)
|
||||
.then(res => {
|
||||
const detail = res?.data?.data || {};
|
||||
console.log('获取到的详情数据:', detail);
|
||||
// 删除不需要复制的字段
|
||||
delete detail.id;
|
||||
delete detail.templateCode; // 系统自动生成
|
||||
delete detail.createTime;
|
||||
delete detail.createUser;
|
||||
delete detail.createUserName;
|
||||
delete detail.createDept;
|
||||
delete detail.updateTime;
|
||||
delete detail.updateUser;
|
||||
delete detail.updateUserName;
|
||||
delete detail.status;
|
||||
|
||||
console.log('处理后的数据:', detail);
|
||||
console.log('isStandaloneBusinessPage:', this.isStandaloneBusinessPage);
|
||||
|
||||
// 存储到组件状态(用于判断是否是复制模式)
|
||||
this.copyingRow = detail;
|
||||
console.log('已存储到 copyingRow');
|
||||
|
||||
// 如果是独立表单页模式,同时存储到 sessionStorage
|
||||
if (this.isStandaloneBusinessPage) {
|
||||
sessionStorage.setItem('shipping-template-copy-data', JSON.stringify(detail));
|
||||
console.log('已存储到 sessionStorage');
|
||||
}
|
||||
|
||||
// 打开新增表单
|
||||
this.openBusinessForm('add', {});
|
||||
})
|
||||
.catch(() => {
|
||||
this.$message.error('获取数据失败');
|
||||
});
|
||||
},
|
||||
handleCustomOperation(operation, row) {
|
||||
if (operation.action === 'createFromTemplate') {
|
||||
@@ -2100,6 +2191,45 @@ export default {
|
||||
}[text.toUpperCase()] || text
|
||||
);
|
||||
},
|
||||
currencyUnit(value) {
|
||||
const text = String(value || '');
|
||||
// 如果格式是 "CNY - 人民币",提取货币代码部分
|
||||
let code = text;
|
||||
if (text.includes(' - ')) {
|
||||
code = text.split(' - ')[0].trim();
|
||||
}
|
||||
|
||||
const upperCode = code.toUpperCase();
|
||||
const unitMap = {
|
||||
CNY: '元',
|
||||
RMB: '元',
|
||||
USD: '美元',
|
||||
EUR: '欧元',
|
||||
JPY: '日元',
|
||||
GBP: '英镑',
|
||||
};
|
||||
|
||||
// 如果是已知的货币代码,返回对应的单位
|
||||
if (unitMap[upperCode]) {
|
||||
return unitMap[upperCode];
|
||||
}
|
||||
|
||||
// 如果是中文货币名称,转换为单位
|
||||
const nameMap = {
|
||||
'人民币': '元',
|
||||
'美元': '美元',
|
||||
'欧元': '欧元',
|
||||
'日元': '日元',
|
||||
'英镑': '英镑',
|
||||
};
|
||||
|
||||
if (nameMap[code]) {
|
||||
return nameMap[code];
|
||||
}
|
||||
|
||||
// 默认返回原值
|
||||
return text;
|
||||
},
|
||||
loadFeeUnitOptions() {
|
||||
getDictionary({ code: 'unit_fee' }).then(res => {
|
||||
this.feeUnitOptions = this.normalizeDictOptions(res?.data?.data || []);
|
||||
@@ -2644,7 +2774,20 @@ export default {
|
||||
const pathMatch = this.cargoTypeFlatOptions.find(item => item.path?.join('/') === pathKey);
|
||||
if (pathMatch) return pathMatch;
|
||||
}
|
||||
const codeCandidates = [row.secondCargoTypeCode, row.cargoTypeCode, row.firstCargoTypeCode]
|
||||
|
||||
// 优先通过二级类型编码查找(最准确)
|
||||
if (row.secondCargoTypeCode) {
|
||||
const secondMatch = this.cargoTypeFlatOptions.find(
|
||||
item => String(item.cargoCode || item.code || '').trim() === String(row.secondCargoTypeCode).trim()
|
||||
);
|
||||
if (secondMatch) {
|
||||
console.log('通过 secondCargoTypeCode 找到货物类型:', secondMatch);
|
||||
return secondMatch;
|
||||
}
|
||||
}
|
||||
|
||||
// 其他候选编码
|
||||
const codeCandidates = [row.cargoTypeCode, row.firstCargoTypeCode]
|
||||
.map(value => String(value || '').trim())
|
||||
.filter(Boolean);
|
||||
const nameCandidates = [
|
||||
@@ -2655,6 +2798,7 @@ export default {
|
||||
]
|
||||
.map(value => String(value || '').trim())
|
||||
.filter(Boolean);
|
||||
|
||||
return (
|
||||
this.cargoTypeFlatOptions.find(item =>
|
||||
codeCandidates.some(
|
||||
@@ -2671,13 +2815,19 @@ export default {
|
||||
return matched?.path ? this.cargoPath(matched.path) : [];
|
||||
},
|
||||
restoreCargoTypePaths() {
|
||||
console.log('restoreCargoTypePaths 被调用');
|
||||
console.log('transportCargoRows:', this.transportCargoRows);
|
||||
console.log('cargoTypeFlatOptions 长度:', this.cargoTypeFlatOptions.length);
|
||||
if (!this.transportCargoRows.length || !this.cargoTypeFlatOptions.length) return;
|
||||
this.transportCargoRows.forEach(row => {
|
||||
this.transportCargoRows.forEach((row, index) => {
|
||||
console.log(`处理第 ${index + 1} 行货物:`, row);
|
||||
const path = this.resolveCargoTypePath(row);
|
||||
console.log(`解析出的 path:`, path);
|
||||
if (!path.length) return;
|
||||
const item = this.cargoTypeFlatOptions.find(
|
||||
option => option.path?.join('/') === path.join('/')
|
||||
);
|
||||
console.log(`匹配到的 item:`, item);
|
||||
row.cargoTypePath = path;
|
||||
row.cargoType =
|
||||
item?.cargoName ||
|
||||
@@ -2691,12 +2841,22 @@ export default {
|
||||
row.secondCargoTypeCode ||
|
||||
row.firstCargoTypeCode ||
|
||||
'';
|
||||
console.log(`设置后的 row.cargoTypePath:`, row.cargoTypePath);
|
||||
});
|
||||
},
|
||||
normalizeCargo(row = {}) {
|
||||
const cargoTypePath = this.resolveCargoTypePath(row);
|
||||
console.log('normalizeCargo 输入:', row);
|
||||
// 如果原始数据中有完整的 cargoTypePath 数组,直接使用
|
||||
let cargoTypePath = [];
|
||||
if (Array.isArray(row.cargoTypePath) && row.cargoTypePath.length > 0) {
|
||||
cargoTypePath = this.cargoPath(row.cargoTypePath);
|
||||
console.log('使用原始的 cargoTypePath:', cargoTypePath);
|
||||
} else {
|
||||
cargoTypePath = this.resolveCargoTypePath(row);
|
||||
console.log('解析的 cargoTypePath:', cargoTypePath);
|
||||
}
|
||||
const cargoType = this.findCargoTypeOption({ ...row, cargoTypePath });
|
||||
return {
|
||||
const result = {
|
||||
...defaultCargo(),
|
||||
...row,
|
||||
cargoTypePath,
|
||||
@@ -2714,6 +2874,8 @@ export default {
|
||||
'',
|
||||
cargoName: row.cargoName || row.goodsName || '',
|
||||
};
|
||||
console.log('normalizeCargo 输出:', result);
|
||||
return result;
|
||||
},
|
||||
handleCargoTypeChange(row, value) {
|
||||
const path = this.cargoPath(value);
|
||||
@@ -2740,26 +2902,47 @@ export default {
|
||||
.catch(() => callback([]));
|
||||
},
|
||||
async selectCargoSuggestion(row, item = {}) {
|
||||
const cargoTypeOption = this.findCargoTypeOption(item);
|
||||
console.log('selectCargoSuggestion 被调用,item:', item);
|
||||
|
||||
const selectedCargo = {
|
||||
...row,
|
||||
...item,
|
||||
cargoName: item.cargoName || item.name || item.label || item.value || row.cargoName || '',
|
||||
};
|
||||
|
||||
// 确保货物类型树已加载
|
||||
try {
|
||||
await this.ensureCargoTypeOptions();
|
||||
console.log('货物类型树已加载,共', this.cargoTypeFlatOptions.length, '个选项');
|
||||
} catch (error) {
|
||||
console.warn('货物类型树加载失败', error);
|
||||
// 货物类型树加载失败时仍保留货物名称,提交时会给出货物类型必填提示。
|
||||
}
|
||||
// 货物名称返回了类型信息时,以货物自身的类型覆盖当前行原有类型。
|
||||
// 这样从一个类型切换到另一个类型时,级联选择器不会继续显示旧值。
|
||||
const matchedCargoType = this.findCargoTypeOption(item) || cargoTypeOption;
|
||||
|
||||
// 从常用货物返回的数据中查找货物类型
|
||||
const matchedCargoType = this.findCargoTypeOption(item);
|
||||
console.log('匹配到的货物类型:', matchedCargoType);
|
||||
|
||||
if (matchedCargoType?.path?.length) {
|
||||
selectedCargo.cargoTypePath = this.cargoPath(matchedCargoType.path);
|
||||
// 找到匹配的货物类型,回填到当前行
|
||||
const fullPath = matchedCargoType.path;
|
||||
selectedCargo.cargoTypePath = this.cargoPath(fullPath);
|
||||
selectedCargo.cargoType = matchedCargoType.cargoName || selectedCargo.cargoType;
|
||||
selectedCargo.cargoTypeCode =
|
||||
matchedCargoType.cargoCode || matchedCargoType.code || matchedCargoType.id || '';
|
||||
|
||||
console.log('货物名称选择后反选货物类型:', {
|
||||
cargoName: selectedCargo.cargoName,
|
||||
cargoType: selectedCargo.cargoType,
|
||||
cargoTypePath: selectedCargo.cargoTypePath,
|
||||
fullPath: fullPath,
|
||||
matchedCargoType: matchedCargoType,
|
||||
});
|
||||
} else {
|
||||
console.warn('未找到匹配的货物类型,item数据:', item);
|
||||
console.warn('当前 cargoTypeFlatOptions 前5项:', this.cargoTypeFlatOptions.slice(0, 5));
|
||||
}
|
||||
|
||||
Object.assign(row, this.normalizeCargo(selectedCargo));
|
||||
row.value = undefined;
|
||||
this.syncFreightItems();
|
||||
|
||||
@@ -316,6 +316,25 @@
|
||||
empty-text="暂无货物信息"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="70" align="center" fixed="left" />
|
||||
<el-table-column min-width="220" align="center">
|
||||
<template #header>
|
||||
<span class="transport-plan-page__required-column">货物类型</span>
|
||||
</template>
|
||||
<template #default="{ row }">
|
||||
<el-cascader
|
||||
v-model="row.cargoTypePath"
|
||||
:options="transportCargoTypeOptions"
|
||||
:props="transportCargoTypeCascaderProps"
|
||||
:placeholder="row.cargoType || '请选择'"
|
||||
clearable
|
||||
filterable
|
||||
:disabled="dialogReadonly"
|
||||
:filter-method="filterBillingCargoType"
|
||||
@visible-change="visible => visible && ensureBillingCargoTypeOptions()"
|
||||
@change="value => handleTransportCargoTypeChange(row, value)"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="货物名称" min-width="240" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-autocomplete
|
||||
@@ -334,31 +353,11 @@
|
||||
<template #default="{ item }">
|
||||
<div class="transport-plan-page__cargo-autocomplete-item">
|
||||
<span>{{ formatBillingCargoTypeLabel(item) }}</span>
|
||||
<small v-if="item.cargoCode">{{ item.cargoCode }}</small>
|
||||
</div>
|
||||
</template>
|
||||
</el-autocomplete>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column min-width="220" align="center">
|
||||
<template #header>
|
||||
<span class="transport-plan-page__required-column">货物类型</span>
|
||||
</template>
|
||||
<template #default="{ row }">
|
||||
<el-cascader
|
||||
v-model="row.cargoTypePath"
|
||||
:options="transportCargoTypeOptions"
|
||||
:props="transportCargoTypeCascaderProps"
|
||||
:placeholder="row.cargoType || '请选择'"
|
||||
clearable
|
||||
filterable
|
||||
:disabled="dialogReadonly"
|
||||
:filter-method="filterBillingCargoType"
|
||||
@visible-change="visible => visible && ensureBillingCargoTypeOptions()"
|
||||
@change="value => handleTransportCargoTypeChange(row, value)"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="数量" min-width="120" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-input
|
||||
@@ -1494,10 +1493,12 @@
|
||||
v-model="dispatchItemForm.departureName"
|
||||
:placeholder="dispatchStationNamePlaceholder"
|
||||
:suffix-icon="dispatchStationMode ? Search : undefined"
|
||||
disabled
|
||||
/>
|
||||
<el-input
|
||||
v-model="dispatchItemForm.departureAddress"
|
||||
:placeholder="dispatchAddressDetailPlaceholder"
|
||||
disabled
|
||||
>
|
||||
<template v-if="!dispatchStationMode" #suffix>
|
||||
<el-link
|
||||
@@ -1509,9 +1510,9 @@
|
||||
</template>
|
||||
</el-input>
|
||||
<span class="transport-plan-page__route-label">联系人</span>
|
||||
<el-input v-model="dispatchItemForm.departureContact" placeholder="请输入" />
|
||||
<el-input v-model="dispatchItemForm.departureContact" placeholder="请输入" disabled />
|
||||
<span class="transport-plan-page__route-label">联系方式</span>
|
||||
<el-input v-model="dispatchItemForm.departurePhone" placeholder="请输入" />
|
||||
<el-input v-model="dispatchItemForm.departurePhone" placeholder="请输入" disabled />
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="收货地址" required>
|
||||
@@ -1520,10 +1521,12 @@
|
||||
v-model="dispatchItemForm.arrivalName"
|
||||
:placeholder="dispatchStationNamePlaceholder"
|
||||
:suffix-icon="dispatchStationMode ? Search : undefined"
|
||||
disabled
|
||||
/>
|
||||
<el-input
|
||||
v-model="dispatchItemForm.arrivalAddress"
|
||||
:placeholder="dispatchAddressDetailPlaceholder"
|
||||
disabled
|
||||
>
|
||||
<template v-if="!dispatchStationMode" #suffix>
|
||||
<el-link
|
||||
@@ -1535,9 +1538,9 @@
|
||||
</template>
|
||||
</el-input>
|
||||
<span class="transport-plan-page__route-label">联系人</span>
|
||||
<el-input v-model="dispatchItemForm.arrivalContact" placeholder="请输入" />
|
||||
<el-input v-model="dispatchItemForm.arrivalContact" placeholder="请输入" disabled />
|
||||
<span class="transport-plan-page__route-label">联系方式</span>
|
||||
<el-input v-model="dispatchItemForm.arrivalPhone" placeholder="请输入" />
|
||||
<el-input v-model="dispatchItemForm.arrivalPhone" placeholder="请输入" disabled />
|
||||
</div>
|
||||
</el-form-item>
|
||||
</div>
|
||||
@@ -4849,10 +4852,7 @@ export default {
|
||||
fetchTaskCargoSuggestions(queryString, callback, path = []) {
|
||||
const keyword = String(queryString || '').trim();
|
||||
const normalizedPath = this.normalizeBillingCargoTypePath(path);
|
||||
if (!keyword && !normalizedPath.length) {
|
||||
callback([]);
|
||||
return;
|
||||
}
|
||||
// 移除空查询时返回空数组的限制,允许点击时显示货物列表
|
||||
let loadingKey = '';
|
||||
this.ensureBillingCargoTypeOptions()
|
||||
.then(() => {
|
||||
@@ -4884,11 +4884,42 @@ export default {
|
||||
if (loadingKey) this.setTaskCargoLoadingByKey(loadingKey, false);
|
||||
});
|
||||
},
|
||||
handleTaskCargoRowSelect(row, item = {}) {
|
||||
async handleTaskCargoRowSelect(row, item = {}) {
|
||||
const value = this.formatBillingCargoTypeLabel(item);
|
||||
row.cargoName = value;
|
||||
row.specification = item.specification || item.spec || row.specification || '';
|
||||
row.model = item.model || item.modelName || row.model || '';
|
||||
|
||||
// 确保货物类型树已加载
|
||||
try {
|
||||
await this.ensureBillingCargoTypeOptions();
|
||||
} catch (error) {
|
||||
console.warn('货物类型树加载失败', error);
|
||||
this.syncTransportCargoJson();
|
||||
return;
|
||||
}
|
||||
|
||||
// 从常用货物返回的数据中查找货物类型并反选
|
||||
const matchedCargoType = this.findBillingCargoTypeOption(item);
|
||||
|
||||
if (matchedCargoType?.path?.length) {
|
||||
// 找到匹配的货物类型,回填到当前行
|
||||
const fullPath = this.normalizeBillingCargoTypePath(matchedCargoType.path);
|
||||
row.cargoTypePath = fullPath;
|
||||
row.cargoType = matchedCargoType.cargoName || row.cargoType || '';
|
||||
row.cargoTypeCode =
|
||||
matchedCargoType.cargoCode || matchedCargoType.code || matchedCargoType.id || '';
|
||||
|
||||
console.log('货物名称选择后反选货物类型:', {
|
||||
cargoName: row.cargoName,
|
||||
cargoType: row.cargoType,
|
||||
cargoTypePath: row.cargoTypePath,
|
||||
matchedCargoType: matchedCargoType,
|
||||
});
|
||||
} else {
|
||||
console.warn('未找到匹配的货物类型,item数据:', item);
|
||||
}
|
||||
|
||||
this.syncTransportCargoJson();
|
||||
},
|
||||
loadTaskQuantityUnitOptions() {
|
||||
@@ -6179,6 +6210,49 @@ export default {
|
||||
null
|
||||
);
|
||||
},
|
||||
findBillingCargoTypeOption(row = {}) {
|
||||
const path = this.normalizeBillingCargoTypePath(row.cargoTypePath);
|
||||
if (path.length) {
|
||||
const pathKey = path.join('/');
|
||||
const pathMatch = this.billingCargoTypeFlatOptions.find(item => item.path?.join('/') === pathKey);
|
||||
if (pathMatch) return pathMatch;
|
||||
}
|
||||
|
||||
// 优先通过二级类型编码查找(最准确)
|
||||
if (row.secondCargoTypeCode) {
|
||||
const secondMatch = this.billingCargoTypeFlatOptions.find(
|
||||
item => String(item.cargoCode || item.code || '').trim() === String(row.secondCargoTypeCode).trim()
|
||||
);
|
||||
if (secondMatch) {
|
||||
console.log('通过 secondCargoTypeCode 找到货物类型:', secondMatch);
|
||||
return secondMatch;
|
||||
}
|
||||
}
|
||||
|
||||
// 其他候选编码
|
||||
const codeCandidates = [row.cargoTypeCode, row.firstCargoTypeCode]
|
||||
.map(value => String(value || '').trim())
|
||||
.filter(Boolean);
|
||||
const nameCandidates = [
|
||||
row.secondCargoTypeName,
|
||||
row.cargoType,
|
||||
row.goodsType,
|
||||
row.firstCargoTypeName,
|
||||
]
|
||||
.map(value => String(value || '').trim())
|
||||
.filter(Boolean);
|
||||
|
||||
return (
|
||||
this.billingCargoTypeFlatOptions.find(item =>
|
||||
codeCandidates.some(
|
||||
code => code === String(item.cargoCode || item.code || item.id || '').trim()
|
||||
)
|
||||
) ||
|
||||
this.billingCargoTypeFlatOptions.find(item =>
|
||||
nameCandidates.some(name => name === String(item.cargoName || '').trim())
|
||||
)
|
||||
);
|
||||
},
|
||||
resolveCommonCargoTypePath(row = {}) {
|
||||
const path = this.normalizeBillingCargoTypePath(row.cargoTypePath);
|
||||
if (path.length) return path;
|
||||
|
||||
Reference in New Issue
Block a user