diff --git a/src/api/settlement/formalSettlement.js b/src/api/settlement/formalSettlement.js index 92830f8..ea4cb14 100644 --- a/src/api/settlement/formalSettlement.js +++ b/src/api/settlement/formalSettlement.js @@ -31,8 +31,15 @@ export const approve = data => request({ url: `${baseUrl}/approve`, method: 'pos export const returnBill = data => request({ url: `${baseUrl}/return`, method: 'post', data }); export const voidBill = data => request({ url: `${baseUrl}/void`, method: 'post', data }); // 同步金蝶涉及多次金蝶远程接口调用(A102-4 预检 + A102-2 保存),可达 20s+,覆盖全局 10s 超时 -export const syncKingdee = id => - request({ url: `${baseUrl}/sync-kingdee`, method: 'post', timeout: 30000, params: { id } }); +// config.meta.suppressErrorMessage=true 时由页面弹框汇总结果,避免拦截器重复 toast +export const syncKingdee = (id, config = {}) => + request({ + url: `${baseUrl}/sync-kingdee`, + method: 'post', + timeout: 30000, + params: { id }, + ...config, + }); export const getDetailFees = detailId => request({ url: `${baseUrl}/detail-fees`, method: 'get', params: { detailId } }); export const getReceiptClaims = formalSettlementId => diff --git a/src/api/settlement/settlementAdjustment.js b/src/api/settlement/settlementAdjustment.js index d809bf6..4c7b460 100644 --- a/src/api/settlement/settlementAdjustment.js +++ b/src/api/settlement/settlementAdjustment.js @@ -17,6 +17,10 @@ export const approve = id => request({ url: `${baseUrl}/approve`, method: 'post' export const returnBill = (id, reason) => request({ url: `${baseUrl}/return`, method: 'post', data: { id, reason } }); export const repush = id => request({ url: `${baseUrl}/repush`, method: 'post', params: { id } }); +export const syncKingdee = id => + request({ url: `${baseUrl}/sync-kingdee`, method: 'post', timeout: 30000, params: { id } }); +export const kingdeeWriteOffPrecheck = formalSettlementId => + request({ url: `${baseUrl}/kingdee-writeoff-precheck`, method: 'get', params: { formalSettlementId } }); export const approvalStatusOptions = [ { label: '草稿', value: 'draft' }, diff --git a/src/api/settlement/settlementImport.js b/src/api/settlement/settlementImport.js index 131493b..e59c23f 100644 --- a/src/api/settlement/settlementImport.js +++ b/src/api/settlement/settlementImport.js @@ -53,3 +53,13 @@ export const confirm = data => request({ url: `${baseUrl}/confirm`, method: 'post', data, timeout: 120000 }); export const voidBatch = data => request({ url: `${baseUrl}/void`, method: 'post', data }); + +export const removeDraft = id => + request({ url: `${baseUrl}/remove`, method: 'post', params: { id } }); + +export const getHistoryWaybills = params => + request({ + url: `${baseUrl}/history-waybills`, + method: 'get', + params, + }); diff --git a/src/api/system/dept.js b/src/api/system/dept.js index 5a489e0..c7f22de 100644 --- a/src/api/system/dept.js +++ b/src/api/system/dept.js @@ -77,7 +77,8 @@ export const syncOaDepartment = ( size = 20, signal, incremental = false, - modifiedSince + modifiedSince, + companyOaId ) => { return request({ url: '/blade-system/dept/sync-oa-department', @@ -87,6 +88,7 @@ export const syncOaDepartment = ( size, incremental: !!incremental, modifiedSince: modifiedSince || undefined, + companyOaId: companyOaId || undefined, }, timeout: 60000, signal, diff --git a/src/axios.js b/src/axios.js index 1d23232..a3de4a3 100644 --- a/src/axios.js +++ b/src/axios.js @@ -74,12 +74,15 @@ const redirectToLogin = () => { * 统一弹出错误提示并返回带标记的 Error。 * `_notified` 标记用于让业务层(批量导入等)识别「拦截器已经提示过」, * 避免同一条错误被弹两次。 + * meta.suppressErrorMessage=true 时由业务层自行弹框汇总,拦截器不再 toast。 */ -const notifiedError = message => { - ElMessage({ - message: message, - type: 'error', - }); +const notifiedError = (message, config) => { + if (config?.meta?.suppressErrorMessage !== true) { + ElMessage({ + message: message, + type: 'error', + }); + } const error = new Error(message); error._notified = true; return error; @@ -260,12 +263,12 @@ axios.interceptors.response.use( // OAuth2 业务错误码提示 if (status > 2000 && !validatenull(res.data.error_description)) { - return Promise.reject(notifiedError(message)); + return Promise.reject(notifiedError(message, config)); } // 其余非 200 响应统一提示 if (status !== 200) { - return Promise.reject(notifiedError(message)); + return Promise.reject(notifiedError(message, config)); } return res; }, @@ -273,7 +276,11 @@ axios.interceptors.response.use( NProgress.done(); // 网络级失败(HTTP 状态 >500、网关错误、超时、断网等 validateStatus 放行之外的响应) // 原为静默 reject,接口报错页面无任何感知;统一补错误提示,取消请求与刷新令牌请求除外 - if (!axios.isCancel(error) && !isRefreshTokenRequest(error?.config)) { + if ( + !axios.isCancel(error) && + !isRefreshTokenRequest(error?.config) && + error?.config?.meta?.suppressErrorMessage !== true + ) { ElMessage({ message: error?.response?.data?.msg || '请求失败,请稍后重试', type: 'error', diff --git a/src/option/business/project-apply.js b/src/option/business/project-apply.js index 9a96ad6..502032e 100644 --- a/src/option/business/project-apply.js +++ b/src/option/business/project-apply.js @@ -97,7 +97,8 @@ export const config = { action: 'startChange', label: '变更', statusProp: 'approvalStatus', - status: ['approved'], + // 立项通过、变更通过后均可再次发起变更 + status: ['approved', 'change_approved'], permission: 'project_apply_change', }, ], diff --git a/src/option/payment/paymentApplication.js b/src/option/payment/paymentApplication.js index 9f3b688..65494a3 100644 --- a/src/option/payment/paymentApplication.js +++ b/src/option/payment/paymentApplication.js @@ -52,7 +52,8 @@ export const paymentApplicationOption = ({ searchShow: true, searchIcon: true, searchLabelWidth: 88, - searchMenuSpan: 24, + // 查询/重置紧跟首行 4 个条件(4×5 + 菜单 4 = 24),不再独占下一整行 + searchMenuSpan: 4, searchIndex: 4, searchMenuPosition: 'right', border: true, @@ -78,6 +79,7 @@ export const paymentApplicationOption = ({ prop: 'paymentNo', slot: true, search: true, + searchSpan: 5, searchOrder: 9, searchPlaceholder: '请输入', minWidth: 150, @@ -88,6 +90,7 @@ export const paymentApplicationOption = ({ type: 'daterange', searchType: 'daterange', search: true, + searchSpan: 5, searchOrder: 8, hide: true, showColumn: false, @@ -95,18 +98,24 @@ export const paymentApplicationOption = ({ editDisplay: false, viewDisplay: false, }, - searchOnlyColumn({ - label: '客户名称', - prop: 'payeeNameSearch', - searchOrder: 7, - searchProp: 'payeeName', - }), - searchOnlyColumn({ - label: '项目名称', - prop: 'projectNameSearch', - searchOrder: 6, - searchProp: 'projectName', - }), + { + ...searchOnlyColumn({ + label: '客户名称', + prop: 'payeeNameSearch', + searchOrder: 7, + searchProp: 'payeeName', + }), + searchSpan: 5, + }, + { + ...searchOnlyColumn({ + label: '项目名称', + prop: 'projectNameSearch', + searchOrder: 6, + searchProp: 'projectName', + }), + searchSpan: 5, + }, searchOnlyColumn({ label: '关联结算单', prop: 'settlementNo', diff --git a/src/option/settlement/formalSettlementSearch.js b/src/option/settlement/formalSettlementSearch.js index abe3520..cd4d811 100644 --- a/src/option/settlement/formalSettlementSearch.js +++ b/src/option/settlement/formalSettlementSearch.js @@ -36,7 +36,7 @@ export const kingdeeSyncStatusOptions = [ export const formalSettlementSearchFields = [ { label: '结算单号', prop: 'formalSettlementNo', type: 'input' }, - { label: '预结算单号', prop: 'preSettlementNo', type: 'input' }, + { label: '预付结算单号', prop: 'preSettlementNo', type: 'input' }, { label: '项目', prop: 'projectName', type: 'input' }, { label: '所属组织', prop: 'deptName', type: 'cascader' }, { label: '合同编号', prop: 'contractNo', type: 'input' }, diff --git a/src/option/settlement/formalSettlementTable.js b/src/option/settlement/formalSettlementTable.js index 390c4e1..92713ca 100644 --- a/src/option/settlement/formalSettlementTable.js +++ b/src/option/settlement/formalSettlementTable.js @@ -19,6 +19,8 @@ export const formalSettlementTableColumns = [ { label: '审核状态', prop: 'approvalStatusName', minWidth: 110, status: true }, { label: '当前节点', prop: 'currentNode', minWidth: 130 }, { label: '当前处理人', prop: 'currentProcessor', minWidth: 130 }, + { label: '调整标识', prop: 'adjustFlag', minWidth: 110 }, + { label: '来源原单号', prop: 'originFormalSettlementNo', minWidth: 170 }, { label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 }, { label: '金蝶单据状态', prop: 'kingdeeSyncStatus', minWidth: 135 }, { label: '金蝶锁状态', prop: 'kingdeeLockStatus', minWidth: 150 }, @@ -28,7 +30,7 @@ export const formalSettlementTableColumns = [ ]; export const sourceColumns = [ - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 160 }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 160 }, { label: '结算金额', prop: 'settlementAmount', minWidth: 130, money: true }, { label: '申请预付金额', prop: 'advanceAppliedAmount', minWidth: 140, money: true }, { label: '已付款金额', prop: 'advancePaidAmount', minWidth: 130, money: true }, @@ -48,6 +50,7 @@ export const detailColumns = [ { label: '运输总量', prop: 'transportQuantity', minWidth: 120 }, { label: '里程(KM)', prop: 'mileage', minWidth: 120 }, { label: '批次号', prop: 'batchNo', minWidth: 120 }, + { label: '计费方式', prop: 'billingType', minWidth: 130 }, { label: '运输单价', prop: 'unitPrice', minWidth: 120, money: true }, { label: '运费', prop: 'freightAmount', minWidth: 120, money: true }, { label: '调整金额', prop: 'adjustAmount', minWidth: 120, money: true }, @@ -66,7 +69,7 @@ export const summaryColumns = [ ]; export const candidateColumns = [ - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 170 }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 170 }, { label: '项目名称', prop: 'projectName', minWidth: 140 }, { label: '所属组织', prop: 'deptName', minWidth: 140 }, { label: '合同编号', prop: 'contractNo', minWidth: 150 }, @@ -86,7 +89,7 @@ export const candidateDetailColumns = [ { label: '合同编号', prop: 'contractNo', minWidth: 150 }, { label: '合同名称', prop: 'contractName', minWidth: 170 }, { label: '来源', prop: 'sourceType', minWidth: 110 }, - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 160 }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 160 }, { label: '正式结算单号', prop: 'formalSettlementNo', minWidth: 160 }, { label: '运单号', prop: 'waybillNo', minWidth: 150 }, { label: '车号', prop: 'vehicleNo', minWidth: 130 }, @@ -94,6 +97,7 @@ export const candidateDetailColumns = [ { label: '货物名称', prop: 'cargoName', minWidth: 140 }, { label: '货物类型', prop: 'cargoType', minWidth: 130 }, { label: '批次号', prop: 'batchNo', minWidth: 120 }, + { label: '计费方式', prop: 'billingType', minWidth: 130 }, { label: '应收应付合计', prop: 'totalAmount', minWidth: 140, money: true }, { label: '状态', prop: 'settlementStatusName', minWidth: 110 }, ]; diff --git a/src/option/settlement/preSettlementForm.js b/src/option/settlement/preSettlementForm.js index cace25d..ef70be7 100644 --- a/src/option/settlement/preSettlementForm.js +++ b/src/option/settlement/preSettlementForm.js @@ -4,7 +4,7 @@ export const settlementTypeOptions = [ ]; export const preSettlementFormFields = [ - { label: '预结算单号', prop: 'preSettlementNo', readonly: true }, + { label: '预付结算单号', prop: 'preSettlementNo', readonly: true }, { label: '合同名称', prop: 'contractId', type: 'contract', required: true }, { label: '合同编号', prop: 'contractNo', readonly: true }, { label: '项目名称', prop: 'projectName', readonly: true }, diff --git a/src/option/settlement/preSettlementSearch.js b/src/option/settlement/preSettlementSearch.js index 1165ae9..c270345 100644 --- a/src/option/settlement/preSettlementSearch.js +++ b/src/option/settlement/preSettlementSearch.js @@ -7,7 +7,7 @@ export const approvalStatusOptions = [ ]; export const preSettlementSearchFields = [ - { label: '预结算单号', prop: 'preSettlementNo', type: 'input' }, + { label: '预付结算单号', prop: 'preSettlementNo', type: 'input' }, { label: '预付单号', prop: 'advanceNo', type: 'input' }, { label: '项目名称', prop: 'projectName', type: 'input' }, { label: '所属组织', prop: 'deptName', type: 'cascader' }, diff --git a/src/option/settlement/preSettlementTable.js b/src/option/settlement/preSettlementTable.js index 01ab798..e3c6e55 100644 --- a/src/option/settlement/preSettlementTable.js +++ b/src/option/settlement/preSettlementTable.js @@ -1,5 +1,5 @@ export const preSettlementTableColumns = [ - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 150, link: true, fixed: 'left' }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 150, link: true, fixed: 'left' }, { label: '来源', prop: 'sourceType', minWidth: 100 }, { label: '付款方', prop: 'payerName', minWidth: 160 }, { label: '收款方', prop: 'payeeName', minWidth: 160 }, @@ -52,6 +52,7 @@ export const settlementDetailColumns = [ { label: '运输总量', prop: 'transportQuantityText', minWidth: 120 }, { label: '里程(KM)', prop: 'mileage', minWidth: 120 }, { label: '批次号', prop: 'batchNo', minWidth: 130 }, + { label: '计费方式', prop: 'billingType', minWidth: 130 }, { label: '运输单价', prop: 'unitPrice', minWidth: 120, money: true }, { label: '运费', prop: 'freightAmount', minWidth: 120, money: true }, { label: '原金额', prop: 'originalAmount', minWidth: 120, money: true }, @@ -94,5 +95,6 @@ export const candidateDetailColumns = [ { label: '货物名称', prop: 'cargoName', minWidth: 140 }, { label: '货物类型', prop: 'cargoType', minWidth: 130 }, { label: '批次号', prop: 'batchNo', minWidth: 120 }, + { label: '计费方式', prop: 'billingType', minWidth: 130 }, { label: '结算金额', prop: 'totalAmount', minWidth: 130, money: true }, ]; diff --git a/src/option/settlement/receivable-payable-detail.js b/src/option/settlement/receivable-payable-detail.js index 29123d0..bdf976d 100644 --- a/src/option/settlement/receivable-payable-detail.js +++ b/src/option/settlement/receivable-payable-detail.js @@ -20,7 +20,7 @@ export const searchFields = [ { label: '货物名称', prop: 'cargoName', type: 'input' }, { label: '合同编号', prop: 'contractNo', type: 'input' }, { label: '合同名称', prop: 'contractName', type: 'input' }, - { label: '预结算单号', prop: 'preSettlementNo', type: 'input' }, + { label: '预付结算单号', prop: 'preSettlementNo', type: 'input' }, { label: '正式结算单号', prop: 'formalSettlementNo', type: 'input' }, { label: '批次号', prop: 'batchNo', type: 'input' }, { label: '车号', prop: 'vehicleNo', type: 'input' }, @@ -35,7 +35,7 @@ export const tableColumns = [ { label: '合同编号', prop: 'contractNo', minWidth: 140 }, { label: '合同名称', prop: 'contractName', minWidth: 140 }, { label: '来源', prop: 'sourceType', minWidth: 110 }, - { label: '预结算单号', prop: 'preSettlementNo', minWidth: 140, link: true }, + { label: '预付结算单号', prop: 'preSettlementNo', minWidth: 140, link: true }, { label: '正式结算单号', prop: 'formalSettlementNo', minWidth: 140, link: true }, { label: '运单号', prop: 'waybillNo', minWidth: 140, link: true }, { label: '车号', prop: 'vehicleNo', minWidth: 120 }, diff --git a/src/option/settlement/settlementAdjustmentTable.js b/src/option/settlement/settlementAdjustmentTable.js index aaaa9fc..4919a1a 100644 --- a/src/option/settlement/settlementAdjustmentTable.js +++ b/src/option/settlement/settlementAdjustmentTable.js @@ -1,6 +1,6 @@ export const settlementAdjustmentTableColumns = [ { label: '单据号', prop: 'adjustmentNo', minWidth: 160, link: true, fixed: 'left' }, - { label: '结算单号', prop: 'formalSettlementNo', minWidth: 160 }, + { label: '结算单号', prop: 'formalSettlementNo', minWidth: 160, link: true }, { label: '结算单类型', prop: 'settlementTypeName', minWidth: 110 }, { label: '项目名称', prop: 'projectName', minWidth: 140 }, { label: '所属组织', prop: 'deptName', minWidth: 140 }, @@ -9,6 +9,8 @@ export const settlementAdjustmentTableColumns = [ { label: '合同名称', prop: 'contractName', minWidth: 170 }, { label: '调整金额', prop: 'adjustmentAmount', minWidth: 130, money: true }, { label: '审核状态', prop: 'approvalStatusName', minWidth: 110, status: true }, + { label: '金蝶单据状态', prop: 'kingdeeSyncStatus', minWidth: 130, kingdee: true }, + { label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 }, { label: '当前节点', prop: 'currentNode', minWidth: 120 }, { label: '当前处理人', prop: 'currentProcessor', minWidth: 130 }, { label: '创建人', prop: 'createUserName', minWidth: 110 }, diff --git a/src/option/settlement/transportReconciliationSearch.js b/src/option/settlement/transportReconciliationSearch.js index 0f1ca83..9852557 100644 --- a/src/option/settlement/transportReconciliationSearch.js +++ b/src/option/settlement/transportReconciliationSearch.js @@ -13,7 +13,7 @@ export const reconciliationStatusOptions = [ export const transportReconciliationSearchFields = [ { prop: 'reconciliationNo', label: '对账单号', type: 'input' }, - { prop: 'preSettlementNos', label: '预结算单号', type: 'input' }, + { prop: 'preSettlementNos', label: '预付结算单号', type: 'input' }, { prop: 'projectName', label: '项目', type: 'input' }, { prop: 'deptName', label: '所属组织', type: 'cascader' }, { prop: 'contractNo', label: '合同编号', type: 'input' }, diff --git a/src/option/system/user.js b/src/option/system/user.js index 93e3152..cd0a0ee 100644 --- a/src/option/system/user.js +++ b/src/option/system/user.js @@ -72,6 +72,7 @@ export const userOption = safe => { }, { label: '岗位', prop: 'postName', overHidden: true, display: false }, { label: '性别', prop: 'sexName', width: 80, display: false }, + { label: 'OA登录名', prop: 'oaLoginId', minWidth: 140, overHidden: true, display: false }, { label: 'OA人员id', prop: 'oaPersonId', minWidth: 120, overHidden: true, display: false }, { label: '备注', prop: 'remark', minWidth: 160, overHidden: true, display: false }, { diff --git a/src/router/page/index.js b/src/router/page/index.js index e2a8ab1..11c3a57 100644 --- a/src/router/page/index.js +++ b/src/router/page/index.js @@ -108,7 +108,7 @@ export default [ }, { path: '/settlement/pre-settlement/public-view', - name: '查看预结算信息', + name: '查看预付结算单信息', component: () => import('@/views/settlement/pre-settlement-public-view.vue'), meta: { keepAlive: false, @@ -119,7 +119,7 @@ export default [ }, { path: '/settlement/formal-settlement/public-view', - name: '查看正式结算信息', + name: '查看结算单信息', component: () => import('@/views/settlement/formal-settlement-public-view.vue'), meta: { keepAlive: false, diff --git a/src/router/views/index.js b/src/router/views/index.js index 546ffb2..6d11ebd 100644 --- a/src/router/views/index.js +++ b/src/router/views/index.js @@ -95,7 +95,7 @@ export default [ children: [ { path: '', - name: '新增编辑预结算', + name: '新增编辑预付结算单', meta: { keepAlive: false, activeMenu: '/settlement/pre-settlement', @@ -110,10 +110,11 @@ export default [ children: [ { path: '', - name: '新增编辑正式结算', + name: '新增编辑结算单', meta: { keepAlive: false, - activeMenu: '/settlement/formal-settlement', + // 付款/收款结算单共用表单页,具体高亮菜单由页面按 settlementType 回写 + activeMenu: '/settlement/payment-settlement', }, component: loadView(() => import('@/views/settlement/formal-settlement-form.vue')), }, diff --git a/src/utils/mk-approval.js b/src/utils/mk-approval.js index 83806da..9e224b2 100644 --- a/src/utils/mk-approval.js +++ b/src/utils/mk-approval.js @@ -23,7 +23,7 @@ export const MK_BIZ = { }, 'pre-settlement': { dictName: '提交预结算审核流', - subjectPrefix: '预结算审批', + subjectPrefix: '预付结算审批', rejected: ['returned'], approved: ['approved'], }, diff --git a/src/utils/settlement-adjust-rule.js b/src/utils/settlement-adjust-rule.js new file mode 100644 index 0000000..066cda3 --- /dev/null +++ b/src/utils/settlement-adjust-rule.js @@ -0,0 +1,30 @@ +export function isFreightFeeName(name) { + const text = String(name || ''); + return text.includes('运费') || text.includes('运输费'); +} + +/** 运输单价对应的运费计费类型。 */ +export function freightBillingType(row = {}) { + const rule = row.billingRule || {}; + const rules = Array.isArray(rule.rules) ? rule.rules : []; + const freightRule = rules.find( + item => isFreightFeeName(item?.feeItem) || isFreightFeeName(item?.feeType) + ); + return freightRule?.billingType || row.billingType || rule.billingType || ''; +} + +export function isTierUnitPrice(row) { + return freightBillingType(row) === '阶梯单价'; +} + +export function isIntervalBilling(row) { + const type = freightBillingType(row); + return type === '区间单价' || (type.includes('区间') && type.includes('一口价')); +} + +/** 阶梯单价、区间单价、区间一口价的运输单价不开放手工调整。 */ +export function isUnitPriceAdjustable(row) { + const type = freightBillingType(row); + if (!type) return true; + return !isTierUnitPrice(row) && !isIntervalBilling(row); +} diff --git a/src/utils/settlement-menu.js b/src/utils/settlement-menu.js new file mode 100644 index 0000000..86413c0 --- /dev/null +++ b/src/utils/settlement-menu.js @@ -0,0 +1,39 @@ +/** 结算菜单拆分后的展示名与权限前缀 */ + +export const SETTLEMENT_TYPE_PAYABLE = 'payable'; +export const SETTLEMENT_TYPE_RECEIVABLE = 'receivable'; + +export function settlementBillLabel(settlementType) { + return settlementType === SETTLEMENT_TYPE_RECEIVABLE ? '收款结算单' : '付款结算单'; +} + +export function settlementPermissionPrefix(settlementType) { + return settlementType === SETTLEMENT_TYPE_RECEIVABLE + ? 'receipt_settlement' + : 'payment_settlement'; +} + +export function settlementListPath(settlementType) { + return settlementType === SETTLEMENT_TYPE_RECEIVABLE + ? '/settlement/receipt-settlement' + : '/settlement/payment-settlement'; +} + +/** + * 权限判断:优先新菜单码,兼容旧 formal_settlement_*。 + * @param {Object} ctx 组件实例(需含 permission、isAdmin、validData) + * @param {string} settlementType payable|receivable + * @param {string} action add|edit|view... + */ +export function hasSettlementPermission(ctx, settlementType, action) { + if (ctx?.isAdmin) return true; + const prefix = settlementPermissionPrefix(settlementType); + const codes = [`${prefix}_${action}`, `formal_settlement_${action}`]; + return codes.some(code => { + const value = ctx?.permission?.[code]; + if (typeof ctx?.validData === 'function') { + return ctx.validData(value, false); + } + return value === true; + }); +} diff --git a/src/utils/settlementStatus.js b/src/utils/settlementStatus.js new file mode 100644 index 0000000..4fdf2ec --- /dev/null +++ b/src/utils/settlementStatus.js @@ -0,0 +1,23 @@ +/** + * 结算单预付记录单据状态名(预结算编辑器与正式结算编辑器共用,避免两页状态名不一致) + */ +export function settlementStatusName(status, displayValue) { + const labels = { + reviewing: '审批中', + approved: '审批通过', + paid: '已付款', + returned: '已驳回', + voided: '已作废', + draft: '草稿', + }; + const name = labels[status]; + if (name) return name; + return typeof displayValue === 'function' ? displayValue(status) : status || '-'; +} + +/** + * 统一预付付款记录类型名 + */ +export function settlementRecordTypeName(recordType) { + return { progress_advance: '进度预付', project_advance: '项目预付核销' }[recordType] || ''; +} diff --git a/src/views/business/components/shipping-template-page.vue b/src/views/business/components/shipping-template-page.vue index 21f0015..5b4df82 100644 --- a/src/views/business/components/shipping-template-page.vue +++ b/src/views/business/components/shipping-template-page.vue @@ -388,7 +388,7 @@ :disabled="dialogReadonly" @visible-change="visible => visible && loadFeeUnitOptions()" > sum + Number(this.freightAmount(item) || 0), @@ -1530,6 +1552,18 @@ export default { }, watch: { $route(to, from) { + // 列表实例:从其他页进入列表时刷新(activated 负责标签切回)。 + if (!this.isFormPageInstance) { + const enteringList = + (to.path === this.routePathLocked || to.path === shippingTemplateListRoute) && + from?.path && + from.path !== to.path; + if (enteringList) { + sessionStorage.removeItem(shippingTemplateListRefreshKey); + this.$nextTick(() => this.onLoad(this.page, this.query)); + } + return; + } if ( this.isStandaloneFormPage && (to.query.mode !== from?.query?.mode || @@ -1550,6 +1584,10 @@ export default { this.handleTransportTypeChange(value); this.syncFreightItems(); }, + 'form.templateType'() { + // 切换到运单模板时立即按货物数量单位生成公路运费明细。 + this.$nextTick(() => this.syncFreightItems()); + }, }, created() { this.loadProjectOptions(); @@ -1559,8 +1597,16 @@ export default { this.loadCurrencyOptions(); if (this.isStandaloneFormPage) this.$nextTick(() => this.initStandaloneFormPage()); }, + activated() { + if (this.isFormPageInstance) return; + sessionStorage.removeItem(shippingTemplateListRefreshKey); + this.$nextTick(() => this.onLoad(this.page, this.query)); + }, methods: { formatContractOptionLabel, + markShippingTemplateListNeedRefresh() { + sessionStorage.setItem(shippingTemplateListRefreshKey, '1'); + }, loadQuantityUnitOptions() { if (this.quantityUnitLoading) return this.quantityUnitLoadPromise; this.quantityUnitLoading = true; @@ -1591,12 +1637,8 @@ export default { }); } if (this.menuWidth != null) next.menuWidth = this.menuWidth; - if ( - this.standaloneFormPage && - ['/business/shipping-template', '/business/shipping-template/form'].includes( - this.$route.path - ) - ) { + // 仅表单页实例套用全屏表单弹窗样式,避免列表页误用后表格区域异常。 + if (this.standaloneFormPage && this.$route.path === shippingTemplateFormRoute) { next.dialogAppendToBody = false; next.dialogModal = false; next.dialogCustomClass = 'shipping-template-form-page-dialog'; @@ -1776,13 +1818,22 @@ export default { this.onLoad(this.page, this.query); }, onLoad(page, params = {}) { + if (this.isFormPageInstance) return; this.loading = true; + const currentPage = page?.currentPage || this.page.currentPage || 1; + const pageSize = page?.pageSize || this.page.pageSize || 10; this.api - .getList(page.currentPage, page.pageSize, { ...this.query, ...params }) + .getList(currentPage, pageSize, { ...this.query, ...params }) .then(res => { - const data = res?.data?.data || {}; - this.data = extractRecords(res); - this.page.total = data.total || this.data.length; + const data = res?.data?.data || res?.data || {}; + const records = extractRecords(res); + this.data = records; + this.page.total = Number(data.total ?? records.length) || 0; + }) + .catch(error => { + window.console.error(error); + this.data = []; + this.page.total = 0; }) .finally(() => { this.loading = false; @@ -1821,9 +1872,10 @@ export default { .submit(submit) .then(() => { this.$message.success('操作成功'); + this.markShippingTemplateListNeedRefresh(); done?.(); this.closeCrudDialog(); - this.onLoad(this.page, this.query); + if (!this.isFormPageInstance) this.onLoad(this.page, this.query); }) .catch(() => loading?.()); }, @@ -1837,9 +1889,10 @@ export default { .submit(submit) .then(() => { this.$message.success('操作成功'); + this.markShippingTemplateListNeedRefresh(); done?.(); this.closeCrudDialog(); - this.onLoad(this.page, this.query); + if (!this.isFormPageInstance) this.onLoad(this.page, this.query); }) .catch(() => loading?.()); }, @@ -1883,6 +1936,8 @@ export default { this.attachmentRows = []; this.shippingTemplateFreight = defaultFreight(); this.loadCurrencyOptions(); + this.loadFeeUnitOptions(); + this.$nextTick(() => this.syncFreightItems()); if (typeof this.api.nextCode === 'function') this.api .nextCode() @@ -2005,20 +2060,47 @@ export default { return false; } if (this.transportMode === 'road') { - const invalid = this.shippingTemplateFreight.freightItems.findIndex( - item => - Number(item.unitPrice || 0) < 0 || - !item.priceUnit || - (!this.isFreightAutoCalculable(item) && - (item.freightAmount === '' || - item.freightAmount === null || - item.freightAmount === undefined)) || - Number(item.freightAmount || 0) < 0 - ); - if (invalid > -1) { - this.$message.warning(`第${invalid + 1}条货物的单价、计价单位或运费无效`); + if (!this.shippingTemplateFreight.freightItems.length) { + this.$message.warning('请先完善货物数量单位,以便生成运费明细'); return false; } + for (const [index, item] of this.shippingTemplateFreight.freightItems.entries()) { + const label = `第${index + 1}条运费明细`; + if ( + item.unitPrice === '' || + item.unitPrice === null || + item.unitPrice === undefined + ) { + this.$message.warning(`请填写${label}的单价`); + return false; + } + if (Number(item.unitPrice) < 0) { + this.$message.warning(`${label}的单价不能小于0`); + return false; + } + if (!String(item.priceUnit || '').trim()) { + this.$message.warning(`请选择${label}的计价单位`); + return false; + } + if (this.isFreightAutoCalculable(item)) { + if (!item.freightAmountManual) { + item.freightAmount = this.freightAmount(item); + } + } else if ( + item.freightAmount === '' || + item.freightAmount === null || + item.freightAmount === undefined + ) { + this.$message.warning( + `${label}的计价单位与货物数量单位不匹配,无法自动计算运费,请手动填写运费` + ); + return false; + } + if (Number(item.freightAmount || 0) < 0) { + this.$message.warning(`${label}的运费不能小于0`); + return false; + } + } } else if (Number(this.shippingTemplateFreight.freightAmount || 0) < 0) { this.$message.warning('运费不能小于0'); return false; @@ -2033,8 +2115,11 @@ export default { return true; }, closeCrudDialog() { - if (this.isStandaloneBusinessPage) { - this.$router.push({ path: '/business/shipping-template', query: {} }); + if (this.isStandaloneBusinessPage || this.isFormPageInstance) { + // 关闭独立表单页时标记列表需刷新(含直接点关闭未保存的场景) + this.markShippingTemplateListNeedRefresh(); + this.$router.$avueRouter?.closeTag?.(); + this.$router.push({ path: shippingTemplateListRoute, query: {} }); return; } this.$refs.crud?.closeDialog?.(); @@ -2294,7 +2379,16 @@ export default { }, loadFeeUnitOptions() { getDictionary({ code: 'unit_fee' }).then(res => { - this.feeUnitOptions = this.normalizeDictOptions(res?.data?.data || []); + // 计价单位必须保存可读文案(如 元/吨),才能与货物数量单位匹配并自动计算运费。 + this.feeUnitOptions = (res?.data?.data || []).map(item => { + const label = String(item.dictValue || item.label || item.value || '').trim(); + const key = String(item.dictKey || item.value || '').trim(); + return { + label: label || key, + value: label.includes('/') ? label : key || label, + remark: item.remark || '', + }; + }); }); }, loadCurrencyOptions() { @@ -3098,24 +3192,53 @@ export default { : []; const quantityUnits = []; this.transportCargoRows.forEach(row => { - const quantityUnit = row.quantityUnit || ''; + const quantityUnit = String(row.quantityUnit || '').trim(); + if (!quantityUnit) return; if (!quantityUnits.some(unit => unit === quantityUnit)) quantityUnits.push(quantityUnit); }); + const currency = this.shippingTemplateFreight.currency || 'RMB'; this.shippingTemplateFreight.freightItems = quantityUnits.map((quantityUnit, index) => { const matched = previousItems.find(item => String(item.quantityUnit || '') === String(quantityUnit)) || previousItems[index] || {}; + const defaultPriceUnit = resolvePriceUnitByQuantityUnit(quantityUnit, currency); + const priceUnit = this.normalizeFreightPriceUnit( + matched.priceUnit || defaultPriceUnit || '', + quantityUnit, + currency + ); return { quantityUnit, unitPrice: matched.unitPrice || '', - priceUnit: matched.priceUnit || '', + priceUnit, freightAmount: matched.freightAmount ?? '', freightAmountManual: matched.freightAmountManual === true || matched.manualFreightAmount === true, }; }); }, + normalizeFreightPriceUnit(priceUnit, quantityUnit, currency = 'RMB') { + const text = this.resolvePriceUnitText(priceUnit); + if (text && this.priceUnitMatchesQuantity(text, quantityUnit)) return text; + return ( + resolvePriceUnitByQuantityUnit(quantityUnit, currency) || + text || + String(priceUnit || '').trim() + ); + }, + resolvePriceUnitText(priceUnit) { + const raw = String(priceUnit || '').trim(); + if (!raw) return ''; + if (raw.includes('/')) return raw; + const options = this.feeUnitSelectOptions.length + ? this.feeUnitSelectOptions + : this.feeUnitOptions; + const matched = options.find( + item => String(item.value) === raw || String(item.label) === raw + ); + return matched?.label || raw; + }, quantityUnits() { return [ ...new Set( @@ -3131,7 +3254,7 @@ export default { .replace(/\s+/g, '') .replace(/立方米|立方公尺|方/g, '立方'); const unit = normalizeUnit(quantityUnit).replace(/[·*.]/g, ''); - const value = String(priceUnit || '') + const value = String(this.resolvePriceUnitText(priceUnit) || '') .trim() .toLowerCase() .replace(/\s+/g, ''); @@ -3163,6 +3286,10 @@ export default { return this.formatFreightNumber(item.freightAmount); } if (!this.isFreightAutoCalculable(item)) { + // 无法自动计算且未手工填写时返回空,避免把空值显示成 0 造成“已填写”的错觉。 + if (item.freightAmount === '' || item.freightAmount === null || item.freightAmount === undefined) { + return ''; + } return this.formatFreightNumber(item.freightAmount); } return this.formatFreightNumber( diff --git a/src/views/business/components/transport-plan-page.vue b/src/views/business/components/transport-plan-page.vue index 4d12b86..e4af27c 100644 --- a/src/views/business/components/transport-plan-page.vue +++ b/src/views/business/components/transport-plan-page.vue @@ -2807,8 +2807,11 @@ import 'nprogress/nprogress.css'; const AMAP_KEY = '653b7cf105ad7fb8ec9b2f5198ade315'; const AMAP_SECURITY_CODE = '5aab65c632e48ebae0d0e28f5b28e21a'; let amapLoader; +const transportPlanListRoute = '/business/transport-plan'; +const transportPlanFormRoute = '/business/transport-plan/form'; +const transportPlanListRefreshKey = 'transport-plan-list-refresh'; const standaloneTransportPlanFormRoutes = { - '/business/transport-plan': '/business/transport-plan/form', + [transportPlanListRoute]: transportPlanFormRoute, }; const standaloneTransportPlanFormPaths = [ ...Object.keys(standaloneTransportPlanFormRoutes), @@ -3072,6 +3075,10 @@ export default { // 必须放 data:Options API 的顺序是 data → computed → watch(immediate) → created, // 放 created 的话首个 immediate watcher 会读到空值,把首次加载也挡掉。 routePathLocked: this.$route.path, + // 表单页实例在创建时锁定,避免 keep-alive 列表实例随全局 $route 误切到表单态。 + isFormPageInstance: Object.values(standaloneTransportPlanFormRoutes).includes( + this.$route.path + ), form: {}, suppressTransportTypeClear: false, query: {}, @@ -3112,10 +3119,11 @@ export default { option: (() => { const opt = this.cloneOption(this.crudOption, estimateMenuButtonCount(this.config)); if (this.menuWidth != null) opt.menuWidth = this.menuWidth; - if ( - this.standaloneFormPage && - standaloneTransportPlanFormPaths.includes(this.$route.path) - ) { + // 仅表单页实例套用全屏表单弹窗样式,避免列表页误用后表格区域异常。 + const isFormInstance = Object.values(standaloneTransportPlanFormRoutes).includes( + this.$route.path + ); + if (this.standaloneFormPage && isFormInstance) { opt.dialogAppendToBody = false; opt.dialogModal = false; opt.dialogCustomClass = 'transport-plan-form-page-dialog'; @@ -3289,6 +3297,12 @@ export default { } this.loadTaskQuantityUnitOptions(); }, + // keep-alive 重新激活列表时强制刷新,避免缓存脏数据;标记位用于兼容旧跳转逻辑。 + activated() { + if (this.isFormPageInstance) return; + sessionStorage.removeItem(transportPlanListRefreshKey); + this.$nextTick(() => this.onLoad(this.page, this.query)); + }, computed: { ...mapGetters(['permission', 'userInfo']), permissionList() { @@ -3300,10 +3314,20 @@ export default { return this.config.detailSections || []; }, isStandaloneBusinessPage() { - return this.standaloneFormPage && standaloneTransportPlanFormPaths.includes(this.$route.path); + return ( + this.standaloneFormPage && + (this.isFormPageInstance || + standaloneTransportPlanFormPaths.includes(this.routePathLocked) || + standaloneTransportPlanFormPaths.includes(this.$route.path)) + ); }, isStandaloneFormPage() { - return this.isStandaloneBusinessPage && ['add', 'edit'].includes(this.$route.query.mode); + // 用实例锁定标志,避免列表 keep-alive 实例被全局路由误判成表单页。 + return ( + this.standaloneFormPage && + this.isFormPageInstance && + ['add', 'edit'].includes(this.$route.query.mode) + ); }, formPageTitle() { if (this.isStandaloneFormPage) { @@ -3752,6 +3776,18 @@ export default { }, watch: { $route(to, from) { + // 列表实例:从其他页进入列表时刷新(activated 负责标签切回)。 + if (!this.isFormPageInstance) { + const enteringList = + (to.path === this.routePathLocked || to.path === transportPlanListRoute) && + from?.path && + from.path !== to.path; + if (enteringList) { + sessionStorage.removeItem(transportPlanListRefreshKey); + this.$nextTick(() => this.onLoad(this.page, this.query)); + } + return; + } if (!this.isStandaloneFormPage) return; if ( to.query.mode !== from?.query?.mode || @@ -4484,6 +4520,9 @@ export default { loading(); } }, + markTransportPlanListNeedRefresh() { + sessionStorage.setItem(transportPlanListRefreshKey, '1'); + }, rowSave(row, done, loading) { const submitRow = this.normalizeRow(row); if (!submitRow) { @@ -4492,6 +4531,7 @@ export default { } this.getSaveRequest()(submitRow).then( () => { + this.markTransportPlanListNeedRefresh(); this.onLoad(this.page); this.$message({ type: 'success', message: '操作成功!' }); done(); @@ -4511,6 +4551,7 @@ export default { } this.getSaveRequest()(submitRow).then( () => { + this.markTransportPlanListNeedRefresh(); this.onLoad(this.page); this.$message({ type: 'success', message: '操作成功!' }); done(); @@ -4540,7 +4581,7 @@ export default { .submit(submitRow) .then(() => { this.$message.success(action === 'draft' ? '暂存成功' : '创建成功'); - this.onLoad(this.page, this.query); + this.markTransportPlanListNeedRefresh(); this.closeCrudDialog(); }) .finally(() => { @@ -4548,12 +4589,14 @@ export default { }); }, closeCrudDialog() { - if (this.isStandaloneBusinessPage) { + if (this.isStandaloneBusinessPage || this.isFormPageInstance) { + // 关闭独立表单页时标记列表需刷新(含直接点关闭未保存的场景) + this.markTransportPlanListNeedRefresh(); this.$router.$avueRouter?.closeTag?.(); const listPath = Object.entries(standaloneTransportPlanFormRoutes).find( - ([, formPath]) => formPath === this.$route.path - )?.[0] || this.$route.path; + ([, formPath]) => formPath === this.$route.path || formPath === this.routePathLocked + )?.[0] || transportPlanListRoute; this.$router.push({ path: listPath, query: {} }); return; } @@ -6634,20 +6677,33 @@ export default { return query; }, onLoad(page, params = {}) { + if (this.isFormPageInstance) return; this.loading = true; + const currentPage = page?.currentPage || this.page.currentPage || 1; + const pageSize = page?.pageSize || this.page.pageSize || 10; const query = this.normalizeQueryParams({ ...params, ...this.query, allDept: 0, }); this.api - .getList(page.currentPage, page.pageSize, query) + .getList(currentPage, pageSize, query) .then(res => { - const result = res.data.data; - this.page.total = result.total; - this.data = result.records; + const result = res?.data?.data || res?.data || {}; + const records = Array.isArray(result.records) + ? result.records + : Array.isArray(result) + ? result + : []; + this.page.total = Number(result.total ?? records.length) || 0; + this.data = records; this.selectionClear(); }) + .catch(error => { + window.console.error(error); + this.data = []; + this.page.total = 0; + }) .finally(() => { this.loading = false; }); diff --git a/src/views/business/components/waybill-import-dialog.vue b/src/views/business/components/waybill-import-dialog.vue index 5db574c..56ea9b8 100644 --- a/src/views/business/components/waybill-import-dialog.vue +++ b/src/views/business/components/waybill-import-dialog.vue @@ -1266,9 +1266,27 @@ const fillEditForm = async row => { if (carrierValue) carrierChange(carrierValue); await loadBatchRows(snapshot.id); }; -const removeBatches = () => - api.removeImportBatches(selected.value.map(item => item.id).join(',')).then(loadBatches); -const removeBatch = row => api.removeImportBatches(row.id).then(loadBatches); +/** 与行操作一致:仅草稿可删除 */ +const canRemoveBatch = row => String(row?.importStatus || '') === 'draft'; +const removeBatches = () => { + if (!selected.value.length) { + ElMessage.warning('请选择至少一条数据'); + return; + } + // 选中含不可删条目时整批拦截(含已完成/进行中),不静默跳过 + if (selected.value.some(row => !canRemoveBatch(row))) { + ElMessage.warning('已完成运单不可删除'); + return; + } + return api.removeImportBatches(selected.value.map(item => item.id).join(',')).then(loadBatches); +}; +const removeBatch = row => { + if (!canRemoveBatch(row)) { + ElMessage.warning('已完成运单不可删除'); + return; + } + return api.removeImportBatches(row.id).then(loadBatches); +}; const projectChange = async id => { const requestId = ++projectRequestId; const item = projects.value.find(row => String(row.id) === String(id)); diff --git a/src/views/business/contract-manage-change.vue b/src/views/business/contract-manage-change.vue index 344a997..c745705 100644 --- a/src/views/business/contract-manage-change.vue +++ b/src/views/business/contract-manage-change.vue @@ -217,7 +217,12 @@ />
-
计费信息
添加
+
+
计费信息
+ 添加 +
系统生成账单导入生成
@@ -440,7 +445,7 @@ export default { }, preSettlementConfig: {}, formalSettlementConfig: {}, - settlementTypeOptions: ['月结', '日结', '周结', '半月结', '固定天数周期结算'], + settlementTypeOptions: ['月结', '日结', '周结', '固定天数周期结算'], billCycleTypeOptions: ['固定截单日', '自然月', '自定义多周期'], billCutoffDayOptions: Array.from({ length: 31 }, (_, index) => ({ label: `${index + 1}日`, diff --git a/src/views/business/contract-manage.vue b/src/views/business/contract-manage.vue index 3623a5e..8076697 100644 --- a/src/views/business/contract-manage.vue +++ b/src/views/business/contract-manage.vue @@ -647,7 +647,12 @@ 账单导入生成 - 添加 + 添加 diff --git a/src/views/business/project-apply.vue b/src/views/business/project-apply.vue index e05c03d..e4b41bb 100644 --- a/src/views/business/project-apply.vue +++ b/src/views/business/project-apply.vue @@ -224,7 +224,7 @@ placeholder="请选择" filterable clearable - :disabled="isBasicInfoReadonly" + :disabled="dialogReadonly" /> @@ -236,7 +236,7 @@ collapse-tags-tooltip clearable filterable - :disabled="isBasicInfoReadonly" + :disabled="dialogReadonly" @change="handleUndertakeDeptChange" > { const deptTree = res.data.data || []; - const businessDeptTree = ['add', 'edit', 'majorSupplement'].includes(this.dialogType) + // 新增/编辑/重大补录/项目变更均可选择业务部门,排除外部组织 + const businessDeptTree = ['add', 'edit', 'majorSupplement', 'change'].includes(this.dialogType) ? this.excludeExternalOrganization(deptTree) : deptTree; this.deptOptions = this.flattenDept(businessDeptTree); diff --git a/src/views/business/transport-plan-import.vue b/src/views/business/transport-plan-import.vue index 4944c48..f49195a 100644 --- a/src/views/business/transport-plan-import.vue +++ b/src/views/business/transport-plan-import.vue @@ -602,6 +602,8 @@ export default { if (result.code !== 200) throw new Error(result.msg || '导入失败'); this.$message.success('导入完成'); } + // 与运单/配载一致:通知 keep-alive 列表实例重新拉取 + sessionStorage.setItem('transport-plan-list-refresh', '1'); this.$router.push('/business/transport-plan'); } catch (error) { this.$message.error(error.message || '导入失败'); diff --git a/src/views/payment/invoice-application-form.vue b/src/views/payment/invoice-application-form.vue index 0c6f4cd..d4ed32a 100644 --- a/src/views/payment/invoice-application-form.vue +++ b/src/views/payment/invoice-application-form.vue @@ -774,7 +774,7 @@ export default { }, validateSettlements(rule, value, callback) { if (!this.form.settlements.length) { - callback(new Error('请选择正式结算单')); + callback(new Error('请选择付款结算单')); return; } callback(); @@ -1215,7 +1215,7 @@ export default { }, async syncReferenceData() { if (!this.settlementIds.length) { - this.$message.warning('请先选择正式结算单'); + this.$message.warning('请先选择付款结算单'); return; } await Promise.all([this.loadReceiverInformation(), this.loadSettlementDetails(false)]); diff --git a/src/views/payment/invoice-application.vue b/src/views/payment/invoice-application.vue index 0deb659..969c41a 100644 --- a/src/views/payment/invoice-application.vue +++ b/src/views/payment/invoice-application.vue @@ -359,7 +359,7 @@ export default { item => String(item.formalSettlementNo || '').trim() === normalizedNo ); if (!row?.id) { - this.$message.warning('未找到对应的正式结算单'); + this.$message.warning('未找到对应的付款结算单'); return; } this.$router.push({ diff --git a/src/views/payment/invoice-receipt-form.vue b/src/views/payment/invoice-receipt-form.vue index 1d06b34..200e758 100644 --- a/src/views/payment/invoice-receipt-form.vue +++ b/src/views/payment/invoice-receipt-form.vue @@ -76,7 +76,7 @@ diff --git a/src/views/payment/payment-application-form.vue b/src/views/payment/payment-application-form.vue index a3e337d..acec661 100644 --- a/src/views/payment/payment-application-form.vue +++ b/src/views/payment/payment-application-form.vue @@ -121,7 +121,7 @@ >
- - + + - - + + + + + @@ -409,7 +445,7 @@ 同步 - 保存 - + - - - - + + + + + + + diff --git a/src/views/settlement/pre-settlement-form.vue b/src/views/settlement/pre-settlement-form.vue index 9bd3549..18586de 100644 --- a/src/views/settlement/pre-settlement-form.vue +++ b/src/views/settlement/pre-settlement-form.vue @@ -1,7 +1,7 @@ diff --git a/src/views/wel/components/section-business.vue b/src/views/wel/components/section-business.vue index 9322f72..a0e3d8c 100644 --- a/src/views/wel/components/section-business.vue +++ b/src/views/wel/components/section-business.vue @@ -156,7 +156,7 @@ export default {