diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java index 3838397e..bf9818db 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java @@ -14,6 +14,7 @@ import com.ghy.order.request.AppOrderRequest; import com.ghy.order.service.OrderDetailService; import com.ghy.order.service.OrderGoodsService; import com.ghy.order.service.OrderMasterService; +import com.ghy.payment.domain.FinancialDetail; import com.ghy.payment.domain.FinancialMaster; import com.ghy.payment.service.FinancialDetailService; import com.ghy.payment.service.FinancialMasterService; @@ -37,6 +38,10 @@ import java.util.stream.Collectors; @RequestMapping("/order") public class OrderController extends BaseController { + private static final BigDecimal PERCENT1 = BigDecimal.valueOf(0.01); + private static final BigDecimal PERCENT2 = BigDecimal.valueOf(0.02); + private static final BigDecimal PERCENT7 = BigDecimal.valueOf(0.07); + @Autowired private CustomerService customerService; @@ -79,8 +84,13 @@ public class OrderController extends BaseController { Set goodsIds = appGoodsList.stream().map(AppGoodsRequest::getGoodsId).collect(Collectors.toSet()); // 所有商品 List goodsList = goodsService.selectByIds(goodsIds); + // 商户ID + Long deptId = goodsList.get(0).getDeptId(); + Assert.notNull(deptId, "deptId is null!"); + // 生成主单 OrderMaster orderMaster = new OrderMaster(); + orderMaster.setDeptId(deptId); orderMaster.setCode(orderMasterService.createOrderCode()); orderMaster.setOrderType(1); orderMaster.setOrderStatus(0); @@ -88,17 +98,23 @@ public class OrderController extends BaseController { orderMaster.setPayStatus(0); orderMaster.setCreateTime(new Date()); orderMasterService.insertOrderMaster(orderMaster); - Assert.notNull(orderMaster.getId(), "OrderMaster ID is null!"); + Assert.notNull(orderMaster.getId(), "OrderMaster.id is null!"); + + // TODO 优惠金额不知道咋算 暂时先给0 + BigDecimal discountMoney = BigDecimal.ZERO; + BigDecimal payMoney = totalPay.subtract(discountMoney); + + // 当实付金额payType<=0时 使payType=BigDecimal.ZERO + payMoney = BigDecimal.ZERO.max(payMoney); // 生成财务主单 - FinancialMaster financialMaster = new FinancialMaster(orderMaster.getId(), orderMaster.getCode(), - // TODO 优惠金额不知道咋算 暂时先给0 - totalPay, BigDecimal.ZERO, totalPay); + FinancialMaster financialMaster = new FinancialMaster(financialMasterService.createCode(), deptId, + orderMaster.getId(), orderMaster.getCode(), totalPay, discountMoney, payMoney); financialMasterService.insertFinancialMaster(financialMaster); + Assert.notNull(financialMaster.getId(), "FinancialMaster.id is null!"); - //TODO 生成细单 - - //TODO 生成财务细单(含分销等.) + //生成财务子单 + createFinancialDetail(deptId, customer, payMoney, financialMaster); // 生成商品订单 Map goodsMap = goodsList.stream().filter(Objects::nonNull) @@ -113,4 +129,52 @@ public class OrderController extends BaseController { return AjaxResult.success(orderMaster); } + /** + * 生成财务子单 + * + * @param deptId 商户ID + * @param customer 消费者 + * @param payMoney 实付金额 + * @param financialMaster 财务主单 + */ + private void createFinancialDetail(Long deptId, Customer customer, BigDecimal payMoney, FinancialMaster financialMaster) { + // 是否为0元购 是的话下面就不用多级分销了 + if (BigDecimal.ZERO.equals(payMoney)) { + return; + } + // 公司抽成比例 初始10% + BigDecimal companyRatio = BigDecimal.valueOf(0.1); + + // 上级分销人的 customerId + Long customerPlaceId = customer.getCustomerPlace(); + if (customerPlaceId != null) { + // 子财务单的实付金额 + BigDecimal fdPayMoney = payMoney.multiply(PERCENT7); + // 生成上级分销的子财务单 + FinancialDetail financialDetail = new FinancialDetail(financialDetailService.createCode(), deptId, + financialMaster.getId(), fdPayMoney, 2, customerPlaceId); + financialDetailService.insertFinancialDetail(financialDetail); + companyRatio = companyRatio.subtract(PERCENT7); + } + + // 祖级分销人 customerId + Long parentCustomerPlaceId = customer.getParentCustomerPlace(); + if (parentCustomerPlaceId != null) { + // 子财务单的实付金额 + BigDecimal fdPayMoney = payMoney.multiply(PERCENT2); + // 生成祖级分销的子财务单 + FinancialDetail financialDetail = new FinancialDetail(financialDetailService.createCode(), deptId, + financialMaster.getId(), fdPayMoney, 2, parentCustomerPlaceId); + financialDetailService.insertFinancialDetail(financialDetail); + companyRatio = companyRatio.subtract(PERCENT2); + } + + // 平台抽成子财务单的实付金额 + BigDecimal fdPayMoney = payMoney.multiply(companyRatio); + // 生成平台抽成的子财务单 + FinancialDetail financialDetail = new FinancialDetail(financialDetailService.createCode(), deptId, + financialMaster.getId(), fdPayMoney, 2, parentCustomerPlaceId); + financialDetailService.insertFinancialDetail(financialDetail); + } + } diff --git a/ghy-admin/src/main/java/com/ghy/web/core/AfterPay.java b/ghy-admin/src/main/java/com/ghy/web/core/AfterPay.java index f58fdddf..39e9a5e7 100644 --- a/ghy-admin/src/main/java/com/ghy/web/core/AfterPay.java +++ b/ghy-admin/src/main/java/com/ghy/web/core/AfterPay.java @@ -1,9 +1,12 @@ package com.ghy.web.core; import com.ghy.common.adapay.callback.PayCallback; +import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.adapay.model.PayReply; -import com.ghy.order.service.OrderDetailService; import com.ghy.order.service.OrderMasterService; +import com.ghy.payment.service.FinancialMasterService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -15,20 +18,24 @@ import javax.annotation.Resource; @Configuration public class AfterPay { + private static final Logger logger = LoggerFactory.getLogger(AfterPay.class); + @Resource - OrderMasterService orderMasterService; - @Resource - OrderDetailService orderDetailService; + FinancialMasterService financialMasterService; @Bean public PayCallback payCallback() { return new PayCallback() { @Override public void onReply(PayReply reply) { - reply.getStatus(); - // TODO 修改 OrderMaster 订单状态 - // TODO 修改 OrderDetail 订单状态 - // TODO 保存支付结果到MySQL + if (AdapayStatusEnum.succeeded.code.equals(reply.getStatus())) { + // TODO 保存支付结果到 adapay_callback_log 表 + + // 修改财务单状态为支付成功 + financialMasterService.paySucceeded(reply.getOrderNo(), reply.getPayChannel()); + } else { + logger.warn("支付失败:{}", reply); + } } }; } diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/PayChannel.java b/ghy-common/src/main/java/com/ghy/common/adapay/PayChannel.java new file mode 100644 index 00000000..24735de1 --- /dev/null +++ b/ghy-common/src/main/java/com/ghy/common/adapay/PayChannel.java @@ -0,0 +1,51 @@ +package com.ghy.common.adapay; + +/** + * 支付渠道 https://docs.adapay.tech/api/appendix.html#id2 + * + * @author HH 2022/5/23 + */ +public interface PayChannel { + + /** + * 支付宝 App 支付 + */ + String ALIPAY = "alipay"; + /** + * 支付宝正扫 + */ + String ALIPAY_QR = "alipay_qr"; + /** + * 支付宝 H5 支付 + */ + String ALIPAY_WAP = "alipay_wap"; + /** + * 支付宝小程序支付 + */ + String ALIPAY_LITE = "alipay_lite"; + /** + * 支付宝生活号支付 + */ + String ALIPAY_PUB = "alipay_pub"; + /** + * 支付宝反扫 + */ + String ALIPAY_SCAN = "alipay_scan"; + + /** + * 这个不是支付渠道 + */ + String WX = "wx"; + /** + * 微信公众号支付 + */ + String WX_PUB = "wx_pub"; + /** + * 微信小程序支付 + */ + String WX_LITE = "wx_lite"; + /** + * 微信反扫 + */ + String WX_SCAN = "wx_scan"; +} diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/PayChannelEnum.java b/ghy-common/src/main/java/com/ghy/common/adapay/PayChannelEnum.java index 3fdea91a..3999aa02 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/PayChannelEnum.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/PayChannelEnum.java @@ -1,15 +1,22 @@ package com.ghy.common.adapay; /** - * 支付渠道 + * 支付渠道 https://docs.adapay.tech/api/appendix.html#id2 * * @author HH 2022/3/25 */ public enum PayChannelEnum { - ALIPAY_QR("alipay_qr", "支付宝正扫"), - WX_LITE("wx_lite", "微信小程序"), - WX_PUB("wx_pub", "微信公众号"); + ALIPAY(PayChannel.ALIPAY, "支付宝App支付"), + ALIPAY_QR(PayChannel.ALIPAY_QR, "支付宝正扫"), + ALIPAY_WAP(PayChannel.ALIPAY_WAP, "支付宝H5支付"), + ALIPAY_LITE(PayChannel.ALIPAY_LITE, "支付宝小程序支付"), + ALIPAY_PUB(PayChannel.ALIPAY_PUB, "支付宝生活号支付"), + ALIPAY_SCAN(PayChannel.ALIPAY_SCAN, "支付宝反扫"), + + WX_PUB(PayChannel.WX_PUB, "微信公众号"), + WX_LITE(PayChannel.WX_LITE, "微信小程序"), + WX_SCAN(PayChannel.WX_SCAN, "微信反扫"); private final String code; private final String description; diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/model/AdapayStatusEnum.java b/ghy-common/src/main/java/com/ghy/common/adapay/model/AdapayStatusEnum.java index 7c13df32..41ef88cb 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/model/AdapayStatusEnum.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/model/AdapayStatusEnum.java @@ -11,8 +11,8 @@ public enum AdapayStatusEnum { succeeded("succeeded", "成功"), failed("failed", "失败"); - public String code; - public String description; + public final String code; + public final String description; AdapayStatusEnum(String code, String description) { this.code = code; diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java index 1a0e038a..e28b3c53 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java @@ -4,6 +4,8 @@ import com.ghy.common.annotation.Excel; import com.ghy.common.core.domain.BaseEntity; import lombok.Data; +import java.util.Date; + /** * @author clunt * 细单表(转派后产生的订单) @@ -20,7 +22,7 @@ public class OrderDetail extends BaseEntity { private String code; @Excel(name = "主单id", cellType = Excel.ColumnType.NUMERIC) - private Integer orderMasterId; + private Long orderMasterId; @Excel(name = "主单编码", cellType = Excel.ColumnType.STRING) private String orderMasterCode; @@ -37,17 +39,14 @@ public class OrderDetail extends BaseEntity { @Excel(name = "接单师傅id", cellType = Excel.ColumnType.NUMERIC) private Integer workerId; - @Excel(name = "付款时间", cellType = Excel.ColumnType.STRING) - private String payTime; - @Excel(name = "接单时间", cellType = Excel.ColumnType.STRING) - private String revTime; + private Date revTime; @Excel(name = "服务开始时间/上门时间", cellType = Excel.ColumnType.STRING) - private String workBeginTime; + private Date workBeginTime; @Excel(name = "服务完成时间", cellType = Excel.ColumnType.STRING) - private String workFinishTime; + private Date workFinishTime; } diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderGoods.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderGoods.java index c62b64fa..34dab37f 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderGoods.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderGoods.java @@ -34,7 +34,7 @@ public class OrderGoods extends BaseEntity { @Excel(name = "已服务数量", cellType = Excel.ColumnType.NUMERIC) private Integer serverGoodsNum; - /** 创建时间 */ + @Excel(name = "完成时间", cellType = Excel.ColumnType.NUMERIC) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date finishTime; 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 24b751db..87637359 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 @@ -4,6 +4,8 @@ import com.ghy.common.annotation.Excel; import com.ghy.common.core.domain.BaseEntity; import lombok.Data; +import java.util.Date; + /** * @author clunt * 主单表(对应付款订单) @@ -41,9 +43,9 @@ public class OrderMaster extends BaseEntity { private Integer workerId; @Excel(name = "付款时间", cellType = Excel.ColumnType.STRING) - private String payTime; + private Date payTime; @Excel(name = "接单时间", cellType = Excel.ColumnType.STRING) - private String revTime; + private Date revTime; } 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 2d86d4b0..dd9a28f8 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 @@ -25,14 +25,14 @@ public class OrderMasterServiceImpl implements OrderMasterService { @Resource private OrderMasterMapper orderMasterMapper; - AtomicLong index = new AtomicLong(1L); + private static final AtomicLong INDEX = new AtomicLong(1L); - private final static ThreadLocal dateFormat = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyyMMddHHmmss")); + private final static ThreadLocal dateFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMddHHmmss")); @Override public String createOrderCode() { - index.compareAndSet(9999L, 1L); - return "om" + dateFormat.get().format(new Date()) + index.getAndIncrement(); + INDEX.compareAndSet(9999L, 1L); + return "om" + dateFormat.get().format(new Date()) + INDEX.getAndIncrement(); } @Override diff --git a/ghy-order/src/main/resources/mapper/order/OrderDetailMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderDetailMapper.xml index 800578f6..d723c9ae 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderDetailMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderDetailMapper.xml @@ -13,7 +13,6 @@ - @@ -27,12 +26,12 @@ SELECT id, code, + order_master_id, order_master_code, customer_id, order_type, order_status, worker_id, - pay_time, rev_time, work_begin_time, work_finish_time, @@ -51,10 +50,10 @@ AND customer_id = #{customerId} - + AND order_type = #{orderType} - + AND order_status = #{orderStatus} @@ -67,12 +66,7 @@ @@ -86,16 +80,15 @@ UPDATE order_detail code = #{code}, - order_master_id = #{orderMasterId}, + order_master_id = #{orderMasterId}, order_master_code = #{orderMasterCode}, - customer_id = #{customerId}, - order_type = #{orderType}, - order_status = #{orderStatus}, - worker_id = #{workerId}, - pay_time = #{payTime}, - rev_time = #{revTime}, - work_begin_time = #{workBeginTime}, - work_finish_time = #{workFinishTime}, + customer_id = #{customerId}, + order_type = #{orderType}, + order_status = #{orderStatus}, + worker_id = #{workerId}, + rev_time = #{revTime}, + work_begin_time = #{workBeginTime}, + work_finish_time = #{workFinishTime}, update_by = #{updateBy}, update_time = SYSDATE() @@ -104,31 +97,29 @@ INSERT INTO order_detail( - code, - order_master_id, + code, + order_master_id, order_master_code, - customer_id, - order_type, - order_status, - worker_id, - pay_time, - rev_time, - work_begin_time, - work_finish_time, + customer_id, + order_type, + order_status, + worker_id, + rev_time, + work_begin_time, + work_finish_time, create_by, create_time )VALUES( - #{code}, - o#{orderMasterId}, + #{code}, + o#{orderMasterId}, #{orderMasterCode}, - #{customerId}, - #{orderType}, - #{orderStatus}, - #{workerId}, - #{payTime}, - #{revTime}, - #{workBeginTime}, - #{workFinishTime}, + #{customerId}, + #{orderType}, + #{orderStatus}, + #{workerId}, + #{revTime}, + #{workBeginTime}, + #{workFinishTime}, #{createBy}, SYSDATE() ) diff --git a/ghy-order/src/main/resources/mapper/order/OrderGoodsMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderGoodsMapper.xml index 3cb8739f..1e02b650 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderGoodsMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderGoodsMapper.xml @@ -20,19 +20,20 @@ - SELECT order_goods_id, order_id, goods_name, goods_num, server_goods_num, finish_time, create_by, create_time, remark + SELECT order_goods_id, order_id, goods_id, goods_name, goods_num, server_goods_num, + finish_time, create_by, create_time, update_by, update_time, remark FROM order_goods UPDATE order_goods - order_id = #{orderId}, - goods_id = #{goodsId}, + order_id = #{orderId}, + goods_id = #{goodsId}, goods_name = #{goodsName}, - goods_num = #{goodsNum}, - server_goods_num = #{serverGoodsNum}, - finish_time = #{finishTime}, + goods_num = #{goodsNum}, + server_goods_num = #{serverGoodsNum}, + finish_time = #{finishTime}, update_by = #{updateBy}, update_time = SYSDATE() @@ -42,21 +43,21 @@ INSERT INTO order_goods( - order_id, - goods_id, + order_id, + goods_id, goods_name, - goods_num, - server_goods_num, - finish_time, + goods_num, + server_goods_num, + finish_time, create_by, create_time )VALUES( - #{orderId}, - #{goodsId}, + #{orderId}, + #{goodsId}, #{goodsName}, - #{goodsNum}, - #{serverGoodsNum}, - #{finishTime}, + #{goodsNum}, + #{serverGoodsNum}, + #{finishTime}, #{createBy}, SYSDATE() ) @@ -65,14 +66,14 @@ @@ -87,7 +88,7 @@ - DELETE FROM order_goods WHERE id IN + DELETE FROM order_goods WHERE order_goods_id IN #{orderGoodsId} diff --git a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml index 43236f9b..55c34d69 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml @@ -6,6 +6,7 @@ + @@ -24,6 +25,7 @@ SELECT id, + dept_id, code, customer_id, order_type, @@ -42,22 +44,25 @@