Pārlūkot izejas kodu

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

zhangkaikai 1 gadu atpakaļ
vecāks
revīzija
f6e3184dc2
30 mainītis faili ar 1497 papildinājumiem un 7 dzēšanām
  1. 82 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelGoodsOrderMgrController.java
  2. 73 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelGoodsController.java
  3. 317 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelGoodsOrderController.java
  4. 3 1
      mp-common/src/main/java/com/qs/mp/common/enums/BizTypeEnum.java
  5. 51 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelGoodsOrderStatusEnum.java
  6. 3 1
      mp-common/src/main/java/com/qs/mp/common/enums/CouponTypeEnum.java
  7. 1 1
      mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java
  8. 17 1
      mp-service/src/main/java/com/qs/mp/admin/domain/Goods.java
  9. 45 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelGoodsOrderQueryParam.java
  10. 1 1
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponParam.java
  11. 10 1
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GoodsParam.java
  12. 9 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GoodsVO.java
  13. 201 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoodsOrder.java
  14. 93 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoodsOrderItem.java
  15. 26 0
      mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelGoodsOrderParam.java
  16. 18 0
      mp-service/src/main/java/com/qs/mp/channel/domain/param/SiteGoodsQueryParam.java
  17. 25 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderInfoVO.java
  18. 20 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderItemVO.java
  19. 60 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderSettleVO.java
  20. 24 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderVO.java
  21. 20 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelGoodsOrderItemMapper.java
  22. 20 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelGoodsOrderMapper.java
  23. 24 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsOrderItemService.java
  24. 57 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsOrderService.java
  25. 25 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsOrderItemServiceImpl.java
  26. 184 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsOrderServiceImpl.java
  27. 3 1
      mp-service/src/main/java/com/qs/mp/framework/redis/RedisKey.java
  28. 7 0
      mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java
  29. 33 0
      mp-service/src/main/resources/mapper/channel/ChannelGoodsOrderItemMapper.xml
  30. 45 0
      mp-service/src/main/resources/mapper/channel/ChannelGoodsOrderMapper.xml

+ 82 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelGoodsOrderMgrController.java

@@ -0,0 +1,82 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.param.ChannelGoodsOrderQueryParam;
+import com.qs.mp.channel.domain.ChannelGoodsOrder;
+import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderItemVO;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderVO;
+import com.qs.mp.channel.service.IChannelGoodsOrderItemService;
+import com.qs.mp.channel.service.IChannelGoodsOrderService;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-05 3:12 PM
+ **/
+
+@Api(tags = "门店采购商品订单管理")
+@RestController
+@RequestMapping("/api/v1/mp/admin/channel/goods/order")
+@AllArgsConstructor
+public class ChannelGoodsOrderMgrController extends BaseApiController {
+
+    @Autowired
+    private IChannelGoodsOrderService channelGoodsOrderService;
+
+    @Autowired
+    private IChannelGoodsOrderItemService channelGoodsOrderItemService;
+
+    /**
+     * 采购商品订单列表
+     */
+    @PostMapping("/list")
+    @ApiOperation(value = "订单列表", notes = "获取所有订单信息")
+    @PreAuthorize("@ss.hasPermi('order:channel:list')")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "success", response = ChannelGoodsOrderVO.class)
+    )
+    public TableDataInfo list(@RequestBody ChannelGoodsOrderQueryParam queryParam) {
+        startPage();
+
+        QueryWrapper<ChannelGoodsOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(null != queryParam && StringUtils.isNotBlank(queryParam.getOrderId()), "t1.order_id", queryParam.getOrderId());
+        queryWrapper.eq(null != queryParam && null != queryParam.getStatus(), "t1.`status`", queryParam.getStatus());
+        queryWrapper.eq(null != queryParam && StringUtils.isNotBlank(queryParam.getTel()), "t1.`tel`", queryParam.getTel());
+        queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+        queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+        queryWrapper.eq(null != queryParam && null != queryParam.getSupplierId(), "t3.supplier_id", queryParam.getSupplierId());
+        queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), "t2.title", queryParam.getTitle());
+        queryWrapper.orderByDesc("t1.created_time", "t1.order_id");
+        List<ChannelGoodsOrderVO> list = channelGoodsOrderService.selectChannelGoodsOrderVOList(queryWrapper);
+        for (ChannelGoodsOrderVO channelGoodsOrderVO : list) {
+            QueryWrapper<ChannelGoodsOrderItem> goodsOrderItemQueryWrapper = new QueryWrapper<>();
+            goodsOrderItemQueryWrapper.eq("t1.order_id", channelGoodsOrderVO.getOrderId())
+                    .eq(null != queryParam && null != queryParam.getSupplierId(), "t1.supplier_id", queryParam.getSupplierId());
+            List<ChannelGoodsOrderItemVO> orderItemVOList = channelGoodsOrderItemService.selectChannelGoodsOrderItemVOList(goodsOrderItemQueryWrapper);
+            channelGoodsOrderVO.setItems(orderItemVOList);
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     *
+     */
+
+
+}

+ 73 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelGoodsController.java

@@ -0,0 +1,73 @@
+package com.qs.mp.web.controller.api.channel;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.admin.domain.vo.GoodsVO;
+import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.channel.domain.param.SiteGoodsQueryParam;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.stereotype.Component;
+import org.springframework.web.bind.annotation.*;
+
+
+import java.util.List;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-01 5:04 PM
+ **/
+@Api("门店采购商品管理")
+@RestController
+@RequestMapping("/api/v1/mp/channel/*")
+@Component
+public class ChannelGoodsController extends BaseApiController {
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
+    @PostMapping("/site/goods/list")
+    @ApiOperation("采购商品列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = GoodsVO.class)
+    )
+    public TableDataInfo siteGoodsList(@RequestBody SiteGoodsQueryParam param) {
+
+        QueryWrapper<Goods> queryWrapper = new QueryWrapper<Goods>();
+        queryWrapper.eq("type", param.getType())
+                .orderByDesc("create_time");
+        List<Goods> goodsList = goodsService.list(queryWrapper);
+
+        List<GoodsVO> goodsVOList = mapperFacade.mapAsList(goodsList, GoodsVO.class);
+
+        return getDataTable(goodsVOList);
+    }
+
+    @PostMapping("/site/goods/detail/{goodsId}")
+    @ApiOperation("采购商品详情")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = GoodsVO.class)
+    )
+    public AjaxResult siteGoodsDetail(@PathVariable("goodsId") Integer goodsId) {
+        Goods goods = goodsService.getById(goodsId);
+        GoodsVO goodsVO = mapperFacade.map(goods, GoodsVO.class);
+        return AjaxResult.success(goodsVO);
+    }
+
+
+
+
+
+
+
+}

+ 317 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelGoodsOrderController.java

@@ -0,0 +1,317 @@
+package com.qs.mp.web.controller.api.channel.mall;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
+import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelGoodsOrder;
+import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
+import com.qs.mp.channel.domain.param.ChannelGoodsOrderParam;
+import com.qs.mp.channel.domain.param.OrderPayParam;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderInfoVO;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderItemVO;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderSettleVO;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderVO;
+import com.qs.mp.channel.service.IChannelGoodsOrderItemService;
+import com.qs.mp.channel.service.IChannelGoodsOrderService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.domain.DeliveryCompany;
+import com.qs.mp.common.enums.*;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.service.IDeliveryCompanyService;
+import com.qs.mp.common.service.IShippingTemplateRuleService;
+import com.qs.mp.common.service.IShippingTemplateService;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.framework.redis.RedisKey;
+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.user.domain.UserAddr;
+import com.qs.mp.user.service.IUserAddrService;
+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 io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-02 3:08 PM
+ **/
+@Api("采购商品订单管理")
+@RestController
+@RequestMapping("/api/v1/mp/channel/mall")
+public class ChannelGoodsOrderController extends BaseApiController {
+
+
+    @Autowired
+    private IChannelGoodsOrderService channelGoodsOrderService;
+
+    @Autowired
+    private IChannelGoodsOrderItemService channelGoodsOrderItemService;
+
+    @Autowired
+    private IChannelService channelService;
+
+    @Autowired
+    private IUserAddrService userAddrService;
+
+    @Autowired
+    private IShippingTemplateRuleService shippingTemplateRuleService;
+
+    @Autowired
+    private IShippingTemplateService shippingTemplateService;
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private IDeliveryCompanyService deliveryCompanyService;
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private IWalletService walletService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Value("${shipping.channel}")
+    public Long shippingTemplateId;
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
+
+    @ApiOperation("采购商品订单列表")
+    @RequestMapping("/goods/order/list")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = ChannelGoodsOrderVO.class)
+    )
+    public TableDataInfo goodsOrderList(@RequestBody JSONObject param) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        Integer status = param.getInteger("status");
+        startPage();
+        List<ChannelGoodsOrder> channelGoodsOrders = channelGoodsOrderService.list(
+                new LambdaQueryWrapper<ChannelGoodsOrder>().eq(ChannelGoodsOrder::getChannelId, channelId)
+                        .eq(null != status, ChannelGoodsOrder::getStatus, status)
+                        .orderByDesc(ChannelGoodsOrder::getCreatedTime));
+        List<ChannelGoodsOrderVO> channelGoodsOrderVOList = mapperFacade.mapAsList(channelGoodsOrders, ChannelGoodsOrderVO.class);
+        for (ChannelGoodsOrderVO channelGoodsOrderVO : channelGoodsOrderVOList) {
+            List<ChannelGoodsOrderItem> itemList = channelGoodsOrderItemService.list(new LambdaQueryWrapper<ChannelGoodsOrderItem>()
+                    .eq(ChannelGoodsOrderItem::getOrderId, channelGoodsOrderVO.getOrderId()));
+
+            List<ChannelGoodsOrderItemVO> itemVOList = mapperFacade.mapAsList(itemList, ChannelGoodsOrderItemVO.class);
+            channelGoodsOrderVO.setItems(itemVOList);
+        }
+        TableDataInfo rspData = getDataTable(channelGoodsOrders);
+        rspData.setRows(channelGoodsOrderVOList);
+        return rspData;
+    }
+
+
+    @ApiOperation("采购商品订单详情")
+    @RequestMapping("/goods/order/detail")
+    public AjaxResult goodsOrderDetail(@RequestBody ChannelGoodsOrder goodsOrder) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        ChannelGoodsOrder channelGoodsOrder = channelGoodsOrderService.getOne(new LambdaQueryWrapper<ChannelGoodsOrder>().eq(ChannelGoodsOrder::getChannelId, channelId)
+                .eq(ChannelGoodsOrder::getOrderId, goodsOrder.getOrderId()));
+        ChannelGoodsOrderInfoVO goodsOrderInfoVO = mapperFacade.map(channelGoodsOrder, ChannelGoodsOrderInfoVO.class);
+        // 设置自动确认收货的时间;
+        if (goodsOrderInfoVO != null && Objects.nonNull(goodsOrderInfoVO.getDeliveryTime())) {
+            Date deliveryTime = goodsOrderInfoVO.getDeliveryTime();
+            LocalDateTime autoConfirmTime = LocalDateTimeUtil.of(deliveryTime).plusDays(15);
+            Duration between = LocalDateTimeUtil.between(LocalDateTime.now(), autoConfirmTime);
+            long hours = between.toHours();
+            long day = hours / 24;
+            long hour = hours % 24;
+            goodsOrderInfoVO.setAutoConfirmTime(day + "天" + hour + "小时");
+        }
+
+        if(null != goodsOrderInfoVO && null != goodsOrderInfoVO.getDeliveryId()) {
+            DeliveryCompany deliveryCompany = deliveryCompanyService.getById(goodsOrderInfoVO.getDeliveryId());
+            goodsOrderInfoVO.setDeliveryCompany(deliveryCompany);
+        }
+
+        ChannelGoodsOrderItem goodsOrderItem = channelGoodsOrderItemService.getOne(new LambdaQueryWrapper<ChannelGoodsOrderItem>().eq(ChannelGoodsOrderItem::getOrderId, goodsOrder.getOrderId()));
+
+        goodsOrderInfoVO.setChannelGoodsOrderItem(goodsOrderItem);
+
+        return AjaxResult.success(goodsOrderInfoVO);
+
+    }
+
+
+
+    /**
+     * 订单结算,每次更换地址时需重新请求此接口
+     */
+    @ApiOperation("采购商品订单结算")
+    @RequestMapping("/goods/order/settle")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = ChannelGoodsOrderSettleVO.class)
+    )
+    public AjaxResult goodsOrderSettle(@Valid @RequestBody ChannelGoodsOrderParam param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        Channel channel = channelService.getById(channelId);
+        if (channel.getStatus() == ChannelStatusEnum.OFF) {
+            return AjaxResult.error("账号异常");
+        }
+
+        ChannelGoodsOrderSettleVO orderSettleVO = new ChannelGoodsOrderSettleVO();
+        // 收货地址,如果用户选了地址,则此处不做处理
+        if (null == param.getAddrId() || 0 == param.getAddrId()) {
+            //读取默认地址
+            UserAddr addr = userAddrService.getDefaultChannelAddr(userId);
+            if (null != addr) {
+                orderSettleVO.setAddr(addr);
+            }
+        }
+
+        Goods goods = goodsService.getById(param.getGoodsId());
+
+        // 订单金额计算
+        orderSettleVO.setGoodsId(goods.getGoodsId());
+        orderSettleVO.setOrderNum(param.getOrderNum());
+        orderSettleVO.setOrderAmt(goods.getPurchasePrice() * param.getOrderNum());
+
+
+        // 运费计算
+        Integer freightAmt = 0;
+        // 计算运费
+        UserAddr userAddr = orderSettleVO.getAddr();
+        if (Objects.nonNull(userAddr)) {
+            // TODO: 4L上线需要调整,后期放开就是取的商品里配的运费模板id
+            ShippingTemplateCalculateVO shippingTemplateCalculateVO = shippingTemplateRuleService.getShippingTemplateRuleByTemplateIdAndAreaInfo(shippingTemplateId, userAddr.getProvinceId(), userAddr.getCityId());
+            // 无法查到运费模板则默认为0
+            if (Objects.nonNull(shippingTemplateCalculateVO)) {
+
+                orderSettleVO.setFreightRemark(shippingTemplateCalculateVO.getRemark());
+                orderSettleVO.setFreightType(shippingTemplateCalculateVO.getType());
+
+                if (ShippingTemplateRuleTypeEnum.SHIP.getValue().equals(shippingTemplateCalculateVO.getType())) {
+                    // 运费计算
+                    freightAmt = shippingTemplateService.calculateFreightAmt(param.getOrderNum(), shippingTemplateCalculateVO);
+                }
+            }
+        }
+
+        orderSettleVO.setFreightAmt(freightAmt);
+        orderSettleVO.setPayAmt(orderSettleVO.getOrderAmt() + freightAmt);
+
+        // 缓存商品订单
+        redisCache.setCacheObject(RedisKey.build(RedisKey.CHANNEL_GOODS_ORDER_KEY, channelId), orderSettleVO, 10,
+                TimeUnit.MINUTES);
+        return AjaxResult.success(orderSettleVO);
+    }
+
+    /**
+     * 提交订单
+     */
+    @ApiOperation("采购商品订单提交")
+    @RequestMapping("/goods/order/submit")
+    public AjaxResult goodsOrderSubmit(@RequestBody ChannelGoodsOrder goodsOrder) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        Channel channel = channelService.getById(channelId);
+        if (channel.getCertifyStatus() != ChannelCertifyStatusEnum.CERTIFIED) {
+            LogUtil.info(logger, "账号未补充。channelId:{0}", channelId);
+            return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1016);
+        }
+        ChannelGoodsOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.CHANNEL_GOODS_ORDER_KEY, channelId));
+        if (null == orderSettleVO) {
+            return AjaxResult.error("订单已过期,请重新下单");
+        }
+        if (null == orderSettleVO.getAddr()) {
+            return AjaxResult.error("收货地址缺失,请重新下单");
+        }
+        String orderId = channelGoodsOrderService.submitOrder(channelId, goodsOrder.getMemo(), orderSettleVO);
+
+        // 清除缓存的订单
+        redisCache.deleteObject(RedisKey.build(RedisKey.CHANNEL_GOODS_ORDER_KEY, channelId));
+
+        return AjaxResult.success(orderId);
+    }
+
+
+    /**
+     * 取消订单
+     */
+    @ApiOperation("采购商品订单取消")
+    @RequestMapping("/goods/order/cancel")
+    public AjaxResult goodsOrderCancel(@RequestBody ChannelGoodsOrder goodsOrder) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        channelGoodsOrderService.cancelOrder(channelId, goodsOrder.getOrderId());
+        return AjaxResult.success("取消成功");
+    }
+
+
+    @ApiOperation("采购商品订单支付")
+    @RequestMapping("/goods/order/pay")
+    public AjaxResult goodsOrderPay(@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);
+        }
+
+        ChannelGoodsOrder channelGoodsOrder = channelGoodsOrderService.getById(param.getOrderId());
+        JSONObject jsonObject;
+        try {
+            jsonObject = walletService.pay(BizTypeEnum.CHANNEL_GOODS_ORDER, param.getOrderId(), channelOpenId, channelGoodsOrder.getPayAmt(), 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);
+    }
+
+
+    @ApiOperation("采购商品订单确认收货")
+    @RequestMapping("/goods/order/confirm")
+    public AjaxResult goodsOrderConfirm(@RequestBody ChannelGoodsOrder goodsOrder) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        ChannelGoodsOrder channelGoodsOrder = channelGoodsOrderService.getById(goodsOrder.getOrderId());
+        if (Objects.isNull(channelGoodsOrder)) {
+            return AjaxResult.error("订单不存在");
+        }
+        if (!ChannelGoodsOrderStatusEnum.NOT_CONFIRM.equals(channelGoodsOrder.getStatus())) {
+            return AjaxResult.error("订单状态不是待收货");
+        }
+        if (!channelId.equals(channelGoodsOrder.getChannelId())) {
+            return AjaxResult.error("非法操作他人订单");
+        }
+        channelGoodsOrderService.confirmOrder(channelGoodsOrder);
+        return AjaxResult.success("确认收藏成功");
+
+    }
+}

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

@@ -12,7 +12,9 @@ public enum BizTypeEnum implements IEnum<Integer> {
 
   CHANNEL_ORDER(1, "渠道盲票采购订单"),
   TICKET_ORDER(2, "用户盲票购买订单"),
-  DELIVER_ORDER(3, "用户提货订单");
+  DELIVER_ORDER(3, "用户提货订单"),
+  CHANNEL_GOODS_ORDER(4, "门店商品采购订单"),
+  ;
 
 
   private final int value;

+ 51 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelGoodsOrderStatusEnum.java

@@ -0,0 +1,51 @@
+package com.qs.mp.common.enums;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+/**
+ * @author zhangkaikai
+ * @create 2023-06-02 5:16 PM
+ **/
+/**
+ *
+ * 渠道商品订单状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelGoodsOrderStatusEnum implements IEnum<Integer> {
+    CANCELED(-1, "已取消"),
+    NOT_PAY(0, "待付款"),
+    NOT_DELIVER(1, "待发货"),
+    NOT_CONFIRM(2, "待收货"),
+    FINISHED(3, "已完成");
+
+    private final int value;
+    private final String desc;
+
+    ChannelGoodsOrderStatusEnum(final int value, final String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    /**
+     * 重写toString,单个转化成json
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value",value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+}

+ 3 - 1
mp-common/src/main/java/com/qs/mp/common/enums/CouponTypeEnum.java

@@ -16,7 +16,9 @@ public enum CouponTypeEnum implements IEnum<Integer> {
 
   TICKET_ORDER(1, "盲票购买"),
   SITE_CONSUME(2, "门店消费"),
-  CHANNEL(3, "经销商采购");
+  CHANNEL(3, "经销商采购"),
+  SITE_GOODS_VERITY(4, "门店采购商品核销")
+  ;
 
 
   private final int value;

+ 1 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java

@@ -49,7 +49,7 @@ public class Coupon implements Serializable {
     /**
      * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
      */
-    @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券")
+    @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券、4门店采购商品核销")
     @TableField("type")
     @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
     private CouponTypeEnum type;

+ 17 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/Goods.java

@@ -69,7 +69,7 @@ public class Goods implements Serializable {
   @TableField("pic_url")
   private String picUrl;
 
-  @ApiModelProperty("商品类型:1实物,2卡密")
+  @ApiModelProperty("商品类型:1实物,2卡密,3采购商品")
   @TableField("type")
   private Integer type;
 
@@ -199,4 +199,20 @@ public class Goods implements Serializable {
   @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
+
+  /**
+   * 采购商品关联采购核销劵id
+   */
+  @ApiModelProperty("关联id couponId")
+  @TableField("ref_id")
+  private String refId;
+
+  /**
+   * 采购商品经销商进货价格
+   */
+  @ApiModelProperty("经销商进货价格")
+  @TableField("purchase_price")
+  private Integer purchasePrice;
+
+
 }

+ 45 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelGoodsOrderQueryParam.java

@@ -0,0 +1,45 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-05 3:27 PM
+ **/
+@ApiModel("门店采购商品列表查询参数")
+@Data
+public class ChannelGoodsOrderQueryParam {
+    @ApiModelProperty(value = "商品名称", required = false)
+    private String title;
+
+    @ApiModelProperty(value = "订单编号", required = false)
+    private String orderId;
+
+    @ApiModelProperty(value = "经销商ID", required = false)
+    private Long channelId;
+
+    @ApiModelProperty(value = "订单状态", required = false)
+    private Integer status;
+
+    @ApiModelProperty(value = "收货人手机号", required = false)
+    private String tel;
+
+    @ApiModelProperty("供应商id")
+    private Long supplierId;
+
+    /**
+     * 下单区间-开始时间
+     */
+    @ApiModelProperty(value = "开始时间", required = false)
+    private Date startTime;
+
+    /**
+     * 下单区间-截止时间
+     */
+    @ApiModelProperty(value = "截止时间", required = false)
+    private Date endTime;
+}

+ 1 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponParam.java

@@ -35,7 +35,7 @@ public class CouponParam {
   private String title;
 
   /**
-   * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
+   * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券、4 门店采购商品核销
    */
   @ApiModelProperty(value = "代金券类型", required = false)
   private CouponTypeEnum type;

+ 10 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/param/GoodsParam.java

@@ -131,10 +131,19 @@ public class GoodsParam {
 	private String shoppingLink;
 
 
-	@ApiModelProperty("商品类型:1实物,2卡密")
+	@ApiModelProperty("商品类型:1实物,2卡密,3采购商品")
 	private Integer type;
 
 	@ApiModelProperty("使用链接")
 	private String useLink;
 
+	/**
+	 * 采购商品关联采购核销劵id
+	 */
+	@ApiModelProperty("关联id couponId")
+	private String refId;
+
+	@ApiModelProperty("经销商进货价格")
+    private Integer purchasePrice;
+
 }

+ 9 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/GoodsVO.java

@@ -163,4 +163,13 @@ public class GoodsVO {
 	 */
 	@ApiModelProperty("更新时间")
 	private Date updatedTime;
+
+	/**
+	 * 采购商品关联采购核销劵id
+	 */
+	@ApiModelProperty("关联id couponId")
+	private String refId;
+
+	@ApiModelProperty("经销商进货价格")
+	private Integer purchasePrice;
 }

+ 201 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoodsOrder.java

@@ -0,0 +1,201 @@
+package com.qs.mp.channel.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import com.qs.mp.common.enums.ChannelGoodsOrderStatusEnum;
+import com.qs.mp.common.enums.ChannelOrderStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 经销商商品采购订单实体类
+ * @auther quanshu
+ * @create 2023-06-05 11:13:54
+ */
+@TableName("mp_channel_goods_order")
+@Data
+public class ChannelGoodsOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "order_id", type = IdType.INPUT)
+    private String orderId;
+
+    /**
+     * 渠道ID
+     */
+    @ApiModelProperty("渠道ID")
+    @TableField("channel_id")
+    private Long channelId;
+
+    /**
+     * 标题
+     */
+    @ApiModelProperty("标题")
+    @TableField("title")
+    private String title;
+
+    /**
+     * 订单金额
+     */
+    @ApiModelProperty("订单金额")
+    @TableField("order_amt")
+    private Integer orderAmt;
+
+    /**
+     * 优惠金额
+     */
+    @ApiModelProperty("优惠金额")
+    @TableField("discount_amt")
+    private Integer discountAmt;
+
+    /**
+     * 运费金额
+     */
+    @ApiModelProperty("运费金额")
+    @TableField("freight_amt")
+    private Integer freightAmt;
+
+    /**
+     * 实付金额
+     */
+    @ApiModelProperty("实付金额")
+    @TableField("pay_amt")
+    private Integer payAmt;
+
+    /**
+     * 订单类型1采购商品
+     */
+    @ApiModelProperty("订单类型1采购商品")
+    @TableField("type")
+    private Integer type;
+
+    @ApiModelProperty("支付类型1支付宝,2微信,10支付宝直连")
+    @TableField("pay_type")
+    private String payType;
+
+        /**
+     * 订单状态,-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成
+     */
+        @TableField("status")
+        @ApiModelProperty("订单状态,-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成")
+        @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+        private ChannelGoodsOrderStatusEnum status;
+
+    /**
+     * 购买数量
+     */
+    @ApiModelProperty("购买数量")
+    @TableField("order_num")
+    private Integer orderNum;
+
+    /**
+     * 备注
+     */
+    @ApiModelProperty("备注")
+    @TableField("memo")
+    private String memo;
+
+    /**
+     * 收货人
+     */
+    @ApiModelProperty("收货人")
+    @TableField("receiver")
+    private String receiver;
+
+    /**
+     * 收货人电话
+     */
+    @ApiModelProperty("收货人电话")
+    @TableField("tel")
+    private String tel;
+
+    /**
+     * 收货地址-省
+     */
+    @ApiModelProperty("收货地址-省")
+    @TableField("province")
+    private String province;
+
+    /**
+     * 收货地址-市
+     */
+    @ApiModelProperty("收货地址-市")
+    @TableField("city")
+    private String city;
+
+    /**
+     * 收货地址-区
+     */
+    @ApiModelProperty("收货地址-区")
+    @TableField("area")
+    private String area;
+
+    /**
+     * 收货地址-详细
+     */
+    @ApiModelProperty("收货地址-详细")
+    @TableField("address")
+    private String address;
+
+    /**
+     * 物流ID
+     */
+    @ApiModelProperty("物流ID")
+    @TableField("delivery_id")
+    private String deliveryId;
+
+    /**
+     * 物流单号
+     */
+    @ApiModelProperty("物流单号")
+    @TableField("delivery_flow_id")
+    private String deliveryFlowId;
+
+    /**
+     * 发货时间
+     */
+    @ApiModelProperty("发货时间")
+    @TableField("delivery_time")
+    private Date deliveryTime;
+
+    /**
+     * 确认收货时间
+     */
+    @ApiModelProperty("确认收货时间")
+    @TableField("confirm_time")
+    private Date confirmTime;
+
+    /**
+     * 支付时间
+     */
+    @ApiModelProperty("支付时间")
+    @TableField("pay_time")
+    private Date payTime;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+}

+ 93 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoodsOrderItem.java

@@ -0,0 +1,93 @@
+package com.qs.mp.channel.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 经销商商品采购订单明细实体类
+ * @auther quanshu
+ * @create 2023-06-05 11:01:39
+ */
+@TableName("mp_channel_goods_order_item")
+@Data
+public class ChannelGoodsOrderItem implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "item_id", type = IdType.AUTO)
+    private Long itemId;
+
+    /**
+     * 渠道ID
+     */
+    @ApiModelProperty("渠道ID")
+    @TableField("channel_id")
+    private Long channelId;
+
+    /**
+     * 订单ID
+     */
+    @ApiModelProperty("订单ID")
+    @TableField("order_id")
+    private String orderId;
+
+    /**
+     * 商品ID
+     */
+    @ApiModelProperty("商品ID")
+    @TableField("goods_id")
+    private Long goodsId;
+
+    /**
+     * 商品标题
+     */
+    @ApiModelProperty("商品标题")
+    @TableField("title")
+    private String title;
+
+        /**
+     * 商品图片
+     */
+         @TableField("pic_url")
+    private String picUrl;
+
+    /**
+     * 商品数量
+     */
+    @ApiModelProperty("商品数量")
+    @TableField("goods_num")
+    private Integer goodsNum;
+
+    /**
+     * 供应商id
+     */
+    @ApiModelProperty("供应商id")
+    @TableField("supplier_id")
+    private Long supplierId;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+}

+ 26 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelGoodsOrderParam.java

@@ -0,0 +1,26 @@
+package com.qs.mp.channel.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-04 11:02 PM
+ **/
+@ApiModel("门店采购商品订单参数")
+@Data
+public class ChannelGoodsOrderParam {
+
+    @ApiModelProperty(value = "商品ID",required=false)
+    private Long goodsId;
+
+    @ApiModelProperty(value = "订单类型 3 采购商品",required = false)
+    private Integer type;
+
+    @ApiModelProperty(value = "购买数量",required=false)
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "收货地址ID",required=false)
+    private Long addrId;
+}

+ 18 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/SiteGoodsQueryParam.java

@@ -0,0 +1,18 @@
+package com.qs.mp.channel.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-02 11:11 AM
+ **/
+
+@ApiModel("门店采购商品查询参数")
+@Data
+public class SiteGoodsQueryParam {
+
+    @ApiModelProperty(value = "商品类型:1实物,2卡密,3采购商品", required = true)
+    private Integer type;
+}

+ 25 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderInfoVO.java

@@ -0,0 +1,25 @@
+package com.qs.mp.channel.domain.vo;
+
+import com.qs.mp.channel.domain.ChannelGoodsOrder;
+import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
+import com.qs.mp.common.domain.DeliveryCompany;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-05 1:45 PM
+ **/
+@ApiModel("门店采购商品订单详情出参类")
+@Data
+public class ChannelGoodsOrderInfoVO extends ChannelGoodsOrder {
+
+    @ApiModelProperty("自动确认收货时间")
+    private String autoConfirmTime;
+
+    private DeliveryCompany deliveryCompany;
+
+    private ChannelGoodsOrderItem channelGoodsOrderItem;
+
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderItemVO.java

@@ -0,0 +1,20 @@
+package com.qs.mp.channel.domain.vo;
+
+import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-05 4:31 PM
+ **/
+
+@ApiModel("门店采购商品明细出参类")
+public class ChannelGoodsOrderItemVO extends ChannelGoodsOrderItem {
+
+    @ApiModelProperty("商品图片")
+    private String picUrl;
+
+    @ApiModelProperty("商品名称")
+    private String title;
+}

+ 60 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderSettleVO.java

@@ -0,0 +1,60 @@
+package com.qs.mp.channel.domain.vo;
+
+import com.qs.mp.user.domain.UserAddr;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-04 11:18 PM
+ **/
+@ApiModel("门店商品订单结算出参类")
+@Data
+public class ChannelGoodsOrderSettleVO {
+
+    @ApiModelProperty("用户地址")
+    private UserAddr addr;
+
+    /**
+     * 订单金额
+     */
+    @ApiModelProperty("订单金额")
+    private Integer orderAmt = 0;
+
+    /**
+     * 实付金额
+     */
+    @ApiModelProperty("实付金额")
+    private Integer payAmt = 0;
+
+    /**
+     * 运费金额
+     */
+    @ApiModelProperty("运费金额")
+    private Integer freightAmt = 0;
+
+    @ApiModelProperty("运费模板类型 1发货,2不发货")
+    private Integer freightType;
+
+    @ApiModelProperty("运费备注")
+    private String freightRemark;
+
+    /**
+     * 单价
+     */
+    @ApiModelProperty("单价")
+    private Integer price;
+
+    /**
+     * 商品id
+     */
+    @ApiModelProperty("商品id")
+    private Long goodsId;
+
+    /**
+     * 购买数量
+     */
+    @ApiModelProperty("购买数量")
+    private Integer orderNum;
+}

+ 24 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderVO.java

@@ -0,0 +1,24 @@
+package com.qs.mp.channel.domain.vo;
+
+import com.qs.mp.channel.domain.ChannelGoodsOrder;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-02 5:22 PM
+ **/
+
+@ApiModel("经销商商品订单出参类")
+@Data
+public class ChannelGoodsOrderVO extends ChannelGoodsOrder {
+
+    @ApiModelProperty("经销商商品订单明细")
+    private List<ChannelGoodsOrderItemVO> items;
+
+    @ApiModelProperty("供应商名称")
+    private String supplierName;
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelGoodsOrderItemMapper.java

@@ -0,0 +1,20 @@
+package com.qs.mp.channel.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderItemVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-05 11:01:39
+ * @describe 经销商商品采购订单明细mapper类
+ */
+public interface ChannelGoodsOrderItemMapper extends BaseMapper<ChannelGoodsOrderItem> {
+
+    List<ChannelGoodsOrderItemVO> selectChannelGoodsOrderItemVOList(@Param(Constants.WRAPPER) QueryWrapper<ChannelGoodsOrderItem> goodsOrderItemQueryWrapper);
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelGoodsOrderMapper.java

@@ -0,0 +1,20 @@
+package com.qs.mp.channel.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.channel.domain.ChannelGoodsOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-05 11:13:54
+ * @describe 经销商商品采购订单mapper类
+ */
+public interface ChannelGoodsOrderMapper extends BaseMapper<ChannelGoodsOrder> {
+
+    List<ChannelGoodsOrderVO> selectChannelGoodsOrderVOList(@Param(Constants.WRAPPER) QueryWrapper<ChannelGoodsOrder> queryWrapper);
+}

+ 24 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsOrderItemService.java

@@ -0,0 +1,24 @@
+package com.qs.mp.channel.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderItemVO;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-05 11:01:39
+ * @describe 经销商商品采购订单明细服务类
+ */
+public interface IChannelGoodsOrderItemService extends IService<ChannelGoodsOrderItem> {
+
+    /**
+     * 门店采购商品明细查询
+     *
+     * @param goodsOrderItemQueryWrapper
+     * @return
+     */
+    List<ChannelGoodsOrderItemVO> selectChannelGoodsOrderItemVOList(QueryWrapper<ChannelGoodsOrderItem> goodsOrderItemQueryWrapper);
+}

+ 57 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsOrderService.java

@@ -0,0 +1,57 @@
+package com.qs.mp.channel.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.channel.domain.ChannelGoodsOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderSettleVO;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderVO;
+import com.qs.mp.pay.domain.PayOrder;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-05 11:13:54
+ * @describe 经销商商品采购订单服务类
+ */
+public interface IChannelGoodsOrderService extends IService<ChannelGoodsOrder> {
+
+    /**
+     * 提交订单
+     * @param channelId
+     * @param memo
+     * @param orderSettleVO
+     * @return
+     */
+    String submitOrder(Long channelId, String memo, ChannelGoodsOrderSettleVO orderSettleVO);
+
+    /**
+     * 取消订单
+     *
+     * @param channelId
+     * @param orderId
+     * @return
+     */
+    boolean cancelOrder(Long channelId, String orderId);
+
+    /**
+     * 支付成功回调
+     * @param payOrder
+     */
+    void paySuccess(PayOrder payOrder);
+
+    /**
+     * 订单确认收货
+     * @param channelGoodsOrder
+     */
+    void confirmOrder(ChannelGoodsOrder channelGoodsOrder);
+
+    /**
+     * 门店采购商品订单列表
+     * @param queryWrapper
+     * @return
+     */
+    List<ChannelGoodsOrderVO> selectChannelGoodsOrderVOList(QueryWrapper<ChannelGoodsOrder> queryWrapper);
+
+
+}

+ 25 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsOrderItemServiceImpl.java

@@ -0,0 +1,25 @@
+package com.qs.mp.channel.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderItemVO;
+import com.qs.mp.channel.mapper.ChannelGoodsOrderItemMapper;
+import com.qs.mp.channel.service.IChannelGoodsOrderItemService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-05 11:01:39
+ * @describe 经销商商品采购订单明细服务实现类
+ */
+@Service
+public class ChannelGoodsOrderItemServiceImpl extends ServiceImpl<ChannelGoodsOrderItemMapper, ChannelGoodsOrderItem> implements IChannelGoodsOrderItemService {
+
+    @Override
+    public List<ChannelGoodsOrderItemVO> selectChannelGoodsOrderItemVOList(QueryWrapper<ChannelGoodsOrderItem> goodsOrderItemQueryWrapper) {
+        return getBaseMapper().selectChannelGoodsOrderItemVOList(goodsOrderItemQueryWrapper);
+    }
+}

+ 184 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsOrderServiceImpl.java

@@ -0,0 +1,184 @@
+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.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.channel.domain.ChannelGoodsOrder;
+import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderSettleVO;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderVO;
+import com.qs.mp.channel.mapper.ChannelGoodsOrderMapper;
+import com.qs.mp.channel.service.IChannelGoodsOrderItemService;
+import com.qs.mp.channel.service.IChannelGoodsOrderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.common.enums.ChannelGoodsOrderStatusEnum;
+import com.qs.mp.common.enums.GoodsStatusEnum;
+import com.qs.mp.common.enums.PayTypeEnum;
+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 com.qs.mp.user.domain.UserAddr;
+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;
+import org.springframework.util.Assert;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-05 11:13:54
+ * @describe 经销商商品采购订单服务实现类
+ */
+@Service
+public class ChannelGoodsOrderServiceImpl extends ServiceImpl<ChannelGoodsOrderMapper, ChannelGoodsOrder> implements IChannelGoodsOrderService {
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+    @Autowired
+    private IChannelGoodsOrderService channelGoodsOrderService;
+
+    @Autowired
+    private IChannelGoodsOrderItemService channelGoodsOrderItemService;
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String submitOrder(Long channelId, String memo, ChannelGoodsOrderSettleVO orderSettleVO) {
+
+        UserAddr addr = orderSettleVO.getAddr();
+        String orderId = bizIdGenerator.newId();
+        Goods goods = goodsService.getById(orderSettleVO.getGoodsId());
+
+        if (goods.getQuantity() < orderSettleVO.getOrderNum()) {
+            throw new ServiceException(goods.getTitle() + "库存不足,请重新下单");
+        }
+        // 更新库存
+        boolean updateGoods = goodsService.update(new LambdaUpdateWrapper<Goods>()
+                .set(goods.getQuantity() - orderSettleVO.getOrderNum() == 0, Goods::getStatus,
+                        GoodsStatusEnum.PUT_OFF)
+                .set(Goods::getQuantity, goods.getQuantity() - orderSettleVO.getOrderNum())
+                .eq(Goods::getGoodsId, goods.getGoodsId()).eq(Goods::getQuantity, goods.getQuantity()));
+        Assert.isTrue(updateGoods, "门店购买采购商品更新GOODS库存失败。goodsId:" + goods.getGoodsId());
+
+        // 创建订单
+        ChannelGoodsOrder channelGoodsOrder = new ChannelGoodsOrder();
+        channelGoodsOrder.setOrderId(orderId);
+        channelGoodsOrder.setChannelId(channelId);
+        channelGoodsOrder.setTitle(goods.getTitle());
+        if (orderSettleVO.getOrderNum() < 0) {
+            throw new ServiceException("订单商品数量不能小于0");
+        }
+        channelGoodsOrder.setOrderNum(orderSettleVO.getOrderNum());
+        channelGoodsOrder.setOrderAmt(orderSettleVO.getOrderAmt());
+        channelGoodsOrder.setFreightAmt(orderSettleVO.getFreightAmt());
+        channelGoodsOrder.setPayAmt(orderSettleVO.getPayAmt());
+        channelGoodsOrder.setPayType(PayTypeEnum.WXPAY.getValue());
+        channelGoodsOrder.setStatus(ChannelGoodsOrderStatusEnum.NOT_PAY);
+        channelGoodsOrder.setMemo(memo);
+        channelGoodsOrder.setReceiver(addr.getReceiver());
+        channelGoodsOrder.setTel(addr.getMobile());
+        channelGoodsOrder.setProvince(addr.getProvince());
+        channelGoodsOrder.setCity(addr.getCity());
+        channelGoodsOrder.setArea(addr.getArea());
+        channelGoodsOrder.setAddress(addr.getAddr());
+        channelGoodsOrderService.save(channelGoodsOrder);
+
+        // 创建订单明细
+        ChannelGoodsOrderItem item = new ChannelGoodsOrderItem();
+        item.setChannelId(channelId);
+        item.setOrderId(orderId);
+        item.setGoodsId(goods.getGoodsId());
+        item.setTitle(goods.getTitle());
+        item.setGoodsNum(orderSettleVO.getOrderNum());
+        item.setPicUrl(goods.getPicUrl());
+        item.setSupplierId(goods.getSupplierId());
+        channelGoodsOrderItemService.save(item);
+
+
+        return channelGoodsOrder.getOrderId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean cancelOrder(Long channelId, String orderId) {
+        ChannelGoodsOrder channelGoodsOrder = channelGoodsOrderService.getOne(new LambdaQueryWrapper<ChannelGoodsOrder>()
+                .eq(ChannelGoodsOrder::getChannelId, channelId)
+                .eq(ChannelGoodsOrder::getOrderId, orderId));
+
+        if (ChannelGoodsOrderStatusEnum.NOT_PAY != channelGoodsOrder.getStatus()) {
+            throw new ServiceException("订单状态异常,不能取消订单");
+        }
+
+        ChannelGoodsOrderItem goodsOrderItem = channelGoodsOrderItemService.getOne(new LambdaQueryWrapper<ChannelGoodsOrderItem>().eq(ChannelGoodsOrderItem::getChannelId, channelId)
+                .eq(ChannelGoodsOrderItem::getOrderId, orderId));
+        // 恢复采购商品库存
+        Goods goods = goodsService.getById(goodsOrderItem.getGoodsId());
+        boolean rst = goodsService.update(new LambdaUpdateWrapper<Goods>()
+                .set(Goods::getStatus, GoodsStatusEnum.PUT_ON)
+                .set(Goods::getQuantity, goods.getQuantity() + goodsOrderItem.getGoodsNum())
+                .eq(Goods::getGoodsId, goods.getGoodsId())
+                .eq(Goods::getQuantity, goods.getQuantity())
+
+        );
+        Assert.isTrue(rst,"门店采购商品订单取消恢复采购商品库存失败,goodsId:" + goods.getGoodsId());
+
+        channelGoodsOrder.setStatus(ChannelGoodsOrderStatusEnum.CANCELED);
+        boolean updateRst = channelGoodsOrderService.updateById(channelGoodsOrder);
+        Assert.isTrue(updateRst,"门店采购商品订单取消失败,orderId:" + orderId);
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void paySuccess(PayOrder payOrder) {
+        ChannelGoodsOrder channelGoodsOrder = getById(payOrder.getBizId());
+        if (null == channelGoodsOrder || channelGoodsOrder.getStatus() != ChannelGoodsOrderStatusEnum.NOT_PAY) {
+            LogUtil.error(logger, "支付回调渠道采购商品订单处理,订单状态异常,不是待支付。payOrder:{0}, channelGoodsOrder:{1}",
+                    JSONObject.toJSONString(payOrder), JSONObject.toJSONString(channelGoodsOrder));
+            throw new ServiceException("支付回调渠道采购商品订单处理,订单状态异常,不是待支付。orderId:" + payOrder.getBizId());
+        }
+        boolean rst = update(
+                new LambdaUpdateWrapper<ChannelGoodsOrder>().set(ChannelGoodsOrder::getStatus,
+                                ChannelGoodsOrderStatusEnum.NOT_DELIVER)
+                        .set(ChannelGoodsOrder::getPayTime, DateUtils.parseDate(payOrder.getCompleteDate()))
+                        .eq(ChannelGoodsOrder::getOrderId, channelGoodsOrder.getOrderId())
+                        .eq(ChannelGoodsOrder::getStatus, ChannelGoodsOrderStatusEnum.NOT_PAY));
+        if (!rst) {
+            LogUtil.error(logger, "渠道采购商品订单支付成功时,更新订单状态失败。orderId:{0}",
+                    channelGoodsOrder.getOrderId());
+            throw new ServiceException("渠道采购商品订单支付成功时,更新订单状态失败");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void confirmOrder(ChannelGoodsOrder channelGoodsOrder) {
+        ChannelGoodsOrder param = new ChannelGoodsOrder();
+        param.setOrderId(channelGoodsOrder.getOrderId());
+        param.setStatus(ChannelGoodsOrderStatusEnum.FINISHED);
+        param.setConfirmTime(new Date());
+        boolean rst = channelGoodsOrderService.updateById(param);
+        Assert.isTrue(rst,"门店采购商品订单确认失败,orderId:" + channelGoodsOrder.getOrderId());
+    }
+
+    @Override
+    public List<ChannelGoodsOrderVO> selectChannelGoodsOrderVOList(QueryWrapper<ChannelGoodsOrder> queryWrapper) {
+        return getBaseMapper().selectChannelGoodsOrderVOList(queryWrapper);
+    }
+
+}

+ 3 - 1
mp-service/src/main/java/com/qs/mp/framework/redis/RedisKey.java

@@ -17,7 +17,9 @@ public enum RedisKey {
     USER_TICKET_ORDER_KEY("user_ticket_order_key_{0}", "用户购票订单"),
     USER_DELIVER_ORDER_KEY("user_deliver_order_key_{0}", "用户提货订单"),
     OFFLINE_TICKET_ID_KEY("offline_ticket_id_key_{0}", "线下盲票ID"),
-    USER_PRIZE_RECOVERY_KEY("user_prize_recovery_key_{0}", "用户奖品回收");
+    USER_PRIZE_RECOVERY_KEY("user_prize_recovery_key_{0}", "用户奖品回收"),
+    CHANNEL_GOODS_ORDER_KEY("channel_goods_order_key_{0}", "经销商下的商品采购订单"),
+    ;
 
     public String keyTemplate;
     public String desc;

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

@@ -18,6 +18,7 @@ import com.eptok.yspay.opensdkjava.util.HttpClientUtil;
 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.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelWithdrawService;
 import com.qs.mp.common.constant.YsPayMethodConstants;
@@ -99,6 +100,9 @@ public class WalletServiceImpl implements IWalletService {
   @Autowired
   private IYsCallLogService ysCallLogService;
 
+  @Autowired
+  private IChannelGoodsOrderService  channelGoodsOrderService;
+
   @Value("${pay.notifyUrl}")
   private String notifyUrl;  //支付成功前端跳转地址
   @Value("${pay.callbackUrl}")
@@ -554,6 +558,9 @@ public class WalletServiceImpl implements IWalletService {
     if (BizTypeEnum.CHANNEL_ORDER == payOrder.getBizType()) {
       // 渠道盲票采购订单支付成功,调用业务订单服务处理
       channelOrderService.paySuccess(payOrder);
+    } else if (BizTypeEnum.CHANNEL_GOODS_ORDER == payOrder.getBizType()) {
+      // 门店商品采购订单支付成功,调用业务订单服务处理
+      channelGoodsOrderService.paySuccess(payOrder);
     } else if (BizTypeEnum.TICKET_ORDER == payOrder.getBizType()) {
       // 用户盲票购买订单支付成功,调用业务订单服务处理
       userTicketOrderService.paySuccess(payOrder);

+ 33 - 0
mp-service/src/main/resources/mapper/channel/ChannelGoodsOrderItemMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.channel.mapper.ChannelGoodsOrderItemMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.channel.domain.ChannelGoodsOrderItem">
+        <id column="item_id" property="itemId" />
+        <result column="channel_id" property="channelId" />
+        <result column="order_id" property="orderId" />
+        <result column="goods_id" property="goodsId" />
+        <result column="title" property="title" />
+        <result column="pic_url" property="picUrl" />
+        <result column="goods_num" property="goodsNum" />
+        <result column="supplier_id" property="supplierId" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        item_id, channel_id, order_id, goods_id, title, pic_url, goods_num, supplier_id, created_time, updated_time
+    </sql>
+    <select id="selectChannelGoodsOrderItemVOList"
+            resultType="com.qs.mp.channel.domain.vo.ChannelGoodsOrderItemVO">
+        select t1.*,t2.name as supplierName,t3.pic_url,t3.title
+        from mp_channel_goods_order_item t1
+            left join mp_supplier t2 on t1.supplier_id = t2.id
+            left join mp_goods t3 on t1.goods_id = t3.goods_id
+            ${ew.customSqlSegment}
+    </select>
+
+
+</mapper>

+ 45 - 0
mp-service/src/main/resources/mapper/channel/ChannelGoodsOrderMapper.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.channel.mapper.ChannelGoodsOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.channel.domain.ChannelGoodsOrder">
+        <id column="order_id" property="orderId" />
+        <result column="channel_id" property="channelId" />
+        <result column="title" property="title" />
+        <result column="order_amt" property="orderAmt" />
+        <result column="discount_amt" property="discountAmt" />
+        <result column="freight_amt" property="freightAmt" />
+        <result column="pay_amt" property="payAmt" />
+        <result column="type" property="type" />
+        <result column="status" property="status" />
+        <result column="order_num" property="orderNum" />
+        <result column="memo" property="memo" />
+        <result column="receiver" property="receiver" />
+        <result column="tel" property="tel" />
+        <result column="province" property="province" />
+        <result column="city" property="city" />
+        <result column="area" property="area" />
+        <result column="address" property="address" />
+        <result column="delivery_id" property="deliveryId" />
+        <result column="delivery_flow_id" property="deliveryFlowId" />
+        <result column="delivery_time" property="deliveryTime" />
+        <result column="confirm_time" property="confirmTime" />
+        <result column="pay_time" property="payTime" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        order_id, channel_id, title, order_amt, discount_amt, freight_amt, pay_amt, type, status, order_num, memo, receiver, tel, province, city, area, address, delivery_id, delivery_flow_id, delivery_time, confirm_time, pay_time, created_time, updated_time
+    </sql>
+    <select id="selectChannelGoodsOrderVOList" resultType="com.qs.mp.channel.domain.vo.ChannelGoodsOrderVO">
+        select DISTINCT t1.* , t3.name as supplierName
+        from mp_channel_goods_order t1
+                 left join mp_channel_goods_order_item t2 on t1.order_id = t2.order_id
+                 left join mp_supplier t3 on t2.supplier_id = t3.id
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>