From c7cb86db957dc7fbf6ca30270a71a43f5b31eccf Mon Sep 17 00:00:00 2001
From: huanghongfa <huanghongfa123456>
Date: 星期三, 13 四月 2022 09:29:03 +0800
Subject: [PATCH] 电动车商城-拼团活动接口开发

---
 springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderServiceImpl.java |  287 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 231 insertions(+), 56 deletions(-)

diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderServiceImpl.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderServiceImpl.java
index 2d717fc..3b3c716 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderServiceImpl.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderServiceImpl.java
@@ -68,6 +68,12 @@
     private String mchId;
     @Value("${min.app.currencyNotifyUrl}")
     private String currencyNotifyUrl;
+    @Resource
+    private ComBatteryCommodityOrderCollageTeamMapper orderCollageTeamMapper;
+    @Resource
+    private ComBatteryCommodityOrderCollageTeamPeopleMapper orderCollageTeamPeopleMapper;
+    @Resource
+    private ComBatteryCommodityActivityMapper commodityActivityMapper;
 
     /**
      * description  queryByPage  分页查询
@@ -151,7 +157,7 @@
     @Override
     public R detailById(Long id) {
         ComBatteryCommodityOrderVo commodityOrderVo = this.baseMapper.queryById(id);
-        if(commodityOrderVo != null){
+        if (commodityOrderVo != null) {
             //查询商品信息
             ComBatteryCommodityVo commodityVo = commodityMapper.queryById(commodityOrderVo.getCommodityId());
             commodityOrderVo.setCommodityVo(commodityVo);
@@ -180,8 +186,9 @@
 
     /**
      * 修改订单收货地址
-     * @param editOrderAddressDto   请求参数
-     * @return  修改结果
+     *
+     * @param editOrderAddressDto 请求参数
+     * @return 修改结果
      */
     @Override
     public R updateOrderAddress(EditOrderAddressDto editOrderAddressDto) {
@@ -195,8 +202,9 @@
 
     /**
      * 修改订单物流信息
+     *
      * @param editOrderLogisticsDto 请求参数
-     * @return  修改结果
+     * @return 修改结果
      */
     @Override
     public R updateOrderLogistics(EditOrderLogisticsDto editOrderLogisticsDto) {
@@ -210,8 +218,9 @@
 
     /**
      * 电动车商城购买商品支付回调
-     * @param notifyOrderDTO    请求参数
-     * @return  购买商品支付回调
+     *
+     * @param notifyOrderDTO 请求参数
+     * @return 购买商品支付回调
      */
     @Override
     public R batteryPayNotify(WxPayNotifyOrderDTO notifyOrderDTO) {
@@ -221,7 +230,7 @@
         String payNo = notifyOrderDTO.getWxTradeNo();
         BigDecimal cashFee = new BigDecimal(notifyOrderDTO.getCashFee());
         ComBatteryCommodityOrder commodityOrder = this.baseMapper.selectOne(new QueryWrapper<ComBatteryCommodityOrder>().lambda()
-                .eq(ComBatteryCommodityOrder::getOrderNo,orderNo));
+                .eq(ComBatteryCommodityOrder::getOrderNo, orderNo));
         if (commodityOrder == null) {
             log.error("用户购买商品订单微信支付回调错误,未查询到支付订单记录,支付订单号:" + orderNo);
             return R.fail("未查询到用户购买商品支付订单记录");
@@ -246,48 +255,49 @@
 
     /**
      * 小程序用户创建订单
-     * @param createOrderDto    请求参数
-     * @return  创建结果
+     *
+     * @param createOrderDto 请求参数
+     * @return 创建结果
      */
     @Override
     public R appletsOrderCreate(UserCreateOrderDto createOrderDto) {
         //查询商品
         ComBatteryCommodity commodity = commodityMapper.selectById(createOrderDto.getCommodityId());
-        if(commodity == null){
+        if (commodity == null) {
             return R.fail("未查询到商品信息");
         }
         //查询商品规格信息
         ComBatteryCommoditySpecs commoditySpecs = commoditySpecsMapper.selectById(createOrderDto.getSpecsId());
-        if(commoditySpecs == null){
+        if (commoditySpecs == null) {
             return R.fail("未查询到商品规格信息");
         }
         //判断商品库存
-        if(commoditySpecs.getStock() < createOrderDto.getCount()){
+        if (commoditySpecs.getStock() < createOrderDto.getCount()) {
             return R.fail("您购买的商品库存不足");
         }
         //查询用户收货地址
         ComBatteryUserAddress userAddress = userAddressMapper.selectById(createOrderDto.getAddressId());
-        if(userAddress == null){
+        if (userAddress == null) {
             return R.fail("未查询到用户收货地址");
         }
         //查询用户信息
         SysUser user = userMapper.selectById(createOrderDto.getUserId());
-        if(user == null){
+        if (user == null) {
             return R.fail("未查询到用户信息");
         }
         Date nowDate = new Date();
         //初始化订单信息
-        ComBatteryCommodityOrder commodityOrder = getCreateOrder(commodity,userAddress,user,commoditySpecs,createOrderDto,nowDate);
-        Map<String,Object> resultMap = new HashMap<>(2);
-        if(this.baseMapper.insert(commodityOrder) > 0){
+        ComBatteryCommodityOrder commodityOrder = getCreateOrder(commodity, userAddress, user, commoditySpecs, createOrderDto, nowDate);
+        Map<String, Object> resultMap = new HashMap<>(2);
+        if (this.baseMapper.insert(commodityOrder) > 0) {
             //更新商品库存
             commoditySpecs.setStock(commoditySpecs.getStock() - createOrderDto.getCount());
             commoditySpecsMapper.updateById(commoditySpecs);
 
             //微信支付需要调取小程序微信支付
-            String result = getWxPayResult(commodityOrder.getFinalAmount(),commodityOrder.getOpenId(),commodityOrder.getOrderNo(),"购买商品");
-            resultMap.put("payResult",result);
-            resultMap.put("orderId",commodityOrder.getId());
+            String result = getWxPayResult(commodityOrder.getFinalAmount(), commodityOrder.getOpenId(), commodityOrder.getOrderNo(), "购买商品");
+            resultMap.put("payResult", result);
+            resultMap.put("orderId", commodityOrder.getId());
 
             // 添加微信支付交易流水
             String wxTradeOrderNo = "wx" + Snowflake.getId();
@@ -300,16 +310,17 @@
 
     /**
      * 初始化订单数据
-     * @param commodity         商品数据
-     * @param userAddress       用户收货地址信息
-     * @param user              用户数据
-     * @param commoditySpecs    商品规格数据
-     * @param createOrderDto    用户请求参数
-     * @param nowDate           操作时间
-     * @return  初始化订单数据
+     *
+     * @param commodity      商品数据
+     * @param userAddress    用户收货地址信息
+     * @param user           用户数据
+     * @param commoditySpecs 商品规格数据
+     * @param createOrderDto 用户请求参数
+     * @param nowDate        操作时间
+     * @return 初始化订单数据
      */
-    private ComBatteryCommodityOrder getCreateOrder(ComBatteryCommodity commodity, ComBatteryUserAddress userAddress
-            , SysUser user, ComBatteryCommoditySpecs commoditySpecs, UserCreateOrderDto createOrderDto, Date nowDate){
+    public static ComBatteryCommodityOrder getCreateOrder(ComBatteryCommodity commodity, ComBatteryUserAddress userAddress
+            , SysUser user, ComBatteryCommoditySpecs commoditySpecs, UserCreateOrderDto createOrderDto, Date nowDate) {
         ComBatteryCommodityOrder commodityOrder = new ComBatteryCommodityOrder();
         commodityOrder.setUserId(user.getUserId());
         commodityOrder.setOpenId(user.getOpenid());
@@ -342,14 +353,10 @@
     /**
      * 小程序唤起微信支付
      *
-     * @param money
-     *            需要支付的金额
-     * @param openId
-     *            用户唤起微信支付的openid
-     * @param orderNo
-     *            业务订单号
-     * @param remark
-     *            交易备注
+     * @param money   需要支付的金额
+     * @param openId  用户唤起微信支付的openid
+     * @param orderNo 业务订单号
+     * @param remark  交易备注
      * @return 小程序支付参数
      */
     private String getWxPayResult(BigDecimal money, String openId, String orderNo, String remark) {
@@ -359,14 +366,16 @@
             money = BigDecimal.valueOf(0.01);
         }
         // 调用wx支付
-        result = WxPayUtils.getUnifiedorder(appid, mchId, payKey, currencyNotifyUrl + PayCpmstant.BATTERY_STORE_PAY_NOTIFY_URL, remark, openId, orderNo, money);
+        result = WxPayUtils.getUnifiedorder(appid, mchId, payKey, currencyNotifyUrl + PayCpmstant.BATTERY_STORE_PAY_NOTIFY_URL
+                , remark, openId, orderNo, money,null);
         log.info("用户购买商品微信支付返回参数:" + result);
         return result;
     }
 
     /**
      * 定时关闭5分钟未支付订单
-     * @return  操作结果
+     *
+     * @return 操作结果
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -374,19 +383,19 @@
         log.info("定时器定时关闭超过30分钟未支付订单,并返回商品库存");
         Date nowDate = new Date();
         //获取当前时间减30分钟时间
-        Date oldDate = DateUtils.addMinutes(nowDate,-5);
+        Date oldDate = DateUtils.addMinutes(nowDate, -5);
         List<ComBatteryCommodityOrder> commodityOrderList = this.baseMapper.selectList(new QueryWrapper<ComBatteryCommodityOrder>()
-                .lambda().eq(ComBatteryCommodityOrder::getStatus,ComBatteryCommodityOrder.Status.DFK)
-                .eq(ComBatteryCommodityOrder::getPayStatus,ComBatteryCommodityOrder.PayStatus.WZF)
-                .eq(ComBatteryCommodityOrder::getIsDel,ComBatteryCommodityOrder.IsDel.NO)
-                .lt(ComBatteryCommodityOrder::getCreateAt,oldDate));
+                .lambda().eq(ComBatteryCommodityOrder::getStatus, ComBatteryCommodityOrder.Status.DFK)
+                .eq(ComBatteryCommodityOrder::getPayStatus, ComBatteryCommodityOrder.PayStatus.WZF)
+                .eq(ComBatteryCommodityOrder::getIsDel, ComBatteryCommodityOrder.IsDel.NO)
+                .lt(ComBatteryCommodityOrder::getCreateAt, oldDate));
         commodityOrderList.forEach(commodityOrder -> {
             commodityOrder.setStatus(ComBatteryCommodityOrder.Status.YGB);
             commodityOrder.setUpdateAt(nowDate);
             this.baseMapper.updateById(commodityOrder);
             //归还库存
             ComBatteryCommoditySpecs commoditySpecs = commoditySpecsMapper.selectById(commodityOrder.getSpecsId());
-            if(commoditySpecs != null){
+            if (commoditySpecs != null) {
                 commoditySpecs.setStock(commoditySpecs.getStock() + commodityOrder.getCount());
                 commoditySpecs.setUpdateAt(nowDate);
                 commoditySpecsMapper.updateById(commoditySpecs);
@@ -397,14 +406,15 @@
 
     /**
      * 电动车商城用户确认收货
-     * @param id    订单id
-     * @param userId    用户id
-     * @return  确认结果
+     *
+     * @param id     订单id
+     * @param userId 用户id
+     * @return 确认结果
      */
     @Override
     public R appletsOrderReceiving(Long id, Long userId) {
         ComBatteryCommodityOrder commodityOrder = this.baseMapper.selectById(id);
-        if(commodityOrder == null){
+        if (commodityOrder == null) {
             return R.fail("未查询到订单信息");
         }
         //确认收货
@@ -412,7 +422,7 @@
         commodityOrder.setReceivingTime(new Date());
         commodityOrder.setUpdateAt(new Date());
         commodityOrder.setUpdateBy(userId);
-        if(this.baseMapper.updateById(commodityOrder) > 0){
+        if (this.baseMapper.updateById(commodityOrder) > 0) {
             return R.ok();
         }
         return R.fail();
@@ -420,34 +430,199 @@
 
     /**
      * 后台订单发货
-     * @param deliverAdminDto   请求参数
-     * @return  发货结果
+     *
+     * @param deliverAdminDto 请求参数
+     * @return 发货结果
      */
     @Override
     public R orderDeliver(OrderDeliverAdminDto deliverAdminDto) {
         //查询订单
         ComBatteryCommodityOrder commodityOrder = this.baseMapper.selectById(deliverAdminDto.getId());
-        if(commodityOrder == null){
+        if (commodityOrder == null) {
             return R.fail("未查询到订单信息");
         }
         Date nowDate = new Date();
         //判断操作类型
-        if(deliverAdminDto.getType().equals(OrderDeliverAdminDto.Type.FH)){
+        if (deliverAdminDto.getType().equals(OrderDeliverAdminDto.Type.FH)) {
             commodityOrder.setLogisticsCompany(deliverAdminDto.getLogisticsCompany());
             commodityOrder.setLogisticsNo(deliverAdminDto.getLogisticsNo());
             commodityOrder.setUpdateBy(deliverAdminDto.getUserId());
             commodityOrder.setUpdateAt(nowDate);
             commodityOrder.setDeliveryTime(nowDate);
             commodityOrder.setStatus(ComBatteryCommodityOrder.Status.DSH);
-        }else if(deliverAdminDto.getType().equals(OrderDeliverAdminDto.Type.XGWL)){
+        } else if (deliverAdminDto.getType().equals(OrderDeliverAdminDto.Type.XGWL)) {
             commodityOrder.setLogisticsCompany(deliverAdminDto.getLogisticsCompany());
             commodityOrder.setLogisticsNo(deliverAdminDto.getLogisticsNo());
             commodityOrder.setUpdateBy(deliverAdminDto.getUserId());
             commodityOrder.setUpdateAt(nowDate);
         }
-        if(this.baseMapper.updateById(commodityOrder) > 0){
+        if (this.baseMapper.updateById(commodityOrder) > 0) {
             return R.ok();
         }
         return R.fail();
     }
+
+    /**
+     * 电动车商城购买活动商品支付回调
+     *
+     * @param notifyOrderDTO 请求参数
+     * @return 购买商品支付回调
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public synchronized R batteryActivityPayNotify(WxPayNotifyOrderDTO notifyOrderDTO) {
+        Date payTime = DateUtils.stringToDate(notifyOrderDTO.getPayTime(), new SimpleDateFormat("yyyyMMddHHmmss"));
+        Date nowDate = new Date();
+        String orderNo = notifyOrderDTO.getOrderTradeNo();
+        String payNo = notifyOrderDTO.getWxTradeNo();
+        BigDecimal cashFee = new BigDecimal(notifyOrderDTO.getCashFee());
+        //查询该订单数据
+        ComBatteryCommodityOrder commodityOrder = this.baseMapper.selectOne(new QueryWrapper<ComBatteryCommodityOrder>().lambda()
+                .eq(ComBatteryCommodityOrder::getOrderNo, orderNo));
+        if (commodityOrder == null) {
+            log.error("用户购买商品订单微信支付回调错误,未查询到支付订单记录,支付订单号:" + orderNo);
+            return R.fail("未查询到用户购买商品支付订单记录");
+        }
+        if (!commodityOrder.getPayStatus().equals(ComBatteryCommodityOrder.PayStatus.WZF)) {
+            log.error("用户购买商品订单微信支付回调错误,错误原因:支付订单状态已发生改变,不可重复回调,订单号:" + orderNo);
+            return R.fail("支付订单状态已发生改变,不可重复回调");
+        }
+        //更新订单
+        if (commodityOrder.getActivityId() != null) {
+            switch (commodityOrder.getActivityType()) {
+                case ComBatteryCommodityOrder.ActivityType.PT:
+                    //拼团订单成功支付处理
+                    commodityOrder.setCollageStatus(ComBatteryCommodityOrder.CollageStatus.PTZ);
+                    commodityOrder.setStatus(ComBatteryCommodityOrder.Status.DPT);
+                    ComBatteryCommodityOrderCollageTeam orderCollageTeam = null;
+                    if(notifyOrderDTO.getAttach() != null && notifyOrderDTO.getAttach().equals("1")){
+                        //用户开团,创建团队信息
+                        orderCollageTeam = getOrderCollageTeam(commodityOrder,nowDate);
+                        orderCollageTeamMapper.insert(orderCollageTeam);
+                    }else{
+                        //用户参团,查询参加的团队信息
+                        orderCollageTeam = orderCollageTeamMapper.selectById(commodityOrder.getTeamId());
+                        //判断当前拼团人员是否已足够成团
+                        syncAssortedDoughStatus(orderCollageTeam.getId(),nowDate);
+                        //判断当前拼团活动是否已完成
+                        syncAssortedDoughActivityStatus(commodityOrder.getActivityId(),nowDate);
+                    }
+                    if(orderCollageTeam != null){
+                        //创建用户开团人员记录
+                        ComBatteryCommodityOrderCollageTeamPeople orderCollageTeamPeople = getOrderCollageTeamPeople(commodityOrder.getUserId()
+                                ,nowDate,orderCollageTeam,notifyOrderDTO.getAttach());
+                        orderCollageTeamPeopleMapper.insert(orderCollageTeamPeople);
+                    }
+                    break;
+                case ComBatteryCommodityOrder.ActivityType.KJ:
+                    break;
+                case ComBatteryCommodityOrder.ActivityType.MS:
+                    commodityOrder.setStatus(ComBatteryCommodityOrder.Status.DFH);
+                    break;
+                default:
+                    break;
+            }
+        }
+        // 更新微信支付流水记录
+        tradeOrderService.renewPayTrade(commodityOrder.getId(), cashFee, notifyOrderDTO.getWxTradeNo(), payTime, nowDate);
+
+        commodityOrder.setPayStatus(ComBatteryCommodityOrder.PayStatus.YZF);
+        commodityOrder.setPayNo(payNo);
+        commodityOrder.setPayAmount(cashFee);
+        commodityOrder.setUpdateAt(nowDate);
+        commodityOrder.setPayTime(payTime);
+        this.baseMapper.updateById(commodityOrder);
+        return R.ok();
+    }
+
+    /**
+     * 初始化拼团团队数据
+     * @param commodityOrder    用户订单数据
+     * @param nowDate   操作时间
+     * @return  拼团团队数据
+     */
+    private ComBatteryCommodityOrderCollageTeam getOrderCollageTeam(ComBatteryCommodityOrder commodityOrder,Date nowDate){
+        ComBatteryCommodityOrderCollageTeam orderCollageTeam = new ComBatteryCommodityOrderCollageTeam();
+        orderCollageTeam.setActivityId(commodityOrder.getActivityId());
+        orderCollageTeam.setOrderId(commodityOrder.getId());
+        orderCollageTeam.setOrderNo(commodityOrder.getOrderNo());
+        orderCollageTeam.setUserId(commodityOrder.getUserId());
+        orderCollageTeam.setStatus(ComBatteryCommodityOrderCollageTeam.Status.DDPT);
+        orderCollageTeam.setCreateAt(nowDate);
+        return orderCollageTeam;
+    }
+
+    /**
+     * 初始化拼团团队人员数据
+     * @param userId    用户id
+     * @param nowDate   操作时间
+     * @param orderCollageTeam  拼团团队数据
+     * @param type  拼团类型(1.开团 2.参团)
+     * @return  拼团团队人员数据
+     */
+    private ComBatteryCommodityOrderCollageTeamPeople getOrderCollageTeamPeople(Long userId
+            ,Date nowDate,ComBatteryCommodityOrderCollageTeam orderCollageTeam,String type){
+        ComBatteryCommodityOrderCollageTeamPeople orderCollageTeamPeople = new ComBatteryCommodityOrderCollageTeamPeople();
+        orderCollageTeamPeople.setUserId(userId);
+        orderCollageTeamPeople.setTeamId(orderCollageTeam.getId());
+        orderCollageTeamPeople.setHeadUserId(orderCollageTeam.getUserId());
+        orderCollageTeamPeople.setType(Integer.parseInt(type));
+        orderCollageTeamPeople.setCreateAt(nowDate);
+        orderCollageTeamPeople.setCreateBy(userId);
+        return orderCollageTeamPeople;
+    }
+
+    /**
+     * 同步拼团活动状态
+     * @param activityId    活动id
+     */
+    private void syncAssortedDoughActivityStatus(Long activityId,Date nowDate){
+        ComBatteryCommodityActivity commodityActivity = commodityActivityMapper.selectById(activityId);
+        if(commodityActivity != null){
+            //查询该活动已成团数量
+            Integer count = orderCollageTeamMapper.selectCount(new QueryWrapper<ComBatteryCommodityOrderCollageTeam>().lambda()
+                    .eq(ComBatteryCommodityOrderCollageTeam::getActivityId,activityId)
+                    .eq(ComBatteryCommodityOrderCollageTeam::getStatus,ComBatteryCommodityOrderCollageTeam.Status.PTCG));
+            if(count >= commodityActivity.getCollageNum()){
+                //该活动已达到活动拼团数量,修改为已结束状态
+                commodityActivity.setStatus(ComBatteryCommodityActivity.Status.YJS);
+                commodityActivity.setUpdateAt(nowDate);
+                commodityActivityMapper.updateById(commodityActivity);
+            }
+        }
+    }
+
+    /**
+     * 判断当前拼团团队是否已满足拼团条件
+     * @param teamId    拼团团队id
+     * @param nowDate    操作时间
+     */
+    private void syncAssortedDoughStatus(Long teamId,Date nowDate){
+        //查询拼团团队id
+        ComBatteryCommodityOrderCollageTeam orderCollageTeam = orderCollageTeamMapper.selectById(teamId);
+        if(orderCollageTeam != null){
+            ComBatteryCommodityActivity commodityActivity = commodityActivityMapper.selectById(orderCollageTeam.getActivityId());
+            if(commodityActivity != null){
+                Integer count = orderCollageTeamPeopleMapper.selectCount(new QueryWrapper<ComBatteryCommodityOrderCollageTeamPeople>()
+                        .lambda().eq(ComBatteryCommodityOrderCollageTeamPeople::getTeamId,teamId));
+                if(count >= commodityActivity.getCollageNum()){
+                    //拼团条件满足,将所有已拼单的用户的订单更新为待发货状态
+                    //更新拼团团队记录
+                    orderCollageTeam.setStatus(ComBatteryCommodityOrderCollageTeam.Status.PTCG);
+                    orderCollageTeamMapper.updateById(orderCollageTeam);
+                    //查询拼团订单并进行更新
+                    List<ComBatteryCommodityOrder> commodityOrderList = this.baseMapper.selectList(new QueryWrapper<ComBatteryCommodityOrder>().lambda()
+                            .eq(ComBatteryCommodityOrder::getTeamId,teamId).eq(ComBatteryCommodityOrder::getStatus,ComBatteryCommodityOrder.Status.DPT)
+                            .eq(ComBatteryCommodityOrder::getCollageStatus,ComBatteryCommodityOrder.CollageStatus.PTZ)
+                            .eq(ComBatteryCommodityOrder::getActivityType,ComBatteryCommodityOrder.ActivityType.PT));
+                    commodityOrderList.forEach(commodityOrder -> {
+                        commodityOrder.setStatus(ComBatteryCommodityOrder.Status.DFH);
+                        commodityOrder.setCollageStatus(ComBatteryCommodityOrder.CollageStatus.PTCG);
+                        commodityOrder.setUpdateAt(nowDate);
+                        this.baseMapper.updateById(commodityOrder);
+                    });
+                }
+            }
+        }
+    }
 }

--
Gitblit v1.7.1