1、新增结算模块

2、调整业务模块
3、调整客商模块
This commit is contained in:
2026-08-20 06:33:01 +08:00
parent 4199255186
commit fd5b1484e6
59 changed files with 11745 additions and 1104 deletions
+78 -6
View File
@@ -42,12 +42,18 @@ export const config = {
batchDelete: false,
enableContractForm: true,
enableProjectSelect: true,
projectQueryParams: {
approvalStatuses: 'approved,change_approved',
},
enableContractPeriod: true,
enableContractFileUpload: true,
enableCurrentUserHandler: true,
enableBillingPlan: true,
enableSettlementRule: true,
enableReconciliation: true,
enableReconciliation: false,
enableFeeGenerationMode: true,
enableSettlementConfigTabs: true,
enablePaymentRatio: true,
enableAttachmentTable: true,
enableChangeRecord: true,
enableOrganizationSelect: true,
@@ -57,6 +63,53 @@ export const config = {
statusProp: 'approvalStatus',
statusTextProp: 'approvalStatusName',
customMenuActions: true,
contractNameDetail: true,
detailSections: [
{
title: '基本信息',
fields: [
['contractNo', '合同编号'],
['contractName', '合同名称'],
['projectName', '所属项目'],
['organizationName', '所属组织'],
['contractCategory', '合同类别'],
['signType', '签约类型'],
['partyA', '甲方'],
['partyB', '乙方'],
['handlerUserName', '经办人'],
['signDate', '签订日期'],
['contractFormat', '合同格式'],
['legalSealFlag', '是否需要加盖法人章'],
['copyCount', '一式'],
['paymentDays', '回款账期'],
['remark', '备注', 2],
],
},
{
title: '合同期限',
fields: [
['startDate', '开始日期'],
['endDate', '结束日期'],
['temporaryStartDate', '临时效力起'],
['temporaryEndDate', '临时效力止'],
['effectiveType', '生效类型'],
['contractStage', '合同阶段'],
['approvalStatus', '审核状态'],
['currentNode', '当前节点'],
['currentProcessor', '当前处理人'],
],
},
{
title: '计费与结算',
fields: [
['feeGenerationMode', '费用生成模式'],
['billingPlanJson', '计费方案', 2],
['settlementMode', '结算类型'],
['settlementRuleJson', '结算规则', 2],
['paymentRatioJson', '付款比例设置', 2],
],
},
],
editLabelStatusMap: {
change_rejected: '编辑变更内容',
},
@@ -96,6 +149,22 @@ export const config = {
stage: ['temporary', 'formal'],
permission: 'contract_manage_reject',
},
{
action: 'approve',
label: '通过',
statusProp: 'approvalStatus',
status: ['change_reviewing'],
stage: ['formal'],
permission: 'contract_manage_approve',
},
{
action: 'reject',
label: '驳回',
statusProp: 'approvalStatus',
status: ['change_reviewing'],
stage: ['formal'],
permission: 'contract_manage_reject',
},
{
action: 'submitFormal',
label: '重新提交转正',
@@ -186,6 +255,7 @@ export const option = createCrudOption([
searchOrder: 7,
searchPlaceholder: '请输入',
order: 180,
slot: true,
minWidth: 180,
rules: textRule('合同名称', 100, true),
},
@@ -198,7 +268,8 @@ export const option = createCrudOption([
searchPlaceholder: '请选择',
formslot: true,
order: 140,
dicUrl: '/blade-transport/project-apply/list?current=1&size=9999',
dicUrl:
'/blade-transport/project-apply/list?current=1&size=9999&approvalStatuses=approved,change_approved',
dicFormatter: listDicFormatter,
props: {
label: 'projectName',
@@ -481,7 +552,7 @@ export const option = createCrudOption([
editDisplay: false,
},
{
label: '计费信息',
label: '费用生成模式',
prop: 'billingEnabled',
type: 'switch',
dicData: [
@@ -515,10 +586,11 @@ export const option = createCrudOption([
labelWidth: 0,
},
{
label: '附件',
label: '',
prop: 'contractFileJson',
formslot: true,
span: 24,
className: 'contract-file-form-item',
order: 20,
hide: true,
},
@@ -560,7 +632,7 @@ export const option = createCrudOption([
},
{
label: '',
prop: 'reconciliationTitle',
prop: 'paymentRatioTitle',
formslot: true,
span: 24,
order: -30,
@@ -569,7 +641,7 @@ export const option = createCrudOption([
},
{
label: '',
prop: 'reconciliationJson',
prop: 'paymentRatioJson',
formslot: true,
span: 24,
order: -40,
+78 -13
View File
@@ -63,15 +63,6 @@ const parseProcessNodes = value => {
return Array.isArray(value.nodes) ? value.nodes : [];
};
const requiresDriverAcceptConfirmation = processJson =>
parseProcessNodes(processJson).some(
node =>
(node.key === 'accept' || node.name === '接单') &&
node.enabled !== false &&
node.confirmMode === 'yes' &&
node.confirmDriver === true
);
const getProcessConfigNodes = row => {
const sources = [
row.processJson,
@@ -99,11 +90,79 @@ const getProcessConfigNodes = row => {
});
};
const hasAcceptProcessNode = row =>
const isAcceptProcessNode = node => node.key === 'accept' || node.name === '接单';
const requiresDriverAcceptConfirmation = row =>
getProcessConfigNodes(row).some(
node => node.enabled !== false && (node.key === 'accept' || node.name === '接单')
node =>
isAcceptProcessNode(node) &&
node.enabled !== false &&
node.confirmMode === 'yes' &&
node.confirmDriver === true
);
const isDriverRejectedStatus = value => {
if (value === null || value === undefined || typeof value === 'boolean') return false;
return [
'-1',
'2',
'reject',
'rejected',
'refuse',
'refused',
'decline',
'declined',
'deny',
'denied',
'拒绝',
'已拒绝',
'拒绝接单',
'已拒绝接单',
].includes(String(value).trim().toLowerCase());
};
const hasDriverRejectRecord = row => {
const rejectRecordValues = [
row.driverRejectTime,
row.driverRejectedTime,
row.driverRefuseTime,
row.acceptRejectTime,
row.driverRejectReason,
row.driverRefuseReason,
row.acceptRejectReason,
];
if (rejectRecordValues.some(value => !isEmpty(value))) return true;
const driverStatusProps = [
'driverAcceptStatus',
'driverAccepted',
'driverAccept',
'accepted',
'isAccepted',
'acceptStatus',
'driverResponseStatus',
'driverOrderStatus',
'driverAcceptResult',
'acceptResult',
];
if (driverStatusProps.some(prop => isDriverRejectedStatus(row[prop]))) return true;
const nodeStatusProps = [
...driverStatusProps,
'confirmStatus',
'executionStatus',
'nodeStatus',
'status',
'result',
];
return getProcessConfigNodes(row)
.filter(isAcceptProcessNode)
.some(node => nodeStatusProps.some(prop => isDriverRejectedStatus(node[prop])));
};
const isDriverRejectedWaybill = row =>
requiresDriverAcceptConfirmation(row) && hasDriverRejectRecord(row);
const hasDriverAcceptRecord = row => {
const recordValues = [
row.driverAcceptTime,
@@ -304,7 +363,7 @@ export const config = {
formatStatus(row, prop, defaultText) {
if (
prop === 'businessStatus' &&
hasAcceptProcessNode(row) &&
requiresDriverAcceptConfirmation(row) &&
isInProgressStatus(row, defaultText) &&
!hasDriverAcceptRecord(row)
) {
@@ -313,12 +372,18 @@ export const config = {
if (
prop === 'businessStatus' &&
row.businessStatus === 'pending' &&
!requiresDriverAcceptConfirmation(row.processJson)
!requiresDriverAcceptConfirmation(row)
) {
return '进行中';
}
return defaultText;
},
canReassign(row) {
return isDriverRejectedWaybill(row);
},
canEdit(row) {
return !isDriverRejectedWaybill(row);
},
deleteStatus: ['draft'],
editStatus: ['draft', 'pending'],
};