diff --git a/bms-back/ruoyi-admin/src/main/resources/i18n/messages.properties b/bms-back/ruoyi-admin/src/main/resources/i18n/messages.properties index 44a153d3..7047dc50 100644 --- a/bms-back/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/bms-back/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -142,6 +142,7 @@ price.bill.orderNoRequired=订单号为空 price.bill.billIdRequired=计费ID为空 price.bill.notFound=计费记录不存在 price.bill.customerRequired=订单同步缺少有效客户 +price.bill.alreadyInArBill=订单{0}已生成应收账单,作废后方可重新计费 price.bill.bizDateRequired=业务日期为空 price.set.version.effectiveTime.empty=版本生效时间不能为空 diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcOrderBillServiceImpl.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcOrderBillServiceImpl.java index d415e4db..52120ef5 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcOrderBillServiceImpl.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcOrderBillServiceImpl.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.ar.enums.ArOrderBillStatus; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.StringUtils; @@ -71,6 +72,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService throw new ServiceException(MessageUtils.message("price.bill.bizDateRequired")); } Date bizDate = resolveBizDate(request.getBizDate()); + assertOrderBillEditable(request.getOrderNo()); BigDecimal weight = request.getWeight(); TmsPriceQuoteResult result = tmsPriceQuoteService.calculate(request); persistBill(request, weight, bizDate, result); @@ -127,6 +129,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService String orderNo = request.getOrderNo(); String billKey = Md5Utils.hash(orderNo); PrcOrderBill existed = orderBillMapper.selectPrcOrderBillByOrderNo(orderNo); + assertOrderBillEditable(existed); BigDecimal previousIncome = existed == null ? BigDecimal.ZERO : nz(existed.getIncomeTotal()); PrcOrderBill bill = existed == null ? new PrcOrderBill() : existed; if (existed == null) @@ -204,6 +207,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService result.setFromCache(Boolean.valueOf(existed != null)); if (existed == null) { + bill.setArBillStatus(ArOrderBillStatus.UNBILLED.getCode()); orderBillMapper.insertPrcOrderBill(bill); } else @@ -310,6 +314,28 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService billSearchStore.save(EsLogType.CREDIT, bill.getOrderNo(), req.toJSONString(), resp.toJSONString(), status, err); } + /** Block re-bill when order already claimed by an AR bill (BILLED). Void restores UNBILLED. */ + private void assertOrderBillEditable(String orderNo) + { + if (StringUtils.isEmpty(orderNo)) + { + return; + } + assertOrderBillEditable(orderBillMapper.selectPrcOrderBillByOrderNo(orderNo.trim())); + } + + private void assertOrderBillEditable(PrcOrderBill existed) + { + if (existed == null) + { + return; + } + if (ArOrderBillStatus.BILLED.getCode().equals(existed.getArBillStatus())) + { + throw new ServiceException(MessageUtils.message("price.bill.alreadyInArBill", existed.getOrderNo())); + } + } + private static BigDecimal nz(BigDecimal v) { return v == null ? BigDecimal.ZERO : v; diff --git a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml index e32eda16..6747106f 100644 --- a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml +++ b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml @@ -167,7 +167,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" set_type, bind_priority, customer_priceset_id, product_country_id, weight_min, weight_max, weight_label, effective_date, charge_weight, freight_rate, base_freight_rate, discount_percent, registration_fee, - freight_amount, surcharge_amount, income_total, pay_total, currency, round_mode, + freight_amount, surcharge_amount, income_total, pay_total, currency, ar_bill_status, round_mode, create_time ) values ( #{billId}, #{billKey}, #{orderNo}, #{trackingNo}, #{customerId}, #{customerCode}, #{customerName}, @@ -178,7 +178,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{setType}, #{bindPriority}, #{customerPricesetId}, #{productCountryId}, #{weightMin}, #{weightMax}, #{weightLabel}, #{effectiveDate}, #{chargeWeight}, #{freightRate}, #{baseFreightRate}, #{discountPercent}, #{registrationFee}, - #{freightAmount}, #{surchargeAmount}, #{incomeTotal}, #{payTotal}, #{currency}, #{roundMode}, + #{freightAmount}, #{surchargeAmount}, #{incomeTotal}, #{payTotal}, #{currency}, #{arBillStatus}, #{roundMode}, sysdate() )