From acf7a47be60ce76368a79f110e1adc54bc0584cc Mon Sep 17 00:00:00 2001 From: Hawking Date: Fri, 5 May 2023 17:20:40 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E5=AD=90=E5=8D=95=E5=88=86=E8=B4=A6?= =?UTF-8?q?=E6=97=B6=E6=8A=B5=E6=89=A3=E8=B6=85=E6=97=B6=E7=BD=9A=E9=87=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OrderDetailServiceImpl.java | 136 +++++++++++++----- .../payment/mapper/OrderFineRecordMapper.java | 14 +- .../financial/OrderFineRecordMapper.xml | 18 ++- 3 files changed, 131 insertions(+), 37 deletions(-) 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 6115a3ac..e86485c9 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 @@ -23,6 +23,8 @@ import com.ghy.order.service.OrderMasterService; import com.ghy.payment.domain.FinancialChangeRecord; import com.ghy.payment.domain.FinancialDetail; import com.ghy.payment.domain.FinancialMaster; +import com.ghy.payment.domain.OrderTimeoutRecord; +import com.ghy.payment.mapper.OrderFineRecordMapper; import com.ghy.payment.service.AdapayService; import com.ghy.payment.service.FinancialChangeRecordService; import com.ghy.payment.service.FinancialDetailService; @@ -79,6 +81,8 @@ public class OrderDetailServiceImpl implements OrderDetailService { private FinancialChangeRecordService financialChangeRecordService; @Resource private OrderGoodsService orderGoodsService; + @Resource + private OrderFineRecordMapper orderFineRecordMapper; // Adapay 手续费率 默认0.008 @Value("${adapay.fee_rate:0.008}") @@ -457,11 +461,45 @@ public class OrderDetailServiceImpl implements OrderDetailService { if (paid || payedAdd) { ArrayList divMembers = new ArrayList<>(); addPrice = fcRecord.getChangeMoney(); - // 待提现金额里加入改价单金额 - dtx = dtx.add(fcRecord.getChangeMoney()); - // 这里先自己承担手续费 后面再用平台抽成来补偿 - DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true); - divMembers.add(divMember); + BigDecimal fineMoney = BigDecimal.ZERO; + // 查询师傅的超时扣款记录 + List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId()); + ArrayList fineIds = new ArrayList<>(); + for (OrderTimeoutRecord fineRecord : fineRecords) { + // 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金 + if (fineMoney.add(fineRecord.getPayMoney()).compareTo(fcRecord.getChangeMoney()) > 0) { + // 加价单金额不足以抵扣罚金 + logger.info("子订单[{}]的加价单[{}]不足以抵扣罚金{}元", orderDetailId, fcRecord.getId(), fineRecord.getPayMoney()); + break; + } else { + // 抵扣罚金 + logger.info("子订单[{}]的加价单[{}]抵扣罚金{}元", orderDetailId, fcRecord.getId(), fineRecord.getPayMoney()); + fineMoney = fineMoney.add(fineRecord.getPayMoney()); + // 被抵扣的罚金记录ID先存下来,分账成功后修改状态 + fineIds.add(fineRecord.getId()); + } + } + + // 是否有罚金 + boolean haveFine = BigDecimal.ZERO.compareTo(fineMoney) < 0; + if (haveFine) { // 有罚金 + // 扣除罚金后的加价金额 + BigDecimal workerAddMoney = fcRecord.getChangeMoney().subtract(fineMoney); + // 待提现金额里加入加价金额 + dtx = dtx.add(workerAddMoney); + // 这里由平台承担手续费 + DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(workerAddMoney), false); + DivMember planDivMember = new DivMember("0", AdapayUtils.bigDecimalToString(fineMoney), true); + divMembers.add(divMember); + divMembers.add(planDivMember); + } else { // 没有罚金 + // 待提现金额里加入加价金额 + dtx = dtx.add(fcRecord.getChangeMoney()); + // 这里先自己承担手续费 后面再用平台抽成来补偿 + DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true); + divMembers.add(divMember); + } + //调用分账 logger.info("子订单[code={}]的[改价单]发起分账", odCode); JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(), @@ -469,21 +507,25 @@ public class OrderDetailServiceImpl implements OrderDetailService { AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), divMembers, null, null); if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功 logger.info("子订单[code={}]的[改价单]分账成功", odCode); - // 这是被扣掉的手续费 按理说这里肯定大于0 - String fee_amt = response.getString("fee_amt"); - feeAmt = new BigDecimal(fee_amt); - if (feeAmt.compareTo(platformFeeFD.getPayMoney()) < 0 && !"0.00".equals(fee_amt)) { - // 当 0.00<改价单的手续费<=平台抽成金额 时 - // 用平台抽成来补偿改价单的手续费 修改平台抽成子财务单金额 - fdUpdate.setPayMoney(fdUpdate.getPayMoney().subtract(feeAmt)); - int i = financialDetailService.updateFinancialDetail(fdUpdate); - compensate = i > 0; - } else { - logger.warn("主订单[code={}]的平台抽成金额不足以承担子订单[code={}]的[改价单]的手续费", - orderDetail.getOrderMasterCode(), odCode); - // 平台抽成不足以承担改价单手续费了 那没办法了只能自己承担 - // 待提现金额里减去改价单手续费 - dtx = dtx.subtract(feeAmt); + // 分账成功 把罚金状态改为已扣除 + fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1)); + if (!haveFine) { // 没有罚金的情况才需要补偿手续费 有罚金的话直接在罚金里承担手续费 + // 这是被扣掉的手续费 按理说这里应该大于0 + String fee_amt = response.getString("fee_amt"); + feeAmt = new BigDecimal(fee_amt); + if (feeAmt.compareTo(platformFeeFD.getPayMoney()) < 0 && !"0.00".equals(fee_amt)) { + // 当 0.00<改价单的手续费<=平台抽成金额 时 + // 用平台抽成来补偿改价单的手续费 修改平台抽成子财务单金额 + fdUpdate.setPayMoney(fdUpdate.getPayMoney().subtract(feeAmt)); + int i = financialDetailService.updateFinancialDetail(fdUpdate); + compensate = i > 0; + } else { + logger.warn("主订单[code={}]的平台抽成金额不足以承担子订单[code={}]的[改价单]的手续费", + orderDetail.getOrderMasterCode(), odCode); + // 平台抽成不足以承担改价单手续费了 那没办法了只能自己承担 + // 待提现金额里减去改价单手续费 + dtx = dtx.subtract(feeAmt); + } } } else { // 分账失败 if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) { @@ -522,27 +564,57 @@ public class OrderDetailServiceImpl implements OrderDetailService { payMoney = fdPayMoney; } if (BigDecimal.ZERO.compareTo(payMoney) > -1) { - logger.info("子财务单[code={}] 应支付金额={} 不需要分账", financialDetail.getCode(), payMoney); + logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), payMoney); } else { + // 查询师傅的超时扣款记录 + List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId()); + // 超时罚金 + BigDecimal fineMoney = BigDecimal.ZERO; + ArrayList fineIds = new ArrayList<>(); + for (OrderTimeoutRecord fineRecord : fineRecords) { + // 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金 + if (fineMoney.add(fineRecord.getPayMoney()).compareTo(fdPayMoney) > 0) { + // 加价单金额不足以抵扣罚金 + logger.info("子订单[{}]的派单金额[{}元]不足以抵扣罚金{}元", orderDetailId, fdPayMoney, fineRecord.getPayMoney()); + break; + } else { + // 抵扣罚金 + logger.info("子订单[{}]的加价单[{}]抵扣罚金{}元", orderDetailId, fdPayMoney, fineRecord.getPayMoney()); + fineMoney = fineMoney.add(fineRecord.getPayMoney()); + // 被抵扣的罚金记录ID先存下来,分账成功后修改状态 + fineIds.add(fineRecord.getId()); + } + } + // 总分账金额 + BigDecimal fee = BigDecimal.ZERO; // 接单师傅的分账信息 - String payMoneyS = AdapayUtils.bigDecimalToString(payMoney); + String payMoneyS = AdapayUtils.bigDecimalToString(payMoney.subtract(fineMoney)); DivMember divMember = new DivMember(memberId, payMoneyS, false); divMembers.add(divMember); - - // 计算本次分账的手续费 保留两位小数(向上取整) - BigDecimal fee = payMoney.multiply(new BigDecimal(feeRate)).setScale(2, RoundingMode.UP); - // 平台的分账信息 用来承担手续费 - DivMember feeDivMember = new DivMember("0", fee.toString(), true); - divMembers.add(feeDivMember); - + // 是否有罚金 + boolean haveFine = BigDecimal.ZERO.compareTo(fineMoney) < 0; + if (haveFine) { // 有罚金 从罚金里扣除手续费 + // 平台的分账信息 用来承担罚金 + DivMember fineDivMember = new DivMember("0", AdapayUtils.bigDecimalToString(fineMoney), true); + divMembers.add(fineDivMember); + } else { // 没有罚金 需要扣除手续费 + // 计算本次分账的手续费 保留两位小数(向上取整) + fee = payMoney.multiply(new BigDecimal(feeRate)).setScale(2, RoundingMode.UP); + // 平台的分账信息 用来承担手续费 + DivMember feeDivMember = new DivMember("0", fee.toString(), true); + divMembers.add(feeDivMember); + } logger.info("子订单[code={}]发起分账", odCode); - JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), payment.getId(), payment.getOrderNo() + "_" + System.currentTimeMillis(), - fee.add(payMoney).toString(), divMembers, null, null); + JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), payment.getId(), + payment.getOrderNo() + "_" + System.currentTimeMillis(), + AdapayUtils.bigDecimalToString(fee.add(payMoney)), divMembers, null, null); boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")); // 如果确认支付失败 这里抛出异常 回滚订单状态 Assert.isTrue(status, response.toString()); + // 分账成功 把罚金状态改为已扣除 + fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1)); // 待提现金额里加入子财务单金额 - dtx = dtx.add(fdPayMoney); + dtx = dtx.add(fdPayMoney.subtract(fineMoney)); // 修改平台抽成子财务单金额 减去手续费 fdUpdate.setPayMoney(fdUpdate.getPayMoney().subtract(fee)); diff --git a/ghy-payment/src/main/java/com/ghy/payment/mapper/OrderFineRecordMapper.java b/ghy-payment/src/main/java/com/ghy/payment/mapper/OrderFineRecordMapper.java index 3cb9bc3b..5465e464 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/mapper/OrderFineRecordMapper.java +++ b/ghy-payment/src/main/java/com/ghy/payment/mapper/OrderFineRecordMapper.java @@ -10,11 +10,21 @@ import java.util.List; */ public interface OrderFineRecordMapper { - OrderTimeoutRecord selectByDetailIdAndStatus(@Param("orderDetailId")Long orderDetailId, @Param("orderStatus")Integer orderStatus); + OrderTimeoutRecord selectByDetailIdAndStatus(@Param("orderDetailId") Long orderDetailId, @Param("orderStatus") Integer orderStatus); List selectList(OrderTimeoutRecord orderTimeoutRecord); int insert(OrderTimeoutRecord orderTimeoutRecord); - int update(OrderTimeoutRecord orderTimeoutRecord); +// int update(OrderTimeoutRecord orderTimeoutRecord); + + int updateFineStatus(@Param("id") Long id, @Param("fineStatus") int fineStatus); + + /** + * 查询某师傅的未扣款的罚金 + * + * @param workerId 师傅id + */ + List selectUnFine(@Param("workerId") Long workerId); + } diff --git a/ghy-payment/src/main/resources/mapper/financial/OrderFineRecordMapper.xml b/ghy-payment/src/main/resources/mapper/financial/OrderFineRecordMapper.xml index cf2940c2..acf89bd4 100644 --- a/ghy-payment/src/main/resources/mapper/financial/OrderFineRecordMapper.xml +++ b/ghy-payment/src/main/resources/mapper/financial/OrderFineRecordMapper.xml @@ -46,12 +46,24 @@ + + - INSERT INTO order_timeout_record (order_detail_id, worker_id, fine_status, order_status, pay_money) - VALUES (#{orderDetailId}, #{workerId}, #{fineStatus}, #{orderStatus}, #{payMoney}) + INSERT INTO order_timeout_record (order_detail_id, worker_id, order_status, pay_money) + VALUES (#{orderDetailId}, #{workerId}, #{orderStatus}, #{payMoney}) - + + + + + + UPDATE order_timeout_record SET fine_status = #{fineStatus} WHERE id = #{id} From 9982b9521131be3303e29472b37a885aa193e69b Mon Sep 17 00:00:00 2001 From: Hawking Date: Fri, 5 May 2023 18:04:58 +0800 Subject: [PATCH 02/11] =?UTF-8?q?Customer=E8=87=AA=E5=8A=A8=E6=8F=90?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/web/timer/AdapaySyncTimer.java | 31 +++++++++++++++++++ .../mapper/customer/CustomerBankMapper.xml | 16 ++-------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/ghy-admin/src/main/java/com/ghy/web/timer/AdapaySyncTimer.java b/ghy-admin/src/main/java/com/ghy/web/timer/AdapaySyncTimer.java index 91b20e1c..0c693b58 100644 --- a/ghy-admin/src/main/java/com/ghy/web/timer/AdapaySyncTimer.java +++ b/ghy-admin/src/main/java/com/ghy/web/timer/AdapaySyncTimer.java @@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSONObject; import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.enums.AdapayOrderType; import com.ghy.common.utils.AdapayUtils; +import com.ghy.customer.domain.CustomerBank; +import com.ghy.customer.service.CustomerBankService; import com.ghy.order.service.OrderDetailService; import com.ghy.payment.domain.DrawCashRecord; import com.ghy.payment.mapper.DrawCashRecordMapper; @@ -39,6 +41,8 @@ public class AdapaySyncTimer { @Resource private WorkerBankService workerBankService; @Resource + private CustomerBankService customerBankService; + @Resource private OrderDetailService orderDetailService; @Resource private DrawCashRecordMapper drawCashRecordMapper; @@ -75,6 +79,33 @@ public class AdapaySyncTimer { log.error(e.getMessage(), e); } } + + List customerBanks = customerBankService.getCustomerBankList(new CustomerBank()); + for (CustomerBank customer : customerBanks) { + Long deptId = customer.getDeptId(); + String memberId = customer.getAdapayMemberId(); + String settleAccountId = customer.getSettleAccountId(); + if (deptId == null || StringUtils.isBlank(memberId) || StringUtils.isBlank(settleAccountId)) { + continue; + } + try { + JSONObject accountBalance = adapayService.queryAccountBalance(deptId, memberId, settleAccountId, "01"); + if (AdapayStatusEnum.succeeded.code.equals(accountBalance.getString("status"))) { + // 可提现金额 + String avlBalance = accountBalance.getString("avl_balance"); + if (BigDecimal.ZERO.compareTo(new BigDecimal(avlBalance)) > -1) { + continue; + } + // 提现 + log.info("Customer[{},{}]开始提现: avlBalance={}", customer.getCustomerId(), customer.getName(), avlBalance); + String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH); + JSONObject drawCash = adapayService.drawCash(deptId, orderNo, "T1", avlBalance, memberId, "提现", null); + log.info("Customer[{},{}]提现结果: {}", customer.getCustomerId(), customer.getName(), drawCash.toJSONString()); + } + } catch (BaseAdaPayException e) { + log.error(e.getMessage(), e); + } + } } @Scheduled(fixedRate = 5 * 60 * 1000L) diff --git a/ghy-custom/src/main/resources/mapper/customer/CustomerBankMapper.xml b/ghy-custom/src/main/resources/mapper/customer/CustomerBankMapper.xml index cd7c28a0..f7bd490d 100644 --- a/ghy-custom/src/main/resources/mapper/customer/CustomerBankMapper.xml +++ b/ghy-custom/src/main/resources/mapper/customer/CustomerBankMapper.xml @@ -22,20 +22,8 @@ - SELECT customer_bank_id, - settle_account_id, - customer_id, - name, - cert_id, - bank_name, - bank_num, - phone, - dept_id, - adapay_member_id, - settle_account, - create_by, - create_time, - remark + SELECT customer_bank_id, settle_account_id, customer_id, name, cert_id, bank_name, bank_num, phone, dept_id, + adapay_member_id, settle_account, create_by, create_time, update_by, update_time, remark FROM customer_bank From 24a5b2d44ff2f02c75dd8a6ac9bb77b8d6b8442f Mon Sep 17 00:00:00 2001 From: Hawking Date: Fri, 5 May 2023 22:43:33 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E6=89=A3=E6=AC=BE=E7=BD=9A=E9=87=91?= =?UTF-8?q?=E5=8C=BA=E5=88=86=E5=85=AC=E5=8F=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ghy/order/service/impl/OrderDetailServiceImpl.java | 4 ++-- .../java/com/ghy/payment/domain/OrderTimeoutRecord.java | 4 +++- .../com/ghy/payment/mapper/OrderFineRecordMapper.java | 3 ++- .../resources/mapper/financial/OrderFineRecordMapper.xml | 8 +++++--- .../com/ghy/quartz/service/impl/OrderServiceImpl.java | 6 +++--- 5 files changed, 15 insertions(+), 10 deletions(-) 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 e86485c9..4f39547c 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 @@ -463,7 +463,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { addPrice = fcRecord.getChangeMoney(); BigDecimal fineMoney = BigDecimal.ZERO; // 查询师傅的超时扣款记录 - List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId()); + List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderDetail.getDeptId()); ArrayList fineIds = new ArrayList<>(); for (OrderTimeoutRecord fineRecord : fineRecords) { // 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金 @@ -567,7 +567,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), payMoney); } else { // 查询师傅的超时扣款记录 - List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId()); + List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderDetail.getDeptId()); // 超时罚金 BigDecimal fineMoney = BigDecimal.ZERO; ArrayList fineIds = new ArrayList<>(); diff --git a/ghy-payment/src/main/java/com/ghy/payment/domain/OrderTimeoutRecord.java b/ghy-payment/src/main/java/com/ghy/payment/domain/OrderTimeoutRecord.java index 6d7cef46..138c002c 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/domain/OrderTimeoutRecord.java +++ b/ghy-payment/src/main/java/com/ghy/payment/domain/OrderTimeoutRecord.java @@ -21,6 +21,7 @@ public class OrderTimeoutRecord { */ private Long orderDetailId; private Long workerId; + private Long deptId; private List orderDetailIds; @@ -48,9 +49,10 @@ public class OrderTimeoutRecord { public OrderTimeoutRecord() { } - public OrderTimeoutRecord(Long orderDetailId, Long workerId, Integer orderStatus) { + public OrderTimeoutRecord(Long orderDetailId, Long workerId, Long deptId, Integer orderStatus) { this.orderDetailId = orderDetailId; this.workerId = workerId; + this.deptId = deptId; this.orderStatus = orderStatus; } } diff --git a/ghy-payment/src/main/java/com/ghy/payment/mapper/OrderFineRecordMapper.java b/ghy-payment/src/main/java/com/ghy/payment/mapper/OrderFineRecordMapper.java index 5465e464..75da3d67 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/mapper/OrderFineRecordMapper.java +++ b/ghy-payment/src/main/java/com/ghy/payment/mapper/OrderFineRecordMapper.java @@ -24,7 +24,8 @@ public interface OrderFineRecordMapper { * 查询某师傅的未扣款的罚金 * * @param workerId 师傅id + * @param deptId 公司id */ - List selectUnFine(@Param("workerId") Long workerId); + List selectUnFine(@Param("workerId") Long workerId, @Param("deptId") Long deptId); } diff --git a/ghy-payment/src/main/resources/mapper/financial/OrderFineRecordMapper.xml b/ghy-payment/src/main/resources/mapper/financial/OrderFineRecordMapper.xml index acf89bd4..d539929d 100644 --- a/ghy-payment/src/main/resources/mapper/financial/OrderFineRecordMapper.xml +++ b/ghy-payment/src/main/resources/mapper/financial/OrderFineRecordMapper.xml @@ -8,6 +8,7 @@ + @@ -15,7 +16,7 @@ - SELECT id, order_detail_id, worker_id, fine_status, order_status, pay_money, create_time + SELECT id, order_detail_id, worker_id, dept_id, fine_status, order_status, pay_money, create_time FROM order_timeout_record @@ -49,13 +50,14 @@ - INSERT INTO order_timeout_record (order_detail_id, worker_id, order_status, pay_money) - VALUES (#{orderDetailId}, #{workerId}, #{orderStatus}, #{payMoney}) + INSERT INTO order_timeout_record (order_detail_id, worker_id, dept_id, order_status, pay_money) + VALUES (#{orderDetailId}, #{workerId}, #{deptId}, #{orderStatus}, #{payMoney}) diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java index 24877beb..f576b03e 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java @@ -86,7 +86,7 @@ public class OrderServiceImpl implements OrderService { Date overTime = getOverTime(order.getExpectTimeStart(), 4 * 60 * 60 * 1000); if (overTime.before(now)) { log.info("订单[{}]服务中状态超时4小时 扣款", order.getId()); - OrderTimeoutRecord record = new OrderTimeoutRecord(order.getId(), order.getWorkerId(), order.getOrderStatus()); + OrderTimeoutRecord record = new OrderTimeoutRecord(order.getId(), order.getWorkerId(), order.getDeptId(), order.getOrderStatus()); record.setPayMoney(getFineMoney(order)); record.setFineStatus(0); orderFineRecordMapper.insert(record); @@ -115,7 +115,7 @@ public class OrderServiceImpl implements OrderService { Date overTime = getOverTime(order.getUpdateTime(), 4 * 60 * 60 * 1000); if (overTime.before(now)) { log.info("订单[{}]超时4h 扣款", order.getId()); - OrderTimeoutRecord record = new OrderTimeoutRecord(order.getId(), order.getWorkerId(), order.getOrderStatus()); + OrderTimeoutRecord record = new OrderTimeoutRecord(order.getId(), order.getWorkerId(), order.getDeptId(), order.getOrderStatus()); record.setPayMoney(getFineMoney(order)); record.setFineStatus(0); orderFineRecordMapper.insert(record); @@ -128,7 +128,7 @@ public class OrderServiceImpl implements OrderService { Date overTime = getOverTime(orderTime, 6 * 60 * 60 * 1000); if (overTime.before(now)) { log.info("订单[{}]超时6h 再次扣款", order.getId()); - OrderTimeoutRecord record = new OrderTimeoutRecord(order.getId(), order.getWorkerId(), order.getOrderStatus()); + OrderTimeoutRecord record = new OrderTimeoutRecord(order.getId(), order.getWorkerId(), order.getDeptId(), order.getOrderStatus()); record.setPayMoney(getFineMoney(order)); record.setFineStatus(0); orderFineRecordMapper.insert(record); From 5337178504aa974be4ef8b421d35bff9da313a23 Mon Sep 17 00:00:00 2001 From: Hawking Date: Tue, 9 May 2023 11:05:27 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=AE=8C=E5=8D=95?= =?UTF-8?q?=E6=97=B6=E4=B8=BB=E5=8D=95=E7=8A=B6=E6=80=81=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ghy/order/service/impl/OrderMasterServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java index ae387b07..24448b3a 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java @@ -170,7 +170,7 @@ public class OrderMasterServiceImpl implements OrderMasterService { Assert.notNull(payment, String.format("主订单[id=%d]找不到支付记录", orderMasterId)); // 修改主订单状态 - updateStatus(orderMasterId, OrderStatus.FINISH_CHECK.code()); + updateStatus(orderMasterId, OrderStatus.FINISH.code()); if (BigDecimal.ZERO.compareTo(financialMaster.getPayMoney()) > -1) { logger.info("订单[code={}]支付金额<=0,不需要分账", orderMaster.getCode()); From a500a5581d4b178b33dadd270a184b5d42852253 Mon Sep 17 00:00:00 2001 From: Hawking Date: Tue, 9 May 2023 19:53:44 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E4=B8=BB=E5=8D=95=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/order/domain/OrderMaster.java | 5 +++ .../ghy/order/mapper/OrderMasterMapper.java | 17 +++++++++ .../ghy/order/service/OrderMasterService.java | 17 +++++++++ .../service/impl/OrderMasterServiceImpl.java | 14 +++++++- .../mapper/order/OrderMasterMapper.xml | 19 ++++++++-- .../quartz/service/impl/OrderServiceImpl.java | 36 +++++++++++++++++-- 6 files changed, 103 insertions(+), 5 deletions(-) diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java index 6c313280..072c4992 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java @@ -113,4 +113,9 @@ public class OrderMaster extends BaseEntity { private Boolean shelveStatus; private List exceptOrderMasterIds; + + /** + * 是否超时 1=是 0=否 + */ + private Integer timeout; } diff --git a/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java b/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java index d29329d1..a6416593 100644 --- a/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java +++ b/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java @@ -89,4 +89,21 @@ public interface OrderMasterMapper { List selectByIds(@Param("orderMasterId") Collection orderMasterIds); int updatePayStatus(@Param("orderMasterId") Long orderMasterId, @Param("payStatus") Integer payStatus); + + /** + * 更新主订单超时状态 + * + * @param id 主订单ID + * @param timeout 是否超时 + * @return 1 + */ + int updateTimeout(@Param("id") Long id, @Param("timeout") int timeout); + + /** + * 移除主订单的师傅ID + * + * @param id 主订单ID + * @return 1 + */ + int removeWorker(Long id); } diff --git a/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java b/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java index 6cdc826d..9f36fd4e 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java +++ b/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java @@ -135,4 +135,21 @@ public interface OrderMasterService { * @return true/false */ boolean isAllAssign(Long orderMasterId); + + /** + * 更新主订单超时状态 + * + * @param id 主订单ID + * @param timeout 是否超时 + * @return 1 + */ + int updateTimeout(Long id, int timeout); + + /** + * 移除主订单的师傅ID + * + * @param id 主订单ID + * @return 1 + */ + int removeWorker(Long id); } diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java index 24448b3a..9429ba0d 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java @@ -367,7 +367,9 @@ public class OrderMasterServiceImpl implements OrderMasterService { @Override public List selectByStatus(List status) { - Assert.isTrue(!CollectionUtils.isEmpty(status), "订单状态为空"); + if (CollectionUtils.isEmpty(status)) { + return Collections.emptyList(); + } return orderMasterMapper.selectByStatus(status); } @@ -473,4 +475,14 @@ public class OrderMasterServiceImpl implements OrderMasterService { }).sum(); return masterCount == detailCount; } + + @Override + public int updateTimeout(Long id, int timeout) { + return orderMasterMapper.updateTimeout(id, timeout); + } + + @Override + public int removeWorker(Long id) { + return orderMasterMapper.removeWorker(id); + } } diff --git a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml index 03d30e1b..277fd839 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml @@ -27,6 +27,7 @@ + @@ -48,7 +49,8 @@ create_time, remark, all_self_assigned, - goods_id + goods_id, + timeout_ FROM order_master @@ -70,7 +72,8 @@ om.create_time, om.remark, om.all_self_assigned, - om.goods_id + om.goods_id, + om.timeout_ FROM order_master om LEFT JOIN customer_address ca ON ca.customer_address_id = om.address_id LEFT JOIN goods g ON g.goods_id = om.goods_id @@ -350,4 +353,16 @@ + + UPDATE order_master + SET timeout_ = #{timeout} + WHERE id = #{id} + + + + UPDATE order_master + SET worker_id = NULL + WHERE id = #{id} + + diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java index f576b03e..6e7444d7 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java @@ -35,6 +35,8 @@ public class OrderServiceImpl implements OrderService { /** * 需要超时扣款的订单状态 + * + * @see OrderStatus */ @Value("${order.timeout.status:-4,-3,-2,1,2,3}") private List timeoutOrderStatus; @@ -59,14 +61,44 @@ public class OrderServiceImpl implements OrderService { if (nowT.getHour() < 8 || nowT.getHour() > 18) { return; } - // 查询符合超时的单 + // 查询待接单状态的主单 + List orderMasters = orderMasterService.selectByStatus(Collections.singletonList(0)); + log.info("扫描到{}条未完成的主订单", orderMasters.size()); + for (OrderMaster orderMaster : orderMasters) { + executor.execute(() -> checkTimeout(orderMaster)); + } + + // 查询符合超时的子单 List orders = orderDetailService.selectByStatus(timeoutOrderStatus); - log.info("扫描到{}条未完成的订单", orders.size()); + log.info("扫描到{}条未完成的子订单", orders.size()); for (OrderDetail order : orders) { executor.execute(() -> checkTimeout(order)); } } + @Transactional(rollbackFor = Exception.class) + void checkTimeout(OrderMaster order) { + Date now = new Date(); + // 是否超时 + boolean timeout = ONE.equals(order.getTimeout()); + if (timeout) { + Date overTime = getOverTime(order.getUpdateTime(), 60 * 60 * 1000); + if (overTime.before(now)) { + log.info("主订单[{}]超时60分钟", order.getId()); + // 已超时 60min后取消超时状态 清空workerId + orderMasterService.updateTimeout(order.getId(), 0); + orderMasterService.removeWorker(order.getId()); + } + } else { + Date overTime = getOverTime(order.getUpdateTime(), 30 * 60 * 1000); + if (overTime.before(now)) { + // 30min未接单为超时 + log.info("主订单[{}]超时30分钟", order.getId()); + orderMasterService.updateTimeout(order.getId(), 1); + } + } + } + /** * 判断是否超时 * From dd43a90d15a510b342fe8b88090e4e1ea76da53d Mon Sep 17 00:00:00 2001 From: Hawking Date: Wed, 10 May 2023 14:01:36 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E4=B8=BB=E5=8D=95=E7=9A=84update=5Ftime?= =?UTF-8?q?=E4=B8=BAnull=EF=BC=8C=E6=94=B9=E4=B8=BA=E7=94=A8create=5Ftime?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E8=B6=85=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ghy/quartz/service/impl/OrderServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java index 6e7444d7..651967f8 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java @@ -82,7 +82,7 @@ public class OrderServiceImpl implements OrderService { // 是否超时 boolean timeout = ONE.equals(order.getTimeout()); if (timeout) { - Date overTime = getOverTime(order.getUpdateTime(), 60 * 60 * 1000); + Date overTime = getOverTime(order.getCreateTime(), 60 * 60 * 1000); if (overTime.before(now)) { log.info("主订单[{}]超时60分钟", order.getId()); // 已超时 60min后取消超时状态 清空workerId @@ -90,7 +90,7 @@ public class OrderServiceImpl implements OrderService { orderMasterService.removeWorker(order.getId()); } } else { - Date overTime = getOverTime(order.getUpdateTime(), 30 * 60 * 1000); + Date overTime = getOverTime(order.getCreateTime(), 30 * 60 * 1000); if (overTime.before(now)) { // 30min未接单为超时 log.info("主订单[{}]超时30分钟", order.getId()); From 6013517d26073f6fa8dd8acb23e2f0ed6e310b3d Mon Sep 17 00:00:00 2001 From: Hawking Date: Wed, 10 May 2023 14:11:54 +0800 Subject: [PATCH 07/11] =?UTF-8?q?OrderDetail.deptId=20=E4=B8=BAnull?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E7=94=A8=20OrderMaster.deptId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ghy/quartz/service/impl/OrderServiceImpl.java | 3 ++- .../ghy/system/service/impl/SysDeptConfigServiceImpl.java | 2 ++ .../main/resources/mapper/system/SysDeptConfigMapper.xml | 7 +------ 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java index 651967f8..9e681a2f 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java @@ -173,8 +173,9 @@ public class OrderServiceImpl implements OrderService { * 计算订单罚金(固定罚金+比例罚金) */ private BigDecimal getFineMoney(OrderDetail order) { + OrderMaster orderMaster = orderMasterService.selectById(order.getOrderMasterId()); FinancialDetail orderFinancial = financialDetailService.selectByOrderDetailId(order.getId()); - SysDeptConfig deptConfig = sysDeptConfigService.selectByDeptId(order.getDeptId()); + SysDeptConfig deptConfig = sysDeptConfigService.selectByDeptId(orderMaster.getDeptId()); BigDecimal fineMoney = deptConfig.getGoingOutTime(); // 如果扣款额为null或<0 if (fineMoney == null || BigDecimal.ZERO.compareTo(fineMoney) > -1) { diff --git a/ghy-system/src/main/java/com/ghy/system/service/impl/SysDeptConfigServiceImpl.java b/ghy-system/src/main/java/com/ghy/system/service/impl/SysDeptConfigServiceImpl.java index c531687c..d82b87aa 100644 --- a/ghy-system/src/main/java/com/ghy/system/service/impl/SysDeptConfigServiceImpl.java +++ b/ghy-system/src/main/java/com/ghy/system/service/impl/SysDeptConfigServiceImpl.java @@ -7,6 +7,7 @@ import com.ghy.system.mapper.SysDeptConfigMapper; import com.ghy.system.mapper.SysDeptMapper; import com.ghy.system.service.ISysDeptConfigService; import org.springframework.stereotype.Service; +import org.springframework.util.Assert; import javax.annotation.Resource; import java.util.List; @@ -26,6 +27,7 @@ public class SysDeptConfigServiceImpl implements ISysDeptConfigService { @Override public SysDeptConfig selectByDeptId(Long deptId) { + Assert.notNull(deptId, "deptId is null!!!"); return sysDeptConfigMapper.selectByDeptId(deptId); } diff --git a/ghy-system/src/main/resources/mapper/system/SysDeptConfigMapper.xml b/ghy-system/src/main/resources/mapper/system/SysDeptConfigMapper.xml index bb696012..1660eebe 100644 --- a/ghy-system/src/main/resources/mapper/system/SysDeptConfigMapper.xml +++ b/ghy-system/src/main/resources/mapper/system/SysDeptConfigMapper.xml @@ -54,12 +54,7 @@ - WHERE order_detail_id = #{orderDetailId} AND order_status = #{orderStatus} + WHERE order_detail_id = #{orderDetailId} AND order_status = #{orderStatus} order by create_time desc