3 Commity 234bbf416c ... 9af4258400

Autor SHA1 Wiadomość Data
  fubojin 9af4258400 dev合并master 1 miesiąc temu
  fubojin 7155d5181a 暂时停止分单处理,推送市民请结合商品模块需要数据 1 miesiąc temu
  fubojin c87b15c215 分单处理 1 miesiąc temu
52 zmienionych plików z 2003 dodań i 845 usunięć
  1. 20 19
      yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java
  2. 19 1
      yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java
  3. 1 1
      yami-shop-api/src/main/java/com/yami/shop/api/controller/SearchController.java
  4. 151 10
      yami-shop-api/src/main/java/com/yami/shop/api/controller/UserController.java
  5. 2 9
      yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java
  6. 6 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDto.java
  7. 2 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserDto.java
  8. 0 3
      yami-shop-bean/src/main/java/com/yami/shop/bean/event/SubmitOrderEvent.java
  9. 16 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/Channel.java
  10. 41 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/Order.java
  11. 9 2
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderItem.java
  12. 1 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java
  13. 23 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/param/BackendOrderParam.java
  14. 37 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/param/ConfirmSplitOrderParam.java
  15. 59 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/param/ManualSplitOrderParam.java
  16. 4 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/param/OrderParam.java
  17. 4 4
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/ChannelProdExportVO.java
  18. 4 4
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/ChannelProdImportVO.java
  19. 3 1
      yami-shop-common/src/main/java/com/yami/shop/common/util/HttpUtil.java
  20. 1 1
      yami-shop-groupbuy/yami-shop-groupbuy-comment/src/main/java/com/yami/shop/groupbuy/comment/service/impl/GroupOrderServiceImpl.java
  21. 25 12
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ChannelController.java
  22. 80 14
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/OrderController.java
  23. 13 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopCategoryController.java
  24. 87 102
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopDetailController.java
  25. 20 4
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/HBOrderController.java
  26. 1 1
      yami-shop-seckill/yami-shop-seckill-comment/src/main/java/com/yami/shop/seckill/comment/service/impl/SeckillOrderServiceImpl.java
  27. 1 0
      yami-shop-security/yami-shop-security-api/src/main/java/com/yami/shop/security/api/config/ResourceServerConfiguration.java
  28. 4 1
      yami-shop-security/yami-shop-security-api/src/main/java/com/yami/shop/security/api/service/impl/YamiUserServiceImpl.java
  29. 0 1
      yami-shop-security/yami-shop-security-comment/src/main/java/com/yami/shop/security/comment/token/AuthenticationToken.java
  30. 1 31
      yami-shop-security/yami-shop-security-comment/src/main/java/com/yami/shop/security/comment/util/YamiTokenServices.java
  31. 6 0
      yami-shop-service/pom.xml
  32. 6 0
      yami-shop-service/src/main/java/com/yami/shop/dao/ChannelMapper.java
  33. 2 0
      yami-shop-service/src/main/java/com/yami/shop/dao/ChannelProdMapper.java
  34. 2 3
      yami-shop-service/src/main/java/com/yami/shop/dao/OrderMapper.java
  35. 1 1
      yami-shop-service/src/main/java/com/yami/shop/dao/ProductMapper.java
  36. 5 0
      yami-shop-service/src/main/java/com/yami/shop/service/ChannelService.java
  37. 34 4
      yami-shop-service/src/main/java/com/yami/shop/service/OrderService.java
  38. 1 1
      yami-shop-service/src/main/java/com/yami/shop/service/ProductService.java
  39. 37 6
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBFrontCategoryService.java
  40. 118 2
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBGoodsService.java
  41. 5 6
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelProdServiceImpl.java
  42. 6 0
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelServiceImpl.java
  43. 2 11
      yami-shop-service/src/main/java/com/yami/shop/service/impl/MyOrderServiceImpl.java
  44. 718 213
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java
  45. 1 58
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java
  46. 94 0
      yami-shop-service/src/main/java/com/yami/shop/utils/BinPackingUtil.java
  47. 5 0
      yami-shop-service/src/main/resources/mapper/ChannelMapper.xml
  48. 274 246
      yami-shop-service/src/main/resources/mapper/OrderMapper.xml
  49. 29 52
      yami-shop-service/src/main/resources/mapper/ProductMapper.xml
  50. 17 15
      yami-shop-service/src/main/resources/mapper/ShopCategoryMapper.xml
  51. 4 4
      yami-shop-service/src/main/resources/mapper/ShopSkuMapper.xml
  52. 1 1
      yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/impl/ScoreOrderServiceImpl.java

+ 20 - 19
yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java

@@ -77,7 +77,7 @@ public class OrderController {
     @PostMapping("/confirm")
     @ApiOperation(value = "结算,生成订单信息", notes = "传入下单所需要的参数进行下单")
     public ResponseEntity<ShopCartOrderMergerDto> confirm(@Valid @RequestBody OrderParam orderParam) {
-        if (orderParam.getShopId() == null){
+        if (orderParam.getShopId() == null) {
 //            orderParam.setShopId(1L);
             throw new GlobalException("请选择店铺!");
         }
@@ -88,21 +88,21 @@ public class OrderController {
                 Basket byId = basketService.getById(basketId);
                 Sku byIdss = skuService.getById(byId);
                 ShopSku shopSku = shopSkuMapper.selectByShopAndSku(byIdss.getSkuId(), orderParam.getShopId());
-                if (shopSku.getShopSkuStocks()==null || shopSku.getShopSkuStocks()==0){
-                    throw new GlobalException("当前选择的商品["+byIdss.getSkuName()+"]库存为空!请重新选择商品!");
+                if (shopSku.getShopSkuStocks() == null || shopSku.getShopSkuStocks() == 0) {
+                    throw new GlobalException("当前选择的商品[" + byIdss.getSkuName() + "]库存为空!请重新选择商品!");
                 }
-                if (shopSku.getShopSkuStocks() <  byId.getBasketCount()) {
-                    throw new GlobalException("当前选择的商品["+byIdss.getSkuName()+"]库存不足!");
+                if (shopSku.getShopSkuStocks() < byId.getBasketCount()) {
+                    throw new GlobalException("当前选择的商品[" + byIdss.getSkuName() + "]库存不足!");
                 }
 
             });
-        }  else {
+        } else {
             ShopSku shopSku = shopSkuMapper.selectByShopAndSku(orderParam.getOrderItem().getSkuId(), orderParam.getShopId());
-            if (shopSku.getShopSkuStocks()==null || shopSku.getShopSkuStocks()==0){
-                throw new GlobalException("商品:["+shopSku.getSkuName()+"]库存为空!请重新选择商品!");
+            if (shopSku.getShopSkuStocks() == null || shopSku.getShopSkuStocks() == 0) {
+                throw new GlobalException("商品:[" + shopSku.getSkuName() + "]库存为空!请重新选择商品!");
             }
             if (shopSku.getShopSkuStocks() < orderParam.getOrderItem().getProdCount()) {
-                throw new GlobalException("商品:["+shopSku.getSkuName()+"]库存不足!");
+                throw new GlobalException("商品:[" + shopSku.getSkuName() + "]库存不足!");
             }
         }
 
@@ -115,10 +115,10 @@ public class OrderController {
             orderItem.setChannelId(orderParam.getChannelId());
         }
 
-        System.out.println("orderParam.getBasketIds()"+orderParam.getBasketIds());
-        System.out.println("orderItem"+orderItem);
-        System.out.println("userId"+userId);
-        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(), orderItem, userId,orderParam.getChannelId());
+        System.out.println("orderParam.getBasketIds()" + orderParam.getBasketIds());
+        System.out.println("orderItem" + orderItem);
+        System.out.println("userId" + userId);
+        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(), orderItem, userId, orderParam.getChannelId());
         if (CollectionUtil.isEmpty(shopCartItems)) {
             throw new GlobalException("请选择您需要的商品加入购物车");
         }
@@ -209,7 +209,7 @@ public class OrderController {
         shopCartOrderMergerDto.setTotalUsableScore(Arith.sub(actualTotal, v) < 0 ? actualTotal : v);//总共消耗的积分
 //        shopCartOrderMergerDto.setTotalAvailableScore(point);
 
-        shopCartOrderMergerDto.setTotalAvailableScore((long)Arith.mul(shopCartOrderMergerDto.getTotalUsableScore(),100));//总共消耗的积分
+        shopCartOrderMergerDto.setTotalAvailableScore((long) Arith.mul(shopCartOrderMergerDto.getTotalUsableScore(), 100));//总共消耗的积分
         shopCartOrderMergerDto.setTotal(total);
         shopCartOrderMergerDto.setTotalCount(totalCount);
         shopCartOrderMergerDto.setOrderReduce(allOrderReduce);
@@ -258,7 +258,7 @@ public class OrderController {
         }
         shopCartOrderMergerDto.setActualTotal(Arith.sub(actualTotal, v) < 0 ? 0 : Arith.sub(actualTotal, v));
         shopCartOrderMergerDto.setTotalUsableScore(Arith.sub(actualTotal, v) < 0 ? actualTotal : v);//总共消耗的积分
-        shopCartOrderMergerDto.setTotalAvailableScore((long)Arith.mul(shopCartOrderMergerDto.getTotalUsableScore(),100));
+        shopCartOrderMergerDto.setTotalAvailableScore((long) Arith.mul(shopCartOrderMergerDto.getTotalUsableScore(), 100));
         shopCartOrderMergerDto.setTotalTransfee(totalTransfee);
         shopCartOrderMergerDto.setOrderReduce(allOrderReduce);
 
@@ -324,12 +324,13 @@ public class OrderController {
             basketService.removeShopCartItemsCacheByUserId(userId);
         }
         orderService.removeConfirmOrderCache(userId + submitOrderParam.getUuid());
-
-
         for (Order order : orders) {
-            //推送海博订单
             if (!order.getNextPay()) {
-                hbOrderService.createOrderAsync(order.getOrderNumber());
+                //不拆单和已拆单推到海博
+//                if (order.getSplitStatus() == 1 || order.getOrderLevel() == 1) {
+                    //推送海博订单
+                    hbOrderService.createOrderAsync(order.getOrderNumber());
+//                }
             }
         }
 

+ 19 - 1
yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java

@@ -12,6 +12,7 @@ package com.yami.shop.api.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.yami.shop.bean.bo.PayInfoBo;
+import com.yami.shop.bean.model.Channel;
 import com.yami.shop.bean.model.Order;
 import com.yami.shop.bean.model.OrderItem;
 import com.yami.shop.bean.model.RefundDelivery;
@@ -30,6 +31,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
 import java.util.List;
 
 //@ApiIgnore
@@ -40,6 +42,8 @@ public class PayNoticeController {
 
     private final PayService payService;
 
+    private final OrderService orderService;
+
     private final ProductService productService;
 
     private final SkuService skuService;
@@ -51,6 +55,7 @@ public class PayNoticeController {
     private final WxProviderService wxProviderService;
 
     private final IHBOrderService hbOrderService;
+    private final ChannelService channelService;
 
     @ApiOperation(value = "回调")
     @SneakyThrows
@@ -71,6 +76,20 @@ public class PayNoticeController {
             // 根据内部订单号更新order settlement
             List<Order> orders = payService.paySuccess(payInfoBo.getPayNo(), payInfoBo.getBizPayNo(), 1);
 
+            //进行拆单处理
+//            List<Order> objects = new ArrayList<>();
+//            for (Order order : orders) {
+//                Channel byId = channelService.getById(order.getChannelId());
+//                orderService.cd(order, byId, objects);
+//            }
+//
+//            for (Order order : objects) {
+//                //创建子订单
+//                orderService.save(order);
+//                //推送海博订单
+//                hbOrderService.createOrderAsync(order.getOrderNumber());
+//            }
+
             // 移除缓存
             for (Order order : orders) {
                 List<OrderItem> orderItems = order.getOrderItems();
@@ -85,7 +104,6 @@ public class PayNoticeController {
                 hbOrderService.createOrderAsync(order.getOrderNumber());
             }
         }
-
         return ResponseEntity.ok(payInfoBo.getSuccessString());
     }
 

+ 1 - 1
yami-shop-api/src/main/java/com/yami/shop/api/controller/SearchController.java

@@ -81,7 +81,7 @@ public class SearchController {
 
     @GetMapping("/searchProdPage")
     @ApiOperation(value = "搜索商品(首页商品列表)")
-    public ResponseEntity<IPage<SearchProdDto>> searchProdPage(PageParam page, SearchParam searchParam) {
+    public ResponseEntity<IPage<SearchProdDto>> searchProdPage(PageParam<SearchProdDto> page, SearchParam searchParam) {
         searchParam.setProdType(0);
         IPage<SearchProdDto> searchProdDtoPageByProdName = productService.getSearchProdDtoPageByProdName(page, searchParam);
         return ResponseEntity.ok(searchProdDtoPageByProdName);

+ 151 - 10
yami-shop-api/src/main/java/com/yami/shop/api/controller/UserController.java

@@ -1,19 +1,10 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- * 未经允许,不可做商业用途!
- *
- * 版权所有,侵权必究!
- */
 
 package com.yami.shop.api.controller;
 
 
 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import com.yami.shop.bean.app.dto.UserCenterInfoDto;
 import com.yami.shop.bean.app.dto.UserDto;
 import com.yami.shop.bean.app.param.UserInfoParam;
@@ -21,21 +12,38 @@ import com.yami.shop.bean.model.*;
 import com.yami.shop.bean.param.UserParam;
 import com.yami.shop.config.WxConfig;
 import com.yami.shop.dao.ChannelMapper;
+import com.yami.shop.security.api.model.YamiUser;
+import com.yami.shop.security.api.service.YamiUserDetailsService;
 import com.yami.shop.security.api.util.SecurityUtils;
+import com.yami.shop.security.comment.enums.App;
+import com.yami.shop.security.comment.exception.WxErrorException;
+import com.yami.shop.security.comment.model.AppConnect;
+import com.yami.shop.security.comment.service.AppConnectService;
 import com.yami.shop.service.*;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.OAuth2Request;
+import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
+
 /**
  * 用户信息
  *
  * @author LGH
  */
+@Slf4j
 @RestController
 @RequestMapping("/p/user")
 @Api(tags = "用户接口")
@@ -57,6 +65,14 @@ public class UserController {
     private final ChannelMapper channelMapper;
 
 
+    private final AppConnectService appConnectService;
+
+    private final YamiUserDetailsService yamiUserDetailsService;
+
+    @Lazy
+    private final AuthorizationServerTokenServices yamiTokenServices;
+
+
     /**
      * 查看用户接口
      */
@@ -73,6 +89,7 @@ public class UserController {
         if (userDto.getUserMobile() != null) {
             userDto.setMobile(userDto.getUserMobile().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
         }
+        userDto.setUserId(userId);
 
         return ResponseEntity.ok(userDto);
     }
@@ -134,4 +151,128 @@ public class UserController {
         return ResponseEntity.ok(userParam);
     }
 
+    /**
+     * 小程序登录接口 - 使用实体类方式
+     */
+    @GetMapping("/miniAppLogin")
+    @ApiOperation(value = "小程序登录", notes = "通过微信小程序code登录,返回token信息")
+    public ResponseEntity<MiniAppLoginResponse> miniAppLogin(@RequestParam(value = "code") String code) {
+        try {
+            // 通过微信code获取session信息
+            WxMaJscode2SessionResult session = wxConfig.getWxMaService().getUserService().getSessionInfo(code);
+
+            // 查找或创建AppConnect
+            AppConnect appConnect = appConnectService.getByBizUserId(session.getOpenid(), App.MINI.value());
+            if (appConnect == null) {
+                appConnect = new AppConnect();
+                appConnect.setAppId(App.MINI.value());
+                appConnect.setBizUserId(session.getOpenid());
+                appConnect.setBizUnionid(session.getUnionid());
+                appConnectService.save(appConnect);
+
+            }
+
+            // 加载用户信息
+            YamiUser yamiUser = yamiUserDetailsService.loadUserByAppConnect(appConnect);
+            yamiUser.setSessionKey(session.getSessionKey());
+
+            // 生成OAuth2 Token
+            String clientId = String.valueOf(App.MINI.value());
+            OAuth2Request oAuth2Request = new OAuth2Request(null, clientId, null, true, null,
+                    null, null, null, null);
+
+            // 手动设置用户详情
+            com.yami.shop.security.comment.token.AuthenticationToken authToken =
+                    new com.yami.shop.security.comment.token.AuthenticationToken();
+            authToken.setDetails(yamiUser);
+            authToken.setPrincipal(yamiUser.getUserId());
+            authToken.setAppType(App.MINI.value());
+            authToken.setAuthenticated(true);
+
+            OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authToken);
+
+            // 生成token
+            OAuth2AccessToken oAuth2AccessToken = yamiTokenServices.createAccessToken(oAuth2Authentication);
+
+            // 构造返回对象
+            MiniAppLoginResponse response = new MiniAppLoginResponse();
+            response.setAccess_token(oAuth2AccessToken.getValue());
+            response.setToken_type(oAuth2AccessToken.getTokenType());
+            response.setRefresh_token(oAuth2AccessToken.getRefreshToken() != null ?
+                    oAuth2AccessToken.getRefreshToken().getValue() : null);
+            response.setExpires_in(oAuth2AccessToken.getExpiresIn());
+            response.setScope(oAuth2AccessToken.getScope() != null ?
+                    String.join(",", oAuth2AccessToken.getScope()) : null);
+
+            // 设置用户信息(直接从yamiUser获取,确保有值)
+            response.setUserId(yamiUser.getUserId());
+            response.setNickName(yamiUser.getName());
+            response.setPic(yamiUser.getPic());
+            response.setEnabled(yamiUser.isEnabled());
+
+            // 如果token中也有额外信息,作为备用
+            if (oAuth2AccessToken.getAdditionalInformation() != null && !oAuth2AccessToken.getAdditionalInformation().isEmpty()) {
+                // Token增强器添加的信息作为备用
+                if (response.getUserId() == null) {
+                    response.setUserId((String) oAuth2AccessToken.getAdditionalInformation().get("userId"));
+                }
+//                if (response.getUserId() == null) {
+//                    response.setUserId(appConnect.getUserId());
+//                }
+                if (response.getNickName() == null) {
+                    response.setNickName((String) oAuth2AccessToken.getAdditionalInformation().get("nickName"));
+                }
+                if (response.getNickName() == null) {
+                    response.setNickName(appConnect.getNickName());
+                }
+
+                if (response.getPic() == null) {
+                    response.setPic((String) oAuth2AccessToken.getAdditionalInformation().get("pic"));
+                }
+                if (response.getEnabled() == null) {
+                    response.setEnabled((Boolean) oAuth2AccessToken.getAdditionalInformation().get("enabled"));
+                }
+            }
+            log.info("小程序登录成功,返回response:{}", response);
+            return ResponseEntity.ok(response);
+
+        } catch (me.chanjar.weixin.common.error.WxErrorException e) {
+            throw new WxErrorException("微信登录失败: " + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 小程序登录响应实体
+     */
+    @Data
+    public static class MiniAppLoginResponse {
+        @ApiModelProperty(value = "访问令牌")
+        private String access_token;
+
+        @ApiModelProperty(value = "令牌类型")
+        private String token_type;
+
+        @ApiModelProperty(value = "刷新令牌")
+        private String refresh_token;
+
+        @ApiModelProperty(value = "过期时间(秒)")
+        private Integer expires_in;
+
+        @ApiModelProperty(value = "授权范围")
+        private String scope;
+
+        @ApiModelProperty(value = "用户ID")
+        private String userId;
+
+        @ApiModelProperty(value = "用户昵称")
+        private String nickName;
+
+        @ApiModelProperty(value = "用户头像")
+        private String pic;
+
+        @ApiModelProperty(value = "是否启用")
+        private Boolean enabled;
+    }
+
 }

+ 2 - 9
yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java

@@ -53,7 +53,6 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class SubmitOrderListener {
 
-
     private final MapperFacade mapperFacade;
 
     private final UserAddrOrderService userAddrOrderService;
@@ -65,13 +64,6 @@ public class SubmitOrderListener {
     private final Snowflake snowflake;
 
     private final PointsRecordMapper pointsRecordMapper;
-    private final OrderItemMapper orderItemMapper;
-
-    private final SkuMapper skuMapper;
-
-    private final ProductMapper productMapper;
-
-    private final OrderMapper orderMapper;
 
     private final OrderSettlementMapper orderSettlementMapper;
 
@@ -133,7 +125,7 @@ public class SubmitOrderListener {
                 //兑换人民币是分,必须要实时统计计算
                 Long point = pointsRecordMapper.statisticsPoint(userId, mergerOrder.getChannelId());
                 // 使用雪花算法生成的订单号
-                String orderNumber = String.valueOf(snowflake.nextId());
+                String orderNumber = "FD" + snowflake.nextId();
                 shopCartOrderDto.setOrderNumber(orderNumber);
 
                 Long shopId = shopCartOrderDto.getShopId();
@@ -223,6 +215,7 @@ public class SubmitOrderListener {
                         orderProdName.append(orderItem.getProdName()).append(",");
                         //推广员卡号
                         orderItem.setDistributionCardNo(shopCartItem.getDistributionCardNo());
+                        orderItem.setWeight( shopCartItem.getWeight());
                         //使用积分价格
                         orderItem.setUseScore((int) Arith.mul(Arith.sub(shopCartItem.getActualTotal(), actualItem), 100));
                         orderItems.add(orderItem);

+ 6 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDto.java

@@ -65,5 +65,11 @@ public class ShopCartItemDto extends ProductItemDto implements Serializable {
     @ApiModelProperty(value = "逻辑删除标记 0 正常 1 已被删除")
     private Integer isDelete;
 
+    /**
+     * 商品重量
+     */
+    @ApiModelProperty(value = "商品重量")
+    private Double weight;
+
 
 }

+ 2 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserDto.java

@@ -28,6 +28,8 @@ public class UserDto {
 
     @ApiModelProperty(value = "用户状态:0禁用 1正常", required = true)
     private Integer status;
+    @ApiModelProperty(value = "用户ID", required = true)
+    private String userId;
 
     @ApiModelProperty(value = "用户昵称")
     private String nickName;

+ 0 - 3
yami-shop-bean/src/main/java/com/yami/shop/bean/event/SubmitOrderEvent.java

@@ -10,10 +10,7 @@
 
 package com.yami.shop.bean.event;
 
-import com.yami.shop.bean.app.dto.ShopCartItemDto;
-import com.yami.shop.bean.app.dto.ShopCartOrderDto;
 import com.yami.shop.bean.app.dto.ShopCartOrderMergerDto;
-import com.yami.shop.bean.app.param.OrderParam;
 import com.yami.shop.bean.model.Order;
 import lombok.AllArgsConstructor;
 import lombok.Data;

+ 16 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/Channel.java

@@ -39,7 +39,7 @@ public class Channel implements Serializable {
     /**
      * 企业编号
      */
-        private String channelNo;
+    private String channelNo;
     /**
      * 渠道名称
      */
@@ -54,6 +54,21 @@ public class Channel implements Serializable {
      * 企业状态(0-正常,1-停用)
      */
     private Integer status;
+
+    /**
+     * 拆单规则(0-未配置规则,1-默认规则,2-招商规则)
+     */
+    private Integer splitRule;
+    /**
+     * 是否自动拆单(0-手动拆单,1-自动拆单)
+     */
+    private Integer autoSplit;
+
+    /**
+     * 拆单重量(N kg拆单)
+     */
+    private Double splitWeight;
+
     /**
      * 创建日期
      */

+ 41 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/Order.java

@@ -53,6 +53,10 @@ public class Order implements Serializable {
      * 订购用户ID
      */
     private String userId;
+    /**
+     * 父订单编号
+     */
+    private String parentOrderNumber;
 
     /**
      * 订购流水号
@@ -122,6 +126,35 @@ public class Order implements Serializable {
      */
     private Long addrOrderId;
 
+    /**
+     * 是否为超重订单(0-未超重,1-超重 )
+     */
+    private Integer orderSplitStatus;
+    /**
+     * 子订单数量命名
+     */
+    private Integer orderSplitNumber;
+    /**
+     * 是否自动拆单(0-手动拆单,1-自动拆单)
+     */
+    private Integer autoSplit;
+    /**
+     * 是否需要拆单(0-拆单临时保存,1-不拆单,2-待拆单,3-拆单中,4-已拆单)
+     */
+    private Integer splitStatus;
+    /**
+     * 订单等级(0-父订单,1-子订单)
+     */
+    private Integer orderLevel;
+    /**
+     * 拆单操作人ID
+     */
+    private Long splitUserId;
+    @TableField(exist = false)
+    @ApiModelProperty("拆单操作人名称")
+    private String splitUserName;
+
+
     /**
      * 订单商品总数
      */
@@ -275,6 +308,9 @@ public class Order implements Serializable {
     @TableField(exist = false)
     private Integer payScore;
 
+    /**
+     * 是否需要支付
+     */
     @TableField(exist = false)
     private Boolean nextPay = Boolean.FALSE;
 
@@ -285,6 +321,11 @@ public class Order implements Serializable {
     private Integer goodsTotalCount;
 
 
+    /**
+     * 子订单信息
+     */
+    @TableField(exist = false)
+    private List<Order> subOrders;
 
 
 }

+ 9 - 2
yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderItem.java

@@ -51,13 +51,20 @@ public class OrderItem implements Serializable {
     /**
      * 购物车产品个数
      */
-
     private Integer prodCount;
 
     /**
-     * 产品名称
+     * 商品重量(g)
+     */
+    private Double weight;
+    /**
+     * 已拆单数量
      */
+    private Integer splitCount;
 
+    /**
+     * 产品名称
+     */
     private String prodName;
 
     /**

+ 1 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java

@@ -126,6 +126,7 @@ public class ShopDetail implements Serializable {
     private Long areaId;
 
 
+
     /**
      * 店铺logo(可修改)
      */

+ 23 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/param/BackendOrderParam.java

@@ -39,6 +39,11 @@ public class BackendOrderParam {
      */
     private Long shopId;
 
+    /**
+     * 父订单编号
+     */
+    private String parentOrderNumber;
+
     /**
      * 订购流水号
      */
@@ -93,4 +98,22 @@ public class BackendOrderParam {
      */
     private String userAttrType;
 
+
+
+    /**
+     * 是否为超重订单(0-未超重,1-超重 )
+     */
+    private Integer orderSplitStatus;
+    /**
+     * 是否自动拆单(0-手动拆单,1-自动拆单)
+     */
+    private Integer autoSplit;
+    /**
+     * 是否需要拆单(0-拆单临时保存,1-不拆单,2-待拆单,3-拆单中,4-已拆单)
+     */
+    private Integer splitStatus;
+    /**
+     * 订单等级(0-父订单,1-子订单)
+     */
+    private Integer orderLevel;
 }

+ 37 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/param/ConfirmSplitOrderParam.java

@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 确认拆单请求参数
+ *
+ * @author
+ */
+@Data
+@ApiModel("确认拆单请求参数")
+public class ConfirmSplitOrderParam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "父订单号", required = true)
+    @NotBlank(message = "订单号不能为空")
+    private String orderNumber;
+    @ApiModelProperty(value = "拆单操作用户", required = true)
+    @NotBlank(message = "拆单操作用户不能为空")
+    private Long splitUserId;
+}

+ 59 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/param/ManualSplitOrderParam.java

@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 手动拆单请求参数
+ *
+ * @author
+ */
+@Data
+@ApiModel("手动拆单请求参数")
+public class ManualSplitOrderParam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "父订单号", required = true)
+    @NotBlank(message = "订单号不能为空")
+    private String orderNumber;
+
+    @ApiModelProperty(value = "子订单项列表", required = true)
+    @NotEmpty(message = "子订单项列表不能为空")
+    private List<ManualSplitOrderItemParam> orderItems;
+
+    @ApiModelProperty(value = "拆单操作用户", required = true)
+    @NotBlank(message = "拆单操作用户不能为空")
+    private Long splitUserId;
+    /**
+     * 手动拆单订单项参数
+     */
+    @Data
+    @ApiModel("手动拆单订单项参数")
+    public static class ManualSplitOrderItemParam implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        @ApiModelProperty(value = "商品SKU ID", required = true)
+        private Long skuId;
+
+        @ApiModelProperty(value = "商品数量", required = true)
+        private Integer prodCount;
+    }
+}

+ 4 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/param/OrderParam.java

@@ -83,6 +83,10 @@ public class OrderParam {
      * 订购流水号
      */
     private String orderNumber;
+    /**
+     * 订购流水号
+     */
+    private String parentOrderNumber;
 
     /**
      * 店铺名称

+ 4 - 4
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/ChannelProdExportVO.java

@@ -13,7 +13,7 @@ import java.math.BigDecimal;
 @Data
 public class ChannelProdExportVO {
 
-    @ExcelProperty(value = "海博商品ID", index = 0)
+    @ExcelProperty(value = "海博商品ID*", index = 0)
     @ColumnWidth(20)
     private Long skuId;
 
@@ -21,11 +21,11 @@ public class ChannelProdExportVO {
     @ColumnWidth(40)
     private String skuName;
 
-    @ExcelProperty(value = "门店名称", index = 3)
+    @ExcelProperty(value = "门店名称*", index = 3)
     @ColumnWidth(20)
     private String shopName;
 
-    @ExcelProperty(value = "销售渠道", index = 2)
+    @ExcelProperty(value = "销售渠道*", index = 2)
     @ColumnWidth(20)
     private String channelName;
 
@@ -37,7 +37,7 @@ public class ChannelProdExportVO {
     @ColumnWidth(20)
     private BigDecimal deliveryPrice;
 
-    @ExcelProperty(value = "渠道售价(元)", index = 6)
+    @ExcelProperty(value = "渠道售价(元)*", index = 6)
     @ColumnWidth(20)
     private BigDecimal channelProdPrice;
 

+ 4 - 4
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/ChannelProdImportVO.java

@@ -17,7 +17,7 @@ import java.math.BigDecimal;
 @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 9) // 内容背景色(9=淡黄色)
 public class ChannelProdImportVO {
 
-    @ExcelProperty(value = "海博商品ID", index = 0)
+    @ExcelProperty(value = "海博商品ID*", index = 0)
     @ColumnWidth(20) // 列宽
     @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER) // 居中对齐
     private String skuId;
@@ -27,12 +27,12 @@ public class ChannelProdImportVO {
     @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT)
     private String skuName;
 
-    @ExcelProperty(value = "销售渠道", index = 2)
+    @ExcelProperty(value = "销售渠道*", index = 2)
     @ColumnWidth(20)
     @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT)
     private String channelName;
 
-    @ExcelProperty(value = "门店名称", index = 3)
+    @ExcelProperty(value = "门店名称*", index = 3)
     @ColumnWidth(20)
     @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT)
     private String shopName;
@@ -45,7 +45,7 @@ public class ChannelProdImportVO {
     @ColumnWidth(20)
     private BigDecimal deliveryPrice;
 
-    @ExcelProperty(value = "渠道售价(元)", index = 6)
+    @ExcelProperty(value = "渠道售价(元)*", index = 6)
     @ColumnWidth(20)
     private BigDecimal channelProdPrice;
 

+ 3 - 1
yami-shop-common/src/main/java/com/yami/shop/common/util/HttpUtil.java

@@ -106,7 +106,9 @@ public class HttpUtil {
      */
     public static String post(String url, Map<String, String> headers, Map<String, String> params) {
         HttpPost post = new HttpPost(url);
-        post.setEntity(getHttpEntity(params));
+        if (Objects.nonNull(params) && !params.isEmpty()) {
+            post.setEntity(getHttpEntity(params));
+        }
         return getRespString(post, headers);
     }
 

+ 1 - 1
yami-shop-groupbuy/yami-shop-groupbuy-comment/src/main/java/com/yami/shop/groupbuy/comment/service/impl/GroupOrderServiceImpl.java

@@ -96,7 +96,7 @@ public class GroupOrderServiceImpl extends ServiceImpl<GroupOrderMapper, GroupOr
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String submit(String userId, ApiGroupUserOrderDto hadConfirmOrder, String remark) {
-        String orderNumber = String.valueOf(snowflake.nextId());
+        String orderNumber = "FD" + snowflake.nextId();
         Date now = new Date();
         // 获取订单地址
         UserAddrOrder userAddrOrder = mapperFacade.map(hadConfirmOrder.getUserAddrDto(), UserAddrOrder.class);

+ 25 - 12
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ChannelController.java

@@ -3,6 +3,7 @@ package com.yami.shop.platform.controller;
 
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.Channel;
 import com.yami.shop.bean.param.OrderRefundStaisticsParam;
@@ -50,6 +51,15 @@ public class ChannelController {
         List<Channel> channels = channelService.list();
         return R.SUCCESS(channels);
     }
+    /**
+     * 根据规则类型查询全部
+     */
+    @GetMapping("/listAllSplitRule")
+    @ApiOperation(value = "根据规则类型查询全部")
+    public R<List<Channel>> listAllSplitRule(@RequestParam(value = "splitRule") Integer splitRule) {
+        List<Channel> channels = channelService.list(new LambdaQueryWrapper<Channel>().eq(Channel::getSplitRule, splitRule));
+        return R.SUCCESS(channels);
+    }
 
     /**
      * 根据渠道ID获取商品列表
@@ -60,18 +70,6 @@ public class ChannelController {
         Channel channel = channelService.getById(id);
         return R.SUCCESS(channel);
     }
-//    /**
-//     * 分页获取
-//     */
-//    @GetMapping("/page")
-//    @ApiOperation(value = "分页获取")
-//    public R<IPage<Channel>> page(@ModelAttribute PageParam pageParam,
-//                                 @ModelAttribute Channel channel ) {
-//        IPage<Channel> page = channelService.page(pageParam,new LambdaQueryWrapper<Channel>()
-//                .eq(ObjectUtils.isNotEmpty(channel.getChannelName()),Channel::getChannelName, channel.getChannelName())
-//                .eq(ObjectUtils.isNotEmpty(channel.getStatus()), Channel::getStatus, channel.getStatus()));
-//        return R.SUCCESS(page);
-//    }
 
     /**
      * 分页获取政企列表统计
@@ -105,6 +103,21 @@ public class ChannelController {
         return R.SUCCESS();
     }
 
+    /**
+     * 批量修改
+     */
+    @PutMapping("/batch")
+    @ApiOperation(value = "批量修改")
+    public R batchUpdate(@RequestParam(value = "splitRule") Integer splitRule, @RequestBody List<Channel> channels) {
+        if (splitRule == null){
+            R.FAIL( "请传入拆单规则 splitRule" );
+        }
+        channelService.updateSplitRule(splitRule);
+        channelService.updateBatchById(channels);
+        return R.SUCCESS();
+    }
+
+
     @GetMapping("/list")
     @ApiOperation(value = "查询全部")
     public R<List<Channel>> listByUserId() {

+ 80 - 14
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/OrderController.java

@@ -76,6 +76,7 @@ public class OrderController {
 
     @Autowired
     private ExportTaskService exportTaskService;
+
     /**
      * 分页获取
      */
@@ -113,7 +114,7 @@ public class OrderController {
     }
 
     /**
-     * 获取信息
+     * 获取订单信息
      */
     @GetMapping("/orderInfo/{orderNumber}")
 //    @PreAuthorize("@pms.hasPermission('platform:order:info')")
@@ -131,12 +132,36 @@ public class OrderController {
                 c.setRefundSuccessCount(orderItemService.refundSuccessCount(c.getOrderItemId()));
             });
         }
+        //操作人
+        if (order.getSplitUserId() != null) {
+            order.setSplitUserName(sysUserService.getById(order.getSplitUserId()).getUsername());
+        }
         order.setOrderItems(orderItems);
         User user = userService.getById(order.getUserId());
         if (user != null) {
             order.setNickName(user.getNickName());
             order.setUserMobile(user.getUserMobile());
         }
+
+        //子订单数据处理
+        List<Order> list = orderService.list(new LambdaUpdateWrapper<Order>().eq(Order::getParentOrderNumber, orderNumber)
+                .eq(Order::getDeleteStatus, 0));
+
+        if (ObjectUtil.isNotEmpty(list)) {
+            for (Order order1 : list) {
+
+                List<OrderItem> orderItems2 = orderItemService.getOrderItemsByOrderNumber(orderNumber);
+                if (!orderItems2.isEmpty()) {
+                    orderItems2.forEach(c -> {
+                        c.setRefundIngCount(orderItemService.refundIngCount(c.getOrderItemId()));
+                        c.setRefundSuccessCount(orderItemService.refundSuccessCount(c.getOrderItemId()));
+                    });
+                }
+                order1.setOrderItems(orderItems2);
+            }
+            order.setSubOrders(list);
+        }
+
         return R.SUCCESS(order);
     }
 
@@ -198,8 +223,8 @@ public class OrderController {
         UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId());
         AppConnect connect = appConnectMapper.getByUserId(order.getUserId(), 1);
         Delivery delivery = deliveryService.getById(deliveryOrderParam.getDvyId());
-        CullenUtils.validateDataThrowException(connect==null,"openid不存在..."+order.getUserId());
-        CullenUtils.validateDataThrowException(connect.getBizUserId()==null,"openid不存在..."+order.getUserId());
+        CullenUtils.validateDataThrowException(connect == null, "openid不存在..." + order.getUserId());
+        CullenUtils.validateDataThrowException(connect.getBizUserId() == null, "openid不存在..." + order.getUserId());
         WxProviderServiceImpl.uploadShippingInfo(
                 deliveryOrderParam.getDvyFlowId(),
                 settlement.getBizPayNo(),
@@ -221,8 +246,9 @@ public class OrderController {
         IPage<Order> orderIPage = orderService.deliveryOrder(page, orderParam);
         return R.SUCCESS(orderIPage);
     }
+
     /**
-     *配送订单模块(数据统计)
+     * 配送订单模块(数据统计)
      */
     @GetMapping("/selectOrderCount")
     @ApiOperation("配送订单模块(数据统计)")
@@ -242,6 +268,7 @@ public class OrderController {
 
     /**
      * 导出
+     *
      * @param orderParam
      */
     @GetMapping("/export")
@@ -254,21 +281,22 @@ public class OrderController {
         } catch (Exception e) {
             throw new GlobalException("导出获取当前登录用户失败");
         }
-        if (ObjectUtil.isEmpty(userId)){
+        if (ObjectUtil.isEmpty(userId)) {
             throw new GlobalException("导出获取当前登录用户信息失败,请登录");
         }
-        ExportTask exportTaskOne =  exportTaskService.findByUserIdAndStatusAndType(userId,0,1);//查询导出任务为正常订单并且在进行中的数据
+        ExportTask exportTaskOne = exportTaskService.findByUserIdAndStatusAndType(userId, 0, 1);//查询导出任务为正常订单并且在进行中的数据
         // 异步执行
-        if (exportTaskOne!=null){
+        if (exportTaskOne != null) {
             return R.FAIL("正常订单有导出任务正在执行中,请中断或者等待完成");
         }
 
-         return orderService.export(orderParam,userId);
+        return orderService.export(orderParam, userId);
     }
 
 
     /**
      * 订单订单统计数
+     *
      * @param orderParam
      */
     @GetMapping("/orderCount")
@@ -279,27 +307,65 @@ public class OrderController {
     }
 
 
-    private void getBackendOrderParam(BackendOrderParam orderParam){
-        if (orderParam.getChannelIdList()==null||orderParam.getChannelIdList().isEmpty()){
+    private void getBackendOrderParam(BackendOrderParam orderParam) {
+        if (orderParam.getChannelIdList() == null || orderParam.getChannelIdList().isEmpty()) {
             throw new GlobalException("请求参数-所属企业不允许为空");
         }
-        if (ObjectUtil.isEmpty(orderParam.getUserAttrType())){
+        if (ObjectUtil.isEmpty(orderParam.getUserAttrType())) {
             orderParam.setUserAttrType("1");//默认查询正常人员属性
         }
-        if (orderParam.getChannelIdList().contains(0L)){
+        if (orderParam.getChannelIdList().contains(0L)) {
             Long userId = null;
             try {
                 userId = SecurityUtils.getSysUser().getUserId();
             } catch (Exception e) {
                 throw new GlobalException("获取当前登录用户失败");
             }
-            List<Long> channelIdList =  sysUserService.findByUserIdListId(userId);
+            List<Long> channelIdList = sysUserService.findByUserIdListId(userId);
             orderParam.setChannelIdList(channelIdList);
-            if (userId != Constant.SUPER_ADMIN_ID&&(orderParam.getChannelIdList()==null||orderParam.getChannelIdList().isEmpty())){
+            if (userId != Constant.SUPER_ADMIN_ID && (orderParam.getChannelIdList() == null || orderParam.getChannelIdList().isEmpty())) {
                 List<Long> longs = new ArrayList<>();
                 longs.add(0L);
                 orderParam.setChannelIdList(longs);
             }
         }
     }
+
+    /**
+     * 手动拆单处理
+     * 订单会处于拆单中
+     * 会传订单单号和订单项列表信息
+     * 会加上父订单项里面的已拆单数量
+     * 生成子订单数据 并且子订单会处于临时保存
+     */
+    @PostMapping("/manualSplit")
+    @ApiOperation("手动拆单处理")
+    public R<Order> manualSplitOrder(@RequestBody ManualSplitOrderParam param) {
+        Order subOrder = orderService.manualSplitOrder(param);
+        return R.SUCCESS(subOrder);
+    }
+
+    /**
+     * 确定拆单
+     * 会改变订单拆单状态为拆单完成
+     * 会改变子订单拆单状态为不拆单
+     */
+    @PostMapping("/confirmSplit")
+    @ApiOperation("确定拆单")
+    public R<Void> confirmSplitOrder(@RequestBody ConfirmSplitOrderParam param) {
+        orderService.confirmSplitOrder(param);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 删除对应的临时子订单
+     * 加回对应的父订单项已拆单数量数量
+     */
+    @DeleteMapping("/deleteTempSubOrder")
+    @ApiOperation("删除临时子订单")
+    public R<Void> deleteTempSubOrder(@RequestParam String subOrderNumber) {
+        orderService.deleteTempSubOrder(subOrderNumber);
+        return R.SUCCESS();
+    }
+
 }

+ 13 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopCategoryController.java

@@ -163,6 +163,19 @@ public class ShopCategoryController {
             return R.FAIL("门店前台类目不存在");
         }
         shopCategoryService.updateById(shopCategory);
+
+
+//        ShopCategory dbShopCategory1 = shopCategoryService.getById(shopCategory.getId());
+//        // 将frontCategory数据推送到另一个服务器(POST请求,参数放在请求体)
+//        String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncFrontCategoryDel/";
+//        try {
+//            // 将frontCategory对象作为JSON放入请求体
+//            String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, dbShopCategory1);
+//            log.info("推送frontCategory到同步服务器结果: {}", response);
+//        } catch (Exception e) {
+//            log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+//        }
+
         return R.SUCCESS();
     }
 

+ 87 - 102
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopDetailController.java

@@ -1,47 +1,16 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- */
 
 package com.yami.shop.platform.controller;
 
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yami.shop.bean.enums.OfflineHandleEventType;
-import com.yami.shop.bean.enums.ShopStatus;
-import com.yami.shop.bean.model.OfflineHandleEvent;
 import com.yami.shop.bean.model.ShopDetail;
-import com.yami.shop.bean.model.User;
-import com.yami.shop.bean.param.OfflineHandleEventAuditParam;
 import com.yami.shop.common.exception.GlobalException;
-import com.yami.shop.common.exception.YamiShopBindException;
 import com.yami.shop.common.util.PageParam;
-import com.yami.shop.common.util.RedisUtil;
-import com.yami.shop.security.comment.constants.SecurityConstants;
-import com.yami.shop.security.comment.model.AppConnect;
-import com.yami.shop.security.comment.service.AppConnectService;
-import com.yami.shop.security.platform.util.SecurityUtils;
-import com.yami.shop.service.OfflineHandleEventService;
 import com.yami.shop.service.ShopDetailService;
-import com.yami.shop.service.UserService;
 import lombok.AllArgsConstructor;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.oauth2.common.OAuth2AccessToken;
-import org.springframework.security.oauth2.provider.token.TokenStore;
 import org.springframework.web.bind.annotation.*;
 
-import java.math.BigInteger;
-import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import com.yami.shop.common.util.R;
 
@@ -58,11 +27,6 @@ import com.yami.shop.common.util.R;
 public class ShopDetailController {
 
     private final ShopDetailService shopDetailService;
-    private final OfflineHandleEventService offlineHandleEventService;
-    private final AppConnectService appConnectService;
-    private final TokenStore tokenStore;
-    private final UserService userService;
-
 
     /**
      * 分页获取门店详细列表
@@ -76,83 +40,104 @@ public class ShopDetailController {
         return R.SUCCESS(page);
     }
 
-
-
     /**
-     * 通过活动id获取下线信息
+     * 获取所有的门店
      */
-    @GetMapping("/getOfflineHandleEventByShopId/{shopId}")
-    @PreAuthorize("@pms.hasPermission('shop:shopAuditing:info')")
-    public R<OfflineHandleEvent> getOfflineHandleEventByShopId(@PathVariable("shopId") Long shopId) {
-        OfflineHandleEvent offlineHandleEvent = offlineHandleEventService.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), shopId);
-        return R.SUCCESS(offlineHandleEvent);
+    @GetMapping("/list")
+    public R<List<ShopDetail>> list() {
+        List<ShopDetail> list = shopDetailService.list();
+        return R.SUCCESS(list);
     }
 
     /**
-     * 下线活动
+     * 修改门店拆单信息
      */
-    @PostMapping("/offline")
-    @PreAuthorize("@pms.hasPermission('shop:shopAuditing:audit')")
-    public R offline(@RequestBody OfflineHandleEvent offlineHandleEvent) {
-        Long sysUserId = SecurityUtils.getSysUser().getUserId();
-        ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(offlineHandleEvent.getHandleId());
-        if (shopDetail == null) {
-            throw new GlobalException("未找到该店铺信息");
-        }
-        if (!Objects.equals(shopDetail.getShopStatus(), ShopStatus.OPEN.value())) {
-            throw new GlobalException("店铺不处于营业状态,不能进行下线");
-        }
-        shopDetailService.offline(shopDetail, offlineHandleEvent.getOfflineReason(), sysUserId);
-
-        // 清除用户登陆token
-        User user = userService.getUserByUserId(shopDetail.getUserId());
-        if (!Objects.isNull(user)) {
-            List<AppConnect> appConnects = appConnectService.list(new LambdaQueryWrapper<AppConnect>().eq(AppConnect::getUserId, user.getUserId()));
-            if (CollectionUtils.isNotEmpty(appConnects)) {
-                for (AppConnect appConnect : appConnects) {
-                    // 移除登录成功的验证缓存
-                    Map<String, String> values = new LinkedHashMap<>();
-                    values.put("username", appConnect.getAppId() + StrUtil.COLON + appConnect.getBizUserId());
-                    values.put("client_id", "null");
-                    values.put("scope", "");
-                    String key = SecurityConstants.YAMI_OAUTH_PREFIX + "auth_to_access:" + generateKey(values);
-                    RedisUtil.del(key);
-                    // 移除token校验的缓存
-                    Collection<OAuth2AccessToken> tokens = tokenStore.findTokensByClientIdAndUserName(StrUtil.NULL, appConnect.getAppId() + StrUtil.COLON + appConnect.getBizUserId());
-                    for (OAuth2AccessToken token : tokens) {
-                        RedisUtil.del(SecurityConstants.YAMI_OAUTH_PREFIX + "access:" + token.getValue());
-                    }
-                }
-            }
+    @PutMapping("/updateShopDetail")
+    public R updateShopDetail(@RequestBody ShopDetail shopDetail) {
+        if (shopDetail.getShopId()==null){
+            throw new GlobalException("店铺id不能为空");
         }
+        shopDetailService.updateById(shopDetail);
         return R.SUCCESS();
     }
 
-    /**
-     * 店铺审核重新开店
-     */
-    @PostMapping("/auditShop")
-    @PreAuthorize("@pms.hasPermission('shop:shopAuditing:audit')")
-    public R auditOfflineShop(@RequestBody OfflineHandleEventAuditParam offlineHandleEventAuditParam) {
-        Long sysUserId = SecurityUtils.getSysUser().getUserId();
-        ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(offlineHandleEventAuditParam.getHandleId());
-        if (shopDetail == null) {
-            throw new GlobalException("未找到店铺信息");
-        }
-        shopDetailService.auditOfflineShop(offlineHandleEventAuditParam, sysUserId);
 
-        return R.SUCCESS();
-    }
 
-    private String generateKey(Map<String, String> values) {
-        MessageDigest digest;
-        try {
-            digest = MessageDigest.getInstance("MD5");
-            byte[] bytes = digest.digest(values.toString().getBytes(StandardCharsets.UTF_8));
-            return String.format("%032x", new BigInteger(1, bytes));
-        } catch (NoSuchAlgorithmException nsae) {
-            throw new IllegalStateException("MD5 algorithm not available.  Fatal (should be in the JDK).", nsae);
-        }
-    }
+//    /**
+//     * 通过活动id获取下线信息
+//     */
+//    @GetMapping("/getOfflineHandleEventByShopId/{shopId}")
+//    @PreAuthorize("@pms.hasPermission('shop:shopAuditing:info')")
+//    public R<OfflineHandleEvent> getOfflineHandleEventByShopId(@PathVariable("shopId") Long shopId) {
+//        OfflineHandleEvent offlineHandleEvent = offlineHandleEventService.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), shopId);
+//        return R.SUCCESS(offlineHandleEvent);
+//    }
+
+//    /**
+//     * 下线活动
+//     */
+//    @PostMapping("/offline")
+//    @PreAuthorize("@pms.hasPermission('shop:shopAuditing:audit')")
+//    public R offline(@RequestBody OfflineHandleEvent offlineHandleEvent) {
+//        Long sysUserId = SecurityUtils.getSysUser().getUserId();
+//        ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(offlineHandleEvent.getHandleId());
+//        if (shopDetail == null) {
+//            throw new GlobalException("未找到该店铺信息");
+//        }
+//        if (!Objects.equals(shopDetail.getShopStatus(), ShopStatus.OPEN.value())) {
+//            throw new GlobalException("店铺不处于营业状态,不能进行下线");
+//        }
+//        shopDetailService.offline(shopDetail, offlineHandleEvent.getOfflineReason(), sysUserId);
+//
+//        // 清除用户登陆token
+//        User user = userService.getUserByUserId(shopDetail.getUserId());
+//        if (!Objects.isNull(user)) {
+//            List<AppConnect> appConnects = appConnectService.list(new LambdaQueryWrapper<AppConnect>().eq(AppConnect::getUserId, user.getUserId()));
+//            if (CollectionUtils.isNotEmpty(appConnects)) {
+//                for (AppConnect appConnect : appConnects) {
+//                    // 移除登录成功的验证缓存
+//                    Map<String, String> values = new LinkedHashMap<>();
+//                    values.put("username", appConnect.getAppId() + StrUtil.COLON + appConnect.getBizUserId());
+//                    values.put("client_id", "null");
+//                    values.put("scope", "");
+//                    String key = SecurityConstants.YAMI_OAUTH_PREFIX + "auth_to_access:" + generateKey(values);
+//                    RedisUtil.del(key);
+//                    // 移除token校验的缓存
+//                    Collection<OAuth2AccessToken> tokens = tokenStore.findTokensByClientIdAndUserName(StrUtil.NULL, appConnect.getAppId() + StrUtil.COLON + appConnect.getBizUserId());
+//                    for (OAuth2AccessToken token : tokens) {
+//                        RedisUtil.del(SecurityConstants.YAMI_OAUTH_PREFIX + "access:" + token.getValue());
+//                    }
+//                }
+//            }
+//        }
+//        return R.SUCCESS();
+//    }
+//
+//    /**
+//     * 店铺审核重新开店
+//     */
+//    @PostMapping("/auditShop")
+//    @PreAuthorize("@pms.hasPermission('shop:shopAuditing:audit')")
+//    public R auditOfflineShop(@RequestBody OfflineHandleEventAuditParam offlineHandleEventAuditParam) {
+//        Long sysUserId = SecurityUtils.getSysUser().getUserId();
+//        ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(offlineHandleEventAuditParam.getHandleId());
+//        if (shopDetail == null) {
+//            throw new GlobalException("未找到店铺信息");
+//        }
+//        shopDetailService.auditOfflineShop(offlineHandleEventAuditParam, sysUserId);
+//
+//        return R.SUCCESS();
+//    }
+//
+//    private String generateKey(Map<String, String> values) {
+//        MessageDigest digest;
+//        try {
+//            digest = MessageDigest.getInstance("MD5");
+//            byte[] bytes = digest.digest(values.toString().getBytes(StandardCharsets.UTF_8));
+//            return String.format("%032x", new BigInteger(1, bytes));
+//        } catch (NoSuchAlgorithmException nsae) {
+//            throw new IllegalStateException("MD5 algorithm not available.  Fatal (should be in the JDK).", nsae);
+//        }
+//    }
 
 }

+ 20 - 4
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/HBOrderController.java

@@ -1,13 +1,18 @@
 package com.yami.shop.platform.controller.hb;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.model.Order;
 import com.yami.shop.common.util.hb.HBR;
+import com.yami.shop.service.OrderService;
 import com.yami.shop.service.hb.IHBOrderService;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * 海博-订单信息管理
  *
@@ -23,17 +28,28 @@ import org.springframework.web.bind.annotation.*;
 public class HBOrderController {
 
     private final IHBOrderService orderService;
+    private final OrderService orderServicel;
 
     /**
      * 海博订单创建接口-推送接口
      *
-     * @param channelOrderId 海博订单单号
+     * @param orderNumber 订单单号
      * @return 前台类目响应
      */
     @PostMapping("/createOrderAsync")
-    public String addGoods(String channelOrderId) {
-        log.info("海博新增订单{}", channelOrderId);
-        return orderService.createOrderAsync(channelOrderId);
+    public String addGoods(String orderNumber) {
+        log.info("海博新增订单{}", orderNumber);
+//        //查询订单 ID>1354的
+//        List<Order> orders = orderServicel.list(new LambdaQueryWrapper<Order>()
+//                .eq(Order::getIsPayed, 1)
+//                .gt(Order::getOrderId, 1354)
+//                .ne(Order::getActualTotal, 0.00)
+//        );
+//        for (Order order : orders) {
+//            orderService.createOrderAsync(order.getOrderNumber());
+//        }
+
+        return orderService.createOrderAsync(orderNumber);
     }
 
     /**

+ 1 - 1
yami-shop-seckill/yami-shop-seckill-comment/src/main/java/com/yami/shop/seckill/comment/service/impl/SeckillOrderServiceImpl.java

@@ -111,7 +111,7 @@ public class SeckillOrderServiceImpl extends ServiceImpl<SeckillOrderMapper, Sec
         String userId = dto.getUserId();
 
         Long shopId = shopCartItem.getShopId();
-        String orderNumber = String.valueOf(snowflake.nextId());
+        String orderNumber = "FD" + snowflake.nextId( );
 
         // 把订单地址保存到数据库
         UserAddrOrder userAddrOrder = mapperFacade.map(dto.getUserAddr(), UserAddrOrder.class);

+ 1 - 0
yami-shop-security/yami-shop-security-api/src/main/java/com/yami/shop/security/api/config/ResourceServerConfiguration.java

@@ -49,6 +49,7 @@ public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter
                 .antMatchers(
                         "/p/appointment/**",
                         "/p/order/**",
+                        "/p/user/miniAppLogin",
                         "/p/prodComm/commList",
                         "/p/prodComm/commentCount"
                         ).permitAll()

+ 4 - 1
yami-shop-security/yami-shop-security-api/src/main/java/com/yami/shop/security/api/service/impl/YamiUserServiceImpl.java

@@ -106,6 +106,9 @@ public class YamiUserServiceImpl implements YamiUserDetailsService {
 			return yamiUser;
 		}
 		User user = userMapper.selectById(appConnect.getUserId());
+        if (user == null) {
+            appConnectMapper.delete(new LambdaQueryWrapper<AppConnect>().eq(AppConnect::getUserId, appConnect.getUserId()));
+		}
 		return getYamiUser(appConnect.getAppId(), user, appConnect.getBizUserId());
 	}
 
@@ -135,7 +138,7 @@ public class YamiUserServiceImpl implements YamiUserDetailsService {
 			nickName = StrUtil.isBlank(user.getNickName()) ? user.getRealName():user.getNickName();
 			yamiUser.setEnabled(user.getStatus() == 1);
 			yamiUser.setUserId(user.getUserId());
-			yamiUser.setPic(user.getPic());
+            yamiUser.setPic(user.getPic());
 			yamiUser.setPassword(user.getLoginPassword());
 		}
 		yamiUser.setBizUserId(bizUserId);

+ 0 - 1
yami-shop-security/yami-shop-security-comment/src/main/java/com/yami/shop/security/comment/token/AuthenticationToken.java

@@ -56,7 +56,6 @@ public class AuthenticationToken implements Authentication,
      * app类型 见com.yami.shop.security.comment.enums.App
      */
     private Integer appType;
-//    private Integer platform;
 
     /**
      * 0 用户名或手机号 1短信验证码

+ 1 - 31
yami-shop-security/yami-shop-security-comment/src/main/java/com/yami/shop/security/comment/util/YamiTokenServices.java

@@ -84,40 +84,10 @@ public class YamiTokenServices implements AuthorizationServerTokenServices, Reso
     @Override
     public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) {
 
-        OAuth2AccessToken existingAccessToken = tokenStore.getAccessToken(authentication);
-        OAuth2RefreshToken refreshToken = null;
         // 如果有token,直接删除,更新token,避免出现缓存问题
-//        if (existingAccessToken != null) {
-//            if (existingAccessToken.getRefreshToken() != null) {
-//                refreshToken = existingAccessToken.getRefreshToken();
-//                // The token store could remove the refresh token when the
-//                // access token is removed, but we want to
-//                // be sure...
-//                tokenStore.removeRefreshToken(refreshToken);
-//            }
-//            tokenStore.removeAccessToken(existingAccessToken);
-//        }
-
-        // Only create a new refresh token if there wasn't an existing one
-        // associated with an expired access token.
-        // Clients might be holding existing refresh tokens, so we re-use it in
-        // the case that the old access token
-        // expired.
-        if (refreshToken == null) {
-            refreshToken = createRefreshToken(authentication);
-        }
-        // But the refresh token itself might need to be re-issued if it has
-        // expired.
-        else if (refreshToken instanceof ExpiringOAuth2RefreshToken) {
-            ExpiringOAuth2RefreshToken expiring = (ExpiringOAuth2RefreshToken) refreshToken;
-            if (System.currentTimeMillis() > expiring.getExpiration().getTime()) {
-                refreshToken = createRefreshToken(authentication);
-            }
-        }
-
+        OAuth2RefreshToken  refreshToken = createRefreshToken(authentication);
         OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken);
         tokenStore.storeAccessToken(accessToken, authentication);
-        // In case it was modified
         refreshToken = accessToken.getRefreshToken();
         if (refreshToken != null) {
             tokenStore.storeRefreshToken(refreshToken, authentication);

+ 6 - 0
yami-shop-service/pom.xml

@@ -51,5 +51,11 @@
             <artifactId>yami-shop-wx</artifactId>
             <version>${yami.shop.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.xmlbeans</groupId>
+            <artifactId>xmlbeans</artifactId>
+            <version>5.1.1</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 6 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/ChannelMapper.java

@@ -35,4 +35,10 @@ public interface ChannelMapper extends BaseMapper<Channel> {
     IPage<ChannelVO> statisticsPage(@Param("pageParam")PageParam pageParam, @Param("channel")Channel channel);
 
     List<IdNameVo> queryMyChannel(Long userId);
+
+    /**
+     * 更新拆单规则
+     * @param splitRule 拆单规则
+     */
+    void updateSplitRule(Integer splitRule);
 }

+ 2 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/ChannelProdMapper.java

@@ -102,4 +102,6 @@ public interface ChannelProdMapper extends BaseMapper<ChannelProd> {
      * @param updateShannerProdDTO 渠道商品
      */
     void deleteChannelProd(UpdateShannerProdDTO updateShannerProdDTO);
+
+
 }

+ 2 - 3
yami-shop-service/src/main/java/com/yami/shop/dao/OrderMapper.java

@@ -48,9 +48,8 @@ public interface OrderMapper extends BaseMapper<Order> {
 
     List<Order> listOrdersDetialByOrderParam(@Param("adapter") PageAdapter adapter, @Param("orderParam") OrderParam orderParam);
 
-    List<Order> deliverList(@Param("adapter") PageAdapter adapter, @Param("orderParam") BackendOrderParam orderParam);
+    IPage<Order> deliverList(@Param("pageParam") PageParam pageParam, @Param("orderParam") BackendOrderParam orderParam);
 
-    Integer deliverListCount(@Param("orderParam") BackendOrderParam orderParam);
 
     Long countOrderDetial(@Param("orderParam") OrderParam orderParam);
 
@@ -58,7 +57,7 @@ public interface OrderMapper extends BaseMapper<Order> {
 
     List<MyOrderDto> listMyOrderByUserIdAndStatus(@Param("adapter") PageAdapter adapter, @Param("userId") String userId, @Param("status") Integer status,@Param("dvyType") Integer dvyType);
 
-    Long countMyOrderByUserIdAndStatus(@Param("userId") String userId, @Param("status") Integer status, @Param("isComm") Integer isComm);
+    Long countMyOrderByUserIdAndStatus(@Param("userId") String userId, @Param("status") Integer status);
 
     void deleteOrders(@Param("orders") List<Order> orders);
 

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/dao/ProductMapper.java

@@ -61,7 +61,7 @@ public interface ProductMapper extends BaseMapper<Product> {
 
     IPage<ProductDto> moreBuyProdList(Page<ProductDto> page);
 
-    IPage<SearchProdDto> getSearchProdDtoPageByProdName(@Param("page") Page page, @Param("searchParam") SearchParam searchParam);
+    IPage<SearchProdDto> getSearchProdDtoPageByProdName(@Param("page") PageParam<SearchProdDto> page, @Param("searchParam") SearchParam searchParam);
 
     TagProductDto tagProdList(@Param("tagId") Long tagId);
 

+ 5 - 0
yami-shop-service/src/main/java/com/yami/shop/service/ChannelService.java

@@ -24,5 +24,10 @@ public interface ChannelService extends IService<Channel> {
     IPage<ChannelVO> statisticsPage(PageParam pageParam, Channel channel);
 
     List<IdNameVo> queryMyChannel(Long userId);
+
+    /**
+     * 根据规则清除渠道拆单配置
+     */
+    void updateSplitRule(Integer splitRule );
 }
 

+ 34 - 4
yami-shop-service/src/main/java/com/yami/shop/service/OrderService.java

@@ -16,10 +16,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yami.shop.bean.app.dto.OrderCountData;
 import com.yami.shop.bean.app.dto.ShopCartOrderMergerDto;
-import com.yami.shop.bean.model.ExportTask;
-import com.yami.shop.bean.model.Order;
-import com.yami.shop.bean.model.OrderItem;
-import com.yami.shop.bean.model.OrderRefund;
+import com.yami.shop.bean.model.*;
 import com.yami.shop.bean.param.*;
 import com.yami.shop.bean.vo.OrderCountVo;
 import com.yami.shop.common.util.PageParam;
@@ -184,4 +181,37 @@ public interface OrderService extends IService<Order> {
 
 
     OrderCountVo orderCount(BackendOrderParam orderParam);
+
+    /**
+     * 订单拆单处理
+     * @param c
+     * @param channel
+     * @param objects
+     */
+    void cd(Order c, Channel channel, List<Order> objects);
+
+    /**
+     * 手动拆单处理
+     * 创建临时子订单(splitStatus=0),父订单进入拆单中状态(splitStatus=3)
+     *
+     * @param param 手动拆单参数
+     * @return 子订单信息
+     */
+    Order manualSplitOrder(ManualSplitOrderParam param);
+
+    /**
+     * 确定拆单
+     * 将父订单状态改为已拆单(splitStatus=4),子订单改为不拆单(splitStatus=1)
+     *
+     * @param param 确认拆单参数
+     */
+    void confirmSplitOrder(ConfirmSplitOrderParam param);
+
+    /**
+     * 删除临时子订单
+     * 删除临时子订单,并减少父订单项的已拆单数量
+     *
+     * @param subOrderNumber 删除临时子订单参数
+     */
+    void deleteTempSubOrder(String subOrderNumber);
 }

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/service/ProductService.java

@@ -74,7 +74,7 @@ public interface ProductService extends IService<Product> {
 
     IPage<ProductDto> moreBuyProdList(Page<ProductDto> page);
 
-    IPage<SearchProdDto> getSearchProdDtoPageByProdName(Page page, SearchParam searchParam);
+    IPage<SearchProdDto> getSearchProdDtoPageByProdName(PageParam<SearchProdDto> page, SearchParam searchParam);
 
     List<TagProductDto> tagProdList();
 

+ 37 - 6
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBFrontCategoryService.java

@@ -52,6 +52,9 @@ public class HBFrontCategoryService implements IHBFrontCategoryService {
             log.info("开始前台分类,body:{}", bodyStr);
             JSONObject bodyJson = JSON.parseObject(bodyStr); // 使用Fastjson的解析方法
             JSONArray codeList = bodyJson.getJSONArray("codeList");
+            if (ObjectUtils.isEmpty(codeList)) {
+                return HBR.success();
+            }
             List<String> resultList = IntStream.range(0, codeList.size())
                     .mapToObj(codeList::getString)
                     .collect(Collectors.toList());
@@ -82,9 +85,6 @@ public class HBFrontCategoryService implements IHBFrontCategoryService {
                         .eq(FrontCategory::getIsDelete, 0));
                 if (frontCategory1 == null) {
                     frontCategoryMapper.insert(frontCategory);
-
-                    //添加门店分类
-//                    addShopCategory(frontCategory, 1L, 5104238L);
                 } else {
                     frontCategory.setId(frontCategory1.getId());
                     frontCategoryMapper.updateById(frontCategory);
@@ -95,8 +95,18 @@ public class HBFrontCategoryService implements IHBFrontCategoryService {
                         shopCategory1.setName(frontCategory.getName());
                         shopCategory1.setNum(frontCategory.getNum());
                         shopCategoryMapper.updateById(shopCategory1);
+                        try {
+                            String syncUrl = "http://192.168.1.101:8080/smqjh-pms//api/v1/sync/syncShopCategoryData";
+                            // 将frontCategory对象作为JSON放入请求体
+                            String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, shopCategory1);
+                            log.info("推送frontCategory到同步服务器结果: {}", response);
+                        } catch (Exception e) {
+                            log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+                        }
+
                     }
                 }
+
             }
             log.info("前台分类成功");
             // 4. 构建响应
@@ -159,7 +169,13 @@ public class HBFrontCategoryService implements IHBFrontCategoryService {
         shopCategory.setIsLeaves(frontCategory.getIsLeaves());
 
         shopCategoryMapper.insert(shopCategory);
-
+        try {
+            String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncShopCategoryData/";
+            String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, shopCategory);
+            log.info("推送门店分类到同步服务器结果: {}", response);
+        } catch (Exception e) {
+            log.error("推送门店分类到同步服务器失败: {}", e.getMessage(), e);
+        }
 
     }
 
@@ -194,13 +210,28 @@ public class HBFrontCategoryService implements IHBFrontCategoryService {
         for (Object codeObject : codeList) {
             String code = codeObject.toString();
             log.info("前台类目删除,body:{}", code);
-            FrontCategory frontCategory = frontCategoryMapper.selectOne(new LambdaQueryWrapper<FrontCategory>().eq(FrontCategory::getCode, Long.valueOf(code)));
-            if(frontCategory == null){
+            FrontCategory frontCategory = frontCategoryMapper.selectOne(new LambdaQueryWrapper<FrontCategory>()
+                    .eq(FrontCategory::getIsDelete, 0)
+                    .eq(FrontCategory::getCode, Long.valueOf(code)));
+            if (frontCategory == null) {
                 return;
             }
             frontCategory.setIsDelete(1);
             frontCategoryMapper.updateById(frontCategory);
             shopCategoryMapper.deleteByCode(code);
+
+            try {
+                List<ShopCategory> shopCategories = shopCategoryMapper.selectList(new LambdaQueryWrapper<ShopCategory>().eq(ShopCategory::getCode, code));
+                for (ShopCategory shopCategory : shopCategories) {
+                    String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncShopCategoryData/";
+                    String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, shopCategory);
+                    log.info("推送门店分类到同步服务器结果: {}", response);
+                }
+            } catch (Exception e) {
+                log.error("推送门店分类到同步服务器失败: {}", e.getMessage(), e);
+            }
+
         }
     }
+
 }

+ 118 - 2
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBGoodsService.java

@@ -93,6 +93,14 @@ public class HBGoodsService implements IHBGoodsService {
                         log.info("SPU创建成功: prodId={}, hbSpuId={}, spuName={}", productAdd.getProdId(), productAdd.getProdId(), productAdd.getProdName());
                     }
 
+                    try {
+                        String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncProductData";
+                        String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, productAdd);
+                        log.info("推送商品到同步服务器结果: {}", response);
+                    } catch (Exception e) {
+                        log.error("推送商品到同步服务器失败: {}", e.getMessage(), e);
+                    }
+
                     convertCategoryCodeToId(productInfo.getJSONArray("relationFrontCategories"), productAdd.getProdId()); // 一品多类目
 
 
@@ -110,6 +118,15 @@ public class HBGoodsService implements IHBGoodsService {
                         skuMapper.insert(sku);
                         log.info("SKU创建成功: skuId={}, skuName={}", sku.getSkuId(), sku.getSkuName());
                     }
+
+                    try {
+                        String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncSkuData";
+                        // 将frontCategory对象作为JSON放入请求体
+                        String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, sku);
+                        log.info("推送frontCategory到同步服务器结果: {}", response);
+                    } catch (Exception e) {
+                        log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+                    }
                 }
             } else {
                 log.info("===================进入多规格商品操作===================");
@@ -139,6 +156,15 @@ public class HBGoodsService implements IHBGoodsService {
                         prodId = productAdd.getProdId();
                         log.info("生成的商品ID: {}", productAdd.getProdId());
                     }
+                    try {
+                        String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncProductData";
+                        // 将frontCategory对象作为JSON放入请求体
+                        String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, productAdd);
+                        log.info("推送frontCategory到同步服务器结果: {}", response);
+                    } catch (Exception e) {
+                        log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+                    }
+
                     convertCategoryCodeToId(productInfo.getJSONArray("relationFrontCategories"), productAdd.getProdId()); // 一品多类目
 
                     JSONArray skuList = productInfo.getJSONArray("skuList");
@@ -156,6 +182,13 @@ public class HBGoodsService implements IHBGoodsService {
                         } else {
                             skuMapper.insert(sku);
                         }
+                        try {
+                            String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncSkuData";
+                            String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, sku);
+                            log.info("推送商品到同步服务器结果: {}", response);
+                        } catch (Exception e) {
+                            log.error("推送商品到同步服务器失败: {}", e.getMessage(), e);
+                        }
                     }
                 }
             }
@@ -191,6 +224,17 @@ public class HBGoodsService implements IHBGoodsService {
                         .eq(ShopSku::getSkuId, sku.getSkuId())
                         .eq(ShopSku::getShopId, shopDetail.getShopId()));
 
+                try {
+                    ShopSku shopSku = shopSkuMapper.selectOne(new LambdaUpdateWrapper<ShopSku>()
+                            .eq(ShopSku::getSkuId, sku.getSkuId())
+                            .eq(ShopSku::getShopId, shopDetail.getShopId()));
+                    String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncShopSkuData";
+                    String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, shopSku);
+                    log.info("推送商品到同步服务器结果: {}", response);
+                } catch (Exception e) {
+                    log.error("推送商品到同步服务器失败: {}", e.getMessage(), e);
+                }
+
                 //处理门店-分类管理
                 List<CategoryProdHb> categoryProds = categoryProdHbMapper.selectList(new LambdaQueryWrapper<CategoryProdHb>()
                         .eq(CategoryProdHb::getProdId, sku.getProdId())
@@ -267,6 +311,15 @@ public class HBGoodsService implements IHBGoodsService {
             shopCategory.setRecTime(new Date());
 
             shopCategoryMapper.insert(shopCategory);
+
+            try {
+                String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncShopCategoryData";
+                String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, shopCategory);
+                log.info("推送门店分类到同步服务器结果: {}", response);
+            } catch (Exception e) {
+                log.error("推送门店分类到同步服务器失败: {}", e.getMessage(), e);
+            }
+
             log.info("门店分类添加成功:{}", shopCategory);
             //二级添加门店-分类绑定商品管理
             addCategoryProd(prodId, shopCategory);
@@ -302,6 +355,15 @@ public class HBGoodsService implements IHBGoodsService {
                 categoryProd.setCreateTime(new Date());
 
                 categoryProdMapper.insert(categoryProd);
+
+                try {
+                    String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncCategoryProdData";
+                    // 将frontCategory对象作为JSON放入请求体
+                    String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, categoryProd);
+                    log.info("推送frontCategory到同步服务器结果: {}", response);
+                } catch (Exception e) {
+                    log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+                }
             }
         }
     }
@@ -343,12 +405,28 @@ public class HBGoodsService implements IHBGoodsService {
                     shopSkuInfo.setRecTime(new Date());
                     shopSkuMapper.insert(shopSkuInfo);
                     log.info("门店对应商品系统不存在直接添加");
+                    try {
+                        String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncShopSkuData";
+                        // 将frontCategory对象作为JSON放入请求体
+                        String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, shopSkuInfo);
+                        log.info("推送frontCategory到同步服务器结果: {}", response);
+                    } catch (Exception e) {
+                        log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+                    }
                 } else {
                     shopSku.setSpuId(sku.getProdId());
                     shopSku.setShopSkuPrice(currentPrice == null ? 0.0 : currentPrice);
                     shopSku.setUpdateTime(new Date());
                     shopSkuMapper.updateById(shopSku);
                     log.info("价格更改成功");
+                    try {
+                        String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncShopSkuData";
+                        // 将frontCategory对象作为JSON放入请求体
+                        String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, shopSku);
+                        log.info("推送frontCategory到同步服务器结果: {}", response);
+                    } catch (Exception e) {
+                        log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+                    }
                 }
             }
         } catch (Exception e) {
@@ -396,14 +474,29 @@ public class HBGoodsService implements IHBGoodsService {
                     shopSkuInfo.setRecTime(new Date());
                     shopSkuInfo.setUpdateTime(new Date());
                     shopSkuMapper.insert(shopSkuInfo);
-
                     log.info("库存添加成功");
+                    try {
+                        String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncShopSkuData";
+                        // 将frontCategory对象作为JSON放入请求体
+                        String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, shopSkuInfo);
+                        log.info("推送frontCategory到同步服务器结果: {}", response);
+                    } catch (Exception e) {
+                        log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+                    }
                 } else {
                     shopSku.setSpuId(sku.getProdId());
                     shopSku.setShopSkuStocks(currentStock);
                     shopSku.setUpdateTime(new Date());
                     shopSkuMapper.updateById(shopSku);
                     log.info("库存更改成功");
+                    try {
+                        String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncShopSkuData";
+                        // 将frontCategory对象作为JSON放入请求体
+                        String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, shopSku);
+                        log.info("推送frontCategory到同步服务器结果: {}", response);
+                    } catch (Exception e) {
+                        log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+                    }
                 }
             }
         } catch (Exception e) {
@@ -435,6 +528,15 @@ public class HBGoodsService implements IHBGoodsService {
             if (!ObjectUtil.isEmpty(product)) {
                 product.setIsDelete(1);
                 productMapper.updateById(product);
+                try {
+                    String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncProductDel" + product.getHbSpuId();
+                    // 将frontCategory对象作为JSON放入请求体
+                    String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, product);
+                    log.info("推送frontCategory到同步服务器结果: {}", response);
+                } catch (Exception e) {
+                    log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+                }
+
                 skuMapper.deleteByProdId(product.getProdId());
                 //删除门店对应商品
                 shopSkuMapper.deleteByProdId(product.getProdId());
@@ -467,6 +569,7 @@ public class HBGoodsService implements IHBGoodsService {
         return post;
     }
 
+
     /**
      * 多规格查询
      *
@@ -651,11 +754,24 @@ public class HBGoodsService implements IHBGoodsService {
         List<CategoryProdHb> categoryProdsHb = categoryProdHbMapper.selectList(new LambdaQueryWrapper<CategoryProdHb>()
                 .eq(CategoryProdHb::getProdId, spuId)
                 .notIn(CategoryProdHb::getCode, list)
-                .eq(CategoryProdHb::getIsDelete, 0) );
+                .eq(CategoryProdHb::getIsDelete, 0));
         for (CategoryProdHb categoryProdHb : categoryProdsHb) {
             categoryProdHb.setIsDelete(1);
             categoryProdHbMapper.updateById(categoryProdHb);
             categoryProdMapper.deleteByCodeAndProdId(categoryProdHb.getCode(), spuId);
+
+            try {
+                String syncUrl = "http://192.168.1.101:8080/smqjh-pms/api/v1/sync/syncCategoryProdData";
+                // 将frontCategory对象作为JSON放入请求体
+                List<CategoryProd> categoryProds = categoryProdMapper.selectList(new LambdaQueryWrapper<CategoryProd>().eq(CategoryProd::getCode, categoryProdHb.getCode()));
+                for (CategoryProd categoryProd : categoryProds) {
+                    String response = com.yami.shop.common.util.HttpUtil.post(syncUrl, categoryProd);
+                    log.info("推送frontCategory到同步服务器结果: {}", response);
+                }
+            } catch (Exception e) {
+                log.error("推送frontCategory到同步服务器失败: {}", e.getMessage(), e);
+            }
+
         }
 
     }

+ 5 - 6
yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelProdServiceImpl.java

@@ -32,7 +32,6 @@ import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * 渠道对应商品管理服务实现类
@@ -254,7 +253,7 @@ public class ChannelProdServiceImpl extends ServiceImpl<ChannelProdMapper, Chann
                 Channel channel = channelMapper.selectByName(importVO.getChannelName());
                 if (ObjectUtil.isEmpty(channel)) {
                     log.error("渠道:{},在系统中不存在", importVO.getChannelName());
-                    throw new GlobalException(String.format("第%d行数据导入失败! 失败原因: 渠道=%s,在系统中不存在", i + 1, importVO.getChannelName()));
+                    throw new GlobalException(String.format("第%d行数据导入失败! 失败原因: 渠道=%s,在系统中不存在", i + 2, importVO.getChannelName()));
                 }
                 channelProd.setChannelId(channel.getId());
 
@@ -262,7 +261,7 @@ public class ChannelProdServiceImpl extends ServiceImpl<ChannelProdMapper, Chann
                 if (ObjectUtil.isEmpty(sku)) {
                     log.error("商品ID:{},在系统中不存在", importVO.getSkuId());
 
-                    throw new GlobalException(String.format("第%d行数据导入失败! 失败原因: 商品ID=%s,在系统中不存在", i + 1, importVO.getSkuId()));
+                    throw new GlobalException(String.format("第%d行数据导入失败! 失败原因: 商品ID=%s,在系统中不存在", i + 2, importVO.getSkuId()));
                 }
 
                 channelProd.setSkuId(sku.getSkuId());
@@ -275,7 +274,7 @@ public class ChannelProdServiceImpl extends ServiceImpl<ChannelProdMapper, Chann
                 ShopDetail shopDetail = shopDetailMapper.selectOne(new LambdaQueryWrapper<ShopDetail>().eq(ShopDetail::getShopName, importVO.getShopName()));
                 if (ObjectUtil.isEmpty(shopDetail)) {
                     log.error("门店:{},在系统中不存在", importVO.getShopName());
-                    throw new GlobalException(String.format("第%d行数据导入失败! 失败原因: 门店=%s,在系统中不存在", i + 1, importVO.getShopName()));
+                    throw new GlobalException(String.format("第%d行数据导入失败! 失败原因: 门店=%s,在系统中不存在", i + 2, importVO.getShopName()));
                 }
                 channelProd.setShopId(shopDetail.getShopId());
 
@@ -308,8 +307,8 @@ public class ChannelProdServiceImpl extends ServiceImpl<ChannelProdMapper, Chann
                 }
                 successCount++;
             } catch (Exception e) {
-                log.error("导入数据失败,行号:{},错误:{}", i + 1, e.getMessage());
-                throw new GlobalException(String.format("第%s行数据导入失败:%s", i + 1,e.getMessage()));
+                log.error("导入数据失败,行号:{},错误:{}", i + 2, e.getMessage());
+                throw new GlobalException(String.format("第%s行数据导入失败:%s", i + 2,e.getMessage()));
             }
         }
         return String.format("导入完成,成功:%d条", successCount);

+ 6 - 0
yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelServiceImpl.java

@@ -33,4 +33,10 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
     public List<IdNameVo> queryMyChannel(Long userId) {
         return baseMapper.queryMyChannel(userId);
     }
+
+    @Override
+    public void updateSplitRule(Integer splitRule) {
+
+        baseMapper.updateSplitRule(splitRule);
+    }
 }

+ 2 - 11
yami-shop-service/src/main/java/com/yami/shop/service/impl/MyOrderServiceImpl.java

@@ -1,12 +1,3 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- * 未经允许,不可做商业用途!
- *
- * 版权所有,侵权必究!
- */
 
 package com.yami.shop.service.impl;
 
@@ -72,7 +63,7 @@ public class MyOrderServiceImpl extends ServiceImpl<OrderMapper, Order> implemen
             }
         }
         page.setRecords(myOrderDtos);
-        page.setTotal(orderMapper.countMyOrderByUserIdAndStatus(userId, status, null));
+        page.setTotal(orderMapper.countMyOrderByUserIdAndStatus(userId, status));
         return page;
     }
 
@@ -109,7 +100,7 @@ public class MyOrderServiceImpl extends ServiceImpl<OrderMapper, Order> implemen
             }
         }
         page.setRecords(myOrderDtos);
-        page.setTotal(orderMapper.countMyOrderByUserIdAndStatus(userId, 0, isComm));
+        page.setTotal(orderMapper.countMyOrderByUserIdAndStatus(userId, 0));
         return page;
     }
 

Plik diff jest za duży
+ 718 - 213
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java


+ 1 - 58
yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java

@@ -221,7 +221,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     }
 
     @Override
-    public IPage<SearchProdDto> getSearchProdDtoPageByProdName(Page page, SearchParam searchParam) {
+    public IPage<SearchProdDto> getSearchProdDtoPageByProdName(PageParam<SearchProdDto> page, SearchParam searchParam) {
 
         if (searchParam.getShopId() == null){
             return new Page<>();
@@ -231,63 +231,6 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         }
         return productMapper.getSearchProdDtoPageByProdName(page, searchParam);
 
-//        String lat = searchParam.getLat();
-//        String lon = searchParam.getLon();
-//        String distance = searchParam.getDistance();
-//
-//        if (StringUtils.isNotEmpty(lat) && StringUtils.isNotEmpty(lon) && StringUtils.isNotEmpty(distance)) {
-//            List<ShopDetail> shopDetails = productMapper.queryShop(lat, lon, distance);
-//            List<Long> shopIds = shopDetails.stream().map(ShopDetail::getShopId).collect(Collectors.toList());
-//            if (CollectionUtil.isEmpty(shopDetails)) {
-//                return new Page<>();
-//            }
-//            IPage<SearchProdDto> searchProdDtoPage = productMapper.getSearchProdDtoPageByProdNameNew(page, searchParam, shopIds);
-//            for (SearchProdDto searchProdDto : searchProdDtoPage.getRecords()) {
-//
-//                List<SkuDto> skuList = skuMapper.listByProdId(searchProdDto.getProdId()).stream().map((sku) -> SkuDto.builder()
-//                        .skuName(sku.getSkuName()).pic(sku.getPic()).skuScore(sku.getSkuScore()).price(sku.getPrice())
-//                        .stocks(sku.getStocks()).properties(sku.getProperties()).skuId(sku.getSkuId())
-//                        .build()).collect(Collectors.toList());
-//                searchProdDto.setSkuList(skuList);
-//                //计算出好评率
-//                if (searchProdDto.getPraiseNumber() == 0 || searchProdDto.getProdCommNumber() == 0) {
-//                    searchProdDto.setPositiveRating(0.0);
-//                } else {
-//                    searchProdDto.setPositiveRating(Arith.div(Arith.mul(searchProdDto.getPraiseNumber(), 100), searchProdDto.getProdCommNumber()));
-//                }
-//                //计算销量
-//                searchProdDto.setSalesVolume(productMapper.getSalesVolume(searchProdDto.getProdId()));
-//            }
-//            return searchProdDtoPage;
-//        }
-//        IPage<SearchProdDto> searchProdDtoPage = productMapper.getSearchProdDtoPageByProdName2(page, searchParam);
-//        for (SearchProdDto searchProdDto : searchProdDtoPage.getRecords()) {
-//            List<Sku> skus = skuMapper.listByProdId(searchProdDto.getProdId());
-//            List<SkuDto> skuList = new ArrayList<>();
-//            skus.forEach(sku -> {
-//                SkuDto skuDto = new SkuDto();
-//                skuDto.setSkuName(sku.getSkuName());
-//                skuDto.setPic(sku.getPic());
-//                skuDto.setSkuScore(sku.getSkuScore());
-//                skuDto.setPrice(sku.getPrice());
-//                skuDto.setStocks(sku.getStocks());
-//                skuDto.setProperties(sku.getProperties());
-//                skuDto.setSkuId(sku.getSkuId());
-//                skuList.add(skuDto);
-//            });
-//            searchProdDto.setSkuList(skuList);
-//            //计算出好评率
-//            if (Objects.nonNull(searchProdDto.getPraiseNumber()) && Objects.nonNull(searchProdDto.getProdCommNumber())) {
-//                if (searchProdDto.getPraiseNumber() == 0 || searchProdDto.getProdCommNumber() == 0) {
-//                    searchProdDto.setPositiveRating(0.0);
-//                } else {
-//                    searchProdDto.setPositiveRating(Arith.div(Arith.mul(searchProdDto.getPraiseNumber(), 100), searchProdDto.getProdCommNumber()));
-//                }
-//                //计算销量
-//                searchProdDto.setSalesVolume(productMapper.getSalesVolume(searchProdDto.getProdId()));
-//            }
-//        }
-//        return searchProdDtoPage;
     }
 
     @Override

+ 94 - 0
yami-shop-service/src/main/java/com/yami/shop/utils/BinPackingUtil.java

@@ -0,0 +1,94 @@
+package com.yami.shop.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+// 自己实现简单的装箱算法
+public class BinPackingUtil {
+
+    /**
+     * 首次适配递减算法
+     */
+    public static <T> List<List<T>> firstFitDecreasing(
+            List<T> items,
+            Function<T, Double> weightExtractor,
+            double capacity) {
+
+        // 按重量从大到小排序
+        List<T> sortedItems = new ArrayList<>(items);
+        sortedItems.sort((a, b) ->
+                Double.compare(weightExtractor.apply(b), weightExtractor.apply(a)));
+
+        List<List<T>> bins = new ArrayList<>();
+        List<Double> binWeights = new ArrayList<>();
+
+        for (T item : sortedItems) {
+            double weight = weightExtractor.apply(item);
+            boolean placed = false;
+
+            // 尝试放入现有箱子
+            for (int i = 0; i < bins.size(); i++) {
+                if (binWeights.get(i) + weight <= capacity) {
+                    bins.get(i).add(item);
+                    binWeights.set(i, binWeights.get(i) + weight);
+                    placed = true;
+                    break;
+                }
+            }
+
+            // 创建新箱子
+            if (!placed) {
+                List<T> newBin = new ArrayList<>();
+                newBin.add(item);
+                bins.add(newBin);
+                binWeights.add(weight);
+            }
+        }
+
+        return bins;
+    }
+
+    /**
+     * 最佳适配递减算法
+     */
+    public static <T> List<List<T>> bestFitDecreasing(
+            List<T> items,
+            Function<T, Double> weightExtractor,
+            double capacity) {
+
+        List<T> sortedItems = new ArrayList<>(items);
+        sortedItems.sort((a, b) ->
+                Double.compare(weightExtractor.apply(b), weightExtractor.apply(a)));
+
+        List<List<T>> bins = new ArrayList<>();
+        List<Double> binWeights = new ArrayList<>();
+
+        for (T item : sortedItems) {
+            double weight = weightExtractor.apply(item);
+            int bestBinIndex = -1;
+            double minRemaining = Double.MAX_VALUE;
+
+            // 寻找最佳箱子
+            for (int i = 0; i < bins.size(); i++) {
+                double remaining = capacity - binWeights.get(i);
+                if (remaining >= weight && remaining < minRemaining) {
+                    minRemaining = remaining;
+                    bestBinIndex = i;
+                }
+            }
+
+            if (bestBinIndex != -1) {
+                bins.get(bestBinIndex).add(item);
+                binWeights.set(bestBinIndex, binWeights.get(bestBinIndex) + weight);
+            } else {
+                List<T> newBin = new ArrayList<>();
+                newBin.add(item);
+                bins.add(newBin);
+                binWeights.add(weight);
+            }
+        }
+
+        return bins;
+    }
+}

+ 5 - 0
yami-shop-service/src/main/resources/mapper/ChannelMapper.xml

@@ -1,6 +1,11 @@
 <?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.yami.shop.dao.ChannelMapper">
+    <update id="updateSplitRule">
+        update tz_channel
+        set split_rule = 0
+        where split_rule = #{splitRule}
+    </update>
 
     <select id="selectByName" resultType="com.yami.shop.bean.model.Channel">
         select *

+ 274 - 246
yami-shop-service/src/main/resources/mapper/OrderMapper.xml

@@ -35,6 +35,11 @@
         <result column="user_mobile" jdbcType="VARCHAR" property="userMobile"/>
         <result column="receiver" jdbcType="VARCHAR" property="receiver"/>
         <result column="shop_name" jdbcType="VARCHAR" property="shopName"/>
+        <result column="split_status" property="splitStatus"/>
+        <result column="auto_split" property="autoSplit"/>
+        <result column="order_level" property="orderLevel"/>
+        <result column="order_split_number" property="orderSplitNumber"/>
+        <result column="order_split_status" property="orderSplitStatus"/>
     </resultMap>
 
     <resultMap id="MyOrderMap" type="com.yami.shop.bean.app.dto.MyOrderDto">
@@ -196,7 +201,7 @@
             <result column="shop_id" jdbcType="BIGINT" property="shopId"/>
             <result column="order_number" jdbcType="VARCHAR" property="orderNumber"/>
             <result column="prod_id" jdbcType="BIGINT" property="prodId"/>
-<!--            <result column="prod_name" jdbcType="BIGINT" property="prodName"/>-->
+            <!--            <result column="prod_name" jdbcType="BIGINT" property="prodName"/>-->
             <result column="sku_id" jdbcType="BIGINT" property="skuId"/>
             <result column="prod_count" jdbcType="INTEGER" property="prodCount"/>
             <result column="use_score" jdbcType="INTEGER" property="useScore"/>
@@ -219,25 +224,32 @@
     </resultMap>
 
     <select id="getOrderByOrderNumber" resultType="com.yami.shop.bean.model.Order">
-    select * from tz_order o where o.order_number = #{orderNumber}
-  </select>
+        select *
+        from tz_order o
+        where o.order_number = #{orderNumber}
+    </select>
 
     <select id="listUnRefundOrderAndOrderItems" resultMap="orderAndOrderItemMap">
-    select o.*,oi.*,tor.return_money_sts,oi.prod_name oi_prod_name,oi.actual_total as oi_actual_total from tz_order o
-      join tz_order_item oi on o.order_number = oi.order_number
-      left join tz_order_refund tor on tor.order_id = o.order_id
-    where o.hb_order_status = #{orderStatus} and (refund_status IS NULL OR o.refund_status &lt;&gt; 1)
-    and o.dvy_time &lt; #{lessThanUpdateTime}
-  </select>
+        select o.*, oi.*, tor.return_money_sts, oi.prod_name oi_prod_name, oi.actual_total as oi_actual_total
+        from tz_order o
+                 join tz_order_item oi on o.order_number = oi.order_number
+                 left join tz_order_refund tor on tor.order_id = o.order_id
+        where o.hb_order_status = #{orderStatus}
+          and (refund_status IS NULL OR o.refund_status &lt;&gt; 1)
+          and o.dvy_time &lt; #{lessThanUpdateTime}
+    </select>
 
     <select id="selectCancelOrders" resultMap="orderAndOrderItemMap">
-    select o.*,oi.*,oi.prod_name oi_prod_name,oi.actual_total as oi_actual_total from tz_order o
-      join tz_order_item oi on o.order_number = oi.order_number
-    where o.hb_order_status = #{orderStatus}  and o.create_time &lt; #{lessThanUpdateTime}
-  </select>
+        select o.*, oi.*, oi.prod_name oi_prod_name, oi.actual_total as oi_actual_total
+        from tz_order o
+                 join tz_order_item oi on o.order_number = oi.order_number
+        where o.hb_order_status = #{orderStatus}
+          and o.create_time &lt; #{lessThanUpdateTime}
+    </select>
 
     <update id="cancelOrders">
-        update tz_order set `hb_order_status`=60,close_type = 1,cancel_reason = #{cancelReason}, cancel_time = NOW(),update_time=NOW(),close_type=4  where order_id in
+        update tz_order set `hb_order_status`=60,close_type = 1,cancel_reason = #{cancelReason}, cancel_time =
+        NOW(),update_time=NOW(),close_type=4 where order_id in
         <foreach collection="orders" item="order" open="(" close=")" separator=",">
             #{order.orderId}
         </foreach>
@@ -251,7 +263,8 @@
     </update>
 
     <update id="updateByToPaySuccess">
-        update tz_order set `hb_order_status` = 20,is_payed =1,update_time=NOW(),pay_time=NOW(),pay_type =#{payType} where dvy_type=3 and
+        update tz_order set `hb_order_status` = 20,is_payed =1,update_time=NOW(),pay_time=NOW(),pay_type =#{payType}
+        where dvy_type=3 and
         order_number in
         <foreach collection="orderNumbers" item="orderNumber" separator="," open="(" close=")">
             #{orderNumber}
@@ -259,7 +272,8 @@
     </update>
 
     <update id="updateByToPaySuccessDelivery">
-        update tz_order set `hb_order_status` = 1,is_payed =1,update_time=NOW(),pay_time=NOW(),pay_type =#{payType} where dvy_type=1 and
+        update tz_order set `hb_order_status` = 1,is_payed =1,update_time=NOW(),pay_time=NOW(),pay_type =#{payType}
+        where dvy_type=1 and
         order_number in
         <foreach collection="orderNumbers" item="orderNumber" separator="," open="(" close=")">
             #{orderNumber}
@@ -268,7 +282,8 @@
 
 
     <select id="listOrdersDetialByOrder" resultMap="orderAndOrderItemAndUserAddrMap">
-        select o.*,oi.*,oi.prod_name as item_prod_name,o.prod_name as order_prod_name,uao.* ,o.hb_order_status as oi_status
+        select o.*,oi.*,oi.prod_name as item_prod_name,o.prod_name as order_prod_name,uao.* ,o.hb_order_status as
+        oi_status
         from tz_order o
         left join tz_order_item oi on o.order_number = oi.order_number
         left join tz_user_addr_order uao on o.addr_order_id = uao.addr_order_id
@@ -305,21 +320,20 @@
     </select>
 
 
-
     <select id="getOrderCountByShopId" resultType="com.yami.shop.bean.param.OrderPayParam">
         SELECT SUM(actual_total) as payActualTotal,COUNT(DISTINCT user_id) as payUserCount,
         COUNT(*) as payOrderCount
         FROM tz_order o
         <where>
-        <if test="shopId != null">
-            and o.shop_id = #{shopId}
-        </if>
-        <if test="startTime != null">
-            and o.pay_time &gt;= #{startTime}
-        </if>
-        <if test="endTime != null">
-            and o.pay_time &lt;= #{endTime}
-        </if>
+            <if test="shopId != null">
+                and o.shop_id = #{shopId}
+            </if>
+            <if test="startTime != null">
+                and o.pay_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null">
+                and o.pay_time &lt;= #{endTime}
+            </if>
             AND o.is_payed =1
         </where>
     </select>
@@ -348,13 +362,13 @@
             </if>
             AND o.is_payed =1
         </where>
-        GROUP BY dates) _tmpAllTable  GROUP BY dates
+        GROUP BY dates) _tmpAllTable GROUP BY dates
         ORDER BY dates
     </select>
 
     <select id="getActualTotalByHour" resultType="com.yami.shop.bean.param.OrderPayParam">
-    SELECT DATE_FORMAT(o.pay_time, '%k') AS dates,SUM(actual_total) as payActualTotal
-    FROM tz_order o
+        SELECT DATE_FORMAT(o.pay_time, '%k') AS dates,SUM(actual_total) as payActualTotal
+        FROM tz_order o
         <where>
             <if test="shopId != null">
                 and o.shop_id = #{shopId}
@@ -367,7 +381,7 @@
             </if>
             AND o.is_payed =1
         </where>
-    GROUP BY dates
+        GROUP BY dates
     </select>
 
     <select id="getActualTotalByDay" resultType="com.yami.shop.bean.param.OrderPayParam">
@@ -390,8 +404,10 @@
 
 
     <select id="listOrdersDetialByOrderParam" resultMap="orderAndOrderItemAndUserAddrMap">
-        SELECT *,oi.prod_name as item_prod_name,oi.actual_total as oi_actual_total,IF(r.refund_type = 2,r.return_money_sts,IF(ar.refund_type = 1,ar.return_money_sts,NULL)) AS oi_return_money_sts,
-        temp.prod_name as order_prod_name,temp.hb_order_status as oi_status, IF(os.pay_score IS NULL,0,os.pay_score) as pay_score
+        SELECT *,oi.prod_name as item_prod_name,oi.actual_total as oi_actual_total,IF(r.refund_type =
+        2,r.return_money_sts,IF(ar.refund_type = 1,ar.return_money_sts,NULL)) AS oi_return_money_sts,
+        temp.prod_name as order_prod_name,temp.hb_order_status as oi_status, IF(os.pay_score IS NULL,0,os.pay_score) as
+        pay_score
         FROM
         (
         SELECT o.*,sd.shop_name,uao.receiver,uao.mobile,u.user_mobile,u.nick_name FROM tz_order o
@@ -399,31 +415,19 @@
         LEFT JOIN tz_user_addr_order uao ON o.addr_order_id = uao.addr_order_id
         LEFT JOIN tz_user u on u.user_id=o.user_id
         <where>
-<!--            <if test="orderParam.type!=null and orderParam.type==1 and orderParam.content != null and orderParam.content != ''">-->
-<!--                and o.order_number = #{orderParam.content}-->
-<!--            </if>-->
+            <!--            <if test="orderParam.type!=null and orderParam.type==1 and orderParam.content != null and orderParam.content != ''">-->
+            <!--                and o.order_number = #{orderParam.content}-->
+            <!--            </if>-->
 
+            <if test="orderParam.parentOrderNumber != null and orderParam.parentOrderNumber != ''">
+                and o.parent_order_number = #{orderParam.parentOrderNumber}
+            </if>
             <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
                 and o.order_number = #{orderParam.orderNumber}
             </if>
-<!--            <if test="orderParam.type!=null and orderParam.type==2 and orderParam.orderNumber != null and orderParam.orderNumber != ''">-->
-<!--                and o.order_number = #{orderParam.orderNumber}-->
-<!--            </if>-->
-<!--            <if test="orderParam.type!=null and orderParam.type==4 and orderParam.content != null and orderParam.content != ''">-->
-<!--                and u.nick_name LIKE concat("%",#{orderParam.content},"%")-->
-<!--            </if>-->
-<!--            <if test="orderParam.type!=null and orderParam.type==5 and orderParam.content != null and orderParam.content != ''">-->
-<!--                and u.user_mobile LIKE concat("%",#{orderParam.content},"%")-->
-<!--            </if>-->
-<!--            <if test="orderParam.type!=null and orderParam.type==6 and orderParam.content != null and orderParam.content != ''">-->
-<!--                and u.dvy_flow_id = #{orderParam.content}-->
-<!--            </if>-->
             <if test="orderParam.hbOrderStatus != null">
                 and o.hb_order_status = #{orderParam.hbOrderStatus}
             </if>
-<!--            <if test="orderParam.payType != null">-->
-<!--                and o.pay_type = #{orderParam.payType}-->
-<!--            </if>-->
             <if test="orderParam.dvyType != null">
                 and o.dvy_type = #{orderParam.dvyType}
             </if>
@@ -447,13 +451,13 @@
                 and o.order_type = #{orderParam.orderType}
             </if>
             <if test="orderParam.orderType == null">
-              and (o.order_type <![CDATA[ <> ]]> 3 OR o.order_type IS NULL)
+                and (o.order_type <![CDATA[ <> ]]> 3 OR o.order_type IS NULL)
             </if>
             <if test="orderParam.shopName != null">
                 and sd.shop_name LIKE concat("%",#{orderParam.shopName},"%")
             </if>
             <if test="orderParam.refundStatus == 0">
-                and o.refund_status  IS NULL
+                and o.refund_status IS NULL
             </if>
             <if test="orderParam.refundStatus != null and orderParam.refundStatus != 0">
                 and o.refund_status = #{orderParam.refundStatus}
@@ -461,21 +465,17 @@
             <if test="orderParam.prodName != null">
                 and o.prod_name LIKE concat("%",#{orderParam.prodName},"%")
             </if>
-<!--            <if test="orderParam.type!=null and orderParam.type==2 and orderParam.content != null and orderParam.content != ''">-->
-<!--                and uao.receiver LIKE concat("%",#{orderParam.content},"%")-->
-<!--            </if>-->
-<!--            <if test="orderParam.type!=null and orderParam.type==3 and orderParam.content != null and orderParam.content != ''">-->
-<!--                and uao.mobile LIKE concat("%",#{orderParam.content},"%")-->
-<!--            </if>-->
         </where>
         ORDER BY o.create_time DESC
         LIMIT #{adapter.begin} , #{adapter.size}
         ) AS temp
         LEFT JOIN tz_order_item oi ON temp.order_number = oi.order_number
         <!--连接单个物品退款的退款信息-->
-        LEFT JOIN tz_order_refund r ON r.order_item_id = oi.order_item_id AND r.refund_type = 2 AND r.return_money_sts &gt; 0 AND r.return_money_sts &lt; 6
+        LEFT JOIN tz_order_refund r ON r.order_item_id = oi.order_item_id AND r.refund_type = 2 AND r.return_money_sts
+        &gt; 0 AND r.return_money_sts &lt; 6
         <!--连接整单退款的退款信息-->
-        LEFT JOIN tz_order_refund ar ON ar.order_id = temp.order_id AND ar.refund_type = 1 AND ar.return_money_sts &gt; 0 AND ar.return_money_sts &lt; 6
+        LEFT JOIN tz_order_refund ar ON ar.order_id = temp.order_id AND ar.refund_type = 1 AND ar.return_money_sts &gt;
+        0 AND ar.return_money_sts &lt; 6
         LEFT JOIN tz_order_settlement os ON temp.order_number = os.order_number
         ORDER BY temp.create_time DESC
     </select>
@@ -484,13 +484,17 @@
         SELECT a.*,b.receiver,b.mobile user_mobile,c.shop_name FROM tz_order a
         LEFT JOIN tz_user_addr_order b on a.addr_order_id=b.addr_order_id
         LEFT JOIN tz_shop_detail c on a.shop_id=c.shop_id
-        left join  tz_user d on a.user_id = d.user_id
+        left join tz_user d on a.user_id = d.user_id
         <where>
             <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
                 and a.order_number = #{orderParam.orderNumber}
             </if>
+
+            <if test="orderParam.parentOrderNumber != null and orderParam.parentOrderNumber != ''">
+                and a.parent_order_number = #{orderParam.parentOrderNumber}
+            </if>
             <if test="orderParam.channelIdList != null and !orderParam.channelIdList.isEmpty()">
-                and a.channel_id  in
+                and a.channel_id in
                 <foreach collection="orderParam.channelIdList" item="channelId" open="(" close=")" separator=",">
                     #{channelId}
                 </foreach>
@@ -516,6 +520,7 @@
             <if test="orderParam.receiver != null">
                 and b.receiver LIKE concat("%",#{orderParam.receiver},"%")
             </if>
+
             <if test="orderParam.userMobile != null">
                 and b.mobile LIKE concat("%",#{orderParam.userMobile},"%")
             </if>
@@ -540,79 +545,30 @@
                 <if test="orderParam.orderStatus == 'cancel'">
                     AND a.hb_order_status in (50,60)
                 </if>
+                <if test="orderParam.orderStatus == 'split'">
+                    AND a.hb_order_status in (1,20) and a.split_status in(2,3)
+                </if>
             </if>
-        </where>
-        order by a.create_time desc,a.order_id desc
-        LIMIT #{adapter.begin} , #{adapter.size}
-    </select>
 
-    <select id="deliverListCount" resultType="integer">
-        SELECT count(1) FROM tz_order a
-        LEFT JOIN tz_user_addr_order b on a.addr_order_id=b.addr_order_id
-        LEFT JOIN tz_shop_detail c on a.shop_id=c.shop_id
-        left join  tz_user d on a.user_id = d.user_id
-        <where>
-            <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
-                and a.order_number = #{orderParam.orderNumber}
+            <if test="orderParam.orderSplitStatus != null">
+                and a.order_split_Status = #{orderParam.orderSplitStatus}
             </if>
-            <if test="orderParam.channelIdList != null and !orderParam.channelIdList.isEmpty()">
-                and a.channel_id  in
-                <foreach collection="orderParam.channelIdList" item="channelId" open="(" close=")" separator=",">
-                    #{channelId}
-                </foreach>
-            </if>
-            <if test="orderParam.dvyType != null and orderParam.dvyType != ''">
-                and a.dvy_type = #{orderParam.dvyType}
-            </if>
-            <if test="orderParam.userAttrType != null and orderParam.userAttrType != '' and orderParam.userAttrType != 0">
-                AND d.user_attr_type = #{orderParam.userAttrType}
+            <if test="orderParam.autoSplit != null">
+                and a.auto_split = #{orderParam.autoSplit}
             </if>
-            <if test="orderParam.shopId != null">
-                and a.shop_id = #{orderParam.shopId}
-            </if>
-            <if test="orderParam.startTime != null">
-                and a.create_time &gt; #{orderParam.startTime}
-            </if>
-            <if test="orderParam.endTime != null">
-                and a.create_time &lt; #{orderParam.endTime}
-            </if>
-            <if test="orderParam.refundStatus != null and orderParam.refundStatus != 0">
-                and a.refund_status = #{orderParam.refundStatus}
-            </if>
-            <if test="orderParam.receiver != null">
-                and b.receiver LIKE concat("%",#{orderParam.receiver},"%")
-            </if>
-            <if test="orderParam.userMobile != null">
-                and b.mobile LIKE concat("%",#{orderParam.userMobile},"%")
-            </if>
-
-            <if test="orderParam.orderStatus != null and orderParam.orderStatus != ''">
-                <if test="orderParam.orderStatus == 'all'">
-                    AND a.hb_order_status in (0, 1,20,30,40,50,60,70,80)
-                </if>
-                <if test="orderParam.orderStatus == 'paddingPay'">
-                    AND a.hb_order_status in (0)
-                </if>
-
-                <if test="orderParam.orderStatus == 'paddingShipped'">
-                    AND a.hb_order_status in (1)
-                </if>
-
-                <if test="orderParam.orderStatus == 'paddingReceived'">
-                    AND a.hb_order_status in (20,30,40,70)
-                </if>
-                <if test="orderParam.orderStatus == 'completed'">
-                    AND a.hb_order_status in (80)
-                </if>
-                <if test="orderParam.orderStatus == 'cancel'">
-                    AND a.hb_order_status in (50,60)
+            <if test="orderParam.splitStatus != null">
+                <if test="orderParam.splitStatus != 2">
+                    and a.split_status = #{orderParam.splitStatus}
                 </if>
             </if>
+            <if test="orderParam.orderLevel != null">
+                and a.order_level = #{orderParam.orderLevel}
+            </if>
         </where>
+        order by a.create_time desc,a.order_id desc
     </select>
 
 
-
     <select id="countOrderDetial" resultType="long">
         SELECT count(0)
         FROM tz_order o
@@ -656,7 +612,7 @@
                 and sd.shop_name LIKE concat("%",#{orderParam.shopName},"%")
             </if>
             <if test="orderParam.refundStatus == 0">
-                and o.refund_status  IS NULL
+                and o.refund_status IS NULL
             </if>
             <if test="orderParam.refundStatus != null and orderParam.refundStatus != 0">
                 and o.refund_status = #{orderParam.refundStatus}
@@ -675,11 +631,12 @@
 
 
     <select id="calculateUserInShopData" resultType="com.yami.shop.bean.distribution.UserShoppingDataDto">
-        select
-            count(o.order_number) as expense_number,
-            ifnull(SUM(o.actual_total),0) as expense_amount
+        select count(o.order_number)          as expense_number,
+               ifnull(SUM(o.actual_total), 0) as expense_amount
         from tz_order o
-        where o.user_id=#{userId} and o.shop_id = #{shopId} and (o.hb_order_status = 45 or o.hb_order_status = 80)
+        where o.user_id = #{userId}
+          and o.shop_id = #{shopId}
+          and (o.hb_order_status = 45 or o.hb_order_status = 80)
     </select>
 
     <select id="listMyOrderByUserIdAndStatus" resultMap="MyOrderMap">
@@ -691,20 +648,25 @@
         o.pay_time,
         o.dvy_type,
         o.comm_sts,
-        (SELECT r.refund_type FROM tz_order_refund r WHERE r.order_id =o.order_id ORDER BY r.update_time DESC LIMIT 0,1) AS refund_type,
-        (SELECT r.return_money_sts FROM tz_order_refund r WHERE r.order_id =o.order_id ORDER BY r.update_time DESC LIMIT 0,1) AS return_money_sts,
-        oi.pic,oi.price,oi.prod_name,oi.pic,oi.sku_name,ifnull(oi.use_score,0) as use_score,oi.prod_id,oi.rec_time,oi.prod_count,oi.order_item_id,oi.comm_sts,
+        (SELECT r.refund_type FROM tz_order_refund r WHERE r.order_id =o.order_id ORDER BY r.update_time DESC LIMIT 0,1)
+        AS refund_type,
+        (SELECT r.return_money_sts FROM tz_order_refund r WHERE r.order_id =o.order_id ORDER BY r.update_time DESC LIMIT
+        0,1) AS return_money_sts,
+        oi.pic,oi.price,oi.prod_name,oi.pic,oi.sku_name,ifnull(oi.use_score,0) as
+        use_score,oi.prod_id,oi.rec_time,oi.prod_count,oi.order_item_id,oi.comm_sts,
         sd.shop_id,sd.shop_name,oi.actual_total as oi_actual_total,ad.longitude,ad.latitude
         FROM (
         SELECT temp.order_type,
-            temp.hb_order_status,
-            temp.hb_logistic_status,
-            temp.offset_points,
-            temp.pay_time,
-            temp.dvy_type,
-            temp.comm_sts,
-            temp.order_id, temp.create_time, temp.freight_amount,temp.order_number,temp.actual_total,temp.shop_id,temp.addr_order_id FROM tz_order temp
+        temp.hb_order_status,
+        temp.hb_logistic_status,
+        temp.offset_points,
+        temp.pay_time,
+        temp.dvy_type,
+        temp.comm_sts,
+        temp.order_id, temp.create_time,
+        temp.freight_amount,temp.order_number,temp.actual_total,temp.shop_id,temp.addr_order_id FROM tz_order temp
         WHERE temp.user_id = #{userId} and temp.delete_status=0
+        and (temp.order_level != 0 OR temp.split_status != 4) and (temp.order_level != 1 OR temp.split_status != 3)
         <if test="status != null">
             AND
             <choose>
@@ -732,22 +694,18 @@
 
 
     <select id="countMyOrderByUserIdAndStatus" resultType="Long">
-        SELECT count(*)
-        FROM (
-        SELECT count(*) FROM tz_order temp
-        JOIN tz_order_item oi ON temp.order_number = oi.order_number
+        SELECT count(temp.order_id) FROM tz_order temp
         WHERE temp.user_id = #{userId} and temp.delete_status = 0
-        <if test="status != null and status != 0">
-            AND temp.hb_order_status = #{status}
-        </if>
-        <if test="isComm != null">
-            AND temp.hb_order_status = 80
-        </if>
-        <if test="isComm != null">
-            AND oi.comm_sts = #{isComm}
+        <if test="status != null">
+            <if test="20 == status">
+                and temp.hb_order_status IN (1,20,30,40,50,70)
+
+            </if>
+            <if test="20 != status">
+                AND temp.hb_order_status = #{status}
+            </if>
         </if>
-        group by temp.order_id
-        )AS o
+        and (temp.order_level != 0 OR temp.split_status != 4) and (temp.order_level != 1 OR temp.split_status != 3)
     </select>
 
 
@@ -760,65 +718,83 @@
     </update>
 
     <select id="getOrderCount" resultType="com.yami.shop.bean.app.dto.OrderCountData">
-        SELECT
-        COUNT(o.order_id) all_count,
-        COUNT( CASE WHEN o.hb_order_status = 0 THEN o.order_id ELSE NULL END ) AS unPay,
-        COUNT( CASE WHEN o.hb_order_status = 1 THEN o.order_id ELSE NULL END ) AS payed,
-        COUNT( CASE WHEN o.hb_order_status in (1,20,30,40,50,70) THEN o.order_id ELSE NULL END ) AS consignment,
-        COUNT( CASE WHEN o.hb_order_status = 40 THEN o.order_id ELSE NULL END ) AS confirm,
-        COUNT( CASE WHEN o.hb_order_status = 80 THEN o.order_id ELSE NULL END ) AS success,
-        COUNT( CASE WHEN o.hb_order_status = 60 THEN o.order_id ELSE NULL END ) AS `close`
+        SELECT COUNT(o.order_id)                                                                              all_count,
+               COUNT(CASE WHEN o.hb_order_status = 0 THEN o.order_id ELSE NULL END)                        AS unPay,
+               COUNT(CASE WHEN o.hb_order_status = 1 THEN o.order_id ELSE NULL END)                        AS payed,
+               COUNT(CASE
+                         WHEN o.hb_order_status in (1, 20, 30, 40, 50, 70) THEN o.order_id
+                         ELSE NULL END)                                                                    AS consignment,
+               COUNT(CASE WHEN o.hb_order_status = 40 THEN o.order_id ELSE NULL END)                       AS confirm,
+               COUNT(CASE WHEN o.hb_order_status = 80 THEN o.order_id ELSE NULL END)                       AS success,
+               COUNT(CASE WHEN o.hb_order_status = 60 THEN o.order_id ELSE NULL END)                       AS `close`
         FROM tz_order o
-        WHERE o.user_id =#{userId} AND o.delete_status = 0
+        WHERE o.user_id = #{userId}
+          AND o.delete_status = 0
+          and (o.order_level != 0 OR o.split_status != 4)
+          and (o.order_level != 1 OR o.split_status != 3)
     </select>
     <update id="cancelSeckillOrderByTime">
         UPDATE tz_order o JOIN (
-          SELECT so.order_number FROM tz_seckill_order so JOIN
+            SELECT so.order_number FROM tz_seckill_order so JOIN
             tz_seckill s ON s.seckill_id = so.seckill_id
-                              AND (UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(so.`create_time`))/60 &gt; s.`max_cancel_time` and so.state = 0 ) t
-            ON o.order_number = t.order_number
-        SET o.`hb_order_status`=60,o.cancel_time = NOW(),o.update_time=NOW()
+            AND (UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(so.`create_time`))/60 &gt; s.`max_cancel_time` and so.state = 0 ) t
+        ON o.order_number = t.order_number
+            SET o.`hb_order_status`=60, o.cancel_time = NOW(), o.update_time=NOW()
     </update>
 
     <update id="updateToWaitGroup">
-        UPDATE tz_order SET hb_order_status = 7,update_time=NOW() WHERE order_number = #{orderNumber}
+        UPDATE tz_order
+        SET hb_order_status = 7,
+            update_time=NOW()
+        WHERE order_number = #{orderNumber}
     </update>
 
     <update id="updateToWaitDelivery">
-        UPDATE tz_order SET `hb_order_status` = 20, `update_time` = NOW()
+        UPDATE tz_order
+        SET `hb_order_status` = 20,
+            `update_time`     = NOW()
         WHERE `order_number` IN
-         (
-           SELECT order_number FROM
-            (SELECT o.`order_number` FROM tz_order o
-             LEFT JOIN tz_group_order go ON go.`order_number` = o.`order_number`
-             LEFT JOIN tz_group_team gt ON gt.`group_team_id` = go.`group_team_id`
-             WHERE gt.`group_team_id` = #{groupTeamId}) temp
-         )
+              (SELECT order_number
+               FROM (SELECT o.`order_number`
+                     FROM tz_order o
+                              LEFT JOIN tz_group_order go
+                     ON go.`order_number` = o.`order_number`
+                         LEFT JOIN tz_group_team gt ON gt.`group_team_id` = go.`group_team_id`
+                     WHERE gt.`group_team_id` = #{groupTeamId}) temp)
     </update>
 
     <select id="getOrderByOrderNumberAndUserId" resultType="com.yami.shop.bean.model.Order">
-        select o.* from tz_order o where o.order_number = #{orderNumber} and o.user_id = #{userId}
+        select o.*
+        from tz_order o
+        where o.order_number = #{orderNumber}
+          and o.user_id = #{userId}
     </select>
 
     <select id="getOrderAndOrderItemByOrderNumber" resultMap="orderAndOrderItemMap">
-        select o.*,oi.*,oi.prod_name oi_prod_name,oi.actual_total as oi_actual_total from tz_order o
-          left join tz_order_item oi on o.order_number = oi.order_number
+        select o.*, oi.*, oi.prod_name oi_prod_name, oi.actual_total as oi_actual_total
+        from tz_order o
+                 left join tz_order_item oi on o.order_number = oi.order_number
         where o.order_number = #{orderNumber}
     </select>
 
     <select id="hasBuySuccessProd" resultType="java.lang.Integer">
-        select count(*) from tz_order_item oi
+        select count(*)
+        from tz_order_item oi
                  join tz_order o on o.order_number = oi.order_number
-        where o.user_id=#{userId} and o.hb_order_status = 50 and oi.prod_id = #{prodId}
+        where o.user_id = #{userId}
+          and o.hb_order_status = 50
+          and oi.prod_id = #{prodId}
     </select>
 
     <select id="listMyOrderByParams" resultMap="MyOrderMap">
         SELECT
         o.order_type,o.actual_total,
-        oi.pic,oi.price,oi.prod_id,oi.prod_name,oi.sku_name,ifnull(oi.use_score,0) as use_score,oi.prod_count,oi.order_item_id,o.hb_order_status,o.order_number,oi.comm_sts,
+        oi.pic,oi.price,oi.prod_id,oi.prod_name,oi.sku_name,ifnull(oi.use_score,0) as
+        use_score,oi.prod_count,oi.order_item_id,o.hb_order_status,o.order_number,oi.comm_sts,
         sd.shop_id,sd.shop_name
         FROM (
-        SELECT temp.order_type, temp.create_time, temp.order_number,temp.actual_total,temp.hb_order_status,temp.shop_id,prod_name
+        SELECT temp.order_type, temp.create_time,
+        temp.order_number,temp.actual_total,temp.hb_order_status,temp.shop_id,prod_name
         FROM tz_order temp
         WHERE temp.user_id = #{userId} and temp.delete_status = 0
         <if test="status != null and status != 0">
@@ -852,38 +828,39 @@
 
     <select id="countMyOrderByParams" resultType="Long">
         SELECT COUNT(*) FROM(
-            SELECT
-            count(1)
-            FROM tz_order o
-            JOIN tz_order_item oi ON o.order_number = oi.order_number
-            join tz_shop_detail sd on o.shop_id = sd.shop_id
-            WHERE o.user_id = #{userId} and o.delete_status = 0
-            <if test="status != null and status != 0">
-                AND o.hb_order_status = #{status}
-            </if>
-            <if test="orderNumber != null and orderNumber != ''">
-                AND o.order_number LIKE CONCAT("%",#{orderNumber},"%")
-            </if>
-            <if test="orderType == 0">
-                AND (o.order_type = 0 or o.order_type is null)
-            </if>
-            <if test="orderType != null and orderType !='' and orderType != 0">
-                AND o.order_type = #{orderType}
-            </if>
-            <if test="orderTimeStatus == 1 or orderTimeStatus == 2">
-                AND o.create_time &gt;= #{preTime}
-            </if>
-            <if test="orderTimeStatus == 3">
-                AND o.create_time &lt;= #{preTime}
-            </if>
-            <if test="orderName != null and orderName != ''">
-                AND (o.prod_name LIKE concat('%',#{orderName},'%') OR oi.prod_name LIKE concat('%',#{orderName},'%'))
-            </if>
-            GROUP BY o.order_number
+        SELECT
+        count(1)
+        FROM tz_order o
+        JOIN tz_order_item oi ON o.order_number = oi.order_number
+        join tz_shop_detail sd on o.shop_id = sd.shop_id
+        WHERE o.user_id = #{userId} and o.delete_status = 0
+        <if test="status != null and status != 0">
+            AND o.hb_order_status = #{status}
+        </if>
+        <if test="orderNumber != null and orderNumber != ''">
+            AND o.order_number LIKE CONCAT("%",#{orderNumber},"%")
+        </if>
+        <if test="orderType == 0">
+            AND (o.order_type = 0 or o.order_type is null)
+        </if>
+        <if test="orderType != null and orderType !='' and orderType != 0">
+            AND o.order_type = #{orderType}
+        </if>
+        <if test="orderTimeStatus == 1 or orderTimeStatus == 2">
+            AND o.create_time &gt;= #{preTime}
+        </if>
+        <if test="orderTimeStatus == 3">
+            AND o.create_time &lt;= #{preTime}
+        </if>
+        <if test="orderName != null and orderName != ''">
+            AND (o.prod_name LIKE concat('%',#{orderName},'%') OR oi.prod_name LIKE concat('%',#{orderName},'%'))
+        </if>
+        GROUP BY o.order_number
         ) AS temp
     </select>
     <select id="listOrdersDetialByOrderInfo" resultMap="orderAndOrderItemAndUserAddrMap">
-        SELECT *,oi.prod_name,uao.address,uao.address_name,uao.addr_detail as item_prod_name,oi.actual_total as oi_actual_total,temp.prod_name as order_prod_name,temp.hb_order_status as oi_status
+        SELECT *,oi.prod_name,uao.address,uao.address_name,uao.addr_detail as item_prod_name,oi.actual_total as
+        oi_actual_total,temp.prod_name as order_prod_name,temp.hb_order_status as oi_status
         FROM
         (
         SELECT o.*,sd.shop_name FROM tz_order o
@@ -918,7 +895,7 @@
                 and sd.shop_name LIKE concat("%",#{orderParam.shopName},"%")
             </if>
             <if test="orderParam.refundStatus == 0">
-                and o.refund_status  IS NULL
+                and o.refund_status IS NULL
             </if>
             <if test="orderParam.refundStatus != null and orderParam.refundStatus != 0">
                 and o.refund_status = #{orderParam.refundStatus}
@@ -953,39 +930,64 @@
         </foreach>
     </select>
     <select id="getOrderDetailByOrderNumberAndShopId" resultMap="orderAndOrderItemAndUserAddrMap">
-        SELECT o.*,oi.prod_name as item_prod_name,oi.*,uao.*,u.`nick_name`,u.user_mobile,o.hb_order_status as oi_status, IF(o.refund_type = 1,
-            o.rms,r.return_money_sts) AS oi_return_money_sts
+        SELECT o.*,oi.prod_name as item_prod_name,oi.*,uao.*,u.`nick_name`,u.user_mobile,o.hb_order_status as oi_status,
+        IF(o.refund_type = 1,
+        o.rms,r.return_money_sts) AS oi_return_money_sts
         FROM (
-            SELECT temp.*,tr.refund_type,tr.return_money_sts rms
-            FROM tz_order temp
-            LEFT JOIN tz_order_refund tr ON tr.order_id = temp.order_id AND tr.return_money_sts &gt; 0 AND
-            tr.return_money_sts &lt; 6
-            WHERE temp.order_number =#{orderNumber}
-            <if test="shopId != null">
-                and  temp.shop_id =#{shopId}
-            </if>
+        SELECT temp.*,tr.refund_type,tr.return_money_sts rms
+        FROM tz_order temp
+        LEFT JOIN tz_order_refund tr ON tr.order_id = temp.order_id AND tr.return_money_sts &gt; 0 AND
+        tr.return_money_sts &lt; 6
+        WHERE temp.order_number =#{orderNumber}
+        <if test="shopId != null">
+            and temp.shop_id =#{shopId}
+        </if>
         ) as o
         LEFT JOIN tz_order_item oi ON oi.order_number = o.order_number
-        LEFT JOIN tz_order_refund r ON r.order_item_id = oi.order_item_id AND r.return_money_sts &gt; 0 AND r.return_money_sts &lt; 6
+        LEFT JOIN tz_order_refund r ON r.order_item_id = oi.order_item_id AND r.return_money_sts &gt; 0 AND
+        r.return_money_sts &lt; 6
         LEFT JOIN tz_user_addr_order uao ON o.addr_order_id = uao.addr_order_id
         LEFT JOIN tz_user u ON u.user_id = o.user_id
     </select>
     <select id="OrderCommentByUserIdAndStatus" resultMap="MyOrderMap">
-        SELECT
-        o.order_type,o.actual_total,o.hb_order_status,o.order_number,o.freight_amount,o.create_time,
-        pc.rec_time,
-        oi.pic,oi.price,oi.prod_name,oi.pic,oi.sku_name,oi.use_score,oi.prod_id,oi.rec_time,oi.prod_count,oi.order_item_id,oi.comm_sts,
-        sd.shop_id,sd.shop_name,oi.actual_total as oi_actual_total
-        FROM (
-        SELECT DISTINCT temp.order_type, temp.create_time, temp.freight_amount,temp.order_number,temp.actual_total,temp.hb_order_status,temp.shop_id FROM tz_order temp
-        JOIN tz_order_item toi ON temp.order_number = toi.order_number AND toi.comm_sts = #{isComm}
-        WHERE temp.user_id = #{userId} and temp.delete_status = 0 AND temp.hb_order_status = 80
-        ORDER BY temp.create_time DESC
-        LIMIT #{adapter.begin} , #{adapter.size}
-        )AS o
-        JOIN tz_order_item oi ON o.order_number = oi.order_number AND oi.comm_sts = #{isComm}
-        left JOIN tz_prod_comm pc ON pc.order_item_id = oi.order_item_id
-        left join tz_shop_detail sd on o.shop_id = sd.shop_id
+        SELECT o.order_type,
+               o.actual_total,
+               o.hb_order_status,
+               o.order_number,
+               o.freight_amount,
+               o.create_time,
+               pc.rec_time,
+               oi.pic,
+               oi.price,
+               oi.prod_name,
+               oi.pic,
+               oi.sku_name,
+               oi.use_score,
+               oi.prod_id,
+               oi.rec_time,
+               oi.prod_count,
+               oi.order_item_id,
+               oi.comm_sts,
+               sd.shop_id,
+               sd.shop_name,
+               oi.actual_total as oi_actual_total
+        FROM (SELECT DISTINCT temp.order_type,
+                              temp.create_time,
+                              temp.freight_amount,
+                              temp.order_number,
+                              temp.actual_total,
+                              temp.hb_order_status,
+                              temp.shop_id
+              FROM tz_order temp
+                       JOIN tz_order_item toi ON temp.order_number = toi.order_number AND toi.comm_sts = #{isComm}
+              WHERE temp.user_id = #{userId}
+                and temp.delete_status = 0
+                AND temp.hb_order_status = 80
+              ORDER BY temp.create_time DESC
+                  LIMIT #{adapter.begin}, #{adapter.size}) AS o
+                 JOIN tz_order_item oi ON o.order_number = oi.order_number AND oi.comm_sts = #{isComm}
+                 left JOIN tz_prod_comm pc ON pc.order_item_id = oi.order_item_id
+                 left join tz_shop_detail sd on o.shop_id = sd.shop_id
         ORDER BY o.create_time DESC
     </select>
     <select id="orderItemCommentByUserIdAndStatus" resultMap="MyOrderItemMap">
@@ -1017,7 +1019,7 @@
         SELECT count(a.order_id) FROM `tz_order` a
         LEFT JOIN tz_user_addr_order b on a.addr_order_id=b.addr_order_id
         LEFT JOIN tz_shop_detail c on a.shop_id=c.shop_id
-        left join  tz_user d on a.user_id = d.user_id
+        left join tz_user d on a.user_id = d.user_id
         <where>
             hb_order_status in
             <foreach collection="status" item="status" separator="," open="(" close=")">
@@ -1026,8 +1028,11 @@
             <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
                 and a.order_number = #{orderParam.orderNumber}
             </if>
+            <if test="orderParam.parentOrderNumber != null and orderParam.parentOrderNumber != ''">
+                and a.parent_order_number = #{orderParam.parentOrderNumber}
+            </if>
             <if test="orderParam.channelIdList != null and !orderParam.channelIdList.isEmpty()">
-                and a.channel_id  in
+                and a.channel_id in
                 <foreach collection="orderParam.channelIdList" item="channelId" open="(" close=")" separator=",">
                     #{channelId}
                 </foreach>
@@ -1079,6 +1084,25 @@
                     AND a.hb_order_status in (50,60)
                 </if>
             </if>
+
+
+            <if test="orderParam.orderSplitStatus != null">
+                and a.order_split_Status = #{orderParam.orderSplitStatus}
+            </if>
+            <if test="orderParam.autoSplit != null">
+                and a.auto_split = #{orderParam.autoSplit}
+            </if>
+            <if test="orderParam.splitStatus != null">
+                <if test="orderParam.splitStatus == 2">
+                    and a.split_status in (2,3)
+                </if>
+                <if test="orderParam.splitStatus != 2">
+                    and a.split_status = #{orderParam.splitStatus}
+                </if>
+            </if>
+            <if test="orderParam.orderLevel != null">
+                and a.order_level = #{orderParam.orderLevel}
+            </if>
         </where>
     </select>
     <select id="selectOrderCount" resultType="com.yami.shop.bean.param.OrderCountParam">
@@ -1121,7 +1145,7 @@
             </if>
 
             <if test="orderParam.refundStatus == 0">
-                and o.refund_status  IS NULL
+                and o.refund_status IS NULL
             </if>
         </where>
     </select>
@@ -1135,7 +1159,7 @@
         <where>
             o.delete_status = 0 AND o.dvy_type = #{orderParam.dvyType}
             <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
-                AND o.order_number  LIKE concat('%',  #{orderParam.orderNumber}, '%')
+                AND o.order_number LIKE concat('%', #{orderParam.orderNumber}, '%')
             </if>
             <if test="orderParam.mobile != null and orderParam.mobile != ''">
                 AND uao.mobile LIKE concat('%', #{orderParam.mobile}, '%')
@@ -1181,13 +1205,13 @@
         LEFT JOIN tz_user_addr_order b on a.addr_order_id=b.addr_order_id
         LEFT JOIN tz_shop_detail c on a.shop_id=c.shop_id
         LEFT JOIN tz_channel d on a.channel_id=d.id
-        left join  tz_user e on a.user_id = e.user_id
+        left join tz_user e on a.user_id = e.user_id
         <where>
             <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
                 and a.order_number = #{orderParam.orderNumber}
             </if>
             <if test="orderParam.channelIdList != null and !orderParam.channelIdList.isEmpty()">
-                and a.channel_id  in
+                and a.channel_id in
                 <foreach collection="orderParam.channelIdList" item="channelId" open="(" close=")" separator=",">
                     #{channelId}
                 </foreach>
@@ -1268,6 +1292,10 @@
             <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
                 and a.order_number = #{orderParam.orderNumber}
             </if>
+
+            <if test="orderParam.parentOrderNumber != null and orderParam.parentOrderNumber != ''">
+                and a.parent_order_number = #{orderParam.parentOrderNumber}
+            </if>
             <if test="orderParam.channelIdList != null and !orderParam.channelIdList.isEmpty()">
                 and a.channel_id in
                 <foreach collection="orderParam.channelIdList" item="channelId" open="(" close=")" separator=",">

+ 29 - 52
yami-shop-service/src/main/resources/mapper/ProductMapper.xml

@@ -272,29 +272,16 @@
         p.pic,
         ss.shop_id AS shop_id,
         SUM(ss.shop_sku_stocks) AS stocks,
-        MIN(cp.channel_prod_price) AS price,
-        COALESCE(SUM(oi.prod_count), 0) -
-        COALESCE(SUM(refund.product_count), 0) AS net_sales_volume
+        MIN(cp.channel_prod_price) AS price
         FROM tz_prod p
-        LEFT JOIN tz_sku sku ON p.prod_id = sku.prod_id AND sku.is_delete = 0
-        INNER JOIN tz_shop_sku ss ON ss.sku_id = sku.sku_id AND ss.shop_id = #{searchParam.shopId} AND ss.is_delete = 0
-        INNER JOIN tz_channel_prod cp ON sku.sku_id = cp.sku_id AND cp.shop_id = #{searchParam.shopId}  AND cp.channel_id = #{searchParam.channelId}  AND cp.is_delete = 0
-        LEFT JOIN tz_order_item oi ON p.prod_id = oi.prod_id
-        LEFT JOIN tz_order o ON oi.order_number = o.order_number and  o.shop_id = #{searchParam.shopId}  and o.channel_id = #{searchParam.channelId}
-        AND o.hb_order_status in (70,80)
-        AND o.delete_status = 0
-        LEFT JOIN tz_order_refund_sku refund ON oi.order_item_id = refund.order_item_id
-        AND refund.order_refund_id IN (
-        SELECT refund_id FROM tz_order_refund
-        WHERE return_money_sts= 70
-        )
+        INNER JOIN tz_shop_sku ss ON ss.spu_id = p.prod_id AND ss.shop_id = #{searchParam.shopId} AND ss.is_delete = 0
+        INNER JOIN tz_channel_prod cp  ON ss.sku_id = cp.sku_id AND cp.shop_id = #{searchParam.shopId}  AND cp.channel_id = #{searchParam.channelId}  AND cp.is_delete = 0
         WHERE p.status = 1
         <if test="searchParam.prodName != null">
             and p.prod_name LIKE CONCAT('%',#{searchParam.prodName},'%')
         </if>
         AND p.is_delete = 0
         GROUP BY p.prod_id
-        ORDER BY net_sales_volume DESC
     </select>
 
     <select id="tagProdList" resultMap="tagProductMap">
@@ -819,50 +806,40 @@
     </select>
 
     <select id="listProdByCIdAndSId" parameterType="com.yami.shop.bean.dto.ProdByCategoryIdAndShopIdDTO" resultType="com.yami.shop.bean.param.CategoryProductParam" >
-
         SELECT
         tp.prod_id,
         tp.prod_name,
         tcp.shop_id,
-        MIN(cp.channel_prod_price) AS price,
+        cp.channel_prod_price AS price,
         tp.pic,
-        sum(tss.shop_sku_stocks) AS total_stocks,
-
-        COALESCE ((
-        SELECT
-        SUM( oi2.prod_count )
-        FROM
-        tz_order_item oi2
-        INNER JOIN tz_order o2 ON o2.order_number = oi2.order_number
-        WHERE
-        oi2.shop_id = #{prodByCategoryIdAndShopIdDTO.shopId}
-        AND oi2.prod_id = tp.prod_id
-        AND o2.hb_order_status IN ( 20, 30, 40, 70, 80 )
-        AND o2.delete_status = 0
-        ),
-        0
-        ) AS sales_volume
-
+        tss.shop_sku_stocks AS total_stocks,
+        COALESCE (sales_data.sales_volume, 0) AS sales_volume
         FROM tz_prod tp
         INNER JOIN tz_category_prod tcp ON tp.prod_id = tcp.prod_id
-        AND tcp.is_delete = 0 AND tcp.shop_id = #{prodByCategoryIdAndShopIdDTO.shopId}
-        and tcp.category_id = #{prodByCategoryIdAndShopIdDTO.categoryId}
-        LEFT JOIN tz_shop_sku tss ON tss.spu_id = tp.prod_id and tss.shop_id =  #{prodByCategoryIdAndShopIdDTO.shopId}
-        INNER JOIN tz_channel_prod cp ON cp.shop_id = tcp.shop_id
-        AND cp.sku_id = tss.sku_id
-        AND cp.is_delete = 0
-        <if test="prodByCategoryIdAndShopIdDTO.channelId == null or prodByCategoryIdAndShopIdDTO.channelId == 0">
-            and cp.channel_id = 1
-        </if>
-        <if test="prodByCategoryIdAndShopIdDTO.channelId != null and prodByCategoryIdAndShopIdDTO.channelId != 0">
+            AND tcp.is_delete = 0
+            AND tcp.shop_id = #{prodByCategoryIdAndShopIdDTO.shopId}
+            AND tcp.category_id = #{prodByCategoryIdAndShopIdDTO.categoryId}
+        LEFT JOIN tz_shop_sku tss ON tss.spu_id = tp.prod_id
+            AND tss.shop_id = #{prodByCategoryIdAndShopIdDTO.shopId}
+        INNER JOIN tz_channel_prod cp ON cp.shop_id =  #{prodByCategoryIdAndShopIdDTO.shopId}
             and cp.channel_id = #{prodByCategoryIdAndShopIdDTO.channelId}
-        </if>
-        AND cp.channel_prod_price IS NOT NULL
-        WHERE tp.STATUS = 1
-        AND tp.`is_delete` = 0
-        GROUP BY tp.prod_id
-        ORDER BY
-        sales_volume DESC,  price ASC
+            AND cp.sku_id = tss.sku_id
+            AND cp.is_delete = 0
+            AND cp.channel_prod_price IS NOT NULL
+        LEFT JOIN (
+            SELECT
+                oi.prod_id,
+                SUM(oi.prod_count) AS sales_volume
+            FROM tz_order_item oi
+            INNER JOIN tz_order o ON o.order_number = oi.order_number
+            WHERE oi.shop_id = #{prodByCategoryIdAndShopIdDTO.shopId}
+                AND o.hb_order_status IN (20, 30, 40, 70, 80)
+                AND o.delete_status = 0
+            GROUP BY oi.prod_id
+        ) sales_data ON sales_data.prod_id = tp.prod_id
+        WHERE tp.STATUS = 1 AND tp.is_delete = 0
+        GROUP BY tp.prod_id, tp.prod_name, tcp.shop_id, cp.channel_prod_price, tp.pic, tss.shop_sku_stocks, sales_data.sales_volume
+        ORDER BY sales_volume DESC, price ASC
     </select>
 
 <!--    <resultMap id="listProdByCIdAndSIdMap" type="com.yami.shop.bean.param.CategoryProductParam">-->

+ 17 - 15
yami-shop-service/src/main/resources/mapper/ShopCategoryMapper.xml

@@ -16,23 +16,25 @@
     <select id="selectAppListAll" resultType="com.yami.shop.bean.model.ShopCategory">
         SELECT fc.*, tl.name as labelName
         FROM tz_shop_category fc
-        left join tz_category_prod cp on fc.code = cp.code  and cp.is_delete = 0 and cp.shop_id = #{shopId}
-        left join tz_prod p on p.prod_id = cp.prod_id and p.is_delete = 0
-        LEFT JOIN tz_sku sku ON p.prod_id = sku.prod_id AND sku.is_delete = 0
-        LEFT JOIN tz_channel_prod cha ON sku.sku_id = cha.sku_id AND cha.is_delete = 0 AND cha.shop_id = #{shopId} AND cha.channel_id =  #{channelId}
-        left join tz_label tl on fc.label = tl.id
-        WHERE fc.is_delete = 0 and fc.is_delete = 0
-        and fc.shop_id = #{shopId}
+        LEFT JOIN tz_label tl ON fc.label = tl.id
+        LEFT JOIN (
+            SELECT DISTINCT fc_inner.id
+            FROM tz_shop_category fc_inner
+            INNER JOIN tz_category_prod cp ON fc_inner.code = cp.code AND cp.is_delete = 0 AND cp.shop_id = #{shopId}
+            INNER JOIN tz_prod p ON p.prod_id = cp.prod_id AND p.is_delete = 0
+            INNER JOIN tz_sku sku ON p.prod_id = sku.prod_id AND sku.is_delete = 0
+            INNER JOIN tz_channel_prod cha ON sku.sku_id = cha.sku_id AND cha.is_delete = 0 AND cha.shop_id = #{shopId} AND cha.channel_id = #{channelId}
+            WHERE fc_inner.is_delete = 0
+            AND fc_inner.shop_id = #{shopId}
+            AND fc_inner.level != 1
+        ) valid_cats ON fc.id = valid_cats.id
+        WHERE fc.is_delete = 0
+        AND fc.shop_id = #{shopId}
         AND (
-        fc.level = 1
-        OR (
-        fc.level != 1
-        AND p.prod_id IS NOT NULL
-        AND cp.prod_id IS NOT NULL
-        AND cha.sku_id IS NOT NULL
+            fc.level = 1
+            OR valid_cats.id IS NOT NULL
         )
-        )
-        group by fc.id order by fc.num asc
+        ORDER BY fc.num ASC
     </select>
 
     <select id="selectAppCount" resultType="java.lang.Integer">

+ 4 - 4
yami-shop-service/src/main/resources/mapper/ShopSkuMapper.xml

@@ -37,7 +37,7 @@
             AND sk.shop_id = #{shopSku.shopId}
         </if>
         <if test="shopSku.skuId != null">
-            AND sk.sku_id = #{shopSku.sku}
+            AND sk.sku_id = #{shopSku.skuId}
         </if>
         <if test="shopSku.skuName != null">
             AND s.sku_name LIKE CONCAT('%',#{shopSku.skuName},'%')
@@ -48,7 +48,7 @@
 
     <select id="exportList" resultType="com.yami.shop.bean.vo.ChannelProdExportVO">
         SELECT
-        sh.sku_id AS skuId,
+        sha.hb_sku_id AS skuId,
         sha.sku_name AS skuName,
         p.channel_id AS channelId,
         c.channel_name AS channelName,
@@ -57,11 +57,11 @@
         p.delivery_price AS deliveryPrice,
         p.channel_prod_price AS channelProdPrice
         FROM tz_shop_sku sh
-        LEFT JOIN  tz_channel_prod p ON sh.sku_id = p.sku_id and p.is_delete = 0
+        LEFT JOIN  tz_channel_prod p ON p.shop_id = sh.shop_id and sh.sku_id = p.sku_id and p.is_delete = 0
         LEFT JOIN tz_channel c ON p.channel_id = c.id
         LEFT JOIN tz_sku sha ON sh.sku_id = sha.sku_id
         LEFT JOIN tz_shop_detail d ON sh.shop_id = d.shop_id
-        WHERE sh.is_delete = 0
+        WHERE sh.is_delete = 0 and sha.is_delete = 0 and p.is_delete = 0
         <if test="shopSku.shopId != null">
             AND sh.shop_id = #{shopSku.shopId}
         </if>

+ 1 - 1
yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/impl/ScoreOrderServiceImpl.java

@@ -176,7 +176,7 @@ public class ScoreOrderServiceImpl extends ServiceImpl<OrderMapper, Order> imple
         Product product = checkAndGetProd(productItemDto.getProdId(), productItemDto);
 
         // 使用雪花算法生成的订单号
-        String orderNumber = String.valueOf(snowflake.nextId());
+        String orderNumber = "FD" + snowflake.nextId( );
         mergerOrder.setOrderNumber(orderNumber);
 
         Long shopId = mergerOrder.getShopId();

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików