diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java index cda700b1..d07554e4 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java @@ -201,20 +201,20 @@ public class OrderDetailServiceImpl implements OrderDetailService { public List selectOrderDetailList(OrderDetail orderDetail) { List result = new ArrayList<>(); List orderDetails = orderDetailMapper.selectOrderDetailList(orderDetail); - orderDetails.forEach(model->{ - if(StringUtils.isNotEmpty(orderDetail.getIsCall())){ + orderDetails.forEach(model -> { + if (StringUtils.isNotEmpty(orderDetail.getIsCall())) { OrderCallRecord param = new OrderCallRecord(); // param.setOrderType("02"); param.setOrderId(model.getId()); List list = orderCallRecordService.selectOrderCallRecordList(param); // 用于判断是约 还是 排的问题 - if("01".equals(orderDetail.getIsCall()) && CollectionUtils.isEmpty(list)){ + if ("01".equals(orderDetail.getIsCall()) && CollectionUtils.isEmpty(list)) { result.add(model); } - if("02".equals(orderDetail.getIsCall()) && CollectionUtils.isNotEmpty(list)){ + if ("02".equals(orderDetail.getIsCall()) && CollectionUtils.isNotEmpty(list)) { result.add(model); } - }else { + } else { result.add(model); } }); @@ -253,10 +253,10 @@ public class OrderDetailServiceImpl implements OrderDetailService { param.setOrderMasterCode(orderMasterCode); List details = orderDetailMapper.selectOrderDetailList(param); int count = 0; - if(CollectionUtils.isNotEmpty(details)){ + if (CollectionUtils.isNotEmpty(details)) { count = details.size(); } - return orderMasterCode + "-" + (count+1); + return orderMasterCode + "-" + (count + 1); } @Override @@ -529,7 +529,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { // 平台抽成的子财务单 FinancialDetail platformFeeFD = details.get(0); BigDecimal payMoney = platformFeeFD.getPayMoney(); - logger.info("平台的抽成{}子单的实际金额{}", payMoney,financialDetail.getPayMoney()); + logger.info("平台的抽成{}子单的实际金额{}", payMoney, financialDetail.getPayMoney()); FinancialDetail fdUpdate = new FinancialDetail(); fdUpdate.setId(platformFeeFD.getId()); @@ -545,22 +545,22 @@ public class OrderDetailServiceImpl implements OrderDetailService { // 一级分销追加扣点 BigDecimal saleRateOne = new BigDecimal(deptGoodsCategory.getOneRate()); saleRateOne = MoneyUtil.lt0(saleRateOne) ? BigDecimal.ZERO : saleRateOne; - logger.info("一级分销扣点{}",saleRateOne); + logger.info("一级分销扣点{}", saleRateOne); // 二级分销追加扣点 BigDecimal saleRateTwo = new BigDecimal(deptGoodsCategory.getTwoRate()); saleRateTwo = MoneyUtil.lt0(saleRateTwo) ? BigDecimal.ZERO : saleRateTwo; - logger.info("二级分销扣点{}",saleRateTwo); + logger.info("二级分销扣点{}", saleRateTwo); // 三级分销追加扣点 BigDecimal saleRateThree = new BigDecimal(deptGoodsCategory.getThreeRate()); saleRateThree = MoneyUtil.lt0(saleRateThree) ? BigDecimal.ZERO : saleRateThree; - logger.info("三级分销扣点{}",saleRateThree); + logger.info("三级分销扣点{}", saleRateThree); Customer customer = customerService.selectByCustomerId(orderMaster.getCustomerId()); // 一级分销售 - if(customer.getCustomerPlace() != null && customer.getParentCustomerPlace() == null){ + if (customer.getCustomerPlace() != null && customer.getParentCustomerPlace() == null) { placeId = AdapayUtils.getCustomerMemberId(customer.getCustomerPlace(), deptId); saleRateThree = saleRateThree.add(saleRateTwo).add(saleRateOne); saleRateTwo = BigDecimal.ZERO; - }else if(customer.getCustomerPlace() != null && customer.getParentCustomerPlace() != null){ + } else if (customer.getCustomerPlace() != null && customer.getParentCustomerPlace() != null) { placeId = AdapayUtils.getCustomerMemberId(customer.getCustomerPlace(), deptId); parentPlaceId = AdapayUtils.getCustomerMemberId(customer.getParentCustomerPlace(), deptId); saleRateTwo = saleRateTwo.add(saleRateOne); @@ -576,23 +576,23 @@ public class OrderDetailServiceImpl implements OrderDetailService { BigDecimal deptRate = new BigDecimal(deptGoodsCategory.getDeptRate()); deptRate = MoneyUtil.lt0(deptRate) ? BigDecimal.ZERO : deptRate; BigDecimal deptMoney = MoneyUtil.lt0(deptGoodsCategory.getDeptMoney()) ? BigDecimal.ZERO : deptGoodsCategory.getDeptMoney(); - logger.info("平台加价抽成{},费率{}",deptMoney,deptRate); + logger.info("平台加价抽成{},费率{}", deptMoney, deptRate); // 平台追加抽成 BigDecimal pcDeptRate = new BigDecimal(deptGoodsCategory.getPcDeptRate()); pcDeptRate = MoneyUtil.lt0(pcDeptRate) ? BigDecimal.ZERO : pcDeptRate; BigDecimal pcDeptMoney = MoneyUtil.lt0(deptGoodsCategory.getPcDeptMoney()) ? BigDecimal.ZERO : deptGoodsCategory.getPcDeptMoney(); - logger.info("平台追加抽成{},费率{}",pcDeptMoney,pcDeptRate); + logger.info("平台追加抽成{},费率{}", pcDeptMoney, pcDeptRate); BigDecimal dtx = BigDecimal.ZERO; // 追加金额分账 BigDecimal dtx1 = this.addPaymentConfirm(orderDetailId, deptId, memberId, masterMemberId, teamRete, teamMoney, pcDeptRate, pcDeptMoney, saleRateOne, placeId, saleRateTwo, parentPlaceId); dtx = dtx.add(dtx1); - logger.info("追加金额分账{}",dtx); + logger.info("追加金额分账{}", dtx); // 改价单分账 BigDecimal changeMoney = BigDecimal.ZERO; // 查询子订单的加价记录 List financialChangeRecords = financialChangeRecordService.selectByDetailIds(String.valueOf(orderDetailId)); - logger.info("子订单加价记录{}",dtx); + logger.info("子订单加价记录{}", dtx); if (CollectionUtils.isNotEmpty(financialChangeRecords)) { // 改价记录只会有一条 直接取出 FinancialChangeRecord fcRecord = financialChangeRecords.get(0); @@ -600,11 +600,11 @@ public class OrderDetailServiceImpl implements OrderDetailService { boolean payedAdd = PayStatus.PAYED_ADD.getCode().equals(fcRecord.getPayStatus()); if (paid || payedAdd) { changeMoney = fcRecord.getChangeMoney(); - logger.info("子订单加价金额{}",changeMoney); + logger.info("子订单加价金额{}", changeMoney); BigDecimal dtx2 = changePaymentConfirm(fcRecord, orderDetailId, orderDetail.getWorkerId(), deptId, memberId, masterMemberId, teamRete, teamMoney, deptRate, deptMoney, saleRateThree, placeId, saleRateTwo, parentPlaceId); dtx = dtx.add(dtx2); - logger.info("子订单加价记录{}加价完毕{}",dtx2,dtx); + logger.info("子订单加价记录{}加价完毕{}", dtx2, dtx); } } @@ -612,15 +612,15 @@ public class OrderDetailServiceImpl implements OrderDetailService { OrderAttachmentRecord param = new OrderAttachmentRecord(); param.setOrderDetailId(orderDetailId); List orderAttachmentRecordList = orderAttachmentRecordService.selectOrderAttachmentRecordList(param); - logger.info("附件费分账金额{}",orderAttachmentRecordList); - if(CollectionUtils.isNotEmpty(orderAttachmentRecordList)){ + logger.info("附件费分账金额{}", orderAttachmentRecordList); + if (CollectionUtils.isNotEmpty(orderAttachmentRecordList)) { // 附件费分账. - attachPaymentConfirm(orderAttachmentRecordList.get(0), orderDetailId, orderDetail.getWorkerId(), deptId,memberId); + attachPaymentConfirm(orderAttachmentRecordList.get(0), orderDetailId, orderDetail.getWorkerId(), deptId, memberId); } // --------------------- 子财务单分账部分 start --------------------- // 子单的实际金额 BigDecimal odMoney = financialDetail.getPayMoney().subtract(changeMoney); - logger.info("子单的实际金额{}",odMoney); + logger.info("子单的实际金额{}", odMoney); if (MoneyUtil.lte0(odMoney)) { logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), odMoney); } else { @@ -647,7 +647,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { ArrayList divMembers = new ArrayList<>(); // 是否有罚金 boolean haveFine = MoneyUtil.gt0(fineMoney); - logger.info("子单的罚金{},是否有罚金{}",fineMoney,haveFine); + logger.info("子单的罚金{},是否有罚金{}", fineMoney, haveFine); if (haveFine) { // 有罚金 从罚金里扣除手续费 // 平台的分账信息 用来承担罚金 divMembers.add(new DivMember("0", MoneyUtil.toS(fineMoney), true)); @@ -660,26 +660,44 @@ public class OrderDetailServiceImpl implements OrderDetailService { // 没有罚金 自己承担手续费 divMembers.add(new DivMember(memberId, MoneyUtil.toS(odMoney), false)); // 平台金额部分抽出来部分承担手续费 - BigDecimal payCommissionMoney= new BigDecimal(0.01); - payCommissionMoney=odMoney.multiply(payCommissionMoney).setScale(6,RoundingMode.HALF_UP); - payMoney=payMoney.setScale(6,RoundingMode.HALF_UP).subtract(payCommissionMoney); + // 1. 使用字符串构造精确的BigDecimal(避免double精度问题) + BigDecimal payCommissionRate = new BigDecimal("0.01"); + +// 2. 计算佣金时强制指定精度和舍入模式(双重保障) + BigDecimal commissionAmount = odMoney.multiply(payCommissionRate) + .setScale(6, RoundingMode.HALF_UP) // 第一次精度控制 + .setScale(6, RoundingMode.DOWN); // 第二次强制截断(关键修复点) + +// 3. 对齐payMoney的精度(确保减法一致性) + payMoney = payMoney.setScale(6, RoundingMode.DOWN); // 统一截断模式 + +// 4. 执行减法操作Z + payMoney = payMoney.subtract(commissionAmount); + +// 5. 更新数据(保持精度一致) fdUpdate.setPayMoney(payMoney); - divMembers.add(new DivMember("0", MoneyUtil.toS(payCommissionMoney.setScale(6)), true)); + divMembers.add(new DivMember( + "0", + // 显式传递舍入模式给工具类 + commissionAmount.toString(), + true + )); + financialDetailService.updateFinancialDetail(fdUpdate); - odMoney=odMoney.add(payCommissionMoney); + odMoney = odMoney.add(payCommissionRate); // 增加手续费财务子单 - FinancialDetail financialDetail1=new FinancialDetail(); + FinancialDetail financialDetail1 = new FinancialDetail(); financialDetail1.setOrderDetailId(orderDetailId); financialDetail1.setFinancialDetailType(6); - financialDetail1.setPayMoney(payCommissionMoney); + financialDetail1.setPayMoney(payCommissionRate); financialDetail1.setPayTime(new Date()); financialDetailService.insertFinancialDetail(financialDetail1); - logger.info("平台的抽成减去承担手续费后的金额{},平台手续费{},增加的财务子单{}", payMoney,payCommissionMoney,financialDetail1); + logger.info("平台的抽成减去承担手续费后的金额{},平台手续费{},增加的财务子单{}", payMoney, payCommissionRate, financialDetail1); } - logger.info("子单的罚金处理后的总额{}",dtx); + logger.info("子单的罚金处理后的总额{}", dtx); String orderNo = "OD_" + orderDetailId + "_" + System.currentTimeMillis(); - logger.info("子订单[{}]发起分账: {} 分账人员{}", orderDetailId, JSON.toJSONString(divMembers),orderDetail.getWorkerName()); + logger.info("子订单[{}]发起分账: {} 分账人员{}", orderDetailId, JSON.toJSONString(divMembers), orderDetail.getWorkerName()); JSONObject response = adapayService.paymentConfirm(deptId, orderPayment.getId(), orderNo, MoneyUtil.toS(odMoney), divMembers, null, null); logger.info("子订单[{}]的分账结果: {}", orderDetailId, response.toString()); boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")); @@ -687,12 +705,12 @@ public class OrderDetailServiceImpl implements OrderDetailService { Assert.isTrue(status, response.toString()); // 分账成功 把罚金状态改为已扣除 fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1)); - logger.info("子单的实际金额{}",odMoney); + logger.info("子单的实际金额{}", odMoney); if (!haveFine) { String feeAmt = response.getString("fee_amt"); dtx = dtx.add(odMoney).subtract(new BigDecimal(feeAmt)); } - logger.info("子单的没有罚金的实际金额{}",dtx); + logger.info("子单的没有罚金的实际金额{}", dtx); } // --------------------- 子财务单分账部分 end --------------------- @@ -751,7 +769,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { } - logger.info("子订单改价分账1级{}2级{}",placeOneMoney,placeTwoMoney); + logger.info("子订单改价分账1级{}2级{}", placeOneMoney, placeTwoMoney); // 上门师傅的报酬 BigDecimal workerFee = changeMoney; BigDecimal fineMoney = BigDecimal.ZERO; @@ -794,25 +812,25 @@ public class OrderDetailServiceImpl implements OrderDetailService { workerFee = workerFee.subtract(placeTwoMoney); } //子师傅的费用计算 - BigDecimal detailFee=BigDecimal.ZERO; + BigDecimal detailFee = BigDecimal.ZERO; - logger.info("大师傅初始金额{}平台费用{}团队抽成金额{}",masterFee,platformFee,teamMoney); + logger.info("大师傅初始金额{}平台费用{}团队抽成金额{}", masterFee, platformFee, teamMoney); // 如果是大师傅自己接单,则不需要抽成 - if(AdapayUtils.getWorkerMemberId(workerId, deptId).equals(masterMemberId)){ + if (AdapayUtils.getWorkerMemberId(workerId, deptId).equals(masterMemberId)) { masterFee = BigDecimal.ZERO; - }else{ - if (MoneyUtil.gt0(workerFee)){ - detailFee=workerFee.multiply(BigDecimal.ONE.subtract(teamRete)).setScale(2, RoundingMode.DOWN); + } else { + if (MoneyUtil.gt0(workerFee)) { + detailFee = workerFee.multiply(BigDecimal.ONE.subtract(teamRete)).setScale(2, RoundingMode.DOWN); divMembers.add(new DivMember(memberId, MoneyUtil.toS(detailFee), !feeFlag)); } - masterFee=workerFee.subtract(detailFee); + masterFee = workerFee.subtract(detailFee); if (MoneyUtil.gt0(masterFee)) { divMembers.add(new DivMember(masterMemberId, MoneyUtil.toS(masterFee), !feeFlag)); } } - logger.info("子师傅的费用{}子师傅抽成比例{}",detailFee,BigDecimal.ONE.subtract(teamRete)); - logger.info("大师傅的扣点{},最终的扣完之后的金额{}",masterFee,workerFee); - logger.info("改价单各个金额{},{},{},{}",placeOneMoney,placeTwoMoney,masterFee,workerFee); + logger.info("子师傅的费用{}子师傅抽成比例{}", detailFee, BigDecimal.ONE.subtract(teamRete)); + logger.info("大师傅的扣点{},最终的扣完之后的金额{}", masterFee, workerFee); + logger.info("改价单各个金额{},{},{},{}", placeOneMoney, placeTwoMoney, masterFee, workerFee); String orderNo = "FCR_" + fcRecord.getId() + "_" + System.currentTimeMillis(); //调用分账 logger.info("子订单[{}]的[改价单]发起分账", orderDetailId); @@ -823,8 +841,8 @@ public class OrderDetailServiceImpl implements OrderDetailService { // 分账成功 把罚金状态改为已扣除 fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1)); //获取当前订单的 一级 二级分销 - drawCash(orderDetailId,deptId,placeOne, AdapayUtils.bigDecimalToString(placeOneMoney)); - drawCash(orderDetailId,deptId,placeTwo, AdapayUtils.bigDecimalToString(placeTwoMoney)); + drawCash(orderDetailId, deptId, placeOne, AdapayUtils.bigDecimalToString(placeOneMoney)); + drawCash(orderDetailId, deptId, placeTwo, AdapayUtils.bigDecimalToString(placeTwoMoney)); } else { // 分账失败 if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) { // 当前确认金额 > 支付金额 - 已支付确认金额 - 已支付撤销金额 @@ -841,7 +859,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { return workerFee; } - private void attachPaymentConfirm(OrderAttachmentRecord orderAttachmentRecord, Long orderDetailId, Long workerId, Long deptId,String customerId) throws BaseAdaPayException { + private void attachPaymentConfirm(OrderAttachmentRecord orderAttachmentRecord, Long orderDetailId, Long workerId, Long deptId, String customerId) throws BaseAdaPayException { BigDecimal attachMoney = orderAttachmentRecord.getAttachMoney(); // 扣除罚金后的上门师傅报酬 // workerFee = workerFee.subtract(fineMoney); @@ -868,8 +886,8 @@ public class OrderDetailServiceImpl implements OrderDetailService { if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功 logger.info("子订单[{}]的[附件费]分账成功", orderDetailId); logger.info("子订单[{}]的[附件费]提现金额", one); - if (feeFlag){ - drawCash(orderDetailId,deptId,customerId,AdapayUtils.bigDecimalToString(one)); + if (feeFlag) { + drawCash(orderDetailId, deptId, customerId, AdapayUtils.bigDecimalToString(one)); } } else { // 分账失败 if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) { @@ -933,7 +951,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { } logger.info("2级分销{}", placeTwoMoney); // 如果是大师傅自己接单,则不需要抽成 - if(memberId.equals(masterMemberId)){ + if (memberId.equals(masterMemberId)) { masterFee = BigDecimal.ZERO; } // 上门师傅的报酬 @@ -956,17 +974,17 @@ public class OrderDetailServiceImpl implements OrderDetailService { divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerFee), !feeFlag)); dtx = dtx.add(workerFee); } - logger.info("工费抽成后{},dtx{}", divMembers,dtx); + logger.info("工费抽成后{},dtx{}", divMembers, dtx); if (StringUtils.isNotEmpty(placeOne)) { divMembers.add(new DivMember(placeOne, MoneyUtil.toS(placeOneMoney), !feeFlag)); dtx = dtx.add(placeOneMoney); } - logger.info("第一次分成{},dtx{}", divMembers,dtx); + logger.info("第一次分成{},dtx{}", divMembers, dtx); if (StringUtils.isNotEmpty(placeTwo)) { divMembers.add(new DivMember(placeTwo, MoneyUtil.toS(placeTwoMoney), !feeFlag)); dtx = dtx.add(placeTwoMoney); } - logger.info("第二次分成{},dtx{}", divMembers,dtx); + logger.info("第二次分成{},dtx{}", divMembers, dtx); String orderNo = "OAS_" + oas.getId() + "_" + System.currentTimeMillis(); //调用分账 logger.info("子订单[{}]的追加单[{}]发起分账: {}", orderDetailId, oas.getId(), JSON.toJSONString(divMembers)); @@ -1086,11 +1104,11 @@ public class OrderDetailServiceImpl implements OrderDetailService { /** *

构建各分销所得金额

- * @param deptGoodsCategory 三级类目,用来计算扣点 - * @param financialChangeRecord 加价记录 * + * @param deptGoodsCategory 三级类目,用来计算扣点 + * @param financialChangeRecord 加价记录 */ - private void buildSettle(FinancialChangeRecord financialChangeRecord, DeptGoodsCategory deptGoodsCategory, Worker workerMaster){ + private void buildSettle(FinancialChangeRecord financialChangeRecord, DeptGoodsCategory deptGoodsCategory, Worker workerMaster) { // 一级分销追加扣点 BigDecimal saleRateOne = new BigDecimal(deptGoodsCategory.getOneRate()); saleRateOne = MoneyUtil.lt0(saleRateOne) ? BigDecimal.ZERO : saleRateOne;