fubojin 1 день тому
батько
коміт
c87b15c215
36 змінених файлів з 1599 додано та 667 видалено
  1. 20 17
      yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java
  2. 19 6
      yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java
  3. 150 10
      yami-shop-api/src/main/java/com/yami/shop/api/controller/UserController.java
  4. 2 1
      yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java
  5. 6 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDto.java
  6. 2 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserDto.java
  7. 0 3
      yami-shop-bean/src/main/java/com/yami/shop/bean/event/SubmitOrderEvent.java
  8. 16 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/Channel.java
  9. 28 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/Order.java
  10. 9 2
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderItem.java
  11. 1 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java
  12. 23 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/param/BackendOrderParam.java
  13. 4 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/param/OrderParam.java
  14. 1 1
      yami-shop-groupbuy/yami-shop-groupbuy-comment/src/main/java/com/yami/shop/groupbuy/comment/service/impl/GroupOrderServiceImpl.java
  15. 25 12
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ChannelController.java
  16. 38 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/OrderController.java
  17. 87 102
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopDetailController.java
  18. 1 1
      yami-shop-seckill/yami-shop-seckill-comment/src/main/java/com/yami/shop/seckill/comment/service/impl/SeckillOrderServiceImpl.java
  19. 1 0
      yami-shop-security/yami-shop-security-api/src/main/java/com/yami/shop/security/api/config/ResourceServerConfiguration.java
  20. 4 1
      yami-shop-security/yami-shop-security-api/src/main/java/com/yami/shop/security/api/service/impl/YamiUserServiceImpl.java
  21. 0 1
      yami-shop-security/yami-shop-security-comment/src/main/java/com/yami/shop/security/comment/token/AuthenticationToken.java
  22. 1 31
      yami-shop-security/yami-shop-security-comment/src/main/java/com/yami/shop/security/comment/util/YamiTokenServices.java
  23. 6 0
      yami-shop-service/pom.xml
  24. 6 0
      yami-shop-service/src/main/java/com/yami/shop/dao/ChannelMapper.java
  25. 2 3
      yami-shop-service/src/main/java/com/yami/shop/dao/OrderMapper.java
  26. 5 0
      yami-shop-service/src/main/java/com/yami/shop/service/ChannelService.java
  27. 34 4
      yami-shop-service/src/main/java/com/yami/shop/service/OrderService.java
  28. 3 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBFrontCategoryService.java
  29. 5 5
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelProdServiceImpl.java
  30. 6 0
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelServiceImpl.java
  31. 2 11
      yami-shop-service/src/main/java/com/yami/shop/service/impl/MyOrderServiceImpl.java
  32. 716 209
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java
  33. 94 0
      yami-shop-service/src/main/java/com/yami/shop/utils/BinPackingUtil.java
  34. 5 0
      yami-shop-service/src/main/resources/mapper/ChannelMapper.xml
  35. 276 245
      yami-shop-service/src/main/resources/mapper/OrderMapper.xml
  36. 1 1
      yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/impl/ScoreOrderServiceImpl.java

+ 20 - 17
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);
 
@@ -327,9 +327,12 @@ public class OrderController {
 
 
         for (Order order : orders) {
-            //推送海博订单
             if (!order.getNextPay()) {
-                hbOrderService.createOrderAsync(order.getOrderNumber());
+                //不拆单和已拆单推到海博
+                if (order.getSplitStatus() == 1 || order.getOrderLevel() == 1) {
+                    //推送海博订单
+                    hbOrderService.createOrderAsync(order.getOrderNumber());
+                }
             }
         }
 

+ 19 - 6
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();
@@ -79,13 +98,7 @@ public class PayNoticeController {
                     skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
                 }
             }
-
-            //推送海博订单
-            for (Order order : orders) {
-                hbOrderService.createOrderAsync(order.getOrderNumber());
-            }
         }
-
         return ResponseEntity.ok(payInfoBo.getSuccessString());
     }
 

+ 150 - 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,127 @@ 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 - 1
yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java

@@ -133,7 +133,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 +223,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;
+
     /**
      * 创建日期
      */

+ 28 - 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,27 @@ 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;
+
     /**
      * 订单商品总数
      */
@@ -275,6 +300,9 @@ public class Order implements Serializable {
     @TableField(exist = false)
     private Integer payScore;
 
+    /**
+     * 是否需要支付
+     */
     @TableField(exist = false)
     private Boolean nextPay = Boolean.FALSE;
 

+ 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;
 }

+ 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;
 
     /**
      * 店铺名称

+ 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() {

+ 38 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/OrderController.java

@@ -302,4 +302,42 @@ public class OrderController {
             }
         }
     }
+
+    /**
+     * 手动拆单处理
+     * 订单会处于拆单中
+     * 会传订单单号和订单项列表信息
+     * 会加上父订单项里面的已拆单数量
+     * 生成子订单数据 并且子订单会处于临时保存
+     */
+    @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();
+    }
+
 }

+ 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);
+//        }
+//    }
 
 }

+ 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 - 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);
 

+ 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);
 }

+ 3 - 0
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());

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

@@ -254,7 +254,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 +262,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 +275,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 +308,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;
     }
 

Різницю між файлами не показано, бо вона завелика
+ 716 - 209
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java


+ 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 *

+ 276 - 245
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,33 @@
                 <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 test="orderParam.splitStatus != null">
+                <if test="orderParam.splitStatus == 2">
+                    and a.split_status in (2,3)
                 </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 != 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 +615,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 +634,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 +651,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 +697,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 +721,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 +831,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 +898,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 +933,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 +1022,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 +1031,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 +1087,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 +1148,7 @@
             </if>
 
             <if test="orderParam.refundStatus == 0">
-                and o.refund_status  IS NULL
+                and o.refund_status IS NULL
             </if>
         </where>
     </select>
@@ -1135,7 +1162,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 +1208,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 +1295,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=",">

+ 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();

Деякі файли не було показано, через те що забагато файлів було змінено