Ver Fonte

订单支付流程

yubin há 10 horas atrás
pai
commit
4abe2236af
17 ficheiros alterados com 448 adições e 100 exclusões
  1. 3 0
      mall-service/src/main/java/com/txz/mall/business/impl/OrderServiceBusinessImpl.java
  2. 4 2
      mall-service/src/main/java/com/txz/mall/controller/PinkController.java
  3. 21 0
      mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppOrderController.java
  4. 3 1
      mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppPinkController.java
  5. 4 0
      mall-service/src/main/java/com/txz/mall/dubbo/client/CifUserDubboServiceClient.java
  6. 1 1
      mall-service/src/main/java/com/txz/mall/model/StorePink.java
  7. 1 1
      mall-service/src/main/java/com/txz/mall/model/StorePinkSummary.java
  8. 3 0
      mall-service/src/main/java/com/txz/mall/service/StoreOrderService.java
  9. 4 2
      mall-service/src/main/java/com/txz/mall/service/StorePinkService.java
  10. 2 0
      mall-service/src/main/java/com/txz/mall/service/StorePinkSummaryService.java
  11. 242 61
      mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderServiceImpl.java
  12. 72 17
      mall-service/src/main/java/com/txz/mall/service/impl/StorePinkServiceImpl.java
  13. 38 14
      mall-service/src/main/java/com/txz/mall/service/impl/StorePinkSummaryServiceImpl.java
  14. 2 1
      mall-service/src/main/java/com/txz/mall/web/param/addparam/MidFavoriteAddParam.java
  15. 23 0
      mall-service/src/main/java/com/txz/mall/web/param/updateparam/StoreOrderUpdateParam.java
  16. 20 0
      mall-service/src/main/java/dto/CreateOrderRequest.java
  17. 5 0
      mall-service/src/main/java/dto/GoPinkDTO.java

+ 3 - 0
mall-service/src/main/java/com/txz/mall/business/impl/OrderServiceBusinessImpl.java

@@ -132,4 +132,7 @@ public class OrderServiceBusinessImpl implements OrderServiceBusiness {
         return list;
     }
 
+
+
+
 }

+ 4 - 2
mall-service/src/main/java/com/txz/mall/controller/PinkController.java

@@ -6,6 +6,7 @@ import com.github.pagehelper.PageInfo;
 import com.txz.mall.business.PinkServiceBusiness;
 import com.txz.mall.core.Result;
 import com.txz.mall.core.ResultCode;
+import com.txz.mall.model.StoreOrder;
 import com.txz.mall.model.StorePink;
 import com.txz.mall.service.StorePinkService;
 import com.txz.mall.web.param.StorePinkParam;
@@ -161,7 +162,8 @@ public class PinkController {
     @ApiOperation(value = "拼团成功")
     @PostMapping(value = "/pinkSuccess")
     public Result pinkSuccess(@RequestParam("id") Long id) {
-        storePinkService.pinkSuccess(id);
+        StoreOrder storeOrder = new StoreOrder();
+        storePinkService.pinkSuccess(id,storeOrder);
         return Result.success();
     }
 
@@ -180,7 +182,7 @@ public class PinkController {
      */
     @ApiOperation(value = "天选")
     @PostMapping(value = "/theSelection")
-    public Result theSelection(@RequestParam("id") String orderId) {
+    public Result theSelection(@RequestParam("id") Long orderId) {
         storePinkService.theSelection(orderId);
         return Result.success();
     }

+ 21 - 0
mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppOrderController.java

@@ -9,6 +9,8 @@ import com.txz.mall.core.Result;
 import com.txz.mall.core.ResultCode;
 import com.txz.mall.model.StoreOrder;
 import com.txz.mall.service.StoreOrderService;
+import com.txz.mall.util.EasyToUseUtil;
+import com.txz.mall.web.param.updateparam.StoreOrderUpdateParam;
 import dto.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -93,6 +95,25 @@ public class AppOrderController {
         return Result.success();
     }
 
+    @PutMapping("/binding/address")
+    @ApiOperation(value = "订单绑定地址")
+    public Result update(@RequestBody StoreOrderUpdateParam storeOrderUpdateParam) {
+
+        try {
+            StoreOrder storeOrder = new StoreOrder();
+            storeOrder.setOrderId(storeOrderUpdateParam.getOrderId());
+            storeOrder.setAddressId(storeOrderUpdateParam.getAddressId());
+            EasyToUseUtil.appUpdateAssignment(new Date(),storeOrder);
+
+            storeOrderService.bindingAddress(storeOrder);
+        } catch (Exception e) {
+            log.error("更新对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success();
+    }
+
+
     @GetMapping("/detail")
     @ApiOperation(value = "订单获取详情")
     public Result<StoreOrderVO> detail(@RequestParam Long id) {

+ 3 - 1
mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppPinkController.java

@@ -6,6 +6,7 @@ import com.github.pagehelper.PageInfo;
 import com.txz.mall.business.PinkServiceBusiness;
 import com.txz.mall.core.Result;
 import com.txz.mall.core.ResultCode;
+import com.txz.mall.model.StoreOrder;
 import com.txz.mall.model.StorePink;
 import com.txz.mall.service.StorePinkService;
 import com.txz.mall.web.param.StorePinkParam;
@@ -161,7 +162,8 @@ public class AppPinkController {
     @ApiOperation(value = "拼团成功")
     @PostMapping(value = "/pinkSuccess")
     public Result pinkSuccess(@RequestParam("id") Long id) {
-        storePinkService.pinkSuccess(id);
+        StoreOrder storeOrder = new StoreOrder();
+        storePinkService.pinkSuccess(id,storeOrder);
         return Result.success();
     }
 

+ 4 - 0
mall-service/src/main/java/com/txz/mall/dubbo/client/CifUserDubboServiceClient.java

@@ -3,13 +3,17 @@ package com.txz.mall.dubbo.client;
 import com.txz.cif.dto.UserDTO;
 import com.txz.cif.service.UserDubboService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.Reference;
 import org.springframework.stereotype.Component;
 
+import java.io.Serializable;
+
 @Slf4j
 @Component
 public class CifUserDubboServiceClient {
 
+
     @Reference
     private UserDubboService userDubboService;
 

+ 1 - 1
mall-service/src/main/java/com/txz/mall/model/StorePink.java

@@ -102,7 +102,7 @@ public class StorePink {
      */
     @ApiModelProperty(value = "团长id 0为团长 1不是")
     @Column(name = "k_id")
-    private Long kId;
+    private Integer kId;
 
     @ApiModelProperty(value = "幸运儿 默认0  1为幸运儿   (//团长不能是天选)")
     @Column(name = "l_id")

+ 1 - 1
mall-service/src/main/java/com/txz/mall/model/StorePinkSummary.java

@@ -383,7 +383,7 @@ public class StorePinkSummary {
     /**
      * 设置是否虚拟拼团
      *
-     * @param isVirtual 是否虚拟拼团
+     * @param isVirtual 是否锁定拼团
      */
     public void setIsVirtual(Boolean isVirtual) {
         this.isVirtual = isVirtual;

+ 3 - 0
mall-service/src/main/java/com/txz/mall/service/StoreOrderService.java

@@ -150,4 +150,7 @@ public interface StoreOrderService extends Service<StoreOrder> {
     void updateOrderStatus(Long id, Integer status);
 
 
+
+    void bindingAddress(StoreOrder storeOrder);
+
 }

+ 4 - 2
mall-service/src/main/java/com/txz/mall/service/StorePinkService.java

@@ -1,6 +1,7 @@
 package com.txz.mall.service;
 
 import com.txz.mall.core.Service;
+import com.txz.mall.model.StoreOrder;
 import com.txz.mall.model.StorePink;
 import vo.StorePinkOngoingVO;
 
@@ -24,15 +25,16 @@ public interface StorePinkService extends Service<StorePink> {
     /**
      * 拼团成功
      */
-    void pinkSuccess(Long id);
+    void pinkSuccess(Long id, StoreOrder storeOrder);
 
     /**
      * 天选之子
      *
      * @return
      */
-    void theSelection(String orderId);
+  //  void theSelection(String orderId);
 
+    void theSelection(Long spsId);
     /**
      * 已存在拼团列表
      */

+ 2 - 0
mall-service/src/main/java/com/txz/mall/service/StorePinkSummaryService.java

@@ -12,4 +12,6 @@ public interface StorePinkSummaryService extends Service<StorePinkSummary> {
 
     Boolean maintainQuantityStatusOfTheStorePinkSummary(Long id);
 
+
+
 }

+ 242 - 61
mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderServiceImpl.java

@@ -23,6 +23,7 @@ import com.txz.mall.core.AbstractService;
 import com.txz.mall.core.RedisUtil;
 import com.txz.mall.core.ResultCode;
 import com.txz.mall.core.ServiceException;
+import com.txz.mall.dao.StoreOrderMapper;
 import com.txz.mall.dao.StorePinkMapper;
 import com.txz.mall.dubbo.client.CifAccountDubboServiceClient;
 import com.txz.mall.dubbo.client.CifUserDubboServiceClient;
@@ -35,6 +36,7 @@ import com.txz.mall.util.EasyToUseUtil;
 import com.txz.mall.util.OrderStateMachine;
 import com.txz.mall.util.OrderUtils;
 import dto.*;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.time.DateUtils;
@@ -43,6 +45,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.session.RowBounds;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.multipart.MultipartFile;
@@ -113,6 +116,64 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     }
 
 
+//    @Override
+//    public void goOpen(String orderId) {
+//        StoreOrder storeOrder = findBy("orderId", orderId);
+//        if (storeOrder == null) {
+//            throw new ServiceException("订单不存在");
+//        }
+//        StorePink storePink = new StorePink();
+////        storePink.setUid(user.getUid());
+////        storePink.setAvatar(user.getAvatar());
+////        storePink.setNickname(user.getNickname());
+//        storePink.setOrderId(storeOrder.getOrderId());
+//        storePink.setOrderIdKey(storeOrder.getId());
+//        storePink.setTotalNum(storeOrder.getTotalNum());
+//        storePink.setTotalPrice(storeOrder.getTotalPrice());
+//        StoreCombination storeCombination = storeCombinationService.findById(storeOrder.getCombinationId());
+//        storePink.setCid(storeCombination.getId());
+//        storePink.setPid(storeCombination.getProductId());
+//        storePink.setPeople(storeCombination.getPeople());
+//        storePink.setPrice(storeCombination.getPrice());
+//        Date date = new Date();
+//        Integer effectiveTime = storeCombination.getEffectiveTime();
+//        storePink.setAddTime(date);
+//        storePink.setStopTime(DateUtils.addMinutes(date, effectiveTime));
+//        storePink.setKId(0L);
+//        storePink.setUid(storeOrder.getUid());
+//        storePink.setIsRefund(0);
+//        storePink.setStatus(1);
+//        storePink.setOrderStatus(storeOrder.getStatus());
+//
+//       //插入拼团汇总表
+//        StorePinkSummary storePinkSummary = new StorePinkSummary();
+//        storePinkSummary.setTotalPrice(storeOrder.getTotalPrice());
+//        storePinkSummary.setCid(storeCombination.getId());
+//        storePinkSummary.setPid(storeCombination.getProductId());
+//        storePinkSummary.setPeople(storeCombination.getPeople());
+//        storePinkSummary.setAddTime(date);
+//        storePinkSummary.setStopTime(DateUtils.addMinutes(date, effectiveTime));
+//        storePinkSummary.setIsRefund(0);
+//        storePinkSummary.setPeopleCount(1);
+//        storePinkSummary.setStatus(1);
+//     //   storePinkSummary.setlId();'//天选 默认0  1为天选',
+//     //   storePinkSummary.setkId(); // '团长id',
+//    //    storePinkSummary.setIsRefund(); //是否退款  0未退款 1已退款',
+//        storePinkSummary.setIsRefund(0);
+//
+//
+//       EasyToUseUtil.appCreateAssignment(date,storePinkSummary);
+//        storePinkSummaryService.save(storePinkSummary);
+//
+//        //插入拼团详情表
+//        storePink.setSpsId(storePinkSummary.getId());
+//        storePinkService.save(storePink);
+//
+//        // 如果是开团,需要更新订单数据
+//        storeOrder.setPinkId(storePink.getId());
+//        update(storeOrder);
+//    }
+
     @Override
     public void goOpen(String orderId) {
         StoreOrder storeOrder = findBy("orderId", orderId);
@@ -136,12 +197,13 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         Integer effectiveTime = storeCombination.getEffectiveTime();
         storePink.setAddTime(date);
         storePink.setStopTime(DateUtils.addMinutes(date, effectiveTime));
-        storePink.setKId(0L);
+        storePink.setKId(0);
         storePink.setUid(storeOrder.getUid());
         storePink.setIsRefund(0);
         storePink.setStatus(1);
+        storePink.setOrderStatus(storeOrder.getStatus());
 
-       //插入拼团汇总表
+        //插入拼团汇总表
         StorePinkSummary storePinkSummary = new StorePinkSummary();
         storePinkSummary.setTotalPrice(storeOrder.getTotalPrice());
         storePinkSummary.setCid(storeCombination.getId());
@@ -152,13 +214,13 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         storePinkSummary.setIsRefund(0);
         storePinkSummary.setPeopleCount(1);
         storePinkSummary.setStatus(1);
-     //   storePinkSummary.setlId();'//天选 默认0  1为天选',
-     //   storePinkSummary.setkId(); // '团长id',
-    //    storePinkSummary.setIsRefund(); //是否退款  0未退款 1已退款',
+        //   storePinkSummary.setlId();'//天选 默认0  1为天选',
+        //   storePinkSummary.setkId(); // '团长id',
+        //    storePinkSummary.setIsRefund(); //是否退款  0未退款 1已退款',
         storePinkSummary.setIsRefund(0);
-        storePinkSummary.setStatus(1);
 
-       EasyToUseUtil.appCreateAssignment(date,storePinkSummary);
+
+        EasyToUseUtil.appCreateAssignment(date,storePinkSummary);
         storePinkSummaryService.save(storePinkSummary);
 
         //插入拼团详情表
@@ -170,6 +232,50 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         update(storeOrder);
     }
 
+//    @Override
+//    public void goPink(GoPinkDTO dto) {
+//        Date date = new Date();
+//        if (dto.getPinkId() == null && dto.getCid() != null) {
+//            automaticMatch(dto);
+//        }
+//        if (dto.getPinkId() != null) {
+//            StorePink teamPink = storePinkService.findById(dto.getPinkId());
+//            if (ObjectUtil.isNull(teamPink) || teamPink.getIsRefund().equals(1)) {
+//                throw new ServiceException("对应的拼团不存在");
+//            }
+//            Condition condition = new Condition(StoreCombination.class);
+//            Example.Criteria criteria = condition.createCriteria();
+//            criteria.andEqualTo("isDelete", 0);
+//            criteria.andEqualTo("isShow", 1);
+//            criteria.andEqualTo("id", dto.getCid());
+//            criteria.andLessThanOrEqualTo("startTime", date);
+//            criteria.andGreaterThanOrEqualTo("stopTime", date);
+//
+//            List<StoreCombination> combinationList = storeCombinationService.findByCondition(condition);
+//            if (CollUtil.isEmpty(combinationList)) {
+//                throw new ServiceException("拼团商品不存在或未开启");
+//            }
+//
+//            Condition pinkCondition = new Condition(StorePink.class);
+//            Example.Criteria pinkCriteria = pinkCondition.createCriteria();
+//            pinkCriteria.andEqualTo("isDelete", 0);
+//            pinkCriteria.andEqualTo("spsId", dto.getSpsId());
+//            pinkCriteria.andEqualTo("status", 1);
+//            List<StorePink> pinkList = storePinkService.findByCondition(pinkCondition);
+//            int count = teamPink.getPeople() - (CollUtil.isEmpty(pinkList) ? 0 : pinkList.size());
+//            if (count < 1) {
+//                throw new ServiceException("拼团已满");
+//            }
+//            List<Long> uidList = pinkList.stream().map(StorePink::getUid).collect(Collectors.toList());
+//            if (uidList.contains(dto.getUserId())) {
+//                throw new ServiceException("您已加入该拼团");
+//            }
+//            joinGroup(teamPink, dto, count,pinkList.size());
+//        }
+//    }
+
+
+
 
     @Override
     public void goPink(GoPinkDTO dto) {
@@ -205,10 +311,12 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             if (count < 1) {
                 throw new ServiceException("拼团已满");
             }
-            List<Long> uidList = pinkList.stream().map(StorePink::getUid).collect(Collectors.toList());
-            if (uidList.contains(dto.getUserId())) {
-                throw new ServiceException("您已加入该拼团");
-            }
+
+            //记得将重复拼团校验放开
+//            List<Long> uidList = pinkList.stream().map(StorePink::getUid).collect(Collectors.toList());
+//            if (uidList.contains(dto.getUserId())) {
+//                throw new ServiceException("重复拼团");
+//            }
             joinGroup(teamPink, dto, count,pinkList.size());
         }
     }
@@ -217,38 +325,51 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         //拼团剩余人数
         Date date = new Date();
 
-        //修改拼团汇总表  这块得上分布式锁
-        StorePinkSummary storePinkSummary = new StorePinkSummary();
-
-        storePinkSummary.setPeopleCount(pinkSize+1);
-        EasyToUseUtil.appCreateAssignment(date,storePinkSummary);
-        if (count == 1) {
-            storePinkSummary.setStatus(1);
-        }
-        storePinkSummaryService.update(storePinkSummary);
-
+        //修改拼团汇总表  这块得上分布式锁   这块不需要了,会去 maintainQuantityStatusOfTheStorePinkSummary幂等时时维护 汇总表的拼团状态和拼团数量的
+//        StorePinkSummary storePinkSummary = new StorePinkSummary();
+//        storePinkSummary.setId(dto.getSpsId());
+//        storePinkSummary.setPeopleCount(pinkSize+1);
+//        EasyToUseUtil.appCreateAssignment(date,storePinkSummary);
+//        if (count == 1) {
+//            storePinkSummary.setStatus(1);
+//        }
+//        storePinkSummaryService.update(storePinkSummary);
 
         // 加入拼团
         StorePink storePink = new StorePink();
         BeanUtils.copyProperties(teamPink, storePink);
         storePink.setId(null);
-        storePink.setSpsId(storePinkSummary.getId());
-//            storePink.setOrderId(null);
-//            storePink.setOrderIdKey(null);
+        storePink.setSpsId(dto.getSpsId());
+            storePink.setOrderId(dto.getOrderId());
+            storePink.setOrderIdKey(dto.getOrderIdKey());
         storePink.setUid(dto.getUserId());
+        storePink.setStatus(1);
+        storePink.setOrderStatus(PinkOrderStatusEnum.GROUP_ORDER_TO_PAY.getKey());
         storePink.setIsRefund(0);
-        storePink.setKId(1L);
+        storePink.setKId(1);
 //            storePink.setAvatar();
 //            storePink.setNickname();
         storePink.setCreateTime(date);
         storePinkService.save(storePink);
-        if (count == 1) {
-            storePinkService.pinkSuccess(teamPink.getId());
 
+        Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(teamPink.getSpsId());
+
+        StoreOrder storeOrder = new StoreOrder();
+        storeOrder.setId(dto.getOrderIdKey());
 
-            // 考虑是否回写主订单
+        // 需要更新订单数据
+        storeOrder.setPinkId(storePink.getId());
+        update(storeOrder);
+//        if(!b){
+//            throw new ServiceException("拼团超员请选择新的拼团");
+//        }
 
-        }
+//        if (count == 1) {
+//            storePinkService.pinkSuccess(teamPink.getId());
+//
+//            // 考虑是否回写主订单
+//
+//        }
     }
 
     /**
@@ -268,47 +389,69 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         pinkSummaryCriteria.andEqualTo("isDelete", 0);
         pinkSummaryCriteria.andEqualTo("cid", dto.getCid());
         pinkSummaryCriteria.andEqualTo("status", 1);
+        pinkSummaryCriteria.andEqualTo("isVirtual", 0);
         pinkSummaryCondition.setOrderByClause("people_count DESC");
+
         List<StorePinkSummary> pinkSummaryList = storePinkSummaryService.findByCondition(pinkSummaryCondition);
-        List<StorePinkSummary> pinkSummaryListResult = ((Page<StorePinkSummary>) pinkSummaryList).getRecords();
 
-        if (CollUtil.isEmpty(pinkSummaryListResult)) {
+
+        if (CollUtil.isEmpty(pinkSummaryList)) {
             throw new ServiceException("暂时没有可加入的团");
         }
 
-        List<Long> storePinkSummaryId = pinkSummaryListResult.stream().map(StorePinkSummary::getId).collect(Collectors.toList());
+        List<Long> storePinkSummaryId = pinkSummaryList.stream().map(StorePinkSummary::getId).collect(Collectors.toList());
+        log.info("storePinkSummaryId:"+storePinkSummaryId.toString());
         Condition pinkCondition = new Condition(StorePink.class);
         Example.Criteria pinkCriteria = pinkCondition.createCriteria();
         pinkCriteria.andEqualTo("isDelete", 0);
         pinkCriteria.andEqualTo("cid", dto.getCid());
 //        pinkCriteria.andEqualTo("status", 1);
-        pinkCriteria.andIn("sps_id",storePinkSummaryId);
+        pinkCriteria.andIn("spsId",storePinkSummaryId);
         List<StorePink> pinkList = storePinkService.findByCondition(pinkCondition);
+        log.info("pinkList:"+pinkList.toString());
+
+        Map<Long, List<StorePink>> collect = pinkList.stream().collect(Collectors.groupingBy(StorePink::getSpsId));
+        log.info("collect:"+collect.toString());
+//记得将重复拼团校验放开
+//        List<List<StorePink>> availableGroups = collect.values().stream()
+//                .filter(list -> !list.stream().map(StorePink::getUid).collect(Collectors.toList()).contains(dto.getUserId()))
+//                .collect(Collectors.toList());
+        List<List<StorePink>> availableGroups = collect.values().stream()
 
 
-        Map<String, List<StorePink>> collect = pinkList.stream().collect(Collectors.groupingBy(StorePink::getOrderId));
-
-        List<List<StorePink>> availableGroups = collect.values().stream()
-                .filter(list -> !list.stream().map(StorePink::getUid).collect(Collectors.toList()).contains(dto.getUserId()))
+                .filter(list -> true)
                 .collect(Collectors.toList());
 
+        log.info("availableGroups:"+availableGroups.toString());
         // 如果没有用户未参与的拼团,直接返回,让调用方处理创建新团的逻辑
         if (CollUtil.isEmpty(availableGroups)) {
-            throw new ServiceException("所有的均已参加");
+            throw new ServiceException("所有的均已参加");
         }
         // 找出最多value对应的key
-        List<StorePink> maxPinkList = availableGroups.stream()
-                .max(Comparator.comparing(List::size))
-                .orElse(Collections.emptyList());
+//        List<StorePink> maxPinkList = availableGroups.stream()
+//                .max(Comparator.comparing(List::size))
+//                .orElse(Collections.emptyList());
+        //随机挑选一个拼团去参加
+        Random random = new Random();
+        int num = random.nextInt(availableGroups.size()) ;  //  生成 可用列表随机下标的整数有效增加并发量
+        log.info("randomNum:"+num);
+        List<StorePink> maxPinkList = availableGroups.get(num);
+        log.info("maxPinkList:"+maxPinkList.toString());
         if (CollectionUtils.isNotEmpty(maxPinkList)) {
             List<Long> uidList = maxPinkList.stream().map(StorePink::getUid).collect(Collectors.toList());
-            if (!uidList.contains(dto.getUserId())) {
-                StorePink pink = maxPinkList.stream().filter(i -> i.getKId().equals(0L)).collect(Collectors.toList()).get(0);
-                int count = pink.getPeople() - (CollUtil.isEmpty(pinkList) ? 0 : pinkList.size());
+            //记得将重复拼团校验放开
+          //  if (!uidList.contains(dto.getUserId())) {
+                //团长
+                StorePink pink = maxPinkList.stream().filter(i -> i.getKId().equals(0)).collect(Collectors.toList()).get(0);
+                int count = pink.getPeople() - (CollUtil.isEmpty(maxPinkList) ? 0 : maxPinkList.size());
+            log.info("count:"+count);
                 if (count > 0) {
+                    dto.setSpsId(pink.getSpsId()); //拼团汇总表id
                     joinGroup(pink, dto, count,pinkList.size());
+                }else{
+                    throw new ServiceException("拼团人数超员请重新发起拼团 pinkid:"+pink.getId());
                 }
-            }
+          //  }
         }
     }
 
@@ -725,7 +868,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         List<StoreOrder> userCombinationOrders = this.getUserCurrentCombinationOrders(userId, storeCombination.getId());
         if (CollUtil.isNotEmpty(userCombinationOrders)) {
             // 判断是否有待支付订单
-            List<StoreOrder> unPayOrders = userCombinationOrders.stream().filter(e -> e.getPaid().equals(0)).collect(Collectors.toList());
+            List<StoreOrder> unPayOrders = userCombinationOrders.stream().filter(e -> e.getStatus().equals(PinkOrderStatusEnum.GROUP_ORDER_TO_PAY.getKey())).collect(Collectors.toList());
             if (!unPayOrders.isEmpty()) {
                 throw new ServiceException("您有拼团待支付订单,请支付后再购买");
             }
@@ -1049,7 +1192,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             case 2:
                 pinkCriteria.andEqualTo("status", 2);
                 pinkCriteria.andEqualTo("lId", 1);
-                pinkCriteria.andIn("order_status", Arrays.asList(3));
+                pinkCriteria.andIn("orderStatus", Arrays.asList(3));
                 pinkList = storePinkService.findByCondition(pinkCondition);
                 if (CollUtil.isNotEmpty(pinkList)) {
                     criteria.andIn("id", pinkList.stream().map(StorePink::getOrderIdKey).collect(Collectors.toList()));
@@ -1058,7 +1201,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             case 3:
                 pinkCriteria.andEqualTo("status", 2);
                 pinkCriteria.andEqualTo("lId", 0);
-                pinkCriteria.andIn("order_status", Arrays.asList(3));
+                pinkCriteria.andIn("orderStatus", Arrays.asList(3));
                 pinkList = storePinkService.findByCondition(pinkCondition);
                 if (CollUtil.isNotEmpty(pinkList)) {
                     criteria.andIn("id", pinkList.stream().map(StorePink::getOrderIdKey).collect(Collectors.toList()));
@@ -1066,7 +1209,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                 break;
             case 4:
                 pinkCriteria.andEqualTo("status", 2);
-                pinkCriteria.andIn("order_status", Arrays.asList(5,7,8));
+                pinkCriteria.andIn("orderStatus", Arrays.asList(5,7,8));
                 pinkList = storePinkService.findByCondition(pinkCondition);
                 if (CollUtil.isNotEmpty(pinkList)) {
                     criteria.andIn("id", pinkList.stream().map(StorePink::getOrderIdKey).collect(Collectors.toList()));
@@ -1370,6 +1513,24 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 //        }
 //        // 保存购物车商品详情
         storeOrderInfoService.saveOrderInfos(storeOrderInfos);
+
+
+        if ("open".equals(request.getType())) {
+            goOpen(storeOrder.getOrderId());
+        }
+        if ("join".equals(request.getType())) {
+            GoPinkDTO goPinkDTO = new GoPinkDTO();
+            goPinkDTO.setCid(request.getCid());  //拼团商品id  m_store_combination.id
+            goPinkDTO.setOrderId(storeOrder.getOrderId());
+            goPinkDTO.setOrderIdKey(storeOrder.getId());
+            goPinkDTO.setSpsId(request.getSpsId()); //拼团汇总表id
+            goPinkDTO.setPinkId(request.getPinkId());
+            goPinkDTO.setUserId(user.getId());
+            goPink(goPinkDTO);
+        }
+
+
+
 //        // 生成订单日志
         storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_STATUS_CREATE_ORDER, "订单生成");
 //
@@ -1379,6 +1540,9 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 //        }
 //        return Boolean.TRUE;
 
+
+
+
         // 删除缓存订单
         if (redisUtil.hasKey(key)) {
             redisUtil.del(key);
@@ -1393,10 +1557,12 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     }
 
     @Override
-    @Transactional
+    @Transactional(propagation = Propagation.REQUIRED)
     public Boolean goPay(GoPinkDTO dto) {
         StoreOrder storeOrder = findBy("orderId", dto.getOrderId());
-
+        if(ObjectUtils.isEmpty(storeOrder)){
+            throw new ServiceException("订单为空orderId:"+dto.getOrderId());
+        }
         // 检验余额够不够
         Result result = accountDubboServiceClient.getWalletAccount(storeOrder.getUid());
         if (result.getCode().equals(ResultCode.SUCCESS.getCode())) {
@@ -1407,7 +1573,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         } else {
             throw new ServiceException("获取用户钱包账户失败");
         }
-        updateOrderStatus(storeOrder.getId(), PinkOrderStatusEnum.GROUP_ORDER_TO_PAY.getKey());
+
 
         if ("open".equals(dto.getType())) {
             OpenParam openParam = new OpenParam();
@@ -1416,8 +1582,12 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             openParam.setUserId(storeOrder.getUid());
             openParam.setAmount(storeOrder.getPayPrice());
             openParam.setTransTime(new Date());
-            accountDubboServiceClient.openGroup(openParam);
-            goOpen(dto.getOrderId());
+
+            //
+          //  accountDubboServiceClient.openGroup(openParam);
+            updateOrderStatus(storeOrder.getId(), PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey());
+            storePinkService.pinkSuccess(storeOrder.getPinkId(),storeOrder);
+           // goOpen(dto.getOrderId());
         }
         if ("join".equals(dto.getType())) {
             JoinParam joinParam = new JoinParam();
@@ -1426,8 +1596,10 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             joinParam.setUserId(storeOrder.getUid());
             joinParam.setAmount(storeOrder.getPayPrice());
             joinParam.setTransTime(new Date());
-            accountDubboServiceClient.joinGroup(joinParam);
-            goPink(dto);
+           // accountDubboServiceClient.joinGroup(joinParam);
+            updateOrderStatus(storeOrder.getId(), PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey());
+            storePinkService.pinkSuccess(storeOrder.getPinkId(),storeOrder);
+           // goPink(dto);
         }
         return true;
     }
@@ -1537,11 +1709,11 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         storeOrder.setStatus(status);
         update(storeOrder);
 
-        StorePink storePink = new StorePink();
-        Example example = new Example(StorePink.class);
-        example.createCriteria().andEqualTo("orderIdKey",id);
-        storePink.setOrderStatus(status);
-        storePinkMapper.updateByConditionSelective(storePink,example);
+//        StorePink storePink = new StorePink();
+//        Example example = new Example(StorePink.class);
+//        example.createCriteria().andEqualTo("orderIdKey",id);
+//        storePink.setOrderStatus(status);
+//        int i = storePinkMapper.updateByConditionSelective(storePink, example);
 
         storeOrderStatusService.createLog(id, "", PinkOrderStatusEnum.getEnum(status).getValue());
 
@@ -1617,4 +1789,13 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         });
         return recordList;
     }
+
+    @Resource
+    private StoreOrderMapper storeOrderMapper;
+    @Override
+    public void bindingAddress(StoreOrder storeOrder) {
+        Example example = new Example(StoreOrder.class);
+        example.createCriteria().andEqualTo("orderId",storeOrder.getOrderId());
+        storeOrderMapper.updateByConditionSelective(storeOrder,example);
+    }
 }

+ 72 - 17
mall-service/src/main/java/com/txz/mall/service/impl/StorePinkServiceImpl.java

@@ -8,11 +8,15 @@ import com.txz.mall.core.AbstractService;
 import com.txz.mall.core.ServiceException;
 import com.txz.mall.dao.StorePinkMapper;
 import com.txz.mall.dubbo.client.CifAccountDubboServiceClient;
+import com.txz.mall.enums.PinkOrderStatusEnum;
+import com.txz.mall.model.StoreOrder;
 import com.txz.mall.model.StorePink;
 import com.txz.mall.service.StorePinkService;
 import com.txz.mall.service.StorePinkSummaryService;
 import com.txz.mall.util.RandomUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
@@ -28,7 +32,12 @@ import java.util.stream.Collectors;
  */
 @Service
 @Transactional
+@Slf4j
 public class StorePinkServiceImpl extends AbstractService<StorePink> implements StorePinkService {
+
+
+
+
     @Resource
     private StorePinkMapper storePinkMapper;
 
@@ -52,27 +61,37 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
     private StorePinkSummaryService storePinkSummaryService;
 
     @Override
-    public void pinkSuccess(Long id) {
+    @Transactional
+    public void pinkSuccess(Long id, StoreOrder storeOrder) {
+
+
+        //现在这个方法每次支付的时候都会执行一次
         Date date = new Date();
         if (ObjectUtil.isNull(id)) {
             return;
         }
         StorePink teamPink = findById(id);
         List<StorePink> memberList = getListByCidAndKid(teamPink.getCid(), id);
+        StorePink storePink2 = new StorePink();
+        storePink2.setId(teamPink.getId());
+        storePink2.setStatus(2);
+        storePink2.setStopTime(date);
+        storePink2.setOrderStatus(PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey());
+        log.info("storePink2:"+storePink2);
+        update(storePink2);
         memberList.add(teamPink);
-        memberList.forEach(i -> {
-            i.setStatus(2);
-            i.setStopTime(date);
-            update(i);
-        });
-
-
+//        memberList.forEach(i -> {
+//            i.setStatus(2);
+//            i.setStopTime(date);
+//            update(i);
+//        });
+
+        //理论上在支付环节调用的时候不会出现拼团人数校验异常,所以这块调用这个方法的目的在于维护成团状态。 如果支付环节抛出了
+        //拼团校验异常则证明在 add时就有问题,没有挡住异常的拼团数据
         Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(teamPink.getSpsId());
-        if(!b){
-            throw new ServiceException("拼团超员请选择新的拼团");
-        }
+        if(b){
         // 算出天选
-        theSelection(teamPink.getOrderId());
+        theSelection(teamPink.getSpsId());
 
         Condition condition = new Condition(StorePink.class);
         Example.Criteria criteria = condition.createCriteria();
@@ -81,29 +100,65 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
         criteria.andEqualTo("lId", 0);
         List<StorePink> pinkList = findByCondition(condition);
 
+        //非天选之子给他退款
         AccomplishParam param = new AccomplishParam();
         param.setBizNo(teamPink.getOrderId());
         param.setBizId(teamPink.getId().toString());
         param.setUserIds(pinkList.stream().map(StorePink::getUid).collect(Collectors.toList()));
         param.setAmount(teamPink.getPrice());
         param.setTransTime(date);
-        accountDubboServiceClient.accomplishGroup(param);
+      //  accountDubboServiceClient.accomplishGroup(param);
+        }
     }
 
+//    @Override
+//    public void theSelection(String orderId) {
+//        // 假设只有1个用户是天选
+//        long luckNum = 1;
+//
+//        Condition condition = new Condition(StorePink.class);
+//        Example.Criteria criteria = condition.createCriteria();
+//        criteria.andEqualTo("isDelete", 0);
+//        criteria.andEqualTo("orderId", orderId);
+//        // 排除团长
+////        criteria.andEqualTo("kId", 1);
+//        // 支付成功的
+//
+//        criteria.andEqualTo("status", 1);
+//        List<StorePink> list = findByCondition(condition);
+//        if (CollUtil.isEmpty(list)) {
+//            throw new ServiceException("没有拼团订单");
+//        }
+//        long count = list.stream().filter(i -> i.getLId().equals(1)).count();
+//        if (count >= luckNum) {
+//            throw new ServiceException("已有天选");
+//        }
+//
+//        List<Long> idCollect = list.stream().map(StorePink::getId).collect(Collectors.toList());
+//        List<Long> randomIds = RandomUtil.uniqueRandom(idCollect, (int) luckNum);
+//
+//        randomIds.forEach(i -> {
+//            StorePink luckPink = new StorePink();
+//            luckPink.setId(i);
+//            luckPink.setLId(1);
+//            update(luckPink);
+//        });
+//    }
+
+
     @Override
-    public void theSelection(String orderId) {
+    public void theSelection(Long spsId) {
         // 假设只有1个用户是天选
         long luckNum = 1;
 
         Condition condition = new Condition(StorePink.class);
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
-        criteria.andEqualTo("orderId", orderId);
+        criteria.andEqualTo("spsId", spsId);
         // 排除团长
 //        criteria.andEqualTo("kId", 1);
         // 支付成功的
-
-        criteria.andEqualTo("status", 1);
+        criteria.andEqualTo("status", 2);
         List<StorePink> list = findByCondition(condition);
         if (CollUtil.isEmpty(list)) {
             throw new ServiceException("没有拼团订单");

+ 38 - 14
mall-service/src/main/java/com/txz/mall/service/impl/StorePinkSummaryServiceImpl.java

@@ -36,10 +36,11 @@ public class StorePinkSummaryServiceImpl extends AbstractService<StorePinkSummar
 
 
         Condition condition = new Condition(StorePink.class);
-        // 创建Criteria对象,用于添加查询条件
+
         Example.Criteria criteria = condition.createCriteria();
-        // 添加条件:年龄等于25
+
         criteria.andEqualTo("spsId", id);
+        criteria.andEqualTo("isDelete",0);
         List<StorePink> storePinks = mStorePinkMapper.selectByCondition(condition);
         int peopleCount = 0;
 
@@ -51,14 +52,14 @@ public class StorePinkSummaryServiceImpl extends AbstractService<StorePinkSummar
         }
 
         Integer status = storePinkSummary.getStatus();
-        Integer num = 2;
+        Integer num = 2; //拼团成员已付款
         if(num.equals(status)){
             throw new ServiceException("拼团已成功不允许任何更改 id:"+id);
         }
         Integer people = storePinkSummary.getPeople();
 
-        int countOneInteger = 0;
-        int countTwoInteger = 0;
+        int countOneInteger = 0;   //未付款的人数
+        int countTwoInteger = 0;  //付款成功的人数
         if(!CollectionUtils.isEmpty(storePinks)){
 
             Integer deleteInteger = new Integer(0);
@@ -74,21 +75,44 @@ public class StorePinkSummaryServiceImpl extends AbstractService<StorePinkSummar
                         && twoInteger.equals(a.getStatus());
             }).count();
 
-         //   peopleCount = storePinks.size();
+            peopleCount = countOneInteger + countTwoInteger;
+        }
+
+
+        if(people < peopleCount){
+            throw new ServiceException("拼团超员 id:"+id);
         }
 
+        boolean updateFlag = false;
+        //成团标识只有成团后才返回true
+        boolean successFlag = false;
+        StorePinkSummary storePinkSummaryForUpdate = new StorePinkSummary();
+        storePinkSummaryForUpdate.setId(id);
+        storePinkSummaryForUpdate.setPeopleCount(peopleCount);
+
+        //这里判断  已经付款成功的订单 总数==活动总人数的时候代表拼团锁定
+        if(people==peopleCount){
+            storePinkSummaryForUpdate.setIsVirtual(Boolean.TRUE);
+            updateFlag = true;
+        }
+        if(people>peopleCount){
+            storePinkSummaryForUpdate.setIsVirtual(Boolean.FALSE);
+            updateFlag = true;
+        }
         //这里判断  已经付款成功的订单 总数==活动总人数的时候代表拼团成功
-        if(people==(countTwoInteger)){
-            StorePinkSummary storePinkSummaryForUpdate = new StorePinkSummary();
-            storePinkSummaryForUpdate.setId(id);
-            storePinkSummaryForUpdate.setPeopleCount(peopleCount);
+        if(people== countTwoInteger){
+            storePinkSummaryForUpdate.setIsVirtual(Boolean.TRUE);
             storePinkSummaryForUpdate.setStatus(num);
-            mStorePinkSummaryMapper.updateByPrimaryKeySelective(storePinkSummaryForUpdate);
+            updateFlag = true;
+            successFlag = true;   //拼团成功标识
+        }
 
-        }else if(countTwoInteger<(countOneInteger+countTwoInteger)){
-            return Boolean.FALSE;
+        if(people > countTwoInteger){
+            storePinkSummaryForUpdate.setStatus(1);
+            updateFlag = true;
         }
 
-        return Boolean.TRUE;
+        mStorePinkSummaryMapper.updateByPrimaryKeySelective(storePinkSummaryForUpdate);
+        return successFlag;
     }
 }

+ 2 - 1
mall-service/src/main/java/com/txz/mall/web/param/addparam/MidFavoriteAddParam.java

@@ -4,10 +4,11 @@ package com.txz.mall.web.param.addparam;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 @Data
-public class MidFavoriteAddParam {
+public class MidFavoriteAddParam implements Serializable {
 
     @ApiModelProperty(value = "产品id列表")
     private List<Long> productIdList;

+ 23 - 0
mall-service/src/main/java/com/txz/mall/web/param/updateparam/StoreOrderUpdateParam.java

@@ -0,0 +1,23 @@
+package com.txz.mall.web.param.updateparam;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+public class StoreOrderUpdateParam implements Serializable {
+
+    /**
+     * 订单编号
+     */
+    @ApiModelProperty(value = "订单编号")
+    @NotNull
+    private String orderId;
+
+    @ApiModelProperty(value = "地址id")
+    @NotNull
+    private Long addressId;
+
+}

+ 20 - 0
mall-service/src/main/java/dto/CreateOrderRequest.java

@@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
 /**
@@ -62,4 +63,23 @@ public class CreateOrderRequest implements Serializable {
     private String phone;
 
     private Long userId;
+
+
+
+   //新加的入参
+    @ApiModelProperty(value = "类型  open-开团  join-加团")
+    @NotBlank(message = "拼团类型不能为空")
+    private String type;
+
+
+    @ApiModelProperty(value = "拼团商品id  m_store_combination.id")
+    @NotNull(message = "拼团商品id不能为空")
+    private Long cid;
+
+
+    @ApiModelProperty(value = "拼团汇总表id")
+    private Long spsId;
+
+    @ApiModelProperty(value = "拼团id")
+    private Long pinkId;   //理论上是不用传这个id的但是为了减少整改量就让他传上来
 }

+ 5 - 0
mall-service/src/main/java/dto/GoPinkDTO.java

@@ -32,4 +32,9 @@ public class GoPinkDTO implements Serializable {
 
     @ApiModelProperty(value = "拼团汇总表id")
     private Long spsId;
+
+    //这个变量作为后端数据传递的变量前端无需感知
+    @ApiModelProperty(value = "m_store_order.id")
+    private Long orderIdKey;
+
 }