yangyb il y a 3 semaines
Parent
commit
8e2782d034

+ 9 - 7
mall-service/src/main/java/com/txz/mall/controller/CombinationController.java

@@ -9,14 +9,15 @@ import com.txz.mall.core.ServiceException;
 import com.txz.mall.model.StoreCombination;
 import com.txz.mall.service.StoreCombinationService;
 import com.txz.mall.service.StoreOrderService;
+import dto.GoPinkDTO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
-import vo.GoPinkResponse;
 
 import javax.annotation.Resource;
 import java.util.Date;
@@ -185,14 +186,15 @@ public class CombinationController {
 
     /**
      * 去拼团
-     *
-     * @param pinkId 拼团团长单id
      */
     @ApiOperation(value = "去拼团")
-    @GetMapping(value = "/pink/{pinkId}")
-    public Result<GoPinkResponse> goPink(@PathVariable(value = "pinkId") Long pinkId) {
-        GoPinkResponse goPinkResponse = storeCombinationService.goPink(pinkId);
-        return Result.success(goPinkResponse);
+    @PostMapping(value = "/pink")
+    public Result goPink(@Validated @RequestBody GoPinkDTO dto) {
+        if (dto.getPinkId() == null && dto.getCid() == null) {
+            return Result.fail(ResultCode.ID_IS_NULL);
+        }
+        storeCombinationService.goPink(dto);
+        return Result.success();
     }
 
     /**

+ 3 - 3
mall-service/src/main/java/com/txz/mall/controller/OrderController.java

@@ -167,10 +167,10 @@ public class OrderController {
         return Result.success(storeOrderService.computedOrderPrice(request));
     }
 
-    @ApiOperation(value = "获取订单支付结果")
-    @PostMapping(value = "/get/pay/result")
+    @ApiOperation(value = "去支付")
+    @PostMapping(value = "/goPay")
     public Result getPayResult(@RequestParam Long orderId) {
-        Boolean result = storeOrderService.getPayResult(orderId);
+        Boolean result = storeOrderService.goPay(orderId);
         return Result.success(result);
     }
 }

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

@@ -118,6 +118,7 @@ public class StorePink {
      * 状态1进行中2已完成3未完成
      */
     @ApiModelProperty(value = "状态 1进行中 2已完成 3未完成")
+    @Column(name = "status")
     private Integer status;
 
     /**

+ 2 - 3
mall-service/src/main/java/com/txz/mall/service/StoreCombinationService.java

@@ -3,8 +3,8 @@ package com.txz.mall.service;
 import com.github.pagehelper.PageInfo;
 import com.txz.mall.core.Service;
 import com.txz.mall.model.StoreCombination;
+import dto.GoPinkDTO;
 import vo.ActivityProductVO;
-import vo.GoPinkResponse;
 
 import java.util.List;
 
@@ -30,9 +30,8 @@ public interface StoreCombinationService extends Service<StoreCombination> {
     /**
      * 去拼团
      *
-     * @param pinkId 拼团团长单ID
      */
-    GoPinkResponse goPink(Long pinkId);
+    void goPink(GoPinkDTO dto);
 
     /**
      * 更多拼团信息

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

@@ -107,5 +107,5 @@ public interface StoreOrderService extends Service<StoreOrder> {
      *
      * @param orderId 订单编号
      */
-    Boolean getPayResult(Long orderId);
+    Boolean goPay(Long orderId);
 }

+ 90 - 140
mall-service/src/main/java/com/txz/mall/service/impl/StoreCombinationServiceImpl.java

@@ -5,26 +5,28 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.txz.mall.constants.Constants;
 import com.txz.mall.core.AbstractService;
 import com.txz.mall.core.ServiceException;
 import com.txz.mall.dubbo.client.CifUserDubboServiceClient;
-import com.txz.mall.model.*;
+import com.txz.mall.model.StoreCombination;
+import com.txz.mall.model.StoreFlashActivity;
+import com.txz.mall.model.StorePink;
+import com.txz.mall.model.StoreProduct;
 import com.txz.mall.service.*;
+import dto.GoPinkDTO;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
-import vo.*;
+import vo.ActivityProductVO;
+import vo.FlashActivityVO;
 
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -128,150 +130,98 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
 
 
     @Override
-    public GoPinkResponse goPink(Long pinkId) {
-        //判断拼团是否完成
-        int isOk = 0;
-        //判断当前用户是否在团内  0未在 1在
-        int userBool = 0;
-        //判断拼团是否成功  0未成功 1成功
-        int pinkBool = 0;
+    public void goPink(GoPinkDTO dto) {
         Date date = new Date();
-
-        StorePink teamPink = storePinkService.findById(pinkId);
-        if (ObjectUtil.isNull(teamPink) || teamPink.getIsRefund().equals(1)) {
-            throw new ServiceException("对应的拼团不存在");
-        }
-        StoreCombination storeCombination = findById(teamPink.getCid());
-        if (ObjectUtil.isNull(storeCombination) || storeCombination.getIsDelete().equals(1)) {
-            throw new ServiceException("对应拼团商品不存在");
+        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.andLessThanOrEqualTo("startTime", date);
+            criteria.andGreaterThanOrEqualTo("stopTime", date);
+            List<StoreCombination> combinationList = findByCondition(condition);
+            if (CollUtil.isEmpty(combinationList)) {
+                throw new ServiceException("拼团商品不存在或未开启");
+            }
 
-        // 判断拼团活动时效
-        if (storeCombination.getIsShow().equals(0)) {
-            throw new ServiceException("拼团活动已结束");
-        }
-        if (date.after(storeCombination.getStopTime())) {
-            throw new ServiceException("拼团活动已结束");
-        }
-//
-//        User user = userService.getInfo();
-//
-        GoPinkResponse goPinkResponse = new GoPinkResponse();
-        List<StorePink> pinkList;
-        if (teamPink.getKId().equals(0L)) {
-            pinkList = storePinkService.getListByCidAndKid(teamPink.getCid(), teamPink.getId());
-            pinkList.add(teamPink);
-        } else {
-            // 名额占用的问题 (支付成功的才算1个)
-            pinkList = storePinkService.getListByCidAndKid(teamPink.getCid(), teamPink.getKId());
-            pinkList.add(storePinkService.findById(teamPink.getKId()));
-        }
-        //拼团剩余人数
-        int count = teamPink.getPeople() - (CollUtil.isEmpty(pinkList) ? 0 : pinkList.size());
+            Condition pinkCondition = new Condition(StorePink.class);
+            Example.Criteria pinkCriteria = pinkCondition.createCriteria();
+            pinkCriteria.andEqualTo("isDelete", 0);
+            pinkCriteria.andEqualTo("kId", dto.getPinkId());
+            pinkCriteria.andEqualTo("status", 1);
+            List<StorePink> pinkList = storePinkService.findByCondition(pinkCondition);
 
-        if (teamPink.getStatus() == 2) {
-            //已完成
-            isOk = 1;
-            pinkBool = 1;
-        }
-        if (teamPink.getStatus() == 1) {
-            //进行中
+            //拼团剩余人数
+            int count = teamPink.getPeople() - (CollUtil.isEmpty(pinkList) ? 0 : pinkList.size());
             if (count < 1) {
-                // 拼团已完成
-                isOk = 1;
-                pinkBool = 1;
-                // 拼团完成处理
+                throw new ServiceException("拼团已满");
+            }
+            List<Long> uidList = pinkList.stream().map(StorePink::getUid).collect(Collectors.toList());
+            if (uidList.contains(dto.getUserId())) {
+                throw new ServiceException("您已加入该拼团");
+            }
+            // 加入拼团
+            StorePink storePink = new StorePink();
+            BeanUtils.copyProperties(teamPink, storePink);
+            storePink.setId(null);
+//            storePink.setOrderId(null);
+            storePink.setOrderIdKey(null);
+            storePink.setUid(dto.getUserId());
+            storePink.setKId(1L);
+            storePink.setCreateTime(date);
+            storePinkService.save(storePink);
+            if (count == 1) {
                 storePinkService.pinkSuccess(teamPink.getId());
             }
         }
+    }
 
-        List<Long> uidList = pinkList.stream().map(StorePink::getUid).collect(Collectors.toList());
-        uidList.add(teamPink.getUid());
-//        if (uidList.contains(user.getUid())) {
-//            userBool = 1;
-//            throw new ServiceException("您已加入该拼团");
-//        }
-//
-//        // 处理用户头像昵称
-        List<StorePinkVO> pinkResponseList = CollUtil.newArrayList();
-        // 团长
-        StorePinkVO storePinkTResponse = new StorePinkVO();
-        for (StorePink pink : pinkList) {
-            if (pink.getKId().equals(0)) {
-                BeanUtils.copyProperties(pink, storePinkTResponse);
-//                if (pink.getUid().equals(user.getUid())) {
-//                    storePinkTResponse.setNickname(user.getNickname());
-//                    storePinkTResponse.setAvatar(user.getAvatar());
-//                } else {
-//                    User teamUser = userService.getById(pink.getUid());
-//                    storePinkTResponse.setNickname(teamUser.getNickname());
-//                    storePinkTResponse.setAvatar(teamUser.getAvatar());
-//                }
-                continue;
-            }
-            StorePinkVO storePinkResponse = new StorePinkVO();
-            BeanUtils.copyProperties(pink, storePinkResponse);
-//            User userOne = userService.getById(pink.getUid());
-//            storePinkResponse.setNickname(userOne.getNickname());
-//            storePinkResponse.setAvatar(userOne.getAvatar());
-            pinkResponseList.add(storePinkResponse);
+    /**
+     * 自动匹配
+     */
+    private void automaticMatch(GoPinkDTO dto) {
+        // 找一个最快能成团的
+        Date date = new Date();
+        StoreCombination storeCombination = findById(dto.getCid());
+        if (ObjectUtil.isNull(storeCombination) || storeCombination.getIsDelete().equals(1)) {
+            throw new ServiceException("对应拼团商品不存在");
         }
-
-        goPinkResponse.setCount(count);
-        goPinkResponse.setIsOk(isOk);
-        goPinkResponse.setPinkBool(pinkBool);
-        goPinkResponse.setUserBool(userBool);
-        if (userBool == 1) {
-//            pinkList.forEach(e -> {
-//                if (e.getUid().equals(user.getUid())) {
-//                    goPinkResponse.setCurrentPinkOrder(e.getOrderId());
-//                }
-//            });
+        Condition pinkCondition = new Condition(StorePink.class);
+        Example.Criteria pinkCriteria = pinkCondition.createCriteria();
+        pinkCriteria.andEqualTo("isDelete", 0);
+        pinkCriteria.andEqualTo("cid", dto.getCid());
+        pinkCriteria.andEqualTo("status", 1);
+        List<StorePink> pinkList = storePinkService.findByCondition(pinkCondition);
+        Map<String, List<StorePink>> collect = pinkList.stream().collect(Collectors.groupingBy(StorePink::getOrderId));
+        // 找出最多value对应的key
+        List<StorePink> maxPinkList = collect.values().stream()
+                .max(Comparator.comparing(List::size))
+                .orElse(Collections.emptyList());
+        if (CollectionUtils.isNotEmpty(maxPinkList)) {
+            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 (count > 0) {
+                StorePink storePink = new StorePink();
+                BeanUtils.copyProperties(pink, storePink);
+                storePink.setId(null);
+//            storePink.setOrderId(null);
+                storePink.setOrderIdKey(null);
+                storePink.setUid(dto.getUserId());
+                storePink.setKId(1L);
+                storePink.setCreateTime(date);
+                storePinkService.save(storePink);
+                if (count == 1) {
+                    storePinkService.pinkSuccess(pink.getId());
+                }
+            }
         }
-        goPinkResponse.setPinkAll(pinkResponseList);
-        goPinkResponse.setPinkT(storePinkTResponse);
-//        goPinkResponse.setUserInfo(user);
-
-        // storeCombination部分
-        StoreCombinationVO detailResponse = new StoreCombinationVO();
-        BeanUtils.copyProperties(storeCombination, detailResponse);
-        detailResponse.setSpecType(false);
-        // sku部分
-        ProductAttr spavAttr = new ProductAttr();
-        spavAttr.setProductId(storeCombination.getId());
-        spavAttr.setType(Constants.PRODUCT_TYPE_PINGTUAN);
-//        List<ProductAttr> attrList = productAttrService.getByEntity(spavAttr);
-//        List<HashMap<String, Object>> skuAttrList = getSkuAttrList(attrList);
-//        detailResponse.setProductAttr(skuAttrList);
-//        if (CollUtil.isNotEmpty(attrList) && attrList.size() > 1) {
-//            detailResponse.setSpecType(true);
-//        }
-//        // 单属性时讲attrValueId 赋值给外层方便前端使用
-//        if (!detailResponse.getSpecType()) {
-//            detailResponse.setAloneAttrValueId(attrList.get(0).getId());
-//        }
-//
-//
-//        ProductAttrValue spavValue = new ProductAttrValue();
-//        spavValue.setProductId(storeCombination.getId());
-//        spavValue.setType(Constants.PRODUCT_TYPE_PINGTUAN);
-//        List<ProductAttrValue> valueList = productAttrValueService.getByEntity(spavValue);
-//        // H5 端用于生成skuList
-//        List<StoreProductAttrValueVO> sPAVResponses = new ArrayList<>();
-//        for (ProductAttrValue storeProductAttrValue : valueList) {
-//            StoreProductAttrValueVO atr = new StoreProductAttrValueVO();
-//            BeanUtils.copyProperties(storeProductAttrValue, atr);
-//            sPAVResponses.add(atr);
-//        }
-//        HashMap<String, Object> skuMap = new HashMap<>();
-//        for (StoreProductAttrValueVO attrValue : sPAVResponses) {
-//            skuMap.put(attrValue.getSuk(), attrValue);
-//        }
-//
-//        detailResponse.setProductValue(skuMap);
-//        goPinkResponse.setStoreCombination(detailResponse);
-//        return goPinkResponse;
-        return null;
     }
 
     @Override

+ 6 - 1
mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderServiceImpl.java

@@ -12,6 +12,7 @@ import com.txz.mall.constants.Constants;
 import com.txz.mall.core.AbstractService;
 import com.txz.mall.core.RedisUtil;
 import com.txz.mall.core.ServiceException;
+import com.txz.mall.dubbo.client.CifAccountDubboServiceClient;
 import com.txz.mall.dubbo.client.CifUserDubboServiceClient;
 import com.txz.mall.model.*;
 import com.txz.mall.service.*;
@@ -55,6 +56,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     private final CifUserDubboServiceClient userDubboServiceClient;
     private final StoreOrderStatusService storeOrderStatusService;
     private RedisUtil redisUtil;
+    private final CifAccountDubboServiceClient accountDubboServiceClient;
 
     @Override
     public StoreOrderCountItemVO getOrderStatusNum() {
@@ -1050,7 +1052,10 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     }
 
     @Override
-    public Boolean getPayResult(Long orderId) {
+    public Boolean goPay(Long orderId) {
+        // 扣取余额
+//        accountDubboServiceClient.recharge()
+
         StoreOrder storeOrder = findById(orderId);
         if (storeOrder.getPaid() == 1) {
             goOpen(orderId);

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

@@ -31,7 +31,7 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
         Condition condition = new Condition(StorePink.class);
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
-        criteria.andEqualTo("kid", kid);
+        criteria.andEqualTo("kId", kid);
         criteria.andEqualTo("cid", cid);
         condition.setOrderByClause("id DESC");
         return findByCondition(condition);

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

@@ -0,0 +1,27 @@
+/*
+ *
+ * StorePinkDTO.java
+ * Copyright(C) 2017-2020 fendo公司
+ * @date 2025-07-15
+ */
+package dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+public class GoPinkDTO implements Serializable {
+
+    @ApiModelProperty(value = "拼团id")
+    private Long pinkId;
+
+    @ApiModelProperty(value = "拼团商品id")
+    private Long cid;
+
+    @ApiModelProperty(value = "用户id")
+    @NotNull(message = "用户id不能为空")
+    private Long userId;
+}

+ 0 - 4
mall-service/src/main/java/vo/StorePinkOngoingVO.java

@@ -1,7 +1,5 @@
 package vo;
 
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -14,8 +12,6 @@ import java.util.List;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
-@TableName("eb_store_pink")
-@ApiModel(value = "StorePink对象", description = "拼团表")
 public class StorePinkOngoingVO implements Serializable {
 
     private static final long serialVersionUID = 1L;