diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java index aa0fbed0..24dda9b7 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java @@ -1305,9 +1305,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService bill.setDestPostcode(request.getDestPostcode()); bill.setWarehouseCode(request.getWarehouseCode()); bill.setOrderTime(request.getOrderTime()); - bill.setOrderStatus(request.getOrderStatus()); - bill.setBlPickup(request.getBlPickup()); - bill.setPickupDate(request.getPickupDate()); + applyUpstreamOrderStatus(bill, request); bill.setOrderRemark(request.getOrderRemark()); bill.setProductCode(result.getProductCode()); bill.setProductName(result.getProductName()); @@ -1695,15 +1693,20 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService assertOrderBillEditable(orderBillMapper.selectPrcOrderBillByOrderNo(orderNo.trim())); } - private void assertOrderBillEditable(PrcOrderBill existed) + private boolean isAlreadyInArBill(PrcOrderBill existed) { if (existed == null || StringUtils.isEmpty(existed.getBillId())) { - return; + return false; } int billedFreightCount = incomeBillFeeMapper.countByBillIdAndArBillStatusAndFeeType( existed.getBillId(), ArIncomeBillFeeStatus.BILLED.getCode(), "BASIC_FREIGHT"); - if (billedFreightCount > 0) + return billedFreightCount > 0; + } + + private void assertOrderBillEditable(PrcOrderBill existed) + { + if (isAlreadyInArBill(existed)) { throw new ServiceException(MessageUtils.message("price.bill.alreadyInArBill", existed.getOrderNo())); } @@ -2424,7 +2427,12 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService orderNo = orderNo.trim(); request.setOrderNo(orderNo); PrcOrderBill existed = orderBillMapper.selectPrcOrderBillByOrderNo(orderNo); - assertOrderBillEditable(existed); + // Already in AR: still record fail + ORDER_STATUS; do not touch amounts/fees. + if (isAlreadyInArBill(existed)) + { + persistFailedSnapshotWhenLocked(existed, request, billingFailStatus, errorMessage); + return; + } BigDecimal previousIncome = existed == null ? BigDecimal.ZERO : nz(existed.getIncomeTotal()); PrcOrderBill bill = existed == null ? new PrcOrderBill() : existed; if (existed == null) @@ -2464,9 +2472,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService bill.setDestPostcode(request.getDestPostcode()); bill.setWarehouseCode(request.getWarehouseCode()); bill.setOrderTime(request.getOrderTime()); - bill.setOrderStatus(request.getOrderStatus()); - bill.setBlPickup(request.getBlPickup()); - bill.setPickupDate(request.getPickupDate()); + applyUpstreamOrderStatus(bill, request); bill.setOrderRemark(request.getOrderRemark()); bill.setProductCode(request.getProductCode()); bill.setProductName(request.getProductName()); @@ -2490,14 +2496,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService bill.setSurchargeAmount(BigDecimal.ZERO); bill.setIncomeTotal(BigDecimal.ZERO); bill.setPayTotal(BigDecimal.ZERO); - bill.setBillingFailStatus(Integer.valueOf(billingFailStatus)); - String failText = errorMessage == null ? "" : errorMessage.trim(); - if (failText.length() > 1000) - { - failText = failText.substring(0, 1000); - } - bill.setErrorMessage(failText); - bill.setMatchMessage(failText); + applyBillingFailText(bill, billingFailStatus, errorMessage); if (StringUtils.isEmpty(bill.getRefundStatus())) { bill.setRefundStatus(BillRefundStatus.NONE.getCode()); @@ -2523,4 +2522,64 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService } persistBillExt(bill, request.getUpstreamRow()); } + + /** + * Locked by AR bill: write fail status + upstream ORDER_STATUS only. + * Amounts / income fees stay untouched. + */ + private void persistFailedSnapshotWhenLocked(PrcOrderBill bill, TmsPriceBillRequest request, + int billingFailStatus, String errorMessage) + { + applyUpstreamOrderStatus(bill, request); + if (request != null) + { + if (StringUtils.isNotEmpty(request.getTrackingNo())) + { + bill.setTrackingNo(request.getTrackingNo()); + } + if (StringUtils.isNotEmpty(request.getTransferNo())) + { + bill.setTransferNo(request.getTransferNo()); + } + } + applyBillingFailText(bill, billingFailStatus, errorMessage); + orderBillMapper.updatePrcOrderBill(bill); + if (request != null) + { + persistBillExt(bill, request.getUpstreamRow()); + } + } + + /** Prefer request status fields; never clear existing order_status with null. */ + private static void applyUpstreamOrderStatus(PrcOrderBill bill, TmsPriceBillRequest request) + { + if (bill == null || request == null) + { + return; + } + if (request.getOrderStatus() != null) + { + bill.setOrderStatus(request.getOrderStatus()); + } + if (request.getBlPickup() != null) + { + bill.setBlPickup(request.getBlPickup()); + } + if (request.getPickupDate() != null) + { + bill.setPickupDate(request.getPickupDate()); + } + } + + private static void applyBillingFailText(PrcOrderBill bill, int billingFailStatus, String errorMessage) + { + bill.setBillingFailStatus(Integer.valueOf(billingFailStatus)); + String failText = errorMessage == null ? "" : errorMessage.trim(); + if (failText.length() > 1000) + { + failText = failText.substring(0, 1000); + } + bill.setErrorMessage(failText); + bill.setMatchMessage(failText); + } }