Răsfoiți Sursa

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

zhangkaikai 1 an în urmă
părinte
comite
580b096e6a
21 a modificat fișierele cu 741 adăugiri și 63 ștergeri
  1. 210 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelGoodsOrderMgrController.java
  2. 4 6
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java
  3. 44 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelGoodsSettleStatusTypeEnum.java
  4. 42 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelGoodsOrderShipParam.java
  5. 167 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoods.java
  6. 31 29
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoodsOrderItem.java
  7. 44 0
      mp-service/src/main/java/com/qs/mp/channel/domain/excel/ChannelGoodsOrderExcel.java
  8. 5 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderInfoVO.java
  9. 2 3
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderItemVO.java
  10. 13 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelGoodsMapper.java
  11. 1 1
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelGoodsOrderItemMapper.java
  12. 2 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelGoodsOrderMapper.java
  13. 6 9
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsOrderItemService.java
  14. 13 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsOrderService.java
  15. 13 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsService.java
  16. 6 3
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsOrderItemServiceImpl.java
  17. 71 3
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsOrderServiceImpl.java
  18. 17 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsServiceImpl.java
  19. 37 0
      mp-service/src/main/resources/mapper/channel/ChannelGoodsMapper.xml
  20. 6 6
      mp-service/src/main/resources/mapper/channel/ChannelGoodsOrderItemMapper.xml
  21. 7 0
      mp-service/src/main/resources/mapper/channel/ChannelGoodsOrderMapper.xml

+ 210 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelGoodsOrderMgrController.java

@@ -1,20 +1,38 @@
 package com.qs.mp.web.controller.api.admin;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.param.ChannelGoodsOrderQueryParam;
+import com.qs.mp.admin.domain.param.ChannelGoodsOrderShipParam;
+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.excel.ChannelGoodsOrderExcel;
+import com.qs.mp.channel.domain.vo.ChannelGoodsOrderInfoVO;
 import com.qs.mp.channel.domain.vo.ChannelGoodsOrderItemVO;
 import com.qs.mp.channel.domain.vo.ChannelGoodsOrderVO;
+import com.qs.mp.channel.domain.vo.ChannelVO;
 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.annotation.Log;
+import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.domain.DeliveryCompany;
+import com.qs.mp.common.enums.BusinessType;
+import com.qs.mp.common.enums.DeliverTypeEnum;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.service.IDeliveryCompanyService;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.utils.ExcelUtil;
 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 ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -23,7 +41,10 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @author zhangkaikai
@@ -42,6 +63,18 @@ public class ChannelGoodsOrderMgrController extends BaseApiController {
     @Autowired
     private IChannelGoodsOrderItemService channelGoodsOrderItemService;
 
+    @Autowired
+    private IChannelService channelService;
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private IDeliveryCompanyService deliveryCompanyService;
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
     /**
      * 采购商品订单列表
      */
@@ -66,8 +99,7 @@ public class ChannelGoodsOrderMgrController extends BaseApiController {
         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());
+            goodsOrderItemQueryWrapper.eq("t1.order_id", channelGoodsOrderVO.getOrderId());
             List<ChannelGoodsOrderItemVO> orderItemVOList = channelGoodsOrderItemService.selectChannelGoodsOrderItemVOList(goodsOrderItemQueryWrapper);
             channelGoodsOrderVO.setItems(orderItemVOList);
         }
@@ -75,8 +107,183 @@ public class ChannelGoodsOrderMgrController extends BaseApiController {
     }
 
     /**
-     *
+     * 采购商品订单详情
      */
+    @PostMapping("/detail")
+    @ApiOperation(value = "订单详情", notes = "在订单列表页面查看详情")
+    @PreAuthorize("@ss.hasPermi('order:channel:query')")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "success", response = ChannelGoodsOrderInfoVO.class)
+    )
+    public AjaxResult query(@RequestBody ChannelGoodsOrder order) {
+        if (null == order || StringUtils.isBlank(order.getOrderId())) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        ChannelGoodsOrder channelGoodsOrder = channelGoodsOrderService.getById(order.getOrderId());
+        ChannelGoodsOrderInfoVO goodsOrderInfoVO = mapperFacade.map(channelGoodsOrder, ChannelGoodsOrderInfoVO.class);
+
+        if (null != goodsOrderInfoVO && null != goodsOrderInfoVO.getChannelId()) {
+            ChannelVO channel = channelService.getChannelVoById(goodsOrderInfoVO.getChannelId());
+            goodsOrderInfoVO.setChannel(channel);
+        }
+        if (null != goodsOrderInfoVO && null != goodsOrderInfoVO.getDeliveryId()) {
+            DeliveryCompany deliveryCompany = deliveryCompanyService.getById(goodsOrderInfoVO.getDeliveryId());
+            goodsOrderInfoVO.setDeliveryCompany(deliveryCompany);
+        }
+        ChannelGoodsOrderItem item = channelGoodsOrderItemService.getOne(new QueryWrapper<ChannelGoodsOrderItem>().eq("order_id", order.getOrderId()));
+
+        goodsOrderInfoVO.setChannelGoodsOrderItem(item);
+        return AjaxResult.success(goodsOrderInfoVO);
+    }
+
+
+    /**
+     * 订单发货
+     */
+    @Log(title = "订单发货", businessType = BusinessType.UPDATE)
+    @PostMapping("/ship")
+    @ApiOperation(value = "订单发货", notes = "在订单发货页面提交")
+    @PreAuthorize("@ss.hasPermi('order:channel:ship')")
+    public AjaxResult ship(@RequestBody ChannelGoodsOrderShipParam shipParam) {
+
+        if(null == shipParam || StringUtils.isBlank(shipParam.getOrderId())) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        ChannelGoodsOrder order = channelGoodsOrderService.getById(shipParam.getOrderId());
+
+
+        if(null == order || StringUtils.isBlank(order.getOrderId())
+                || null == order.getChannelId()) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        Integer deliveryType = shipParam.getDeliveryType();
+
+        if (DeliverTypeEnum.DELIVER.getValue().equals(deliveryType)) {
+            if (Objects.isNull(shipParam.getDeliveryId())) {
+                return AjaxResult.error("快递公司不能为空");
+            }
+            if (StringUtils.isBlank(shipParam.getDeliveryFlowId())) {
+                return AjaxResult.error("快递单号不能为空");
+            }
+        }
+
+        ChannelGoodsOrder goodsOrder = new ChannelGoodsOrder();
+        if (DeliverTypeEnum.NO_DELIVER.getValue().equals(deliveryType)) {
+            // 无需物流,设置发货时间为当前时间
+            goodsOrder.setOrderId(shipParam.getOrderId());
+            goodsOrder.setChannelId(order.getChannelId());
+            goodsOrder.setDeliveryTime(new Date());
+
+        } else if (DeliverTypeEnum.DELIVER.getValue().equals(deliveryType)) {
+            // 快递发货,设置物流信息
+            goodsOrder.setOrderId(shipParam.getOrderId());
+            goodsOrder.setChannelId(order.getChannelId());
+            goodsOrder.setDeliveryId(shipParam.getDeliveryId().toString());
+            goodsOrder.setDeliveryFlowId(shipParam.getDeliveryFlowId());
+            goodsOrder.setDeliveryTime(new Date());
+        }
+
+        boolean rst = channelGoodsOrderService.ship(goodsOrder);
+        return AjaxResult.success("发货成功");
+
+    }
+
+    @Log(title = "订单导出", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @PreAuthorize("@ss.hasPermi('order:channel:export')")
+    public AjaxResult export(@RequestBody ChannelGoodsOrderQueryParam queryParam) {
+        Date startTime = queryParam.getStartTime();
+        Date endTime = queryParam.getEndTime();
+        if (startTime == null || endTime == null) {
+            return AjaxResult.error("导出数据必须设置日期范围");
+        }
+        if (DateUtils.diff(startTime, endTime) > 30) {
+            return AjaxResult.error("导出的数据不能超过31天");
+        }
+
+        List<ChannelGoodsOrderExcel> excelList = new ArrayList<>();
+        List<ChannelGoodsOrderVO> listALl = new ArrayList<>();
+
+        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");
+        int totalSize = channelGoodsOrderService.selectChannelGoodsOrderCount(queryWrapper);
+
+        if (totalSize == 0) {
+            return AjaxResult.error("没有符合条件的采购商品订单");
+        }
+
+        int pageSize = 2000;
+        if (totalSize > pageSize) {
+            int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
+            for (int i = 0; i < totalPage; i++) {
+                queryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
+                List<ChannelGoodsOrderVO> channelGoodsOrderVOList = channelGoodsOrderService.selectChannelGoodsOrderVOList(queryWrapper);
+                for (ChannelGoodsOrderVO channelGoodsOrderVO : channelGoodsOrderVOList) {
+                    List<ChannelGoodsOrderItem> items = channelGoodsOrderItemService.list(new LambdaQueryWrapper<ChannelGoodsOrderItem>().eq(ChannelGoodsOrderItem::getOrderId, channelGoodsOrderVO.getOrderId()));
+                    List<ChannelGoodsOrderItemVO> channelGoodsOrderItemVOS = mapperFacade.mapAsList(items, ChannelGoodsOrderItemVO.class);
+                    for (ChannelGoodsOrderItemVO itemVO : channelGoodsOrderItemVOS) {
+                        Goods goods = goodsService.getById(itemVO.getGoodsId());
+                        itemVO.setTitle(goods.getTitle());
+                    }
+                    channelGoodsOrderVO.setItems(channelGoodsOrderItemVOS);
+                }
+                if (channelGoodsOrderVOList.size() > 0) {
+                    listALl.addAll(channelGoodsOrderVOList);
+                }
+            }
+        } else {
+            listALl = channelGoodsOrderService.selectChannelGoodsOrderVOList(queryWrapper);
+            for (ChannelGoodsOrderVO channelGoodsOrderVO : listALl) {
+                List<ChannelGoodsOrderItem> items = channelGoodsOrderItemService.list(new LambdaQueryWrapper<ChannelGoodsOrderItem>().eq(ChannelGoodsOrderItem::getOrderId, channelGoodsOrderVO.getOrderId()));
+                List<ChannelGoodsOrderItemVO> channelGoodsOrderItemVOS = mapperFacade.mapAsList(items, ChannelGoodsOrderItemVO.class);
+                for (ChannelGoodsOrderItemVO itemVO : channelGoodsOrderItemVOS) {
+                    Goods goods = goodsService.getById(itemVO.getGoodsId());
+                    itemVO.setTitle(goods.getTitle());
+                }
+                channelGoodsOrderVO.setItems(channelGoodsOrderItemVOS);
+            }
+        }
+
+        if (listALl.size() > 0) {
+            for (ChannelGoodsOrderVO goodsOrderVO : listALl) {
+                if (null != goodsOrderVO && StringUtils.isNotBlank(goodsOrderVO.getOrderId())
+                        && StringUtils.isNotBlank(goodsOrderVO.getReceiver())
+                        && StringUtils.isNotBlank(goodsOrderVO.getTel())
+                        && StringUtils.isNotBlank(goodsOrderVO.getProvince())
+                        && StringUtils.isNotBlank(goodsOrderVO.getCity())
+                        && StringUtils.isNotBlank(goodsOrderVO.getArea())
+                        && StringUtils.isNotBlank(goodsOrderVO.getAddress()) && null != goodsOrderVO.getItems()
+                        && goodsOrderVO.getItems().size() > 0) {
+                    for (ChannelGoodsOrderItemVO item : goodsOrderVO.getItems()) {
+                        if (null != item) {
+                            ChannelGoodsOrderExcel excel = new ChannelGoodsOrderExcel();
+                            excel.setTitle(item.getTitle());
+                            excel.setNum(item.getGoodsNum().toString());
+                            excel.setSupplierName(goodsOrderVO.getSupplierName());
+                            excel.setCreateTime(goodsOrderVO.getCreatedTime());
+                            excel.setAddress(goodsOrderVO.getProvince() + goodsOrderVO.getCity() + goodsOrderVO.getArea() + goodsOrderVO.getAddress());
+                            excel.setOrderStatus(goodsOrderVO.getStatus().getDesc());
+                            excel.setShipStatus(goodsOrderVO.getStatus().getValue() > 1 ? "已发货" : "未发货”)");
+                            excel.setOrderNo(goodsOrderVO.getOrderId());
+                            excel.setReceiver(goodsOrderVO.getReceiver());
+                            excel.setTel(goodsOrderVO.getTel());
+                            excelList.add(excel);
+                        }
+                    }
+                }
+            }
+        }
+
+        ExcelUtil<ChannelGoodsOrderExcel> util = new ExcelUtil<>(ChannelGoodsOrderExcel.class);
+        return util.exportExcel(excelList, "门店采购商品订单导出",false);
+     }
 
 
 }

+ 4 - 6
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java

@@ -27,12 +27,7 @@ import com.qs.mp.common.constant.Constants;
 import com.qs.mp.common.constant.UserConstants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
-import com.qs.mp.common.enums.BusinessType;
-import com.qs.mp.common.enums.CouponStatusEnum;
-import com.qs.mp.common.enums.CouponTypeEnum;
-import com.qs.mp.common.enums.CouponUseAreaEnum;
-import com.qs.mp.common.enums.ErrorCodeEnum;
-import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.user.domain.UserCoupon;
@@ -232,6 +227,9 @@ public class CouponMgrController extends BaseApiController {
             }
         }
         Coupon coupon = mapperFacade.map(couponParam, Coupon.class);
+        if (CouponTypeEnum.SITE_GOODS_VERITY.equals(couponParam.getType())) {
+            coupon.setDiscountType(CouponDiscountTypeEnum.EXCHANGE);
+        }
         if (StringUtils.isBlank(couponParam.getCouponDetail())) {
             coupon.setCouponDetail("");
         } else {

+ 44 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelGoodsSettleStatusTypeEnum.java

@@ -0,0 +1,44 @@
+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-06 5:02 PM
+ **/
+
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelGoodsSettleStatusTypeEnum implements IEnum<Integer> {
+
+
+    NO(1, "未结算"),
+    FINISHED(2, "已结算"),;
+
+    private final Integer value;
+    private final String desc;
+
+    ChannelGoodsSettleStatusTypeEnum(final Integer value, final String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    /**
+     * 重写toString,单个转化成json
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value",value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+}

+ 42 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelGoodsOrderShipParam.java

@@ -0,0 +1,42 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-06 2:14 PM
+ **/
+@ApiModel("门店采购商品订单发货参数")
+@Data
+public class ChannelGoodsOrderShipParam {
+
+    @ApiModelProperty(value = "订单编号", required = false)
+    private String orderId;
+
+    @NotNull(message = "配送类型不能为空")
+    @ApiModelProperty(value = "配送类型 1快递 2 无需物流", required = false)
+    private Integer deliveryType;
+
+    /**
+     * 物流公司ID
+     */
+    @NotNull(message = "快递公司不能为空")
+    @ApiModelProperty(value = "物流公司", required = false)
+    private Long deliveryId;
+
+    /**
+     * 物流单号ID
+     */
+    @NotNull(message = "物流单号不能为空")
+    @ApiModelProperty(value = "物流单号", required = false)
+    private String deliveryFlowId;
+
+    @NotNull(message = "发货商品不能为空")
+    @ApiModelProperty(value = "发货商品", required = false)
+    private List<Long> itemIds;;
+}

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

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

+ 31 - 29
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelGoodsOrderItem.java

@@ -7,52 +7,58 @@ 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
+ * @create 2023-06-07 01:21:14
  */
 @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)
+         @TableId(value = "item_id", type = IdType.AUTO)
     private Long itemId;
 
-    /**
+        /**
      * 渠道ID
      */
-    @ApiModelProperty("渠道ID")
-    @TableField("channel_id")
+         @TableField("channel_id")
     private Long channelId;
 
-    /**
+        /**
      * 订单ID
      */
-    @ApiModelProperty("订单ID")
-    @TableField("order_id")
+         @TableField("order_id")
     private String orderId;
 
-    /**
+        /**
      * 商品ID
      */
-    @ApiModelProperty("商品ID")
-    @TableField("goods_id")
+         @TableField("goods_id")
     private Long goodsId;
 
-    /**
+        /**
+     * sku ID
+     */
+         @TableField("sku_id")
+    private Long skuId;
+
+        /**
+     * sku 属性
+     */
+         @TableField("properties")
+    private String properties;
+
+        /**
      * 商品标题
      */
-    @ApiModelProperty("商品标题")
-    @TableField("title")
+         @TableField("title")
     private String title;
 
         /**
@@ -61,32 +67,28 @@ public class ChannelGoodsOrderItem implements Serializable {
          @TableField("pic_url")
     private String picUrl;
 
-    /**
+        /**
      * 商品数量
      */
-    @ApiModelProperty("商品数量")
-    @TableField("goods_num")
+         @TableField("goods_num")
     private Integer goodsNum;
 
-    /**
+        /**
      * 供应商id
      */
-    @ApiModelProperty("供应商id")
-    @TableField("supplier_id")
+         @TableField("supplier_id")
     private Long supplierId;
 
-    /**
+        /**
      * 创建时间
      */
-    @ApiModelProperty("创建时间")
-    @TableField("created_time")
+         @TableField("created_time")
     private Date createdTime;
 
-    /**
+        /**
      * 更新时间
      */
-    @ApiModelProperty("更新时间")
-    @TableField("updated_time")
+         @TableField("updated_time")
     private Date updatedTime;
 
 

+ 44 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/excel/ChannelGoodsOrderExcel.java

@@ -0,0 +1,44 @@
+package com.qs.mp.channel.domain.excel;
+
+import com.qs.mp.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-06 5:23 PM
+ **/
+@Data
+public class ChannelGoodsOrderExcel {
+
+    @Excel(name = "商品名称")
+    private String title;
+
+    @Excel(name = "商品数量")
+    private String num;
+
+    @Excel(name = "供应商名称")
+    private String supplierName;
+
+    @Excel(name = "下单时间")
+    private Date createTime;
+
+    @Excel(name = "发货状态")
+    private String shipStatus;
+
+    @Excel(name = "订单编号")
+    private String orderNo;
+
+    @Excel(name = "订单状态")
+    private String orderStatus;
+
+    @Excel(name = "收货人")
+    private String receiver;
+
+    @Excel(name = "联系电话)")
+    private String tel;
+
+    @Excel(name = "收货地址")
+    private String address;
+}

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

@@ -18,8 +18,13 @@ public class ChannelGoodsOrderInfoVO extends ChannelGoodsOrder {
     @ApiModelProperty("自动确认收货时间")
     private String autoConfirmTime;
 
+    @ApiModelProperty("物流信息")
     private DeliveryCompany deliveryCompany;
 
+    @ApiModelProperty("渠道信息")
+    private ChannelVO channel;
+
+    @ApiModelProperty("采购商品订单详情")
     private ChannelGoodsOrderItem channelGoodsOrderItem;
 
 }

+ 2 - 3
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelGoodsOrderItemVO.java

@@ -3,6 +3,7 @@ package com.qs.mp.channel.domain.vo;
 import com.qs.mp.channel.domain.ChannelGoodsOrderItem;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 /**
  * @author zhangkaikai
@@ -10,11 +11,9 @@ import io.swagger.annotations.ApiModelProperty;
  **/
 
 @ApiModel("门店采购商品明细出参类")
+@Data
 public class ChannelGoodsOrderItemVO extends ChannelGoodsOrderItem {
 
-    @ApiModelProperty("商品图片")
-    private String picUrl;
-
     @ApiModelProperty("商品名称")
     private String title;
 }

+ 13 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelGoodsMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.channel.mapper;
+
+import com.qs.mp.channel.domain.ChannelGoods;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-07 01:13:35
+ * @describe 商品库mapper类
+ */
+public interface ChannelGoodsMapper extends BaseMapper<ChannelGoods> {
+
+}

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

@@ -11,7 +11,7 @@ import java.util.List;
 
 /**
  * @auther quanshu
- * @create 2023-06-05 11:01:39
+ * @create 2023-06-07 01:21:14
  * @describe 经销商商品采购订单明细mapper类
  */
 public interface ChannelGoodsOrderItemMapper extends BaseMapper<ChannelGoodsOrderItem> {

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

@@ -17,4 +17,6 @@ import java.util.List;
 public interface ChannelGoodsOrderMapper extends BaseMapper<ChannelGoodsOrder> {
 
     List<ChannelGoodsOrderVO> selectChannelGoodsOrderVOList(@Param(Constants.WRAPPER) QueryWrapper<ChannelGoodsOrder> queryWrapper);
+
+    int selectChannelGoodsOrderCount(@Param(Constants.WRAPPER) QueryWrapper<ChannelGoodsOrder> queryWrapper);
 }

+ 6 - 9
mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsOrderItemService.java

@@ -8,17 +8,14 @@ import com.qs.mp.channel.domain.vo.ChannelGoodsOrderItemVO;
 import java.util.List;
 
 /**
- * @auther quanshu
- * @create 2023-06-05 11:01:39
- * @describe 经销商商品采购订单明细服务类
+ * <p>
+ * 经销商商品采购订单明细 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-06-07
  */
 public interface IChannelGoodsOrderItemService extends IService<ChannelGoodsOrderItem> {
 
-    /**
-     * 门店采购商品明细查询
-     *
-     * @param goodsOrderItemQueryWrapper
-     * @return
-     */
     List<ChannelGoodsOrderItemVO> selectChannelGoodsOrderItemVOList(QueryWrapper<ChannelGoodsOrderItem> goodsOrderItemQueryWrapper);
 }

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

@@ -53,5 +53,18 @@ public interface IChannelGoodsOrderService extends IService<ChannelGoodsOrder> {
      */
     List<ChannelGoodsOrderVO> selectChannelGoodsOrderVOList(QueryWrapper<ChannelGoodsOrder> queryWrapper);
 
+    /**
+     * 发货
+     * @param goodsOrder
+     * @return
+     */
+
+    boolean ship(ChannelGoodsOrder goodsOrder);
 
+    /**
+     * 查询满足条件门店采购商品订单数量
+     * @param queryWrapper
+     * @return
+     */
+    int selectChannelGoodsOrderCount(QueryWrapper<ChannelGoodsOrder> queryWrapper);
 }

+ 13 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelGoodsService.java

@@ -0,0 +1,13 @@
+package com.qs.mp.channel.service;
+
+import com.qs.mp.channel.domain.ChannelGoods;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-07 01:13:35
+ * @describe 商品库服务类
+ */
+public interface IChannelGoodsService extends IService<ChannelGoods> {
+
+}

+ 6 - 3
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsOrderItemServiceImpl.java

@@ -11,9 +11,12 @@ import org.springframework.stereotype.Service;
 import java.util.List;
 
 /**
- * @auther quanshu
- * @create 2023-06-05 11:01:39
- * @describe 经销商商品采购订单明细服务实现类
+ * <p>
+ * 经销商商品采购订单明细 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-06-07
  */
 @Service
 public class ChannelGoodsOrderItemServiceImpl extends ServiceImpl<ChannelGoodsOrderItemMapper, ChannelGoodsOrderItem> implements IChannelGoodsOrderItemService {

+ 71 - 3
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelGoodsOrderServiceImpl.java

@@ -4,8 +4,11 @@ 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.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.admin.service.IGoodsSkuService;
+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.vo.ChannelGoodsOrderSettleVO;
@@ -14,9 +17,8 @@ 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.channel.service.IChannelGoodsService;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
@@ -30,6 +32,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -52,6 +55,12 @@ public class ChannelGoodsOrderServiceImpl extends ServiceImpl<ChannelGoodsOrderM
     @Autowired
     private IGoodsService goodsService;
 
+    @Autowired
+    private IChannelGoodsService channelGoodsService;
+
+    @Autowired
+    private IGoodsSkuService goodsSkuService;
+
     @Autowired
     private BizIdGenerator bizIdGenerator;
 
@@ -103,6 +112,7 @@ public class ChannelGoodsOrderServiceImpl extends ServiceImpl<ChannelGoodsOrderM
         item.setChannelId(channelId);
         item.setOrderId(orderId);
         item.setGoodsId(goods.getGoodsId());
+
         item.setTitle(goods.getTitle());
         item.setGoodsNum(orderSettleVO.getOrderNum());
         item.setPicUrl(goods.getPicUrl());
@@ -174,6 +184,24 @@ public class ChannelGoodsOrderServiceImpl extends ServiceImpl<ChannelGoodsOrderM
         param.setConfirmTime(new Date());
         boolean rst = channelGoodsOrderService.updateById(param);
         Assert.isTrue(rst,"门店采购商品订单确认失败,orderId:" + channelGoodsOrder.getOrderId());
+
+        List<ChannelGoodsOrderItem> items = channelGoodsOrderItemService.list(new QueryWrapper<ChannelGoodsOrderItem>().eq("order_id", channelGoodsOrder.getOrderId()));
+        List<ChannelGoods> goodsList = new ArrayList<>();
+        for (ChannelGoodsOrderItem item : items) {
+            Goods goods = goodsService.getById(item.getGoodsId());
+            ChannelGoods channelGoods = new ChannelGoods();
+            channelGoods.setChannelId(item.getChannelId());
+            channelGoods.setGoodsId(item.getGoodsId());
+            channelGoods.setOrderId(item.getOrderId());
+            channelGoods.setTitle(item.getTitle());
+            channelGoods.setPicUrl(item.getPicUrl());
+            channelGoods.setStatus(ChannelGoodsSettleStatusTypeEnum.NO);
+            channelGoods.setRefId(goods.getRefId());
+            channelGoods.setSupplierId(item.getSupplierId());
+            channelGoods.setQuantity(item.getGoodsNum());
+            goodsList.add(channelGoods);
+        }
+        channelGoodsService.saveBatch(goodsList);
     }
 
     @Override
@@ -181,4 +209,44 @@ public class ChannelGoodsOrderServiceImpl extends ServiceImpl<ChannelGoodsOrderM
         return getBaseMapper().selectChannelGoodsOrderVOList(queryWrapper);
     }
 
+    @Override
+    public boolean ship(ChannelGoodsOrder goodsOrder) {
+        if(null == goodsOrder || StringUtils.isBlank(goodsOrder.getOrderId())) {
+            throw new ServiceException("发货订单异常,发货失败");
+        }
+
+        String deliveryFlowId = goodsOrder.getDeliveryFlowId();
+        // 物流单号为空则表示无需物流发货
+        if (StringUtils.isBlank(deliveryFlowId)) {
+            goodsOrder.setStatus(ChannelGoodsOrderStatusEnum.FINISHED);
+            List<ChannelGoodsOrderItem> items = channelGoodsOrderItemService.list(new QueryWrapper<ChannelGoodsOrderItem>().eq("order_id", goodsOrder.getOrderId()));
+            List<ChannelGoods> goodsList = new ArrayList<>();
+            for (ChannelGoodsOrderItem item : items) {
+                Goods goods = goodsService.getById(item.getGoodsId());
+                ChannelGoods channelGoods = new ChannelGoods();
+                channelGoods.setChannelId(item.getChannelId());
+                channelGoods.setGoodsId(item.getGoodsId());
+                channelGoods.setOrderId(item.getOrderId());
+                channelGoods.setTitle(item.getTitle());
+                channelGoods.setPicUrl(item.getPicUrl());
+                channelGoods.setStatus(ChannelGoodsSettleStatusTypeEnum.NO);
+                channelGoods.setRefId(goods.getRefId());
+                channelGoods.setSupplierId(item.getSupplierId());
+                channelGoods.setQuantity(item.getGoodsNum());
+                goodsList.add(channelGoods);
+            }
+            channelGoodsService.saveBatch(goodsList);
+        } else {
+            goodsOrder.setStatus(ChannelGoodsOrderStatusEnum.NOT_CONFIRM);
+        }
+        boolean updateOrderRtn = updateById(goodsOrder);
+        Assert.isTrue(updateOrderRtn, "更新采购商品订单失败,orderId:" + goodsOrder.getOrderId());
+        return true;
+    }
+
+    @Override
+    public int selectChannelGoodsOrderCount(QueryWrapper<ChannelGoodsOrder> queryWrapper) {
+        return getBaseMapper().selectChannelGoodsOrderCount(queryWrapper);
+    }
+
 }

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

@@ -0,0 +1,17 @@
+package com.qs.mp.channel.service.impl;
+
+import com.qs.mp.channel.domain.ChannelGoods;
+import com.qs.mp.channel.mapper.ChannelGoodsMapper;
+import com.qs.mp.channel.service.IChannelGoodsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-07 01:13:35
+ * @describe 商品库服务实现类
+ */
+@Service
+public class ChannelGoodsServiceImpl extends ServiceImpl<ChannelGoodsMapper, ChannelGoods> implements IChannelGoodsService {
+
+}

+ 37 - 0
mp-service/src/main/resources/mapper/channel/ChannelGoodsMapper.xml

@@ -0,0 +1,37 @@
+<?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.ChannelGoodsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.channel.domain.ChannelGoods">
+        <id column="id" property="id" />
+        <result column="channel_id" property="channelId" />
+        <result column="goods_id" property="goodsId" />
+        <result column="order_id" property="orderId" />
+        <result column="title" property="title" />
+        <result column="pic_url" property="picUrl" />
+        <result column="type" property="type" />
+        <result column="description" property="description" />
+        <result column="ref_id" property="refId" />
+        <result column="purchase_price" property="purchasePrice" />
+        <result column="purchase_cost" property="purchaseCost" />
+        <result column="quantity" property="quantity" />
+        <result column="verify_qty" property="verifyQty" />
+        <result column="status" property="status" />
+        <result column="merchant_info" property="merchantInfo" />
+        <result column="supplier_id" property="supplierId" />
+        <result column="sort_weight" property="sortWeight" />
+        <result column="multi_sku" property="multiSku" />
+        <result column="sku_prop" property="skuProp" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="settle_time" property="settleTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, channel_id, goods_id, order_id, title, pic_url, type, description, ref_id, purchase_price, purchase_cost, quantity, verify_qty, status, merchant_info, supplier_id, sort_weight, multi_sku, sku_prop, is_deleted, created_time, updated_time, settle_time
+    </sql>
+
+</mapper>

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

@@ -8,6 +8,8 @@
         <result column="channel_id" property="channelId" />
         <result column="order_id" property="orderId" />
         <result column="goods_id" property="goodsId" />
+        <result column="sku_id" property="skuId" />
+        <result column="properties" property="properties" />
         <result column="title" property="title" />
         <result column="pic_url" property="picUrl" />
         <result column="goods_num" property="goodsNum" />
@@ -18,16 +20,14 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        item_id, channel_id, order_id, goods_id, title, pic_url, goods_num, supplier_id, created_time, updated_time
+        item_id, channel_id, order_id, goods_id, sku_id, properties, 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
+        select t1.*,t2.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}
+        left join mp_goods t2 on t1.goods_id = t2.goods_id
+        ${ew.customSqlSegment}
     </select>
 
-
 </mapper>

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

@@ -41,5 +41,12 @@
                  left join mp_supplier t3 on t2.supplier_id = t3.id
             ${ew.customSqlSegment}
     </select>
+    <select id="selectChannelGoodsOrderCount" resultType="java.lang.Integer">
+        select count(DISTINCT t1.order_id)
+        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>