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