diff --git a/src/views/business/components/billing-plan-editor.vue b/src/views/business/components/billing-plan-editor.vue
index 19f4b17..6f68b6a 100644
--- a/src/views/business/components/billing-plan-editor.vue
+++ b/src/views/business/components/billing-plan-editor.vue
@@ -12,6 +12,9 @@
{{
displayValue(draft.planName)
}}
+ {{
+ displayValue(draft.customerName || partyOptionLabel(draft.partyRowId))
+ }}
{{
transportModeLabel(draft.transportMode)
}}
@@ -37,6 +40,20 @@
:disabled="readonly" />
+ [] },
},
emits: ['update:modelValue', 'save'],
data() {
@@ -476,6 +494,7 @@ export default {
cargoRequest: null,
formRules: {
planName: [{ required: true, message: '请输入方案名称', trigger: 'blur' }],
+ partyRowId: [{ required: true, message: '请选择适用客商', trigger: 'change' }],
transportMode: [{ required: true, message: '请选择运输方式', trigger: 'change' }],
},
};
@@ -549,6 +568,10 @@ export default {
normalizePlan(value = {}) {
const plan = {
planName: '',
+ partyRowId: '',
+ partyRole: '',
+ customerId: '',
+ customerName: '',
transportMode: '',
transportModeLabel: '',
defaultPlan: false,
@@ -560,6 +583,21 @@ export default {
);
return plan;
},
+ partyOptionLabel(partyRowId) {
+ const matched = (this.partyOptions || []).find(
+ item => String(item.value) === String(partyRowId)
+ );
+ return matched?.label || '';
+ },
+ handlePartyChange(partyRowId) {
+ const matched = (this.partyOptions || []).find(
+ item => String(item.value) === String(partyRowId)
+ );
+ this.draft.partyRowId = matched?.partyRowId || matched?.value || '';
+ this.draft.partyRole = matched?.partyRole || '';
+ this.draft.customerId = matched?.customerId || '';
+ this.draft.customerName = matched?.customerName || '';
+ },
normalizeRule(rule = {}) {
const next = { ...defaultRule(), ...clone(rule) };
if (next.billingType === '阶梯单价' && next.minimumBillingWeight === '') {
@@ -1032,6 +1070,11 @@ export default {
this.$refs.formRef.validate(valid => {
if (!valid || !this.validateRules()) return;
const plan = clone(this.draft);
+ this.handlePartyChange(plan.partyRowId);
+ plan.partyRowId = this.draft.partyRowId;
+ plan.partyRole = this.draft.partyRole;
+ plan.customerId = this.draft.customerId;
+ plan.customerName = this.draft.customerName;
const transportMode = this.transportModeOptions.find(
item => String(item.value) === String(plan.transportMode)
);
diff --git a/src/views/business/components/master-order-dispatch.vue b/src/views/business/components/master-order-dispatch.vue
index 40dd8a3..b08c4bc 100644
--- a/src/views/business/components/master-order-dispatch.vue
+++ b/src/views/business/components/master-order-dispatch.vue
@@ -195,7 +195,7 @@
- handleCarrierContractChange(route, value)">
+ handleCarrierContractChange(route, value)">
- handleCarrierContractChange(route, value)">
+ handleCarrierContractChange(route, value)">
@@ -920,6 +920,8 @@ export default {
route.carrierName = '';
route.carrierId = '';
route.carrierContractId = '';
+ route.carrierPartyId = '';
+ route.carrierPartyRole = '';
this.clearRouteDriverVehicleFields(route);
if (value === '承运商') {
route.trailerVehicleNo = '';
@@ -930,15 +932,18 @@ export default {
if (value === '自运') this.applySelfOperatedCarrierDefaults(route);
});
},
- handleCarrierContractChange(route, contractId) {
+ handleCarrierContractChange(route, selectedValue) {
const contract = this.carrierOptions.find(
item =>
+ this.carrierOptionValue(item) === String(selectedValue || '') ||
[item.contractId, item.carrierName, item.id].some(
- value => String(value || '') === String(contractId || '')
+ value => String(value || '') === String(selectedValue || '')
)
);
route.carrierContractId = route.carrierType !== '自运' ? contract?.contractId || '' : '';
- route.carrierId = route.carrierType !== '自运' ? contract?.carrierId || '' : '';
+ route.carrierPartyId = route.carrierType !== '自运' ? contract?.carrierPartyId || '' : '';
+ route.carrierPartyRole = route.carrierType !== '自运' ? contract?.carrierPartyRole || '' : '';
+ route.carrierId = route.carrierType !== '自运' ? contract?.carrierId || contract?.customerId || '' : '';
route.carrierName = contract?.carrierName || '';
this.clearRouteDriverVehicleFields(route);
},
@@ -954,15 +959,23 @@ export default {
this.driverOptions = [];
},
carrierOptionValue(item = {}) {
- return item.contractId || item.id || item.value || item.carrierName || '';
+ return [item.contractId || item.id || '', item.carrierPartyId || '', item.carrierName || ''].join(
+ '__'
+ );
+ },
+ carrierSelectedValue(route = {}) {
+ return this.carrierOptionValue({
+ contractId: route.carrierContractId,
+ carrierPartyId: route.carrierPartyId,
+ carrierName: route.carrierName,
+ });
},
carrierOptionLabel(item) {
- const duplicateCount = this.carrierOptions.filter(option => option.carrierName === item.carrierName).length;
- if (duplicateCount <= 1) {
- return item.carrierName;
- }
+ const roleLabel = item.carrierPartyRole === 'C' ? '丙方' : item.carrierPartyRole === 'B' ? '乙方' : '';
+ const nameWithRole =
+ roleLabel && item.carrierName ? `${item.carrierName}(${roleLabel})` : item.carrierName;
const contractLabel = formatContractOptionLabel(item);
- return contractLabel ? `${item.carrierName}(${contractLabel})` : item.carrierName;
+ return contractLabel ? `${nameWithRole} - ${contractLabel}` : nameWithRole;
},
driverOptionLabel(item) { return item.driverName || item.name || ''; },
driverOptionKey(item) { return item.id || item.driverId || this.driverOptionLabel(item) || item.mobile; },
@@ -983,19 +996,22 @@ export default {
...item,
contractId: item.contractId || item.carrierContractId || item.id || '',
carrierName:
+ item.carrierName ||
item.partyB ||
item.partyBName ||
item.contractPartyB ||
item.customerContractPartyB ||
- item.carrierName ||
'',
carrierId:
+ item.customerId ||
item.partyBId ||
item.partyBUserId ||
item.contractPartyBId ||
item.customerContractPartyBId ||
item.carrierId ||
'',
+ carrierPartyId: item.carrierPartyId || '',
+ carrierPartyRole: item.carrierPartyRole || '',
}))
.filter(item => item.carrierName);
} finally {
@@ -1137,7 +1153,7 @@ export default {
id: `${route.segmentNo}-${item.cargoName}-${Date.now()}-${Math.random()}`,
batchNo,
segmentNo: route.segmentNo, relationNo: route.segmentNo, documentType: route.documentType, transportType: route.transportType, carrierType: route.carrierType,
- carrierContractId: route.carrierContractId, carrierName: route.carrierName, driverName: route.driverName, driverPhone: route.driverPhone, vehicleNo: route.vehicleNo, captainName: route.captainName, cabinNo: route.cabinNo, containerNo: route.containerNo, trailerVehicleNo: route.trailerVehicleNo, escortName: route.escortName, escortPhone: route.escortPhone, mileage: this.normalizeMileage(route.mileage), unitPrice: this.freightItemsForGoods(route, item).unitPrice || '', priceUnit: this.freightItemsForGoods(route, item).priceUnit || '', currency: route.currency || 'RMB', freightAmount: this.freightAmount(this.freightItemsForGoods(route, item)), freightTotal: this.freightTotal(route), otherFeeTotal: route.otherFeeTotal || '', freightJson: this.buildFreightJson(route), routeRemark: route.remark,
+ carrierContractId: route.carrierContractId, carrierPartyId: route.carrierPartyId, carrierPartyRole: route.carrierPartyRole, carrierName: route.carrierName, driverName: route.driverName, driverPhone: route.driverPhone, vehicleNo: route.vehicleNo, captainName: route.captainName, cabinNo: route.cabinNo, containerNo: route.containerNo, trailerVehicleNo: route.trailerVehicleNo, escortName: route.escortName, escortPhone: route.escortPhone, mileage: this.normalizeMileage(route.mileage), unitPrice: this.freightItemsForGoods(route, item).unitPrice || '', priceUnit: this.freightItemsForGoods(route, item).priceUnit || '', currency: route.currency || 'RMB', freightAmount: this.freightAmount(this.freightItemsForGoods(route, item)), freightTotal: this.freightTotal(route), otherFeeTotal: route.otherFeeTotal || '', freightJson: this.buildFreightJson(route), routeRemark: route.remark,
departureName: route.departureName, departureAddress: route.departureAddress, departureContact: route.departureContact, departurePhone: route.departurePhone,
arrivalName: route.arrivalName, arrivalAddress: route.arrivalAddress, arrivalContact: route.arrivalContact, arrivalPhone: route.arrivalPhone,
estimatedStartTime: route.estimatedStartTime, estimatedEndTime: route.estimatedEndTime,
diff --git a/src/views/business/components/waybill-manage-page.vue b/src/views/business/components/waybill-manage-page.vue
index 268d6cc..302b1d2 100644
--- a/src/views/business/components/waybill-manage-page.vue
+++ b/src/views/business/components/waybill-manage-page.vue
@@ -4650,9 +4650,14 @@ export default {
},
taskCarrierValue: {
get() {
- return this.form.carrierType === '自运'
- ? this.form.carrierName || ''
- : this.form.carrierContractId || this.form.carrierName || '';
+ if (this.form.carrierType === '自运') {
+ return this.form.carrierName || '';
+ }
+ return this.taskCarrierOptionValue({
+ carrierContractId: this.form.carrierContractId,
+ carrierPartyId: this.form.carrierPartyId,
+ carrierName: this.form.carrierName,
+ });
},
set(value) {
this.handleTaskCarrierChange(value);
@@ -7290,6 +7295,8 @@ export default {
this.form.carrierName = '';
this.form.carrierId = '';
this.form.carrierContractId = '';
+ this.form.carrierPartyId = '';
+ this.form.carrierPartyRole = '';
this.hasProjectProcessConfig = false;
this.waybillProcessConfigRows = [];
return;
@@ -7304,6 +7311,8 @@ export default {
this.form.carrierName = '';
this.form.carrierId = '';
this.form.carrierContractId = '';
+ this.form.carrierPartyId = '';
+ this.form.carrierPartyRole = '';
this.loadProjectProcessConfigState();
this.loadTaskCarrierOptions(project);
if (this.contractSelectEnabled) {
@@ -7760,6 +7769,8 @@ export default {
this.form.carrierName = '';
this.form.carrierId = '';
this.form.carrierContractId = '';
+ this.form.carrierPartyId = '';
+ this.form.carrierPartyRole = '';
this.form.driverId = '';
this.form.driverName = '';
this.form.driverPhone = '';
@@ -7814,7 +7825,9 @@ export default {
},
taskCarrierOptionValue(item = {}) {
if (this.form.carrierType !== '自运') {
- return item.carrierContractId || item.value || item.id || '';
+ if (item.value) return item.value;
+ return [item.carrierContractId || item.id || '', item.carrierPartyId || '', item.carrierName || '']
+ .join('__');
}
return (
item.carrierName ||
@@ -7852,55 +7865,76 @@ export default {
names.forEach(append);
return options;
},
+ parseContractPartyRows(partyJson, fallbackName = '', partyRole = 'B') {
+ const rows = this.parseJsonArray(partyJson)
+ .map(item => ({
+ id: item.id || '',
+ customerId: item.customerId || '',
+ customerName: String(item.customerName || '').trim(),
+ creditCode: item.creditCode || '',
+ partyRole,
+ }))
+ .filter(item => item.customerName);
+ if (rows.length) return rows;
+ return String(fallbackName || '')
+ .split(/[、,,]/)
+ .map(name => name.trim())
+ .filter(Boolean)
+ .map(name => ({
+ id: '',
+ customerId: '',
+ customerName: name,
+ creditCode: '',
+ partyRole,
+ }));
+ },
getWaybillCarrierContractOptions(contracts = []) {
- const carrierNameCounts = contracts.reduce((counts, contract) => {
- const carrierName = String(
- contract.partyB ||
- contract.partyBName ||
- contract.contractPartyB ||
- contract.customerContractPartyB ||
- contract.secondParty ||
- contract.secondPartyName ||
- ''
- ).trim();
- if (carrierName) counts[carrierName] = (counts[carrierName] || 0) + 1;
- return counts;
- }, {});
- return contracts
- .map(contract => {
- const carrierName = String(
+ const options = [];
+ contracts.forEach(contract => {
+ if (!contract?.id) return;
+ const parties = [
+ ...this.parseContractPartyRows(contract.partyBJson, contract.partyB, 'B'),
+ ...this.parseContractPartyRows(contract.partyCJson, contract.partyC, 'C'),
+ ];
+ if (!parties.length) {
+ const fallbackName = String(
contract.partyB ||
- contract.partyBName ||
- contract.contractPartyB ||
- contract.customerContractPartyB ||
- contract.secondParty ||
- contract.secondPartyName ||
- ''
+ contract.partyBName ||
+ contract.contractPartyB ||
+ contract.customerContractPartyB ||
+ contract.secondParty ||
+ contract.secondPartyName ||
+ ''
).trim();
- if (!carrierName || !contract.id) return null;
- const contractIdentifier = contract.contractName || contract.contractNo || contract.id;
- return {
+ if (fallbackName) {
+ parties.push({
+ id: '',
+ customerId: '',
+ customerName: fallbackName,
+ creditCode: '',
+ partyRole: 'B',
+ });
+ }
+ }
+ const contractIdentifier = contract.contractName || contract.contractNo || contract.id;
+ parties.forEach(party => {
+ const roleLabel = party.partyRole === 'C' ? '丙方' : '乙方';
+ const optionValue = [contract.id, party.id || '', party.customerName].join('__');
+ options.push({
id: contract.id,
- carrierId:
- contract.partyBId ||
- contract.partyBUserId ||
- contract.contractPartyBId ||
- contract.customerContractPartyBId ||
- contract.secondPartyId ||
- contract.secondPartyUserId ||
- contract.carrierId ||
- '',
- value: contract.id,
- label:
- carrierNameCounts[carrierName] > 1
- ? `${carrierName}(${contractIdentifier})`
- : carrierName,
- carrierName,
- fullName: carrierName,
+ carrierId: party.customerId || '',
+ value: optionValue,
+ label: `${party.customerName}(${roleLabel}) - ${contractIdentifier}`,
+ carrierName: party.customerName,
+ fullName: party.customerName,
carrierContractId: contract.id,
- };
- })
- .filter(Boolean);
+ carrierPartyId: party.id || '',
+ carrierPartyRole: party.partyRole,
+ creditCode: party.creditCode || '',
+ });
+ });
+ });
+ return options;
},
resetWaybillCarrierContractState() {
this.waybillCarrierContractRequestId += 1;
@@ -7930,6 +7964,8 @@ export default {
this.form.carrierName = '';
this.form.carrierId = '';
this.form.carrierContractId = '';
+ this.form.carrierPartyId = '';
+ this.form.carrierPartyRole = '';
}
return options;
})
@@ -8020,10 +8056,14 @@ export default {
);
if (this.form.carrierType !== '自运') {
this.form.carrierContractId = carrier?.carrierContractId || '';
+ this.form.carrierPartyId = carrier?.carrierPartyId || '';
+ this.form.carrierPartyRole = carrier?.carrierPartyRole || '';
this.form.carrierId = carrier?.carrierId || '';
this.form.carrierName = carrier?.carrierName || '';
} else {
this.form.carrierId = carrier?.carrierContractId ? '' : carrier?.id || '';
+ this.form.carrierPartyId = '';
+ this.form.carrierPartyRole = '';
this.form.carrierName = value || '';
}
// 承运商变更后清空司机/车辆,避免跨组织脏数据
diff --git a/src/views/business/loading-manage.vue b/src/views/business/loading-manage.vue
index 5be2599..745a370 100644
--- a/src/views/business/loading-manage.vue
+++ b/src/views/business/loading-manage.vue
@@ -1448,7 +1448,7 @@
@@ -1953,6 +1953,8 @@ const createDialogForm = () => ({
carrierType: '承运商',
carrierName: '',
carrierContractId: '',
+ carrierPartyId: '',
+ carrierPartyRole: '',
escortName: '',
escortPhone: '',
departureAddress: '',
@@ -2256,6 +2258,13 @@ export default {
if (!this.taskCarrierLoading && !this.taskCarrierOptions.length) return '暂无可用承运商合同';
return '请选择';
},
+ taskCarrierSelectedValue() {
+ return this.carrierOptionValue({
+ id: this.dialogForm.carrierContractId,
+ carrierPartyId: this.dialogForm.carrierPartyId,
+ carrierName: this.dialogForm.carrierName,
+ });
+ },
detailStatusType() {
const typeMap = {
pending: 'success',
@@ -2391,11 +2400,23 @@ export default {
driverOptionText,
formatTaskCarrierContractLabel(item = {}) {
const carrierName = item.carrierName || item.partyB || '';
+ const roleLabel =
+ item.carrierPartyRole === 'C' || item.carrierPartyRole === '丙'
+ ? '丙方'
+ : item.carrierPartyRole === 'B' || item.carrierPartyRole === '乙'
+ ? '乙方'
+ : '';
const contractLabel = formatContractOptionLabel(item);
- if (carrierName && contractLabel) {
- return `${carrierName}(${contractLabel})`;
+ const nameWithRole = roleLabel && carrierName ? `${carrierName}(${roleLabel})` : carrierName;
+ if (nameWithRole && contractLabel) {
+ return `${nameWithRole} - ${contractLabel}`;
}
- return carrierName || contractLabel;
+ return nameWithRole || contractLabel;
+ },
+ carrierOptionValue(item = {}) {
+ return [item.id || '', item.carrierPartyId || '', item.carrierName || item.partyB || ''].join(
+ '__'
+ );
},
syncStandaloneTagTitle() {
if (!this.isStandalonePage) return;
@@ -4555,6 +4576,8 @@ export default {
},
handleCarrierTypeChange() {
this.dialogForm.carrierContractId = '';
+ this.dialogForm.carrierPartyId = '';
+ this.dialogForm.carrierPartyRole = '';
this.dialogForm.carrierName = '';
this.dialogForm.carrierId = '';
this.clearDialogDriverVehicleFields();
@@ -4565,17 +4588,25 @@ export default {
}
if (this.dialogForm.carrierType === '自运') {
this.dialogForm.carrierContractId = '';
+ this.dialogForm.carrierPartyId = '';
+ this.dialogForm.carrierPartyRole = '';
}
this.loadTaskCarrierOptions();
},
- handleTaskCarrierChange(contractId) {
- const contract = this.taskCarrierOptions.find(item =>
- [item.id, item.carrierName, item.partyB].some(
- value => String(value || '') === String(contractId || '')
- )
+ handleTaskCarrierChange(selectedValue) {
+ const contract = this.taskCarrierOptions.find(
+ item =>
+ this.carrierOptionValue(item) === String(selectedValue || '') ||
+ [item.id, item.carrierName, item.partyB].some(
+ value => String(value || '') === String(selectedValue || '')
+ )
);
this.dialogForm.carrierContractId =
this.dialogForm.carrierType === '承运商' && contract?.id ? contract.id : '';
+ this.dialogForm.carrierPartyId =
+ this.dialogForm.carrierType === '承运商' ? contract?.carrierPartyId || '' : '';
+ this.dialogForm.carrierPartyRole =
+ this.dialogForm.carrierType === '承运商' ? contract?.carrierPartyRole || '' : '';
this.dialogForm.carrierName = contract?.carrierName || '';
this.dialogForm.carrierId = contract?.carrierId || contract?.customerId || '';
this.clearDialogDriverVehicleFields();
@@ -4758,30 +4789,45 @@ export default {
.map(item => ({
...item,
carrierName:
+ item.carrierName ||
item.partyB ||
item.partyBName ||
item.contractPartyB ||
item.customerContractPartyB ||
- item.carrierName ||
'',
carrierId:
+ item.customerId ||
item.partyBId ||
item.partyBUserId ||
item.contractPartyBId ||
item.customerContractPartyBId ||
item.carrierId ||
'',
+ carrierPartyId: item.carrierPartyId || '',
+ carrierPartyRole: item.carrierPartyRole || '',
}))
.filter(item => item.carrierName);
const current =
- contracts.find(item => String(item.id) === String(this.dialogForm.carrierContractId)) ||
+ this.taskCarrierOptions.find(
+ item =>
+ this.carrierOptionValue(item) === this.taskCarrierSelectedValue ||
+ (String(item.id) === String(this.dialogForm.carrierContractId) &&
+ (!this.dialogForm.carrierPartyId ||
+ String(item.carrierPartyId) === String(this.dialogForm.carrierPartyId)) &&
+ (!this.dialogForm.carrierName ||
+ item.carrierName === this.dialogForm.carrierName))
+ ) ||
this.taskCarrierOptions.find(item => item.carrierName === this.dialogForm.carrierName);
if (current) {
this.dialogForm.carrierContractId = current.id;
+ this.dialogForm.carrierPartyId = current.carrierPartyId || '';
+ this.dialogForm.carrierPartyRole = current.carrierPartyRole || '';
this.dialogForm.carrierName = current.carrierName;
this.dialogForm.carrierId = current.carrierId || '';
} else {
this.dialogForm.carrierContractId = '';
+ this.dialogForm.carrierPartyId = '';
+ this.dialogForm.carrierPartyRole = '';
this.dialogForm.carrierName = '';
this.dialogForm.carrierId = '';
}
@@ -4792,19 +4838,22 @@ export default {
.map(item => ({
...item,
carrierName:
+ item.carrierName ||
item.partyB ||
item.partyBName ||
item.contractPartyB ||
item.customerContractPartyB ||
- item.carrierName ||
'',
carrierId:
+ item.customerId ||
item.partyBId ||
item.partyBUserId ||
item.contractPartyBId ||
item.customerContractPartyBId ||
item.carrierId ||
'',
+ carrierPartyId: item.carrierPartyId || '',
+ carrierPartyRole: item.carrierPartyRole || '',
}))
.filter(item => item.carrierName);
const current = this.taskCarrierOptions.find(
diff --git a/src/views/settlement/components/settlement-import-page.vue b/src/views/settlement/components/settlement-import-page.vue
index 3d6152a..14d0f5e 100644
--- a/src/views/settlement/components/settlement-import-page.vue
+++ b/src/views/settlement/components/settlement-import-page.vue
@@ -89,26 +89,26 @@
-
+
@@ -403,6 +403,9 @@ const createDefaultForm = () => ({
customerName: '',
carrierContractId: '',
carrierContractName: '',
+ carrierOptionValue: '',
+ carrierPartyId: '',
+ carrierPartyRole: '',
carrierName: '',
waybillMode: 'new',
remark: '',
@@ -442,6 +445,62 @@ const filteredCustomerContracts = computed(() => customerContracts.value);
const filteredCarrierContracts = computed(() => carrierContracts.value);
+const parsePartyRows = (partyJson, fallbackName = '', partyRole = 'B') => {
+ let rows = [];
+ try {
+ const parsed = partyJson ? JSON.parse(partyJson) : [];
+ if (Array.isArray(parsed)) {
+ rows = parsed
+ .map(item => ({
+ id: item.id || '',
+ customerId: item.customerId || '',
+ customerName: String(item.customerName || '').trim(),
+ partyRole,
+ }))
+ .filter(item => item.customerName);
+ }
+ } catch (error) {
+ rows = [];
+ }
+ if (rows.length) return rows;
+ return String(fallbackName || '')
+ .split(/[、,,]/)
+ .map(name => name.trim())
+ .filter(Boolean)
+ .map(name => ({ id: '', customerId: '', customerName: name, partyRole }));
+};
+
+const filteredCarrierContractOptions = computed(() => {
+ const options = [];
+ filteredCarrierContracts.value.forEach(contract => {
+ const parties = [
+ ...parsePartyRows(contract.partyBJson, contract.partyB, 'B'),
+ ...parsePartyRows(contract.partyCJson, contract.partyC, 'C'),
+ ];
+ if (!parties.length && contract.carrierName) {
+ parties.push({
+ id: '',
+ customerId: '',
+ customerName: contract.carrierName,
+ partyRole: 'B',
+ });
+ }
+ parties.forEach(party => {
+ const roleLabel = party.partyRole === 'C' ? '丙方' : '乙方';
+ const optionValue = [contract.id, party.id || '', party.customerName].join('__');
+ options.push({
+ ...contract,
+ optionValue,
+ optionLabel: `${party.customerName}(${roleLabel}) - ${formatContractLabel(contract)}`,
+ carrierPartyId: party.id || '',
+ carrierPartyRole: party.partyRole,
+ carrierName: party.customerName,
+ });
+ });
+ });
+ return options;
+});
+
const extractRecords = response => {
const data = response?.data || response;
if (Array.isArray(data)) return data;
@@ -708,6 +767,10 @@ const normalizeContract = item => {
projectId: normalized.projectId,
partyA: normalized.partyA || '',
partyB: normalized.partyB || '',
+ partyC: normalized.partyC || '',
+ partyAJson: normalized.partyAJson || '',
+ partyBJson: normalized.partyBJson || '',
+ partyCJson: normalized.partyCJson || '',
customerName: normalized.customerName || normalized.partyA || '',
carrierName: normalized.carrierName || normalized.partyB || '',
};
@@ -972,10 +1035,9 @@ const autoSelectSingleContracts = () => {
form.customerContractId = customers[0].id;
onCustomerContractChange(customers[0].id);
}
- const carriers = filteredCarrierContracts.value;
+ const carriers = filteredCarrierContractOptions.value;
if (carriers.length === 1 && !form.carrierContractId) {
- form.carrierContractId = carriers[0].id;
- onCarrierContractChange(carriers[0].id);
+ onCarrierContractChange(carriers[0].optionValue);
}
};
@@ -987,6 +1049,9 @@ const onProjectChange = async id => {
form.customerName = '';
form.carrierContractId = '';
form.carrierContractName = '';
+ form.carrierOptionValue = '';
+ form.carrierPartyId = '';
+ form.carrierPartyRole = '';
form.carrierName = '';
customerContracts.value = [];
carrierContracts.value = [];
@@ -1005,9 +1070,15 @@ const onCustomerContractChange = id => {
form.customerName = item?.customerName || item?.partyA || '';
};
-const onCarrierContractChange = id => {
- const item = filteredCarrierContracts.value.find(row => String(row.id) === String(id));
+const onCarrierContractChange = optionValue => {
+ const item = filteredCarrierContractOptions.value.find(
+ row => String(row.optionValue) === String(optionValue)
+ );
+ form.carrierOptionValue = item?.optionValue || '';
+ form.carrierContractId = item?.id || '';
form.carrierContractName = item?.contractName || '';
+ form.carrierPartyId = item?.carrierPartyId || '';
+ form.carrierPartyRole = item?.carrierPartyRole || '';
form.carrierName = item?.carrierName || item?.partyB || '';
};
diff --git a/src/views/settlement/receivable-payable-detail.vue b/src/views/settlement/receivable-payable-detail.vue
index 3d15c6c..a837842 100644
--- a/src/views/settlement/receivable-payable-detail.vue
+++ b/src/views/settlement/receivable-payable-detail.vue
@@ -2904,10 +2904,33 @@ export default {
buildRequestParams(params = {}) {
return this.settlementType ? { ...params, settlementType: this.settlementType } : params;
},
- syncBillingPlanOptions(contractId) {
+ syncBillingPlanOptions(contractId, counterpartyName = '') {
const contracts = [...this.updateContractOptions, ...this.contractOptions];
const contract = contracts.find(item => String(item.id) === String(contractId));
- const plans = this.parseJson(contract?.billingPlanJson);
+ let plans = this.parseJson(contract?.billingPlanJson);
+ const targetName = String(
+ counterpartyName ||
+ this.updateFeeForm?.counterpartyName ||
+ this.generateQuery?.counterpartyName ||
+ this.currentDetail?.counterpartyName ||
+ this.currentDetail?.carrierName ||
+ this.currentDetail?.customerName ||
+ ''
+ ).trim();
+ if (targetName) {
+ const matched = plans.filter(
+ item =>
+ String(item.customerName || '').trim() === targetName ||
+ String(item.partyRowId || '') ===
+ String(this.updateFeeForm?.carrierPartyId || this.generateQuery?.carrierPartyId || '')
+ );
+ const hasBinding = plans.some(
+ item => item.customerName || item.customerId || item.partyRowId
+ );
+ if (matched.length || hasBinding) {
+ plans = matched;
+ }
+ }
this.billingPlanOptions = plans.map((item, index) => ({
id:
item.id ||
@@ -2916,11 +2939,16 @@ export default {
item.planName ||
item.billingPlanName ||
`plan-${index}`,
- name: item.name || item.planName || item.billingPlanName || `计费方案${index + 1}`,
+ name: [
+ item.name || item.planName || item.billingPlanName || `计费方案${index + 1}`,
+ item.customerName ? `(${item.customerName})` : '',
+ ].join(''),
defaultPlan:
item.defaultPlan === true ||
item.defaultPlan === 1 ||
['true', '1'].includes(String(item.defaultPlan).toLowerCase()),
+ customerName: item.customerName || '',
+ partyRowId: item.partyRowId || '',
}));
return this.billingPlanOptions;
},