Bladeren bron

门店供应链物品管理/记录

zhangkaikai 1 jaar geleden
bovenliggende
commit
dfb9d71003

+ 1 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelGoodsSettleMgrController.java

@@ -123,7 +123,7 @@ public class ChannelGoodsSettleMgrController extends BaseApiController {
     @PreAuthorize("@ss.hasPermi('business:order:push')")
     @ApiOperation(value = "推送结算订单")
     public AjaxResult settleOrder(@RequestBody PushChannelGoodsSettleParam settleVO) {
-        Long settleOrderId = settleOrderService.pushSettleOrder(settleVO);
+        String settleOrderId = settleOrderService.pushSettleOrder(settleVO);
         return AjaxResult.success(settleOrderId);
     }
 

+ 57 - 7
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelGoodsSettleController.java

@@ -1,14 +1,27 @@
 package com.qs.mp.web.controller.api.channel;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.channel.domain.ChannelGoodsOrder;
 import com.qs.mp.channel.domain.ChannelGoodsSettleOrder;
 import com.qs.mp.channel.domain.ChannelGoodsSettleOrderItem;
+import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.channel.domain.vo.ChannelGoodsSettleItem;
 import com.qs.mp.channel.domain.vo.ChannelSettleVO;
 import com.qs.mp.channel.service.IChannelGoodsSettleOrderItemService;
 import com.qs.mp.channel.service.IChannelGoodsSettleOrderService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.AppSourceEnum;
+import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.pay.service.IWalletService;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -16,11 +29,9 @@ import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -39,6 +50,12 @@ public class ChannelGoodsSettleController extends BaseApiController {
     @Autowired
     private IChannelGoodsSettleOrderItemService  settleOrderItemService;
 
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private IWalletService walletService;
+
     @Autowired
     private MapperFacade mapperFacade;
 
@@ -49,8 +66,12 @@ public class ChannelGoodsSettleController extends BaseApiController {
             @ApiResponse(code = 200, message = "成功", response = ChannelSettleVO.class)
     )
     public TableDataInfo list() {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
         startPage();
-        List<ChannelGoodsSettleOrder> list = settleOrderService.list();
+        List<ChannelGoodsSettleOrder> list = settleOrderService.list(new LambdaQueryWrapper<ChannelGoodsSettleOrder>()
+                .eq(ChannelGoodsSettleOrder::getChannelId, channelId)
+                .orderByAsc(ChannelGoodsSettleOrder::getStatus)
+                .orderByDesc(ChannelGoodsSettleOrder::getCreatedTime));
         List<ChannelSettleVO> channelSettleVOS = mapperFacade.mapAsList(list, ChannelSettleVO.class);
         return getDataTable(channelSettleVOS);
     }
@@ -60,11 +81,40 @@ public class ChannelGoodsSettleController extends BaseApiController {
     @ApiResponses(
             @ApiResponse(code = 200, message = "成功", response = ChannelSettleVO.class)
     )
-    public AjaxResult detail(@PathVariable Long orderId) {
+    public AjaxResult detail(@PathVariable String orderId) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
         ChannelGoodsSettleOrder settleOrder = settleOrderService.getById(orderId);
         ChannelSettleVO channelSettleVO = mapperFacade.map(settleOrder, ChannelSettleVO.class);
-        List<ChannelGoodsSettleOrderItem> items = settleOrderItemService.list(new LambdaQueryWrapper<ChannelGoodsSettleOrderItem>().eq(ChannelGoodsSettleOrderItem::getOrderId, orderId));
+        List<ChannelGoodsSettleOrderItem> items = settleOrderItemService.list(new LambdaQueryWrapper<ChannelGoodsSettleOrderItem>()
+                .eq(ChannelGoodsSettleOrderItem::getChannelId, channelId)
+                .eq(ChannelGoodsSettleOrderItem::getOrderId, orderId));
         channelSettleVO.setItems(items);
         return AjaxResult.success(channelSettleVO);
     }
+
+    @PostMapping("/settle/order/pay")
+    @ApiOperation("我的结算支付")
+    public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        String channelOpenId = "";
+        if (StringUtils.isNotBlank(param.getOpenId())) {
+            channelOpenId = param.getOpenId();
+        } else {
+            channelOpenId = sysUser.getChannelOpenId();
+        }
+        if (StringUtils.isBlank(channelOpenId)) {
+            return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+        }
+
+        ChannelGoodsSettleOrder channelGoodsOrder = settleOrderService.getById(param.getOrderId());
+        JSONObject jsonObject;
+        try {
+            jsonObject = walletService.pay(BizTypeEnum.CHANNEL_GOODS__SETTLE_ORDER, param.getOrderId(), channelOpenId, channelGoodsOrder.getSettleAmt(), channelGoodsOrder.getTitle(), AppSourceEnum.CHANNEL.getValue());
+        } catch (ServiceException e) {
+            LogUtil.error(logger, e, "门店采购商品结算订单创建支付单失败。userId:{0},orderId:{1}", new Object[]{userId, param.getOrderId()});
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.success(jsonObject);
+    }
 }

+ 1 - 0
mp-common/src/main/java/com/qs/mp/common/enums/BizTypeEnum.java

@@ -14,6 +14,7 @@ public enum BizTypeEnum implements IEnum<Integer> {
   TICKET_ORDER(2, "用户盲票购买订单"),
   DELIVER_ORDER(3, "用户提货订单"),
   CHANNEL_GOODS_ORDER(4, "门店商品采购订单"),
+  CHANNEL_GOODS__SETTLE_ORDER(5, "门店商品结算订单"),
   ;
 
 

+ 2 - 2
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoodsSettleOrder.java

@@ -25,8 +25,8 @@ public class ChannelGoodsSettleOrder implements Serializable {
         /**
      * 主键
      */
-         @TableId(value = "order_id", type = IdType.AUTO)
-    private Long orderId;
+         @TableId(value = "order_id", type = IdType.INPUT)
+    private String orderId;
 
         /**
      * 渠道ID

+ 1 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoodsSettleOrderItem.java

@@ -35,7 +35,7 @@ public class ChannelGoodsSettleOrderItem implements Serializable {
      * 订单ID
      */
          @TableField("order_id")
-    private Long orderId;
+    private String orderId;
 
         /**
      * 门店采购商品id

+ 14 - 1
mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsSettleOrderService.java

@@ -3,6 +3,7 @@ package com.qs.mp.channel.service;
 import com.qs.mp.channel.domain.ChannelGoodsSettleOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.channel.domain.param.PushChannelGoodsSettleParam;
+import com.qs.mp.pay.domain.PayOrder;
 
 /**
  * <p>
@@ -14,5 +15,17 @@ import com.qs.mp.channel.domain.param.PushChannelGoodsSettleParam;
  */
 public interface IChannelGoodsSettleOrderService extends IService<ChannelGoodsSettleOrder> {
 
-    Long pushSettleOrder(PushChannelGoodsSettleParam settleVO);
+    /**
+     * 推送结算订单
+     *
+     * @param settleVO
+     * @return
+     */
+    String pushSettleOrder(PushChannelGoodsSettleParam settleVO);
+
+    /**
+     * 支付成功回调
+     * @param payOrder
+     */
+    void paySuccess(PayOrder payOrder);
 }

+ 48 - 1
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsSettleOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qs.mp.channel.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.channel.domain.ChannelGoods;
@@ -13,6 +14,13 @@ import com.qs.mp.channel.service.IChannelGoodsSettleOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.common.enums.ChannelGoodsOrderSettleEnum;
 import com.qs.mp.common.enums.ChannelGoodsSettleStatusTypeEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.pay.domain.PayOrder;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -31,6 +39,8 @@ import java.util.List;
 @Service
 public class ChannelGoodsSettleOrderServiceImpl extends ServiceImpl<ChannelGoodsSettleOrderMapper, ChannelGoodsSettleOrder> implements IChannelGoodsSettleOrderService {
 
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
     @Autowired
     private IChannelGoodsService channelGoodsService;
 
@@ -40,11 +50,16 @@ public class ChannelGoodsSettleOrderServiceImpl extends ServiceImpl<ChannelGoods
     @Autowired
     private IChannelGoodsSettleOrderItemService settleOrderItemService;
 
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Long pushSettleOrder(PushChannelGoodsSettleParam settleVO) {
+    public String pushSettleOrder(PushChannelGoodsSettleParam settleVO) {
+        String orderId = bizIdGenerator.newId();
         List<ChannelGoods> channelGoodsList = channelGoodsService.list(new LambdaQueryWrapper<ChannelGoods>().eq(ChannelGoods::getOrderId, settleVO.getOrderId()));
         ChannelGoodsSettleOrder settleOrder = new ChannelGoodsSettleOrder();
+        settleOrder.setOrderId(orderId);
         settleOrder.setSettleNum(channelGoodsList.stream().mapToInt(ChannelGoods::getSettleQty).sum());
         Integer orderAmt = 0;
         for (ChannelGoods channelGoods : channelGoodsList) {
@@ -77,4 +92,36 @@ public class ChannelGoodsSettleOrderServiceImpl extends ServiceImpl<ChannelGoods
 
         return settleOrder.getOrderId();
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void paySuccess(PayOrder payOrder) {
+        ChannelGoodsSettleOrder settleOrder = getById(payOrder.getBizId());
+        if (null == settleOrder || settleOrder.getStatus() != ChannelGoodsOrderSettleEnum.NOT_PAY) {
+            LogUtil.error(logger, "支付回调渠道采购商品结算订单处理,订单状态异常,不是待支付。payOrder:{0}, settleOrder:{1}",
+                    JSONObject.toJSONString(payOrder), JSONObject.toJSONString(settleOrder));
+            throw new ServiceException("支付回调渠道采购商品结算订单处理,订单状态异常,不是待支付。orderId:" + payOrder.getBizId());
+        }
+        boolean rst = update(
+                new LambdaUpdateWrapper<ChannelGoodsSettleOrder>().set(ChannelGoodsSettleOrder::getStatus,
+                                ChannelGoodsOrderSettleEnum.FINISHED)
+                        .set(ChannelGoodsSettleOrder::getPayTime, DateUtils.parseDate(payOrder.getCompleteDate()))
+                        .eq(ChannelGoodsSettleOrder::getOrderId, settleOrder.getOrderId())
+                        .eq(ChannelGoodsSettleOrder::getStatus, ChannelGoodsOrderSettleEnum.NOT_PAY));
+        if (!rst) {
+            LogUtil.error(logger, "渠道采购商品结算订单支付成功时,更新订单状态失败。orderId:{0}",
+                    settleOrder.getOrderId());
+            throw new ServiceException("渠道采购商品订单结算支付成功时,更新订单状态失败");
+        }
+        boolean updateRst = channelGoodsService.update(new LambdaUpdateWrapper<ChannelGoods>()
+                .set(ChannelGoods::getStatus, ChannelGoodsSettleStatusTypeEnum.FINISHED)
+                .set(ChannelGoods::getSettleTime, DateUtils.parseDate(payOrder.getCompleteDate()))
+                .eq(ChannelGoods::getOrderId, settleOrder.getOrderId()));
+
+        if (!updateRst) {
+            LogUtil.error(logger, "更新门店采购商品信息失败。orderId:{0}",
+                    settleOrder.getOrderId());
+            throw new ServiceException("更新门店采购商品信息失败");
+        }
+    }
 }

+ 7 - 0
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -19,6 +19,7 @@ import com.eptok.yspay.opensdkjava.util.StringUtil;
 import com.eptok.yspay.opensdkjava.util.YsOnlineSignUtils;
 import com.qs.mp.channel.domain.ChannelWithdraw;
 import com.qs.mp.channel.service.IChannelGoodsOrderService;
+import com.qs.mp.channel.service.IChannelGoodsSettleOrderService;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelWithdrawService;
 import com.qs.mp.common.constant.YsPayMethodConstants;
@@ -103,6 +104,9 @@ public class WalletServiceImpl implements IWalletService {
   @Autowired
   private IChannelGoodsOrderService  channelGoodsOrderService;
 
+  @Autowired
+  private IChannelGoodsSettleOrderService settleOrderService;
+
   @Value("${pay.notifyUrl}")
   private String notifyUrl;  //支付成功前端跳转地址
   @Value("${pay.callbackUrl}")
@@ -561,6 +565,9 @@ public class WalletServiceImpl implements IWalletService {
     } else if (BizTypeEnum.CHANNEL_GOODS_ORDER == payOrder.getBizType()) {
       // 门店商品采购订单支付成功,调用业务订单服务处理
       channelGoodsOrderService.paySuccess(payOrder);
+    } else if (BizTypeEnum.CHANNEL_GOODS__SETTLE_ORDER == payOrder.getBizType()) {
+      // 门店商品采购结算订单支付成功,调用业务订单服务处理
+      settleOrderService.paySuccess(payOrder);
     } else if (BizTypeEnum.TICKET_ORDER == payOrder.getBizType()) {
       // 用户盲票购买订单支付成功,调用业务订单服务处理
       userTicketOrderService.paySuccess(payOrder);