Kaynağa Gözat

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

zhangkaikai 1 yıl önce
ebeveyn
işleme
4861032f3e

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

@@ -7,6 +7,7 @@ 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.ChannelGoods;
 import com.qs.mp.channel.domain.ChannelGoodsOrder;
 import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
 import com.qs.mp.channel.domain.param.ChannelGoodsOrderParam;
@@ -52,6 +53,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 import java.time.Duration;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -160,7 +162,7 @@ public class ChannelGoodsOrderController extends BaseApiController {
             goodsOrderInfoVO.setDeliveryCompany(deliveryCompany);
         }
 
-        ChannelGoodsOrderItem goodsOrderItem = channelGoodsOrderItemService.getOne(new LambdaQueryWrapper<ChannelGoodsOrderItem>().eq(ChannelGoodsOrderItem::getOrderId, goodsOrder.getOrderId()));
+        List<ChannelGoodsOrderItem> goodsOrderItem = channelGoodsOrderItemService.list(new LambdaQueryWrapper<ChannelGoodsOrderItem>().eq(ChannelGoodsOrderItem::getOrderId, goodsOrder.getOrderId()));
 
         goodsOrderInfoVO.setChannelGoodsOrderItem(goodsOrderItem);
 
@@ -203,6 +205,16 @@ public class ChannelGoodsOrderController extends BaseApiController {
         orderSettleVO.setOrderNum(param.getOrderNum());
         orderSettleVO.setOrderAmt(goods.getPurchasePrice() * param.getOrderNum());
 
+        // 结算商品信息
+        List<ChannelGoods> goodsList = new ArrayList<>();
+        ChannelGoods channelGoods = new ChannelGoods();
+        channelGoods.setTitle(goods.getTitle());
+        channelGoods.setQuantity(param.getOrderNum());
+        channelGoods.setPicUrl(goods.getPicUrl());
+        channelGoods.setPurchasePrice(goods.getPurchasePrice());
+        channelGoods.setPurchaseCost(goods.getPurchaseCost());
+        goodsList.add(channelGoods);
+        orderSettleVO.setItems(goodsList);
 
         // 运费计算
         Integer freightAmt = 0;

+ 2 - 1
mp-common/src/main/java/com/qs/mp/common/enums/ChannelGoodsSettleStatusTypeEnum.java

@@ -15,7 +15,8 @@ public enum ChannelGoodsSettleStatusTypeEnum implements IEnum<Integer> {
 
 
     NO(1, "未结算"),
-    FINISHED(2, "已结算"),;
+    FINISHED(2, "已结算"),
+    DOING(3, "结算中"),;
 
     private final Integer value;
     private final String desc;

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

@@ -1,5 +1,8 @@
 package com.qs.mp.admin.domain.param;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.enums.ChannelGoodsSettleStatusTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -42,4 +45,14 @@ public class ChannelGoodsOrderQueryParam {
      */
     @ApiModelProperty(value = "截止时间", required = false)
     private Date endTime;
+
+    @ApiModelProperty(value = "剩余库存最小值", required = false)
+    private Integer minStock;
+
+    @ApiModelProperty(value = "剩余库存最大值", required = false)
+    private Integer maxStock;
+
+    @ApiModelProperty(value = "结算状态 1未结算 2已结算 3 结算中", required = false)
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private ChannelGoodsSettleStatusTypeEnum settleStatus;
 }

+ 47 - 47
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoods.java

@@ -23,82 +23,82 @@ import lombok.Data;
 public class ChannelGoods implements Serializable {
     private static final long serialVersionUID = 1L;
 
-        /**
+    /**
      * 主键
      */
-         @TableId(value = "id", type = IdType.AUTO)
+    @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
-        /**
+    /**
      * 渠道ID
      */
-         @TableField("channel_id")
+    @TableField("channel_id")
     private Long channelId;
 
-        /**
+    /**
      * 关联商品id
      */
-         @TableField("goods_id")
+    @TableField("goods_id")
     private Long goodsId;
 
-        /**
+    /**
      * 门店采购商品订单id
      */
-         @TableField("order_id")
+    @TableField("order_id")
     private String orderId;
 
-        /**
+    /**
      * 商品标题
      */
-         @TableField("title")
+    @TableField("title")
     private String title;
 
-        /**
+    /**
      * 商品图片
      */
-         @TableField("pic_url")
+    @TableField("pic_url")
     private String picUrl;
 
-        /**
+    /**
      * 商品类型:1采购商品
      */
-         @TableField("type")
+    @TableField("type")
     private Integer type;
 
-        /**
+    /**
      * 详情
      */
-         @TableField("description")
+    @TableField("description")
     private String description;
 
-        /**
+    /**
      * 关联id couponId
      */
-         @TableField("ref_id")
+    @TableField("ref_id")
     private String refId;
 
-        /**
+    /**
      * 经销商进货价格
      */
-         @TableField("purchase_price")
+    @TableField("purchase_price")
     private Integer purchasePrice;
 
-        /**
+    /**
      * 采购商品经销商采购成本
      */
-         @TableField("purchase_cost")
+    @TableField("purchase_cost")
     private Integer purchaseCost;
 
-        /**
+    /**
      * 库存数量
      */
-         @TableField("quantity")
+    @TableField("quantity")
     private Integer quantity;
 
-        /**
+    /**
      * 已销数量
      */
-         @TableField("verify_qty")
+    @TableField("verify_qty")
     private Integer verifyQty;
 
     /**
@@ -110,63 +110,63 @@ public class ChannelGoods implements Serializable {
     /**
      * 结算状态,1未结算2已结算
      */
-        @TableField("status")
-        @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-        private ChannelGoodsSettleStatusTypeEnum status;
+    @TableField("status")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private ChannelGoodsSettleStatusTypeEnum status;
 
-        /**
+    /**
      * 商家信息
      */
-         @TableField("merchant_info")
+    @TableField("merchant_info")
     private String merchantInfo;
 
-        /**
+    /**
      * 供应商id
      */
-         @TableField("supplier_id")
+    @TableField("supplier_id")
     private Long supplierId;
 
-        /**
+    /**
      * 排序权重,越大越靠前
      */
-         @TableField("sort_weight")
+    @TableField("sort_weight")
     private Integer sortWeight;
 
-        /**
+    /**
      * 是否多sku,0否,1是
      */
-         @TableField("multi_sku")
+    @TableField("multi_sku")
     private Integer multiSku;
 
-        /**
+    /**
      * sku规格值描述
      */
-         @TableField("sku_prop")
+    @TableField("sku_prop")
     private String skuProp;
 
-        /**
+    /**
      * 逻辑删除标识
      */
-         @TableField("is_deleted")
+    @TableField("is_deleted")
     @TableLogic
     private Integer isDeleted;
 
-        /**
+    /**
      * 创建时间
      */
-         @TableField("created_time")
+    @TableField("created_time")
     private Date createdTime;
 
-        /**
+    /**
      * 更新时间
      */
-         @TableField("updated_time")
+    @TableField("updated_time")
     private Date updatedTime;
 
-        /**
+    /**
      * 采购商品结算时间
      */
-         @TableField("settle_time")
+    @TableField("settle_time")
     private Date settleTime;
 
 

+ 4 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/param/SiteGoodsForChannelQueryParam.java

@@ -1,5 +1,7 @@
 package com.qs.mp.channel.domain.param;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.qs.mp.common.enums.ChannelGoodsSettleStatusTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -15,7 +17,8 @@ import lombok.Data;
 public class SiteGoodsForChannelQueryParam {
 
     @ApiModelProperty("结算状态 1未结算 2已结算")
-    private Integer settleStatus;
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private ChannelGoodsSettleStatusTypeEnum settleStatus;
 
     @ApiModelProperty("门店铺设商品id")
     private Long id;

+ 3 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderInfoVO.java

@@ -7,6 +7,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author zhangkaikai
  * @create 2023-06-05 1:45 PM
@@ -25,6 +27,6 @@ public class ChannelGoodsOrderInfoVO extends ChannelGoodsOrder {
     private ChannelVO channel;
 
     @ApiModelProperty("采购商品订单详情")
-    private ChannelGoodsOrderItem channelGoodsOrderItem;
+    private List<ChannelGoodsOrderItem> channelGoodsOrderItem;
 
 }

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

@@ -1,10 +1,14 @@
 package com.qs.mp.channel.domain.vo;
 
+import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.channel.domain.ChannelGoods;
 import com.qs.mp.user.domain.UserAddr;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author zhangkaikai
  * @create 2023-06-04 11:18 PM
@@ -57,4 +61,10 @@ public class ChannelGoodsOrderSettleVO {
      */
     @ApiModelProperty("购买数量")
     private Integer orderNum;
+
+    /**
+     * 结算商品
+     */
+    @ApiModelProperty("结算商品信息")
+    private List<ChannelGoods> items;
 }

+ 32 - 6
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelCouponVerifyLogServiceImpl.java

@@ -1,30 +1,33 @@
 package com.qs.mp.channel.service.impl;
 
+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.Coupon;
 import com.qs.mp.admin.service.ICouponService;
 import com.qs.mp.channel.domain.ChannelCouponVerifyLog;
+import com.qs.mp.channel.domain.ChannelGoods;
 import com.qs.mp.channel.domain.ChannelMoneyLog;
 import com.qs.mp.channel.mapper.ChannelCouponVerifyLogMapper;
 import com.qs.mp.channel.service.IChannelCouponVerifyLogService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.channel.service.IChannelGoodsService;
 import com.qs.mp.channel.service.IChannelMoneyLogService;
-import com.qs.mp.common.enums.ChannelMoneyEnum;
-import com.qs.mp.common.enums.CouponDiscountTypeEnum;
-import com.qs.mp.common.enums.CouponSettleStatusEnum;
-import com.qs.mp.common.enums.CouponStatusEnum;
-import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.enums.*;
+import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.user.domain.UserCoupon;
 import com.qs.mp.user.service.IUserCouponService;
 import java.util.Date;
+import java.util.List;
+
 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 org.springframework.util.CollectionUtils;
 
 /**
  * <p>
@@ -48,6 +51,9 @@ public class ChannelCouponVerifyLogServiceImpl extends ServiceImpl<ChannelCoupon
   @Autowired
   private IChannelMoneyLogService channelMoneyLogService;
 
+  @Autowired
+  private IChannelGoodsService channelGoodsService;
+
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void verify(Long channelId, UserCoupon userCoupon) {
@@ -92,7 +98,27 @@ public class ChannelCouponVerifyLogServiceImpl extends ServiceImpl<ChannelCoupon
         channelMoneyLogService.changeMoney(moneyLog);
       }
     } else if (CouponDiscountTypeEnum.EXCHANGE == coupon.getDiscountType()) {
-
+      LambdaQueryWrapper<ChannelGoods> queryWrapper = new LambdaQueryWrapper<ChannelGoods>()
+              .eq(ChannelGoods::getChannelId, channelId)
+              .eq(ChannelGoods::getRefId, coupon.getCouponId())
+              .eq(ChannelGoods::getStatus, ChannelGoodsSettleStatusTypeEnum.NO)
+              .ge(ChannelGoods::getRemainQty, 0)
+              .orderByAsc(ChannelGoods::getCreatedTime);
+      List<ChannelGoods> channelGoodsList = channelGoodsService.list(queryWrapper);
+      if (CollectionUtils.isEmpty(channelGoodsList)) {
+          LogUtil.error(logger, "门店下未进货绑定该优惠劵的商品,channelId:{0}, couponId:{1}", channelId, coupon.getCouponId());
+        throw new ServiceException("门店下未进货绑定该优惠劵的商品");
+      }
+      ChannelGoods channelGoods = channelGoodsList.get(0);
+      if (channelGoods.getRemainQty() == 0) {
+        LogUtil.error(logger, "商品库存不足,无法核销,channelId:{0}, channel_goods_id:{1}", channelId, channelGoods.getId());
+        throw new ServiceException("门店商品库存不足,无法核销,请前往采购商品");
+      }
+      boolean rst = channelGoodsService.update(new LambdaUpdateWrapper<ChannelGoods>()
+              .set(ChannelGoods::getRemainQty, channelGoods.getRemainQty() - 1)
+              .set(ChannelGoods::getVerifyQty, channelGoods.getVerifyQty() + 1)
+              .eq(ChannelGoods::getId, channelGoods.getId()));
+      Assert.isTrue(rst,"更新门店下铺设商品失败,channel_goods_id:" + channelGoods.getId());
     } else {
       LogUtil.warn(logger, "优惠券核销结算,类型非代金券,忽略。userCouponId:{0}", userCoupon.getId());
     }