소스 검색

订单支付

chunping 3 년 전
부모
커밋
ced2066d98

+ 3 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/PayCallBackController.java

@@ -65,7 +65,7 @@ public class PayCallBackController {
 
     //回调金额与订单金额一致性校验
     PayOrder order = payOrderService.getById(shopOrderNo);
-    if(order.getTransactionAmount() != payMoney){
+    if(order.getTransAmt() != payMoney){
       //Todo 告警
       logger.error("回调金额与订单金额不一致");
       responseWrite(response,"error");
@@ -76,10 +76,10 @@ public class PayCallBackController {
     payOrder.setOrderNo(orderNo);
     payOrder.setCompleteDate(completeDate);
     payOrder.setChannelNo(channelNo);
-    payOrder.setOrderstatus(orderStatus);
+    payOrder.setStatus(orderStatus);
     // 订单支付状态单独保存
     LambdaUpdateWrapper<PayOrder> updateWrapper = new LambdaUpdateWrapper<>();
-    updateWrapper.eq(PayOrder::getOrderstatus,2);
+    updateWrapper.eq(PayOrder::getStatus,2);
     updateWrapper.eq(PayOrder::getOrderId,shopOrderNo);
     boolean ret = payOrderService.update(payOrder,updateWrapper);
     if(ret){

+ 56 - 11
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java

@@ -10,6 +10,7 @@
 
 package com.qs.mp.web.controller.api.channel.mall;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.service.ITicketBoxService;
@@ -19,6 +20,7 @@ import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.param.ChannelCartParam;
 import com.qs.mp.channel.domain.param.ChannelOrderParam;
+import com.qs.mp.channel.domain.param.ChannelOrderPayParam;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
@@ -27,13 +29,17 @@ import com.qs.mp.channel.service.IChannelCartService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.domain.param.BatchLongIdsParam;
+import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import java.util.Collection;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -69,6 +75,14 @@ public class ChannelOrderController extends BaseApiController {
   @Autowired
   private MapperFacade mapperFacade;
 
+  @Autowired
+  private IWalletService walletService;
+
+  @Autowired
+  private RedisCache redisCache;
+
+  private final String CHANNEL_ORDER_CACHE_KEY = "channel_settle_order_";
+
   /**
    * 订单列表
    */
@@ -115,7 +129,7 @@ public class ChannelOrderController extends BaseApiController {
       List<ChannelCart> channelCarts = channelCartService.listByIds(param.getCartIds());
       for (ChannelCart channelCart : channelCarts) {
         TicketBox ticketBox = ticketBoxService.getById(channelCart.getBoxId());
-        orderAmt += ticketBox.getBoxSalePrice() * channelCart.getOrderNum();
+        orderAmt += ticketBox.getPkgSalePrice() * channelCart.getOrderNum();
         ChannelCartVO cartVO = mapperFacade.map(ticketBox, ChannelCartVO.class);
         cartVO.setCartId(channelCart.getCartId());
         cartVO.setOrderNum(channelCart.getOrderNum());
@@ -123,7 +137,7 @@ public class ChannelOrderController extends BaseApiController {
       }
     } else {
       TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
-      orderAmt += ticketBox.getBoxSalePrice() * param.getOrderNum();
+      orderAmt += ticketBox.getPkgSalePrice() * param.getOrderNum();
       ChannelCartVO cartVO = mapperFacade.map(ticketBox, ChannelCartVO.class);
       cartVO.setOrderNum(param.getOrderNum());
       orderSettleVO.getItems().add(cartVO);
@@ -133,21 +147,52 @@ public class ChannelOrderController extends BaseApiController {
     orderSettleVO.setPayAmt(orderAmt);
 
     // 缓存订单结算对象
-
+    redisCache.setCacheObject(CHANNEL_ORDER_CACHE_KEY + channelId, orderSettleVO, 10, TimeUnit.MINUTES);
     return AjaxResult.success(orderSettleVO);
   }
 
   /**
-   * 删除购物清单项
+   * 提交订单
    */
-  @PostMapping("/cart/remove")
-  @ApiOperation(value = "删除购物清单" , notes = "购物车里点删除")
-  public AjaxResult remove(@RequestBody BatchLongIdsParam param) {
-    boolean rtn = channelCartService.removeByIds(param.getIds());
-    if (!rtn) {
-      return AjaxResult.success("操作失败");
+  @PostMapping("/order/submit")
+  @ApiOperation(value = "提交订单" , notes = "在订单确认页面提交")
+  public AjaxResult submit(@RequestBody ChannelOrder order) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    ChannelOrderSettleVO orderSettleVO = redisCache.getCacheObject(CHANNEL_ORDER_CACHE_KEY + channelId);
+    if (null == orderSettleVO) {
+      return AjaxResult.error("订单已过期,请重新下单");
     }
-    return AjaxResult.error("操作成功");
+    if (null == orderSettleVO.getAddr()) {
+      return AjaxResult.error("收货地址缺失,请重新下单");
+    }
+    String orderId = channelOrderService.submitOrder(channelId, order.getMemo(), orderSettleVO);
+
+    // 清除缓存的订单
+    redisCache.deleteObject(CHANNEL_ORDER_CACHE_KEY + channelId);
+
+    return AjaxResult.success(orderId);
   }
 
+  /**
+   * 取消订单
+   */
+  @PostMapping("/order/cancel")
+  @ApiOperation(value = "取消订单" , notes = "在订单列表页面取消")
+  public AjaxResult cancel(@RequestBody ChannelOrder order) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    channelOrderService.cancelOrder(channelId, order.getOrderId());
+    return AjaxResult.success("取消成功");
+  }
+
+  /**
+   * 订单支付
+   */
+  @PostMapping("/order/pay")
+  @ApiOperation(value = "订单支付" , notes = "在订单列表页面支付")
+  public AjaxResult pay(@RequestBody ChannelOrderPayParam param) {
+    String openId = SecurityUtils.getLoginUser().getUser().getOpenId();
+    ChannelOrder channelOrder = channelOrderService.getById(param.getOrderId());
+    JSONObject jsonObject = walletService.channelPay(BizTypeEnum.CHANNEL_ORDER, param.getOrderId(), openId, channelOrder.getPayAmt());
+    return AjaxResult.success(jsonObject);
+  }
 }

+ 4 - 3
mp-common/src/main/java/com/qs/mp/common/enums/PayOrderTypeEnum.java → mp-common/src/main/java/com/qs/mp/common/enums/BizTypeEnum.java

@@ -7,15 +7,16 @@ import com.baomidou.mybatisplus.annotation.IEnum;
  * 支付订单枚举类型
  *
  */
-public enum PayOrderTypeEnum implements IEnum<Integer> {
+public enum BizTypeEnum implements IEnum<Integer> {
 
-  ORDER_MERCH_RECHARGE(1, "商户充值");
+  CHANNEL_ORDER(1, "渠道订单"),
+  USER_ORDER(2, "用户订单");
 
 
   private final int value;
   private final String desc;
 
-  PayOrderTypeEnum(final int value, final String desc) {
+  BizTypeEnum(final int value, final String desc) {
     this.value = value;
     this.desc = desc;
   }

+ 18 - 6
mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java

@@ -77,14 +77,14 @@ public class TicketBox implements Serializable {
   /**
    * 盲票包原价
    */
-  @TableField("box_price")
-  private Integer boxPrice;
+  @TableField("pkg_price")
+  private Integer pkgPrice;
 
   /**
    * 盲票包售价
    */
-  @TableField("box_sale_price")
-  private Integer boxSalePrice;
+  @TableField("pkg_sale_price")
+  private Integer pkgSalePrice;
 
   /**
    * 每包盲票张数
@@ -131,8 +131,20 @@ public class TicketBox implements Serializable {
   /**
    * 上架时间
    */
-  @TableField("puton_time")
-  private Date putonTime;
+  @TableField("on_time")
+  private Date onTime;
+
+  /**
+   * 下架时间
+   */
+  @TableField("off_time")
+  private Date offTime;
+
+  /**
+   * 人工下架标识
+   */
+  @TableField("manual_off")
+  private Integer manualOff;
 
   /**
    * 状态,上架/下架

+ 20 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelOrderPayParam.java

@@ -0,0 +1,20 @@
+package com.qs.mp.channel.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.List;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+@ApiModel(value= "订单支付参数")
+@Data
+public class ChannelOrderPayParam {
+
+	@NotNull(message = "订单ID不能为空")
+	@ApiModelProperty(value = "订单ID",required=true)
+	private String orderId;
+
+	@NotNull(message = "支付方式不能为空")
+	@ApiModelProperty(value = "支付方式",required=true)
+	private Integer payType;
+}

+ 17 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java

@@ -2,6 +2,7 @@ package com.qs.mp.channel.service;
 
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 
 /**
  * <p>
@@ -13,4 +14,20 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IChannelOrderService extends IService<ChannelOrder> {
 
+  /**
+   * 提交订单
+   * @param channelId
+   * @param memo
+   * @param orderSettleVO
+   * @return
+   */
+  String submitOrder(Long channelId, String memo, ChannelOrderSettleVO orderSettleVO);
+
+  /**
+   * 取消订单
+   * @param channelId
+   * @param orderId
+   * @return
+   */
+  boolean cancelOrder(Long channelId, String orderId);
 }

+ 117 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -1,10 +1,28 @@
 package com.qs.mp.channel.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.channel.domain.ChannelAddr;
 import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderItem;
+import com.qs.mp.channel.domain.vo.ChannelCartVO;
+import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.channel.mapper.ChannelOrderMapper;
+import com.qs.mp.channel.service.IChannelAddrService;
+import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.common.enums.ChannelOrderStatusEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import java.util.ArrayList;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <p>
@@ -17,4 +35,103 @@ import org.springframework.stereotype.Service;
 @Service
 public class ChannelOrderServiceImpl extends ServiceImpl<ChannelOrderMapper, ChannelOrder> implements IChannelOrderService {
 
+  @Autowired
+  private BizIdGenerator bizIdGenerator;
+
+  @Autowired
+  private IChannelAddrService channelAddrService;
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private IChannelOrderItemService channelOrderItemService;
+
+  @Autowired
+  private IChannelOrderService channelOrderService;
+
+  @Override
+  @Transactional
+  public String submitOrder(Long channelId, String memo, ChannelOrderSettleVO orderSettleVO) {
+    ChannelAddr addr = orderSettleVO.getAddr();
+    String orderId = bizIdGenerator.newId();
+    int prodNum = 0;
+    StringBuilder title = new StringBuilder();
+    // 创建订单明细
+    List<ChannelOrderItem> orderItemList = new ArrayList<>();
+    for (ChannelCartVO channelCartVO : orderSettleVO.getItems()) {
+      TicketBox ticketBox = ticketBoxService.getById(channelCartVO.getBoxId());
+      if (ticketBox.getSalePkgQty() + channelCartVO.getOrderNum() > ticketBox.getPkgQty()) {
+        throw new ServiceException(ticketBox.getTitle() + "库存不足,请重新下单");
+      }
+      ChannelOrderItem item = new ChannelOrderItem();
+      item.setOrderId(orderId);
+      item.setChannelId(channelId);
+      item.setTitle(ticketBox.getTitle());
+      item.setPicUrl(ticketBox.getPicUrl());
+      item.setBoxId(channelCartVO.getBoxId());
+      item.setProperties(ticketBox.getProperties());
+      item.setFacePrice(ticketBox.getFacePrice());
+      item.setOrderNum(channelCartVO.getOrderNum());
+      item.setPkgSalePrice(ticketBox.getPkgSalePrice());
+      orderItemList.add(item);
+      // 累计商品数,拼接标题
+      prodNum += channelCartVO.getOrderNum();
+      title.append(ticketBox.getTitle()).append(",");
+      // 更新盲票组的已销售数和状态,乐观锁
+      ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
+          .set(ticketBox.getPkgSalePrice() + channelCartVO.getOrderNum() == ticketBox.getPkgQty(), TicketBox::getStatus,
+              TicketBoxStatusEnum.PUT_OFF)
+          .set(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty() + channelCartVO.getOrderNum())
+          .eq(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty()).eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+    }
+
+    // 创建订单
+    ChannelOrder channelOrder = new ChannelOrder();
+    channelOrder.setOrderId(orderId);
+    channelOrder.setChannelId(channelId);
+    channelOrder.setTitle(title.substring(0, title.length() - 1));
+    channelOrder.setOrderAmt(orderSettleVO.getOrderAmt());
+    channelOrder.setDiscountAmt(orderSettleVO.getDiscountAmt());
+    channelOrder.setFreightAmt(orderSettleVO.getFreightAmt());
+    channelOrder.setPayAmt(orderSettleVO.getPayAmt());
+    channelOrder.setStatus(ChannelOrderStatusEnum.NOT_PAY);
+    channelOrder.setProdNum(prodNum);
+    channelOrder.setMemo(memo);
+    channelOrder.setReceiver(addr.getReceiver());
+    channelOrder.setTel(addr.getMobile());
+    channelOrder.setProvince(addr.getProvince());
+    channelOrder.setCity(addr.getCity());
+    channelOrder.setArea(addr.getArea());
+    channelOrder.setAddress(addr.getAddr());
+
+    channelOrderService.save(channelOrder);
+    channelOrderItemService.saveBatch(orderItemList);
+    return channelOrder.getOrderId();
+  }
+
+  @Override
+  @Transactional
+  public boolean cancelOrder(Long channelId, String orderId) {
+    ChannelOrder channelOrder = channelOrderService.getOne(new LambdaQueryWrapper<ChannelOrder>()
+        .eq(ChannelOrder::getChannelId, channelId).eq(ChannelOrder::getOrderId, orderId));
+    if (channelOrder.getStatus() != ChannelOrderStatusEnum.NOT_PAY) {
+      throw new ServiceException("订单状态异常,不能取消");
+    }
+
+    List<ChannelOrderItem> orderItemList = channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
+        .eq(ChannelOrderItem::getOrderId, orderId));
+    for (ChannelOrderItem orderItem : orderItemList) {
+      TicketBox ticketBox = ticketBoxService.getById(orderItem.getBoxId());
+      // 恢复盲票组的已销售数和状态,乐观锁
+      ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
+          .set(ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF && ticketBox.getManualOff() != 1, TicketBox::getStatus,
+              TicketBoxStatusEnum.PUT_ON)
+          .set(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty() - orderItem.getOrderNum())
+          .eq(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty()).eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+    }
+    channelOrderService.update(new LambdaUpdateWrapper<ChannelOrder>().set(ChannelOrder::getStatus, ChannelOrderStatusEnum.CANCELED)
+        .eq(ChannelOrder::getOrderId, orderId));
+    return true;
+  }
 }

+ 24 - 29
mp-service/src/main/java/com/qs/mp/pay/domain/PayOrder.java

@@ -4,16 +4,17 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.qs.mp.common.enums.BizTypeEnum;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
 
 /**
  * @describe 支付订单表实体类
- * @auther ygp
- * @create 2021-09-11 08:43:10
+ * @auther quanshu
+ * @create 2022-03-03 21:28:15
  */
-@TableName("qs_pay_order")
+@TableName("mp_pay_order")
 @Data
 public class PayOrder implements Serializable {
 
@@ -22,26 +23,20 @@ public class PayOrder implements Serializable {
   /**
    * 订单ID
    */
-  @TableId(value = "order_id", type = IdType.INPUT)
+  @TableId(value = "order_id" , type = IdType.INPUT)
   private String orderId;
 
   /**
-   * 客户ID
+   * 订单类型,1:渠道订单,2用户订单
    */
-  @TableField("cust_id")
-  private String custId;
+  @TableField("biz_type")
+  private BizTypeEnum bizType;
 
   /**
-   * 订单类型,1:商户充值,2:商户订单支付
+   * 业务单据ID,例如:渠道订单关联的渠道订单ID
    */
-  @TableField("order_type")
-  private Integer orderType;
-
-  /**
-   * 类型单据关联对象属性ID,例如:商户充值订单关联,商户ID
-   */
-  @TableField("order_type_ref_id")
-  private String orderTypeRefId;
+  @TableField("biz_id")
+  private String bizId;
 
   /**
    * 支付订单编号,三方支付订单编号
@@ -50,16 +45,16 @@ public class PayOrder implements Serializable {
   private String orderNo;
 
   /**
-   * 订单产生时间2018-07-25 10:10:28
+   * 订单产生时间
    */
   @TableField("order_time")
   private String orderTime;
 
   /**
-   * 支付来源 1:支付宝  2:微信支付 5:云闪付
+   * 支付方式 1:微信  2:支付宝 3:云闪付
    */
-  @TableField("pay_resource")
-  private String payResource;
+  @TableField("pay_type")
+  private Integer payType;
 
   /**
    * 1004:支付宝CTB;1008:微信公众号(需要绑定支付目录)1014: 支付宝服务窗1016:云闪付CTB1017:微信小程序1019:支付宝小程序(请用1014编码)
@@ -70,26 +65,26 @@ public class PayOrder implements Serializable {
   /**
    * 交易金额,以分为单位
    */
-  @TableField("transaction_amount")
-  private Integer transactionAmount;
+  @TableField("trans_amt")
+  private Integer transAmt;
 
   /**
    * 订单备注 长度 100
    */
-  @TableField("order_remark")
-  private String orderRemark;
+  @TableField("remark")
+  private String remark;
 
   /**
    * 订单名称,如:充值,租赁仓库,采购设备等
    */
-  @TableField("order_name")
-  private String orderName;
+  @TableField("title")
+  private String title;
 
   /**
    * 订单状态码
    */
-  @TableField("orderstatus")
-  private String orderstatus;
+  @TableField("status")
+  private String status;
 
   /**
    * 返回状态码
@@ -128,4 +123,4 @@ public class PayOrder implements Serializable {
   private Date gmtModified;
 
 
-}
+}

+ 3 - 3
mp-service/src/main/java/com/qs/mp/pay/mapper/PayOrderMapper.java

@@ -1,11 +1,11 @@
 package com.qs.mp.pay.mapper;
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qs.mp.pay.domain.PayOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
- * @auther ygp
- * @create 2021-09-11 08:43:10
+ * @auther quanshu
+ * @create 2022-03-03 21:28:15
  * @describe 支付订单表mapper类
  */
 public interface PayOrderMapper extends BaseMapper<PayOrder> {

+ 4 - 4
mp-service/src/main/java/com/qs/mp/pay/service/IPayOrderService.java

@@ -1,16 +1,16 @@
 package com.qs.mp.pay.service;
 
-import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.pay.domain.PayOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
  * <p>
  * 支付订单表 服务类
  * </p>
  *
- * @author ygp
- * @since 2021-09-11
+ * @author quanshu
+ * @since 2022-03-03
  */
 public interface IPayOrderService extends IService<PayOrder> {
-  boolean merchRecharge(PayOrder payOrder);
+
 }

+ 15 - 8
mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java

@@ -1,6 +1,8 @@
 package com.qs.mp.pay.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.pay.domain.PayOrder;
 
 /**
  * @auther duota
@@ -8,13 +10,16 @@ import com.alibaba.fastjson.JSONObject;
  * @describe
  */
 public interface IWalletService {
+
   /**
-   * 账户充值
-   * @param merchId
-   * @param money 单位分
+   * 渠道订单支付
+   * @param bizType
+   * @param bizId
+   * @param openId
+   * @param money
    * @return
    */
-  public JSONObject merchRechargeOrderCreate(String custId,String merchId,String refType,String refId, String userId,int money);
+  JSONObject channelPay(BizTypeEnum bizType, String bizId, String openId, int money);
 
   /**
    *
@@ -22,7 +27,7 @@ public interface IWalletService {
    * @param orderNo
    * @return
    */
-  public void payOrderStatusHandle(String orderNo);
+  void payOrderStatusHandle(String orderNo);
 
   /**
    * 账户提现
@@ -30,7 +35,7 @@ public interface IWalletService {
    * @param money
    * @return
    */
-  public boolean drawings(String merchId,int money);
+  boolean drawings(String merchId,int money);
 
   /**
    * 账户提现申请
@@ -38,13 +43,15 @@ public interface IWalletService {
    * @param money 单位分
    * @return
    */
-  public boolean drawingsApply(String merchId,int money);
+  boolean drawingsApply(String merchId,int money);
 
   /**
    * 提现申请完成,充值冻结资金
    * @param merchId
    * @return
    */
-  public boolean completeDrawingsApply(String merchId);
+  boolean completeDrawingsApply(String merchId);
+
+  boolean merchRecharge(PayOrder payOrder);
 
 }

+ 4 - 79
mp-service/src/main/java/com/qs/mp/pay/service/impl/PayOrderServiceImpl.java

@@ -1,95 +1,20 @@
 package com.qs.mp.pay.service.impl;
 
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.pay.mapper.PayOrderMapper;
 import com.qs.mp.pay.service.IPayOrderService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <p>
  * 支付订单表 服务实现类
  * </p>
  *
- * @author ygp
- * @since 2021-09-11
+ * @author quanshu
+ * @since 2022-03-03
  */
 @Service
-public class PayOrderServiceImpl extends ServiceImpl<PayOrderMapper, PayOrder> implements
-    IPayOrderService {
-
-  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+public class PayOrderServiceImpl extends ServiceImpl<PayOrderMapper, PayOrder> implements IPayOrderService {
 
-  @Override
-  @Transactional
-  public boolean merchRecharge(PayOrder payOrder) {
-    /*String merchId = payOrder.getOrderTypeRefId();
-    String orderNo = payOrder.getOrderNo();
-    //根据订单类型,查询商户ID
-    if(PayOrderTypeEnum.ORDER_MRARCH_BILL.getValue() == payOrder.getOrderType().intValue()){
-      //商户支付订单,查询商户信息
-      MerchantBill merchantBill = merchantBillService.getById(payOrder.getOrderTypeRefId());
-      if(merchantBill == null){
-        LogUtil.error(logger,"账单不存在.billId:"+payOrder.getOrderTypeRefId());
-        return false;
-      }
-      merchId = merchantBill.getMerchId();
-    }
-    //查询资金流水表,是否存在重复订单号
-    LambdaQueryWrapper<MerchantMoneyLog> logWrapper = new LambdaQueryWrapper<>();
-    logWrapper.eq(MerchantMoneyLog::getRefId, orderNo);
-    logWrapper.eq(MerchantMoneyLog::getMerchId, merchId);
-    logWrapper.eq(MerchantMoneyLog::getRefType, payOrder.getOrderType());
-    List<MerchantMoneyLog> logList = merchantMoneyLogService.list(logWrapper);
-    if (logList.size() == 0) {
-      Merchant merchant = merchantService.getById(merchId);
-      if(null == merchant){
-        LogUtil.error(logger,"商户不存在.merchId:"+merchId);
-        return false;
-      }
-      MerchantMoneyLog merchantMoneyLog = new MerchantMoneyLog();
-      merchantMoneyLog.setBizTime(
-          DateUtils.parseStrToDate(payOrder.getCompleteDate(), DateUtils.YYYY_MM_DD_HH_MM_SS));
-      merchantMoneyLog.setMerchId(merchId); //商户ID
-      merchantMoneyLog.setType(MerchantMoneyEnum.TYPE_RECHARGE);
-      merchantMoneyLog.setCustId(payOrder.getCustId());  //客户ID
-      merchantMoneyLog.setStoreId(merchant.getStoreId());
-      merchantMoneyLog.setLogMoney(payOrder.getTransactionAmount());  //交易金额
-      merchantMoneyLog.setRefId(payOrder.getOrderId()); //订单ID,全局唯一
-      merchantMoneyLog.setRefType(payOrder.getOrderType()); //单据类型
-      boolean result = merchantMoneyLogService.changeMerchantMoney(merchantMoneyLog);
-      Customer customer = customerService.getById(merchantMoneyLog.getCustId());
-      // 客户中配置了提现卡号,则认为是充值到了平台账户
-      if (null != customer && StringUtils.isNotBlank(customer.getBankCardNo())) {
-        CustomerMoneyLog customerMoneyLog = new CustomerMoneyLog();
-        customerMoneyLog.setBizTime(merchantMoneyLog.getBizTime());
-        customerMoneyLog.setType(CustomerMoneyTypeEnum.MERCH_RECHARGE);
-        customerMoneyLog.setCustId(merchantMoneyLog.getCustId());
-        customerMoneyLog.setLogMoney(merchantMoneyLog.getLogMoney());
-        customerMoneyLog.setIncomeExpense(MerchantMoneyEnum.INCOME);
-        customerMoneyLog.setRefId(payOrder.getOrderId());
-        customerMoneyLog.setRefType(CustomerMoneyTypeEnum.MERCH_RECHARGE.getValue());
-        Store store = storeService.getById(merchant.getStoreId());
-        customerMoneyLog.setLogText(merchant.getBrand() + "-" + store.getName());
-        customerMoneyLogService.changeCustomerMoney(customerMoneyLog);
-      }
-      if (result) {
-        //充值成功,给订阅者发送消息
-        try {
-          pulsarClientService.producer(MqTopicType.merch_recharge, JSONObject.toJSONString(merchantMoneyLog));
-        } catch (PulsarClientException e) {
-          LogUtil.error(logger,"发送异步消息失败.",e);
-        }
-        return true;
-      }
-    }else{
-      //Todo 数据结构异常,告警
-      LogUtil.error(logger,"数据结构异常,违反唯一约束,orderNo:"+orderNo);
-      return false;
-    }*/
-    return false;
-  }
 }

+ 81 - 21
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -1,8 +1,7 @@
 package com.qs.mp.pay.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.qs.mp.common.enums.PayOrderTypeEnum;
+import com.qs.mp.common.enums.BizTypeEnum;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
@@ -11,13 +10,13 @@ import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.pay.service.IPayOrderService;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.system.service.id.BizIdGenerator;
-import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @auther duota
@@ -54,15 +53,10 @@ public class WalletServiceImpl implements IWalletService {
   private static final String PAY_RESOURCE_TYPE = "1017"; //2:微信小程序
 
   @Override
-  public JSONObject merchRechargeOrderCreate(String custId,String merchId,String refType,String refId,String openId, int money) {
+  public JSONObject channelPay(BizTypeEnum bizType, String bizId, String openId, int money) {
     String reqUrl = baseUrl+"/pay/payMoneyCTB";
     JSONObject params = new JSONObject();
-    //merchid不为空,则为商户充值,如果merchid为空,则为客户充值
-    //查询客户三方支付信息
-      // 客户充值的商户号和签名为平台
-      params = buildPayOrderReqData(payShopNo, paySign, money, openId);
-
-
+    params = buildPayOrderReqData(payShopNo, paySign, money, openId);
     String result = OkHttpUtil.postJsonParams(reqUrl,params.toJSONString());
     logger.info("request params:"+ params.toJSONString()+"  result:"+result);
     if(StringUtils.isBlank(result)){
@@ -79,20 +73,15 @@ public class WalletServiceImpl implements IWalletService {
       PayOrder payOrder = buildPayOrder(params);
       payOrder.setOrderId(resultJson.getString("shop_order_no"));
       payOrder.setOrderNo(orderNo);
-      payOrder.setCustId(custId);
       payOrder.setCode(code);
-      //logger.info("++++++++++++++++++++++++++++++++order type:"+OrderTypeEnum.ORDER_MERCH_RECHARGE.getValue().intValue());
-      //payOrder.setOrderType(OrderTypeEnum.ORDER_MERCH_RECHARGE.getValue());
-      if(!StringUtils.isBlank(refType) && refType.equalsIgnoreCase(String.valueOf(PayOrderTypeEnum.ORDER_MERCH_RECHARGE.getValue()))){
-        payOrder.setOrderType(PayOrderTypeEnum.ORDER_MERCH_RECHARGE.getValue()); //商户账单支付
-        payOrder.setOrderTypeRefId(refId);
-      }
-      payOrder.setOrderstatus(orderstatus);
+      payOrder.setBizType(bizType);
+      payOrder.setBizId(bizId);
+      payOrder.setStatus(orderstatus);
       boolean ret = payOrderService.save(payOrder);
       if(ret){
         return data;
       }else{
-        LogUtil.error(logger,"充值订单数据库保存失败.");
+        LogUtil.error(logger,"渠道支付订单数据库保存失败.");
       }
     }
     return null;
@@ -103,7 +92,7 @@ public class WalletServiceImpl implements IWalletService {
   public void payOrderStatusHandle(String orderNo) {
     //查询统一支付订单表,查询订单类型,然后根据不同类型做对应的逻辑处理
     //查询支付状态为1:支付成功,2:订单创建成功,等待支付。
-    LambdaQueryWrapper<PayOrder> wrapper = new LambdaQueryWrapper();
+    /*LambdaQueryWrapper<PayOrder> wrapper = new LambdaQueryWrapper();
     wrapper.eq(PayOrder::getOrderId,orderNo);
     wrapper.eq(PayOrder::getOrderstatus,"1");
     List<PayOrder> payOrderList = payOrderService.list(wrapper);
@@ -121,7 +110,7 @@ public class WalletServiceImpl implements IWalletService {
     else{
       //数据结构异常,告警
       LogUtil.error(logger,"该业务单据类型未支持,orderNo:"+orderNo);
-    }
+    }*/
 }
 
 
@@ -170,4 +159,75 @@ public class WalletServiceImpl implements IWalletService {
     sendData.put("app_id", appId);
     return sendData;
   }
+
+
+  @Override
+  @Transactional
+  public boolean merchRecharge(PayOrder payOrder) {
+    /*String merchId = payOrder.getOrderTypeRefId();
+    String orderNo = payOrder.getOrderNo();
+    //根据订单类型,查询商户ID
+    if(PayOrderTypeEnum.ORDER_MRARCH_BILL.getValue() == payOrder.getOrderType().intValue()){
+      //商户支付订单,查询商户信息
+      MerchantBill merchantBill = merchantBillService.getById(payOrder.getOrderTypeRefId());
+      if(merchantBill == null){
+        LogUtil.error(logger,"账单不存在.billId:"+payOrder.getOrderTypeRefId());
+        return false;
+      }
+      merchId = merchantBill.getMerchId();
+    }
+    //查询资金流水表,是否存在重复订单号
+    LambdaQueryWrapper<MerchantMoneyLog> logWrapper = new LambdaQueryWrapper<>();
+    logWrapper.eq(MerchantMoneyLog::getRefId, orderNo);
+    logWrapper.eq(MerchantMoneyLog::getMerchId, merchId);
+    logWrapper.eq(MerchantMoneyLog::getRefType, payOrder.getOrderType());
+    List<MerchantMoneyLog> logList = merchantMoneyLogService.list(logWrapper);
+    if (logList.size() == 0) {
+      Merchant merchant = merchantService.getById(merchId);
+      if(null == merchant){
+        LogUtil.error(logger,"商户不存在.merchId:"+merchId);
+        return false;
+      }
+      MerchantMoneyLog merchantMoneyLog = new MerchantMoneyLog();
+      merchantMoneyLog.setBizTime(
+          DateUtils.parseStrToDate(payOrder.getCompleteDate(), DateUtils.YYYY_MM_DD_HH_MM_SS));
+      merchantMoneyLog.setMerchId(merchId); //商户ID
+      merchantMoneyLog.setType(MerchantMoneyEnum.TYPE_RECHARGE);
+      merchantMoneyLog.setCustId(payOrder.getCustId());  //客户ID
+      merchantMoneyLog.setStoreId(merchant.getStoreId());
+      merchantMoneyLog.setLogMoney(payOrder.getTransactionAmount());  //交易金额
+      merchantMoneyLog.setRefId(payOrder.getOrderId()); //订单ID,全局唯一
+      merchantMoneyLog.setRefType(payOrder.getOrderType()); //单据类型
+      boolean result = merchantMoneyLogService.changeMerchantMoney(merchantMoneyLog);
+      Customer customer = customerService.getById(merchantMoneyLog.getCustId());
+      // 客户中配置了提现卡号,则认为是充值到了平台账户
+      if (null != customer && StringUtils.isNotBlank(customer.getBankCardNo())) {
+        CustomerMoneyLog customerMoneyLog = new CustomerMoneyLog();
+        customerMoneyLog.setBizTime(merchantMoneyLog.getBizTime());
+        customerMoneyLog.setType(CustomerMoneyTypeEnum.MERCH_RECHARGE);
+        customerMoneyLog.setCustId(merchantMoneyLog.getCustId());
+        customerMoneyLog.setLogMoney(merchantMoneyLog.getLogMoney());
+        customerMoneyLog.setIncomeExpense(MerchantMoneyEnum.INCOME);
+        customerMoneyLog.setRefId(payOrder.getOrderId());
+        customerMoneyLog.setRefType(CustomerMoneyTypeEnum.MERCH_RECHARGE.getValue());
+        Store store = storeService.getById(merchant.getStoreId());
+        customerMoneyLog.setLogText(merchant.getBrand() + "-" + store.getName());
+        customerMoneyLogService.changeCustomerMoney(customerMoneyLog);
+      }
+      if (result) {
+        //充值成功,给订阅者发送消息
+        try {
+          pulsarClientService.producer(MqTopicType.merch_recharge, JSONObject.toJSONString(merchantMoneyLog));
+        } catch (PulsarClientException e) {
+          LogUtil.error(logger,"发送异步消息失败.",e);
+        }
+        return true;
+      }
+    }else{
+      //Todo 数据结构异常,告警
+      LogUtil.error(logger,"数据结构异常,违反唯一约束,orderNo:"+orderNo);
+      return false;
+    }*/
+    return false;
+  }
 }

+ 0 - 1
mp-service/src/main/java/com/qs/mp/system/service/id/BizIdGenerator.java

@@ -24,7 +24,6 @@ public class BizIdGenerator {
      * 长度20位
      * @return
      */
-    @Deprecated
     public String newId(){
         return String.valueOf(bizIdWorker.nextId());
     }

+ 6 - 4
mp-service/src/main/resources/mapper/admin/TicketBoxMapper.xml

@@ -12,8 +12,8 @@
         <result column="type" property="type" />
         <result column="quantity" property="quantity" />
         <result column="sale_qty" property="saleQty" />
-        <result column="box_price" property="boxPrice" />
-        <result column="box_sale_price" property="boxSalePrice" />
+        <result column="pkg_price" property="pkgPrice" />
+        <result column="pkg_sale_price" property="pkgSalePrice" />
         <result column="pkg_unit" property="pkgUnit" />
         <result column="pkg_qty" property="pkgQty" />
         <result column="sale_pkg_qty" property="salePkgQty" />
@@ -21,7 +21,9 @@
         <result column="sale_price" property="salePrice" />
         <result column="sale_comm_rate" property="saleCommRate" />
         <result column="properties" property="properties" />
-        <result column="puton_time" property="putonTime" />
+        <result column="on_time" property="onTime" />
+        <result column="off_time" property="offTime" />
+        <result column="manual_off" property="manualOff" />
         <result column="status" property="status" />
         <result column="is_deleted" property="isDeleted" />
         <result column="created_time" property="createdTime" />
@@ -30,7 +32,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        box_id, title, pic_url, category_id, description, type, quantity, sale_qty, box_price, box_sale_price, pkg_unit, pkg_qty, sale_pkg_qty, face_price, sale_price, sale_comm_rate, properties, puton_time, status, is_deleted, created_time, updated_time
+        box_id, title, pic_url, category_id, description, type, quantity, sale_qty, pkg_price, pkg_sale_price, pkg_unit, pkg_qty, sale_pkg_qty, face_price, sale_price, sale_comm_rate, properties, on_time, off_time, manual_off, status, is_deleted, created_time, updated_time
     </sql>
 
 </mapper>

+ 8 - 9
mp-service/src/main/resources/mapper/pay/PayOrderMapper.xml

@@ -5,17 +5,16 @@
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.qs.mp.pay.domain.PayOrder">
         <id column="order_id" property="orderId" />
-        <result column="cust_id" property="custId" />
-        <result column="order_type" property="orderType" />
-        <result column="order_type_ref_id" property="orderTypeRefId" />
+        <result column="biz_type" property="bizType" />
+        <result column="biz_id" property="bizId" />
         <result column="order_no" property="orderNo" />
         <result column="order_time" property="orderTime" />
-        <result column="pay_resource" property="payResource" />
+        <result column="pay_type" property="payType" />
         <result column="trans_type_code" property="transTypeCode" />
-        <result column="transaction_amount" property="transactionAmount" />
-        <result column="order_remark" property="orderRemark" />
-        <result column="order_name" property="orderName" />
-        <result column="orderstatus" property="orderstatus" />
+        <result column="trans_amt" property="transAmt" />
+        <result column="remark" property="remark" />
+        <result column="title" property="title" />
+        <result column="status" property="status" />
         <result column="code" property="code" />
         <result column="result" property="result" />
         <result column="complete_date" property="completeDate" />
@@ -26,7 +25,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        order_id, cust_id, order_type, order_type_ref_id, order_no, order_time, pay_resource, trans_type_code, transaction_amount, order_remark, order_name, orderstatus, code, result, complete_date, channel_no, gmt_created, gmt_modified
+        order_id, biz_type, biz_id, order_no, order_time, pay_type, trans_type_code, trans_amt, remark, title, status, code, result, complete_date, channel_no, gmt_created, gmt_modified
     </sql>
 
 </mapper>