From 8444084e6aa11efa23287e7f82474ac22378a5c4 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期二, 01 四月 2025 16:03:19 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java | 5939 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 5,673 insertions(+), 266 deletions(-) diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java index 2c2e93d..65d1676 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java @@ -1,42 +1,91 @@ package com.ruoyi.order.service.impl.order; - +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.binarywang.wxpay.bean.ecommerce.*; +import com.github.binarywang.wxpay.bean.ecommerce.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.bean.profitsharingV3.ProfitSharingNotifyResult; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.google.common.collect.Lists; +import com.google.gson.Gson; +import com.ruoyi.common.core.constant.CacheConstants; +import com.ruoyi.common.core.constant.Constants; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.enums.UserStatus; import com.ruoyi.common.core.exception.ServiceException; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.core.utils.ip.IpUtils; import com.ruoyi.common.core.utils.uuid.IdUtils; -import com.ruoyi.common.core.utils.uuid.UUID; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.common.security.utils.CodeFactoryUtil; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.order.config.WxPayConfiguration; import com.ruoyi.order.domain.dto.*; +import com.ruoyi.order.domain.pojo.account.OrderPayment; +import com.ruoyi.order.domain.pojo.account.OrderRefund; +import com.ruoyi.order.domain.pojo.account.ProfitSharing; import com.ruoyi.order.domain.pojo.order.ConsumerGoods; import com.ruoyi.order.domain.pojo.order.Order; import com.ruoyi.order.domain.pojo.order.OrderGoods; +import com.ruoyi.order.domain.pojo.order.PayRecord; import com.ruoyi.order.domain.vo.*; -import com.ruoyi.order.service.order.ConsumerGoodsService; -import com.ruoyi.order.service.order.OrderGoodsService; -import com.ruoyi.order.util.CodeFactoryUtil; -import com.ruoyi.system.api.domain.dto.*; -import com.ruoyi.system.api.service.*; +import com.ruoyi.order.enums.RefundStatusEnum; +import com.ruoyi.order.enums.dict.IDict; +import com.ruoyi.order.mapper.order.OrderMapper; +import com.ruoyi.order.service.account.OrderPaymentService; +import com.ruoyi.order.service.account.OrderRefundService; +import com.ruoyi.order.service.account.PaymentMessageService; +import com.ruoyi.order.service.account.ProfitSharingService; +import com.ruoyi.order.service.order.*; +import com.ruoyi.order.util.HuiFuTianXiaUtil; import com.ruoyi.system.api.constant.AppErrorConstant; +import com.ruoyi.system.api.constant.DelayTaskEnum; +import com.ruoyi.system.api.constant.SecurityConstant; +import com.ruoyi.system.api.domain.dto.*; +import com.ruoyi.system.api.domain.poji.activity.Activity; +import com.ruoyi.system.api.domain.poji.activity.ActivityRecord; +import com.ruoyi.system.api.domain.poji.config.DelayTask; import com.ruoyi.system.api.domain.poji.goods.Goods; import com.ruoyi.system.api.domain.poji.goods.GoodsFile; import com.ruoyi.system.api.domain.poji.goods.ShopGoods; +import com.ruoyi.system.api.domain.poji.member.BirthdayCard; import com.ruoyi.system.api.domain.poji.member.Member; +import com.ruoyi.system.api.domain.poji.member.MemberCoupon; +import com.ruoyi.system.api.domain.poji.member.MemberGiftRecord; import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.poji.sys.SysUser; -import com.ruoyi.system.api.domain.vo.AppOrderTotalVo; -import com.ruoyi.system.api.domain.vo.AppMemberCouponVo; -import com.ruoyi.order.mapper.order.OrderMapper; -import com.ruoyi.order.service.order.OrderService; -import com.ruoyi.system.api.domain.vo.MerHomeShopTotalVo; +import com.ruoyi.system.api.domain.vo.*; +import com.ruoyi.system.api.model.QwH5LoginVo; +import com.ruoyi.system.api.model.QwUserDetailDto; +import com.ruoyi.system.api.service.*; +import io.seata.spring.annotation.GlobalTransactional; +import lombok.extern.log4j.Log4j2; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; @@ -49,6 +98,7 @@ * @since 2023-04-25 */ @Service +@Log4j2 public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService { @Resource @@ -75,6 +125,46 @@ @Resource private RemoteShoppingCartService remoteShoppingCartService; + @Resource + private RemoteConfigService remoteConfigService; + + @Resource + private UserServiceRecordService userServiceRecordService; + + @Resource + private RemoteCouponService remoteCouponService; + + @Resource + private RemoteActivityService remoteActivityService; + + @Resource + private RedisService redisService; + + @Resource + private PayRecordService payRecordService; + + @Resource + private RedissonClient redissonClient; + + @Resource + private WxPayService wxService; + + @Resource + private PaymentMessageService paymentMessageService; + + @Resource + private OrderPaymentService orderPaymentService; + + @Resource + private ProfitSharingService profitSharingService; + + @Resource + private OrderRefundService orderRefundService; + + @Value("${wx.pay.callbackPath}") + private String callbackPath; + + /** * @description: buyGoods @@ -84,12 +174,33 @@ * @date: 2023/5/3 0:07 */ @Override - public AppSureOrderVo buyGoods(AppSureOrderDto appSureOrderDto){ + public AppSureOrderVo buyGoods(AppSureOrderDto appSureOrderDto) { Long userId = appSureOrderDto.getUserId(); + Shop shop = remoteShopService.getShop(appSureOrderDto.getShopId()).getData(); + if(shop!=null&&shop.getShopStatus()!=1){ + throw new ServiceException(AppErrorConstant.SHOP_CLOSED); + } + // 初始化订单对象 AppSureOrderVo appSureOrderVo = new AppSureOrderVo(); + // 初始化订单商品列表 List<AppSureOrderGoodsVo> appSureOrderGoodsVoList = new ArrayList<>(); AppSureOrderGoodsVo appSureOrderGoodsVo; + // 获取购买商品列表 List<AppBuyGoodsDto> appBuyGoodsDtoList = appSureOrderDto.getAppBuyGoodsDtoList(); + //获取商品列表 + StringJoiner goodsIdSJ = new StringJoiner(","); + for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) { + goodsIdSJ.add(appBuyGoodsDto.getGoodsId()); + } + List<Goods> goodsList = remoteGoodsService.listGoodsByGoodsId(goodsIdSJ.toString()).getData(); + Map<String, Goods> goodsMap = goodsList.stream() + .collect(Collectors.toMap(Goods::getGoodsId, Function.identity())); + Boolean haveDeposit = false; + for (Goods goods : goodsList) { + if (goods.getSubscriptionFlag()==1&&goods.getSubscription() != null && goods.getSubscription().compareTo(BigDecimal.ZERO) > 0) { + haveDeposit = true; + } + } String goodsId; Integer buyNum; BigDecimal buyNumBig; @@ -98,9 +209,17 @@ BigDecimal goodsPrice; BigDecimal goodsTotalPrice; BigDecimal goodsRealPrice; - List<AppMemberCouponVo> appMemberCouponVoList = remoteMemberService.listVoMemberCouponByUserId(userId).getData(); - List<AppMemberCouponVo> appGoodsMemberCouponVoList; - Map<Long,AppMemberCouponVo> appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity())); + MerBaseDto merBaseDto = new MerBaseDto(); + merBaseDto.setUserId(userId); + merBaseDto.setShopId(appSureOrderDto.getShopId()); + // 获取用户优惠券列表 + List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(merBaseDto).getData(); + + // 将优惠券列表转换为Map,以优惠券ID为键 + Map<String, AppMemberCouponVo> appMemberCouponVoMap = new HashMap<>(); + if (appMemberCouponVoList != null && !appMemberCouponVoList.isEmpty()) { + appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity())); + } AppMemberCouponVo appMemberCouponVo; Integer couponType; BigDecimal moneyThreshold; @@ -109,59 +228,83 @@ BigDecimal goodsDeposit; GoodsFile goodsFile; Integer useCoupon; + // 初始化订单相关金额 BigDecimal orderGoodsMoney = new BigDecimal("0.00"); BigDecimal couponDiscount = new BigDecimal("0.00"); BigDecimal orderPayDeposit = new BigDecimal("0.00"); BigDecimal orderPayMoney = new BigDecimal("0.00"); - for(AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList){ + // 遍历购买商品列表 + HashSet<Long> userCouponIdSet = new HashSet<>(); + for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) { appSureOrderGoodsVo = new AppSureOrderGoodsVo(); + discountMoney = BigDecimal.ZERO; useCoupon = 0; goodsId = appBuyGoodsDto.getGoodsId(); buyNum = appBuyGoodsDto.getBuyNum(); memberCouponId = appBuyGoodsDto.getMemberCouponId(); - goods = remoteGoodsService.getGoods(goodsId).getData(); + // 获取商品信息 + goods = goodsMap.get(goodsId); + if (goods.getGoodsStatus() != 1) { + throw new ServiceException(AppErrorConstant.GOODS_DOWN); + } + // 设置订单商品信息 appSureOrderGoodsVo.setGoodsId(goodsId); appSureOrderGoodsVo.setGoodsName(goods.getGoodsName()); appSureOrderGoodsVo.setGoodsIntroduction(goods.getGoodsIntroduction()); appSureOrderGoodsVo.setGoodsType(goods.getGoodsType()); - //商品图片 + appSureOrderGoodsVo.setGoodsTag(goods.getGoodsTags()); + // 获取商品图片 goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData(); appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl()); - buyNum = appBuyGoodsDto.getBuyNum(); appSureOrderGoodsVo.setBuyNum(buyNum); goodsPrice = goods.getSalesPrice(); - //商户定制价格 + // 获取商户定制价格 AppShopGoodsGetDto appShopGoodsGetDto = new AppShopGoodsGetDto(); appShopGoodsGetDto.setGoodsId(goods.getGoodsId()); appShopGoodsGetDto.setShopId(appSureOrderDto.getShopId()); ShopGoods shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); - if(shopGoods!=null){ + if (shopGoods != null) { goodsPrice = shopGoods.getSalesPrice(); } appSureOrderGoodsVo.setGoodsPrice(goodsPrice); buyNumBig = BigDecimal.valueOf(buyNum); goodsTotalPrice = goodsPrice.multiply(buyNumBig); goodsRealPrice = goodsTotalPrice; - if(memberCouponId!=null){ - appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId); - if(StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId)){ + // 处理优惠券 + if (null != memberCouponId) { + appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId.toString()); + System.err.println(JSON.toJSONString(appMemberCouponVoMap)); + System.err.println(memberCouponId); + System.err.println(JSON.toJSONString(appMemberCouponVo)); + if (StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId)) { couponType = appMemberCouponVo.getCouponType(); - if(couponType == 1 && appMemberCouponVo.getMoneyThreshold()!=null && appMemberCouponVo.getDiscountMoney()!=null){ + if (couponType == 1 && appMemberCouponVo.getMoneyThreshold() != null && appMemberCouponVo.getDiscountMoney() != null) { moneyThreshold = appMemberCouponVo.getMoneyThreshold(); - if(goodsTotalPrice.compareTo(moneyThreshold)>=0){ - discountMoney = appMemberCouponVo.getDiscountMoney(); + discountMoney = appMemberCouponVo.getDiscountMoney(); + if (goodsTotalPrice.compareTo(moneyThreshold) >= 0 && goodsTotalPrice.compareTo(discountMoney) > 0) { goodsRealPrice = goodsTotalPrice.subtract(discountMoney); useCoupon = 1; + userCouponIdSet.add(memberCouponId); + appSureOrderGoodsVo.setMemberCouponId(memberCouponId.toString()); } - }else if(couponType == 2 && appMemberCouponVo.getDiscountPercent()!=null){ + } else if (couponType == 2 && appMemberCouponVo.getDiscountPercent() != null) { discountPercent = appMemberCouponVo.getDiscountPercent(); - goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN).setScale(2,BigDecimal.ROUND_HALF_UP); - discountMoney = goodsRealPrice.subtract(goodsTotalPrice); + goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN, 2, BigDecimal.ROUND_HALF_UP); + discountMoney = goodsTotalPrice.subtract(goodsRealPrice); useCoupon = 1; - }else if(couponType == 3 && appMemberCouponVo.getDiscountMoney()!=null){ + userCouponIdSet.add(memberCouponId); + appSureOrderGoodsVo.setMemberCouponId(memberCouponId.toString()); + } else if (couponType == 3 && appMemberCouponVo.getDiscountMoney() != null) { discountMoney = appMemberCouponVo.getDiscountMoney(); - goodsRealPrice = goodsTotalPrice.subtract(discountMoney); - useCoupon = 1; + if (goodsTotalPrice.compareTo(discountMoney) > 0) { + goodsRealPrice = goodsTotalPrice.subtract(discountMoney); + if (goodsRealPrice.compareTo(BigDecimal.ZERO) < 0) { + goodsRealPrice = BigDecimal.ZERO; + } + useCoupon = 1; + userCouponIdSet.add(memberCouponId); + appSureOrderGoodsVo.setMemberCouponId(memberCouponId.toString()); + } } } } @@ -169,146 +312,344 @@ appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice); appSureOrderGoodsVo.setCouponDiscount(discountMoney); appSureOrderGoodsVo.setGoodsRealPrice(goodsRealPrice); + // 获取商品订金 goodsDeposit = goods.getSubscription(); - if(goodsDeposit == null){ - goodsDeposit = new BigDecimal("0.00"); + if (goods.getSubscriptionFlag()==1 && goodsDeposit != null && goodsDeposit.compareTo(BigDecimal.ZERO) > 0) { + goodsDeposit = goodsDeposit.multiply(buyNumBig); + } else { + if (haveDeposit) { + goodsDeposit = goodsRealPrice; + } else { + goodsDeposit = new BigDecimal("0.00"); + } } appSureOrderGoodsVo.setGoodsDeposit(goodsDeposit); + // 计算订单总金额 orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice); couponDiscount = couponDiscount.add(discountMoney); orderPayDeposit = orderPayDeposit.add(goodsDeposit); orderPayMoney = orderPayMoney.add(goodsRealPrice); - //商品关联优惠券 - appGoodsMemberCouponVoList = new ArrayList<>(); - if(appMemberCouponVoList!=null && !appMemberCouponVoList.isEmpty()){ - for(AppMemberCouponVo entity : appMemberCouponVoList){ - if(StringUtils.isBlank(entity.getRelGoodsIds())){ - appGoodsMemberCouponVoList.add(entity); - }else if(entity.getRelGoodsIds().contains(goodsId)){ - appGoodsMemberCouponVoList.add(entity); - } - } - appSureOrderGoodsVo.setAppMemberCouponVoList(appGoodsMemberCouponVoList); - } appSureOrderGoodsVoList.add(appSureOrderGoodsVo); } + //处理优惠券列表 + if (appMemberCouponVoList != null && !appMemberCouponVoList.isEmpty()) { + for (AppMemberCouponVo entity : appMemberCouponVoList) { + if (userCouponIdSet != null && userCouponIdSet.contains(entity.getMemberCouponId())) { + entity.setUseFlag(1); + } else { + entity.setUseFlag(0); + } + } + // 过滤商品优惠券列表 + List<AppMemberCouponVo> appGoodsMemberCouponVoList; + for (AppSureOrderGoodsVo sureOrderGoodsVo : appSureOrderGoodsVoList) { + appGoodsMemberCouponVoList = new ArrayList<>(); + for (AppMemberCouponVo entity : appMemberCouponVoList) { + if (StringUtils.isBlank(entity.getRelGoodsIds()) || entity.getRelGoodsIds().contains(sureOrderGoodsVo.getGoodsId())) { + if (entity.getCouponType() == 1) { + if (entity.getMoneyThreshold().compareTo(sureOrderGoodsVo.getGoodsTotalPrice()) <= 0) { + appGoodsMemberCouponVoList.add(entity); + } + /*if (entity.getMoneyThreshold().compareTo(sureOrderGoodsVo.getGoodsTotalPrice()) < 0 && entity.getDiscountMoney().compareTo(sureOrderGoodsVo.getGoodsTotalPrice()) < 0) { + appGoodsMemberCouponVoList.add(entity); + }*/ + } else if (entity.getCouponType() == 2) { + appGoodsMemberCouponVoList.add(entity); + } else if (entity.getCouponType() == 3) { + appGoodsMemberCouponVoList.add(entity); + /*if (entity.getDiscountMoney().compareTo(sureOrderGoodsVo.getGoodsTotalPrice()) < 0) { + appGoodsMemberCouponVoList.add(entity); + }*/ + } + + } + } + sureOrderGoodsVo.setAppMemberCouponVoList(appGoodsMemberCouponVoList); + } + } + // 设置订单相关金额 appSureOrderVo.setOrderGoodsMoney(orderGoodsMoney); appSureOrderVo.setCouponDiscount(couponDiscount); appSureOrderVo.setOrderPayDeposit(orderPayDeposit); appSureOrderVo.setOrderPayMoney(orderPayMoney); + // 设置订单商品列表 appSureOrderVo.setAppSureOrderGoodsVoList(appSureOrderGoodsVoList); return appSureOrderVo; } /** + * @param appPanicBuyDto + * @return AppSureOrderVo + * @description 抢购商品 + * @author jqs + * @date 2023/7/6 11:45 + */ + @Override + public AppPanicBuyVo panicBuyGoods(AppPanicBuyDto appPanicBuyDto) { + Long userId = appPanicBuyDto.getUserId(); + Shop shop = remoteShopService.getShop(appPanicBuyDto.getShopId()).getData(); + if(shop!=null&&shop.getShopStatus()!=1){ + throw new ServiceException(AppErrorConstant.SHOP_CLOSED); + } + AppPanicBuyVo appPanicBuyVo = new AppPanicBuyVo(); + String activityId = appPanicBuyDto.getActivityId(); + String goodsId = appPanicBuyDto.getGoodsId(); + Integer buyNum = appPanicBuyDto.getBuyNum(); + BigDecimal buyNumBig; + BigDecimal goodsPrice; + BigDecimal goodsTotalPrice; + BigDecimal goodsRealPrice; + BigDecimal goodsDeposit; + BigDecimal goodsActivityPrice; + GoodsFile goodsFile; + BigDecimal orderGoodsMoney = new BigDecimal("0.00"); + BigDecimal orderPayDeposit = new BigDecimal("0.00"); + BigDecimal orderPayMoney = new BigDecimal("0.00"); + ActivityGoodsGetDto activityGoodsGetDto = new ActivityGoodsGetDto(); + activityGoodsGetDto.setActivityId(activityId); + activityGoodsGetDto.setGoodsId(goodsId); + activityGoodsGetDto.setUserId(userId); + ActivityGoodsGetVo activityGoodsGetVo = remoteActivityService.getUserActivityGoods(activityGoodsGetDto).getData(); + if (activityGoodsGetVo.getActivityStatus() == 0) { + throw new ServiceException(AppErrorConstant.ACTIVITY_NO_START); + } + if (activityGoodsGetVo.getActivityStatus() == 2) { + throw new ServiceException(AppErrorConstant.ACTIVITY_END); + } + Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + activityId + "-" + goodsId); + if (surpNum == null || surpNum < 1) { + throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL); + } + if (activityGoodsGetVo.getAvailableBuyNum() < 1) { + throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_BEYOND); + } + if (activityGoodsGetVo.getAvailableBuyNum() < buyNum) { + throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_BEYOND); + } + Goods goods = remoteGoodsService.getGoods(goodsId).getData(); + if (goods.getGoodsStatus() != 1) { + throw new ServiceException(AppErrorConstant.GOODS_DOWN); + } + appPanicBuyVo.setActivityId(activityId); + appPanicBuyVo.setGoodsId(goodsId); + appPanicBuyVo.setGoodsName(goods.getGoodsName()); + appPanicBuyVo.setGoodsIntroduction(goods.getGoodsIntroduction()); + appPanicBuyVo.setGoodsType(goods.getGoodsType()); + appPanicBuyVo.setGoodsTag(goods.getGoodsTags()); + //商品图片 + goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData(); + appPanicBuyVo.setGoodsPicture(goodsFile.getFileUrl()); + appPanicBuyVo.setBuyNum(buyNum); + goodsPrice = goods.getSalesPrice(); + //商户定制价格 + AppShopGoodsGetDto appShopGoodsGetDto = new AppShopGoodsGetDto(); + appShopGoodsGetDto.setGoodsId(goods.getGoodsId()); + appShopGoodsGetDto.setShopId(appPanicBuyDto.getShopId()); + ShopGoods shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); + if (shopGoods != null) { + goodsPrice = shopGoods.getSalesPrice(); + } + appPanicBuyVo.setGoodsPrice(goodsPrice); + buyNumBig = BigDecimal.valueOf(buyNum); + goodsActivityPrice = activityGoodsGetVo.getActivityPrice(); + goodsTotalPrice = goodsActivityPrice.multiply(buyNumBig); + goodsRealPrice = goodsTotalPrice; + appPanicBuyVo.setActivityPrice(goodsActivityPrice); + appPanicBuyVo.setGoodsTotalPrice(goodsTotalPrice); + appPanicBuyVo.setGoodsRealPrice(goodsRealPrice); + goodsDeposit = activityGoodsGetVo.getActivitySubscription(); + if (goodsDeposit == null || goodsDeposit.compareTo(BigDecimal.ZERO) == 0) { + goodsDeposit = new BigDecimal("0.00"); + } else { + goodsDeposit = goodsDeposit.multiply(buyNumBig); + } + appPanicBuyVo.setGoodsDeposit(goodsDeposit); + orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice); + orderPayDeposit = orderPayDeposit.add(goodsDeposit); + orderPayMoney = orderPayMoney.add(goodsRealPrice); + appPanicBuyVo.setOrderGoodsMoney(orderGoodsMoney); + appPanicBuyVo.setOrderPayDeposit(orderPayDeposit); + appPanicBuyVo.setOrderPayMoney(orderPayMoney); + return appPanicBuyVo; + } + + /** * 创建订单 + * * @param appPlaceOrderDto * @return */ @Override - public AppPlaceOrderVo placeOrder(AppPlaceOrderDto appPlaceOrderDto){ + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public AppPlaceOrderVo placeOrder(AppPlaceOrderDto appPlaceOrderDto) { + // 获取用户ID Long userId = appPlaceOrderDto.getUserId(); + Member member = remoteMemberService.getMember(userId).getData(); + appPlaceOrderDto.setUserId(userId); + if (member != null) { + appPlaceOrderDto.setOpenid(member.getMiniOpenid()); + appPlaceOrderDto.setShopId(member.getRelationShopId()); + } + // 创建下单视图对象 AppPlaceOrderVo appPlaceOrderVo = new AppPlaceOrderVo(); + // 创建商品列表 List<AppSureOrderGoodsVo> appSureOrderGoodsVoList = new ArrayList<>(); AppSureOrderGoodsVo appSureOrderGoodsVo; + // 获取购买的商品列表 List<AppBuyGoodsDto> appBuyGoodsDtoList = appPlaceOrderDto.getAppBuyGoodsDtoList(); + StringJoiner goodsIdSJ = new StringJoiner(","); + for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) { + goodsIdSJ.add(appBuyGoodsDto.getGoodsId()); + } + //获取商品列表 + List<Goods> goodsList = remoteGoodsService.listGoodsByGoodsId(goodsIdSJ.toString()).getData(); + Map<String, Goods> goodsMap = goodsList.stream() + .collect(Collectors.toMap(Goods::getGoodsId, Function.identity())); + Boolean haveDeposit = false; + for (Goods goods : goodsList) { + if (goods.getSubscription() != null && goods.getSubscription().compareTo(BigDecimal.ZERO) > 0) { + haveDeposit = true; + } + } + // 初始化变量 String goodsId; Integer buyNum; BigDecimal buyNumBig; Integer serviceNum; Integer goodsNum = 0; Long memberCouponId; - Goods goods; + Goods goods = null; + GoodsFile goodsFile; BigDecimal goodsPrice; BigDecimal goodsTotalPrice; BigDecimal goodsRealPrice; - List<AppMemberCouponVo> appMemberCouponVoList = remoteMemberService.listVoMemberCouponByUserId(userId).getData(); - Map<Long,AppMemberCouponVo> appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity())); + MerBaseDto merBaseDto = new MerBaseDto(); + merBaseDto.setUserId(userId); + merBaseDto.setShopId(appPlaceOrderDto.getShopId()); + // 获取用户优惠券列表 + List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(merBaseDto).getData(); + // 将用户优惠券列表转换为Map,方便后续查找 + Map<String, AppMemberCouponVo> appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity())); AppMemberCouponVo appMemberCouponVo; + AppShopGoodsGetDto appShopGoodsGetDto; Integer couponType; BigDecimal moneyThreshold; BigDecimal discountMoney = new BigDecimal("0.00"); BigDecimal discountPercent; BigDecimal goodsDeposit; - GoodsFile goodsFile; Integer useCoupon; BigDecimal orderGoodsMoney = new BigDecimal("0.00"); BigDecimal couponDiscount = new BigDecimal("0.00"); BigDecimal orderPayDeposit = new BigDecimal("0.00"); BigDecimal orderPayMoney = new BigDecimal("0.00"); + // 创建订单ID和订单号 String orderId = IdUtils.simpleUUID(); + String orderNo = CodeFactoryUtil.getShopOrderNo(); OrderGoods orderGoods; String orderGoodsId; + // 创建商品类型集合,用于记录订单中所有商品的类型 HashSet<String> goodsTypeSet = new HashSet<>(); - for(AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList){ + //使用优惠券 + StringJoiner memberCouponSJ = new StringJoiner(","); + List<String> goodsNameList = new ArrayList<>(); + // 遍历购买的商品列表 + for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) { appSureOrderGoodsVo = new AppSureOrderGoodsVo(); useCoupon = 0; + // 获取商品ID和优惠券ID goodsId = appBuyGoodsDto.getGoodsId(); memberCouponId = appBuyGoodsDto.getMemberCouponId(); - goods = remoteGoodsService.getGoods(goodsId).getData(); + // 获取商品信息 + goods = goodsMap.get(goodsId); + goodsNameList.add(goods.getGoodsName()); + // 设置商品信息 appSureOrderGoodsVo.setGoodsId(goodsId); appSureOrderGoodsVo.setGoodsName(goods.getGoodsName()); appSureOrderGoodsVo.setGoodsIntroduction(goods.getGoodsIntroduction()); appSureOrderGoodsVo.setGoodsType(goods.getGoodsType()); - //商品图片 + // 获取商品图片 goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData(); appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl()); + // 获取购买数量 buyNum = appBuyGoodsDto.getBuyNum(); appSureOrderGoodsVo.setBuyNum(buyNum); + // 获取商品价格和服务数量 goodsPrice = goods.getSalesPrice(); serviceNum = goods.getServiceNum(); - //商户定制价格 - AppShopGoodsGetDto appShopGoodsGetDto = new AppShopGoodsGetDto(); + // 获取商户定制价格 + appShopGoodsGetDto = new AppShopGoodsGetDto(); appShopGoodsGetDto.setGoodsId(goods.getGoodsId()); appShopGoodsGetDto.setShopId(appPlaceOrderDto.getShopId()); ShopGoods shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); - if(shopGoods!=null){ + // 如果商户定制价格存在,则使用商户定制价格和服务数量 + if (shopGoods != null) { goodsPrice = shopGoods.getSalesPrice(); serviceNum = shopGoods.getServiceNum(); } appSureOrderGoodsVo.setGoodsPrice(goodsPrice); + // 计算商品总价 buyNumBig = BigDecimal.valueOf(buyNum); goodsTotalPrice = goodsPrice.multiply(buyNumBig); goodsRealPrice = goodsTotalPrice; - if(memberCouponId!=null){ - appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId); - if(StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId)){ + // 如果使用了优惠券,计算优惠后的价格 + if (memberCouponId != null) { + appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId.toString()); + if(null == appMemberCouponVo){ + throw new ServiceException("优惠券已使用"); + } + // 如果优惠券适用于该商品 + if (StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId)) { couponType = appMemberCouponVo.getCouponType(); - if(couponType == 1 && appMemberCouponVo.getMoneyThreshold()!=null && appMemberCouponVo.getDiscountMoney()!=null){ + // 根据优惠券类型计算优惠后的价格 + if (couponType == 1 && appMemberCouponVo.getMoneyThreshold() != null && appMemberCouponVo.getDiscountMoney() != null) { moneyThreshold = appMemberCouponVo.getMoneyThreshold(); - if(goodsTotalPrice.compareTo(moneyThreshold)>=0){ + if (goodsTotalPrice.compareTo(moneyThreshold) >= 0) { discountMoney = appMemberCouponVo.getDiscountMoney(); goodsRealPrice = goodsTotalPrice.subtract(discountMoney); useCoupon = 1; } - }else if(couponType == 2 && appMemberCouponVo.getDiscountPercent()!=null){ + } else if (couponType == 2 && appMemberCouponVo.getDiscountPercent() != null) { discountPercent = appMemberCouponVo.getDiscountPercent(); - goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN).setScale(2,BigDecimal.ROUND_HALF_UP); - discountMoney = goodsRealPrice.subtract(goodsTotalPrice); + goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN, 2, BigDecimal.ROUND_HALF_UP); + discountMoney = goodsTotalPrice.subtract(goodsRealPrice); useCoupon = 1; - }else if(couponType == 3 && appMemberCouponVo.getDiscountMoney()!=null){ + } else if (couponType == 3 && appMemberCouponVo.getDiscountMoney() != null) { discountMoney = appMemberCouponVo.getDiscountMoney(); goodsRealPrice = goodsTotalPrice.subtract(discountMoney); useCoupon = 1; } + if(goodsRealPrice.compareTo(BigDecimal.ZERO)<0){ + goodsRealPrice = BigDecimal.ZERO; + discountMoney = goodsTotalPrice; + } } + memberCouponSJ.add(memberCouponId + ""); } appSureOrderGoodsVo.setUseCoupon(useCoupon); appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice); appSureOrderGoodsVo.setCouponDiscount(discountMoney); appSureOrderGoodsVo.setGoodsRealPrice(goodsRealPrice); + // 获取商品押金 goodsDeposit = goods.getSubscription(); - if(goodsDeposit == null){ - goodsDeposit = new BigDecimal("0.00"); + if (goodsDeposit != null && goodsDeposit.compareTo(BigDecimal.ZERO) > 0) { + goodsDeposit = goodsDeposit.multiply(buyNumBig); + } else { + if (haveDeposit) { + goodsDeposit = goodsRealPrice; + } else { + goodsDeposit = new BigDecimal("0.00"); + } } appSureOrderGoodsVo.setGoodsDeposit(goodsDeposit); + // 计算商品总数量、商品总价、优惠总金额、支付押金、支付金额 goodsNum = goodsNum + buyNum; orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice); couponDiscount = couponDiscount.add(discountMoney); orderPayDeposit = orderPayDeposit.add(goodsDeposit); orderPayMoney = orderPayMoney.add(goodsRealPrice); - //创建OrderGoods + // 创建订单商品 orderGoods = new OrderGoods(); orderGoodsId = IdUtils.simpleUUID(); orderGoods.setOrderGoodsId(orderGoodsId); @@ -316,36 +657,43 @@ orderGoods.setOrderId(orderId); orderGoods.setGoodsId(goodsId); orderGoods.setBuyNum(buyNum); - if(memberCouponId!=null){ + if (memberCouponId != null) { orderGoods.setCouponId(memberCouponId.toString()); } orderGoods.setGoodsPrice(goodsPrice); + orderGoods.setGoodsDeposit(goodsDeposit); orderGoods.setGoodsTotalMoney(orderGoodsMoney); orderGoods.setGoodsReceivableMoney(goodsRealPrice); orderGoods.setCycleNumFlag(goods.getCycleNumFlag()); orderGoods.setServiceNum(serviceNum); orderGoods.setGoodsType(goods.getGoodsType()); + orderGoods.setGoodsName(goods.getGoodsName()); + orderGoods.setGoodsTag(goods.getGoodsTags()); + orderGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + orderGoods.setGoodsPicture(goodsFile.getFileUrl()); + // 保存订单商品 orderGoodsService.save(orderGoods); - //清空购物车 + // 清空购物车 AppShoppingCartDelDto appShoppingCartDelDto = new AppShoppingCartDelDto(); appShoppingCartDelDto.setGoodsId(goodsId); appShoppingCartDelDto.setUserId(userId); remoteShoppingCartService.deleteShoppingCart(appShoppingCartDelDto); - if(goods.getGoodsType()==1){ + // 记录商品类型 + if (goods.getGoodsType() == 1) { goodsTypeSet.add("周期"); - }else if(goods.getGoodsType()==2){ + } else if (goods.getGoodsType() == 2) { goodsTypeSet.add("服务"); - }else if(goods.getGoodsType()==3){ + } else if (goods.getGoodsType() == 3) { goodsTypeSet.add("体验"); - }else if(goods.getGoodsType()==4){ + } else if (goods.getGoodsType() == 4) { goodsTypeSet.add("单品"); } } + // 创建订单 Order order = new Order(); order.setOrderId(orderId); order.setDelFlag(0); - //为对接支付 直接付款成功 - order.setOrderStatus(2); + order.setOrderStatus(1); order.setOrderNo(orderNo); order.setOrderFrom(1); order.setShopId(appPlaceOrderDto.getShopId()); @@ -355,72 +703,727 @@ order.setDiscountMoney(couponDiscount); order.setReceivableMoney(orderPayMoney); order.setReceivableDeposit(orderPayDeposit); - order.setPayType(appPlaceOrderDto.getPayType()); - if(order.getPayType()==1){ + order.setOfflinePayMoney(BigDecimal.ZERO); + // 根据支付类型计算支付金额 + if (appPlaceOrderDto.getPayType() == 1) { order.setPayMoney(orderPayMoney); order.setOnlinePayMoney(orderPayMoney); appPlaceOrderVo.setPayMoney(orderPayMoney); appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + order.setChangeReceivableMoney(orderGoodsMoney.subtract(couponDiscount)); + order.setPayType(1); order.setCloseFlag(1); - }else if(order.getPayType()==2){ + } else if (appPlaceOrderDto.getPayType() == 2) { order.setPayMoney(orderPayDeposit); order.setOnlinePayMoney(orderPayDeposit); appPlaceOrderVo.setPayMoney(orderPayDeposit); appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + order.setChangeReceivableMoney(orderGoodsMoney.subtract(couponDiscount).subtract(orderPayDeposit)); + order.setPayType(2); order.setCloseFlag(0); } order.setOrderRemark(appPlaceOrderDto.getOrderRemark()); order.setGoodsNum(goodsNum); order.setCreateTime(new Date()); + if(member.getBindingFlag()==0){ + order.setUnbindingFlag(1); + }else{ + order.setUnbindingFlag(0); + } + // 保存订单 this.save(order); - //更新用户商品类型 - if(goodsTypeSet!=null&&goodsTypeSet.size()>0){ + appPlaceOrderVo.setOrderId(orderId); + appPlaceOrderVo.setOrderNo(orderNo); + //减去优惠券 + if (StringUtils.isNotBlank(memberCouponSJ.toString())) { + remoteCouponService.useMemberCoupon(memberCouponSJ.toString()); + } + //判断是否需要支付 不需要直接待核销 + if(appPlaceOrderVo.getPayMoney().compareTo(BigDecimal.ZERO)>0){ + String outTradeNo = IdUtils.simpleUUID(); + // 保存订单 交易流水 + order.setOutTradeNo(outTradeNo); + this.saveOrUpdate(order); + Integer delayTime = 30; + if (redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)) { + delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); + } + appPlaceOrderVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(), delayTime)); + //商品数据 + String goodsName = ""; + if (null != goodsNameList) { + goodsName = String.join(",", goodsNameList); + } +// // 小程序微信下单支付 +// createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), goodsName, outTradeNo, +// orderId, order.getPayMoney(), appPlaceOrderDto.getOpenid(), +// appPlaceOrderDto.getSpbillCreateIp()); + + // 小程序微信下单支付 TODO 更换支付渠道(汇付天下) + createWxPayInfo1(appPlaceOrderVo, userId, order.getShopId(), goodsName, outTradeNo, + orderId, order.getPayMoney(), appPlaceOrderDto.getOpenid(), + appPlaceOrderDto.getSpbillCreateIp()); + //生成自动取消订单延时任务 + String payStr = appPlaceOrderVo.getAppId()+"-"+appPlaceOrderVo.getTimeStamp()+"-"+appPlaceOrderVo.getNonceStr()+"-"+appPlaceOrderVo.getPackageStr()+"-"+appPlaceOrderVo.getSignType()+"-"+appPlaceOrderVo.getPaySign(); + redisService.setCacheObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId, payStr , delayTime.longValue(), TimeUnit.MINUTES); + DelayTask delayTask = new DelayTask(); + delayTask.setDelFlag(0); + delayTask.setCreateTime(new Date()); + delayTask.setEndTime(DateUtils.addMinutes(new Date(), delayTime)); + delayTask.setRedisKey(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId); + remoteConfigService.addDelayTask(delayTask); + appPlaceOrderVo.setZeroFlag(0); + }else{ + order.setOrderStatus(2); + this.saveOrUpdate(order); + appPlaceOrderVo.setZeroFlag(1); + } + // 更新用户商品类型统计 + if (goodsTypeSet != null && goodsTypeSet.size() > 0) { AppMemberGoodsTypeDto appMemberGoodsTypeDto = new AppMemberGoodsTypeDto(); appMemberGoodsTypeDto.setUserId(userId); appMemberGoodsTypeDto.setGoodsTypeSet(goodsTypeSet); remoteMemberService.updateMemberGoodsType(appMemberGoodsTypeDto); } - appPlaceOrderVo.setOrderId(orderId); - appPlaceOrderVo.setOrderNo(orderNo); - - //调用支付 - - return appPlaceOrderVo; } /** + * 小程序支付下单API + * @param appPlaceOrderVo + * @param userId + * @param shopId + * @param goodsName + * @param outTradeNo + * @param orderId + * @param payMoney + * @param openid + * @param payerClientIp + */ + + private void createWxPayInfo(AppPlaceOrderVo appPlaceOrderVo, Long userId, Long shopId, + String goodsName, String outTradeNo, + String orderId, BigDecimal payMoney, + String openid, String payerClientIp){ + try { + // 创建支付订单 + //2023-09-05 需求变更为统一支付到矗众 + /*R<String> resultMch = remoteShopService.getShopSubMchId(shopId); + String subMchId = resultMch.getData(); + if (StringUtils.isEmpty(subMchId)) { + throw new ServiceException("获取微信商户号失败"); + }*/ + String mainMchId = WxPayConfiguration.getPlatformTyMacId(); + WxPayConfig config = wxService.getConfig(); + config.setSubMchId(mainMchId); + PartnerTransactionsRequest request = new PartnerTransactionsRequest(); + request.setSpAppid(config.getAppId()); + request.setSpMchid(config.getMchId()); + request.setSubMchid(config.getSubMchId()); + // 商品描述 body + String description = goodsName + "-商品购买"; + + request.setDescription(description); + request.setOutTradeNo(outTradeNo); + request.setNotifyUrl(config.getNotifyUrl()); + // 结算信息 + PartnerTransactionsRequest.SettleInfo settleInfo = new PartnerTransactionsRequest.SettleInfo(); + // TODO 分账处理 + settleInfo.setProfitSharing(true); + settleInfo.setSubsidyAmount(BigDecimal.ZERO); + request.setSettleInfo(settleInfo); + + // 订单总金额 + Integer totalFee = payMoney.multiply(new BigDecimal(100)).intValue(); + PartnerTransactionsRequest.Amount amount = new PartnerTransactionsRequest.Amount(); + amount.setTotal(totalFee); + amount.setCurrency("CNY"); + request.setAmount(amount); + Date endTime = appPlaceOrderVo.getEndTime(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); + String rfc3339Format = formatter.format(endTime); + request.setTimeExpire(rfc3339Format); + // 支付者 + PartnerTransactionsRequest.Payer payer = new PartnerTransactionsRequest.Payer(); + payer.setSpOpenid(openid); + request.setPayer(payer); + + // 场景信息 + PartnerTransactionsRequest.SceneInfo sceneInfo = new PartnerTransactionsRequest.SceneInfo(); + sceneInfo.setPayerClientIp(payerClientIp); + request.setSceneInfo(sceneInfo); + TransactionsResult.JsapiResult result = wxService.getEcommerceService().partnerTransactions(TradeTypeEnum.JSAPI, request); + + // 请求参数 + Gson gson = new Gson(); + String payRequestJson = gson.toJson(request); + // 返回参数 + String payResponseJson = gson.toJson(result); + + // 支付相关信息返回 + appPlaceOrderVo.setAppId(result.getAppId()); + appPlaceOrderVo.setMchId(config.getMchId()); + appPlaceOrderVo.setTimeStamp(result.getTimeStamp()); + appPlaceOrderVo.setNonceStr(result.getNonceStr()); + appPlaceOrderVo.setPackageStr(result.getPackageValue()); + appPlaceOrderVo.setSignType(result.getSignType()); + appPlaceOrderVo.setPaySign(result.getPaySign()); + appPlaceOrderVo.setPrepayId(result.getPackageValue()); + + // 保存支付订单统一下单日志 + paymentMessageService.savePaymentMessage("1", orderId, payRequestJson, payResponseJson); + + // 保存支付订单统一下单支付记录 + orderPaymentService.saveOrderPayment(userId, shopId, mainMchId, orderId, outTradeNo, payMoney, + appPlaceOrderVo.getEndTime(), "Y", openid, + goodsName, result.getPackageValue()); + + } catch (WxPayException e) { + throw new ServiceException(e.getMessage()); + } + } + + + + + /** + * 小程序支付下单API + * @param appPlaceOrderVo + * @param userId + * @param shopId + * @param goodsName + * @param outTradeNo + * @param orderId + * @param payMoney + * @param openid + * @param payerClientIp + */ + + private void createWxPayInfo1(AppPlaceOrderVo appPlaceOrderVo, Long userId, Long shopId, + String goodsName, String outTradeNo, + String orderId, BigDecimal payMoney, + String openid, String payerClientIp){ + try { + WxPayConfig config = wxService.getConfig(); + PartnerTransactionsRequest request = new PartnerTransactionsRequest(); + request.setSpAppid(config.getAppId()); + request.setSpMchid(config.getMchId()); + request.setSubMchid(config.getSubMchId()); + // 商品描述 body + String description = goodsName + "-商品购买"; + + request.setDescription(description); + request.setOutTradeNo(outTradeNo); + request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentCallback"); + + R<com.alibaba.fastjson.JSONObject> r = HuiFuTianXiaUtil.weixinPayment(outTradeNo, description, payMoney.doubleValue(), openid, request.getNotifyUrl()); + if(r.getCode() != 200){ + throw new ServiceException(r.getMsg()); + }else{ + new Thread(new Runnable() { + @Override + public void run() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + int time = 0; + for (int i = 0; i < 13; i++) { + try { + time += (5000 * i); + Thread.sleep(time); + } catch (InterruptedException e) { + e.printStackTrace(); + } + R<WeixinPaymentNotifyVo> voR = HuiFuTianXiaUtil.queryPayment(outTradeNo, sdf.format(new Date())); + if(voR.getCode() == 200){ + WeixinPaymentNotifyVo data = voR.getData(); + //P:处理中;S:成功;F:失败;I: 初始(初始状态很罕见,请联系汇付技术人员处理); + String transStat = data.getTransStat(); + if("S".equals(transStat)){ + PartnerTransactionsResult transaction = new PartnerTransactionsResult(); + transaction.setOutTradeNo(data.getReqSeqId()); + payBack(transaction, data.getFeeFlag() == 1 ? BigDecimal.ZERO : new BigDecimal(data.getFeeAmount())); + return; + } + if("P".equals(transStat) || "F".equals(transStat)){ + continue; + } + log.error("支付失败,流水号:{}, 状态码:{}", outTradeNo, transStat); + return; + }else{ + log.error("支付查询失败!流水号:{},结果:{}", outTradeNo, voR.getMsg()); + } + } + } + }).start(); + } + com.alibaba.fastjson.JSONObject data = r.getData(); + String mainMchId = WxPayConfiguration.getPlatformTyMacId(); + // 支付相关信息返回 + appPlaceOrderVo.setAppId(data.getString("appId")); + appPlaceOrderVo.setMchId(config.getMchId()); + appPlaceOrderVo.setTimeStamp(data.getString("timeStamp")); + appPlaceOrderVo.setNonceStr(data.getString("nonceStr")); + appPlaceOrderVo.setPackageStr(data.getString("package")); + appPlaceOrderVo.setSignType(data.getString("signType")); + appPlaceOrderVo.setPaySign(data.getString("paySign")); + + // 保存支付订单统一下单日志 + paymentMessageService.savePaymentMessage("1", orderId, JSON.toJSONString(request), data.toJSONString()); + + // 保存支付订单统一下单支付记录 + orderPaymentService.saveOrderPayment(userId, shopId, mainMchId, orderId, outTradeNo, payMoney, + appPlaceOrderVo.getEndTime(), "Y", openid, + goodsName, appPlaceOrderVo.getPackageStr()); + }catch (Exception e){ + e.printStackTrace(); + } + + } + + + + + + /** + * @param appPlaceActivityDto + * @return AppPlaceOrderVo + * @description 创建活动订单 + * @author jqs + * @date 2023/7/6 17:59 + */ + @Override + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public AppPlaceOrderVo placeActivityOrder(AppPlaceActivityDto appPlaceActivityDto) { + Long userId = appPlaceActivityDto.getUserId(); + Member member = remoteMemberService.getMember(userId).getData(); + appPlaceActivityDto.setUserId(userId); + if (member != null && member.getRelationShopId() != null) { + appPlaceActivityDto.setOpenid(member.getMiniOpenid()); + appPlaceActivityDto.setShopId(member.getRelationShopId()); + } + // 创建订单对象 + AppPlaceOrderVo appPlaceOrderVo = new AppPlaceOrderVo(); + // 定义商品订单对象 + AppSureOrderGoodsVo appSureOrderGoodsVo; + // 获取活动ID,商品ID,购买数量 + String activityId = appPlaceActivityDto.getActivityId(); + String goodsId = appPlaceActivityDto.getGoodsId(); + Integer buyNum = appPlaceActivityDto.getBuyNum(); + //redis分布式锁库存控制 + String goodsLock = "goods_lock_" + activityId + "_" + goodsId; + RLock redissonLock = redissonClient.getLock(goodsLock); + Integer surpNum = 0; + try { + redissonLock.lock(30, TimeUnit.SECONDS); + surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + activityId + "-" + goodsId); + if (surpNum == null || surpNum < buyNum) { + throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL); + } + // 定义购买数量,服务数量,商品数量 + BigDecimal buyNumBig; + Integer serviceNum; + Integer goodsNum = 0; + // 定义商品,商品文件,商品价格,商品总价,商品实际价格,折扣金额,折扣百分比,商品押金,使用优惠券,订单商品金额,优惠券折扣,订单支付押金,订单支付金额 + Goods goods; + GoodsFile goodsFile; + BigDecimal goodsPrice; + BigDecimal goodsTotalPrice; + BigDecimal goodsRealPrice; + BigDecimal discountMoney = new BigDecimal("0.00"); + BigDecimal goodsDeposit; + Integer useCoupon; + BigDecimal orderGoodsMoney = new BigDecimal("0.00"); + BigDecimal couponDiscount = new BigDecimal("0.00"); + BigDecimal orderPayDeposit = new BigDecimal("0.00"); + BigDecimal orderPayMoney = new BigDecimal("0.00"); + // 创建活动商品对象,并设置活动ID,商品ID,用户ID + ActivityGoodsGetDto activityGoodsGetDto = new ActivityGoodsGetDto(); + activityGoodsGetDto.setActivityId(activityId); + activityGoodsGetDto.setGoodsId(goodsId); + activityGoodsGetDto.setUserId(userId); + // 获取用户活动商品 + ActivityGoodsGetVo activityGoodsGetVo = remoteActivityService.getUserActivityGoods(activityGoodsGetDto).getData(); + // 检查活动状态 + if (activityGoodsGetVo.getActivityStatus() == 0) { + throw new ServiceException(AppErrorConstant.ACTIVITY_NO_START); + } + if (activityGoodsGetVo.getActivityStatus() == 2) { + throw new ServiceException(AppErrorConstant.ACTIVITY_END); + } + if (activityGoodsGetVo.getAvailableBuyNum() < 1) { + throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL); + } + if (activityGoodsGetVo.getAvailableBuyNum() < buyNum) { + throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_BEYOND); + } + // 创建订单ID和订单号 + String orderId = IdUtils.simpleUUID(); + String orderNo = CodeFactoryUtil.getShopOrderNo(); + // 创建订单商品对象和订单商品ID + OrderGoods orderGoods; + String orderGoodsId; + // 创建商品类型集合 + HashSet<String> goodsTypeSet = new HashSet<>(); + HashSet<String> goodsNurseSet = new HashSet<>(); + // 创建商品订单对象,并设置商品ID,商品名称,商品介绍,商品类型 + appSureOrderGoodsVo = new AppSureOrderGoodsVo(); + useCoupon = 0; + goodsId = appPlaceActivityDto.getGoodsId(); + goods = remoteGoodsService.getGoods(goodsId).getData(); + appSureOrderGoodsVo.setGoodsId(goodsId); + appSureOrderGoodsVo.setGoodsName(goods.getGoodsName()); + appSureOrderGoodsVo.setGoodsIntroduction(goods.getGoodsIntroduction()); + appSureOrderGoodsVo.setGoodsType(goods.getGoodsType()); + // 获取商品图片 + goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData(); + appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl()); + // 设置购买数量,商品价格,服务数量 + appSureOrderGoodsVo.setBuyNum(buyNum); + serviceNum = goods.getServiceNum(); + // 获取活动价格 + goodsPrice = activityGoodsGetVo.getActivityPrice(); + appSureOrderGoodsVo.setGoodsPrice(goodsPrice); + // 计算商品总价,商品实际价格 + buyNumBig = BigDecimal.valueOf(buyNum); + goodsTotalPrice = goodsPrice.multiply(buyNumBig); + goodsRealPrice = goodsTotalPrice; + // 设置使用优惠券,商品总价,优惠券折扣,商品实际价格 + appSureOrderGoodsVo.setUseCoupon(useCoupon); + appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice); + appSureOrderGoodsVo.setCouponDiscount(discountMoney); + appSureOrderGoodsVo.setGoodsRealPrice(goodsRealPrice); + // 获取商品押金 + goodsDeposit = activityGoodsGetVo.getActivitySubscription(); + if (goodsDeposit == null || goodsDeposit.compareTo(BigDecimal.ZERO) == 0) { + goodsDeposit = new BigDecimal("0.00"); + } else { + goodsDeposit = goodsDeposit.multiply(buyNumBig); + } + appSureOrderGoodsVo.setGoodsDeposit(goodsDeposit); + // 计算商品数量,订单商品金额,优惠券折扣,订单支付押金,订单支付金额 + goodsNum = goodsNum + buyNum; + orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice); + couponDiscount = couponDiscount.add(discountMoney); + orderPayDeposit = orderPayDeposit.add(goodsDeposit); + orderPayMoney = orderPayMoney.add(goodsRealPrice); + // 创建订单商品,并设置订单商品ID,删除标志,订单ID,商品ID,购买数量,商品价格,商品押金,商品总金额,商品应收金额,周期数量标志,服务数量,商品类型,商品名称,商品图片 + orderGoods = new OrderGoods(); + orderGoodsId = IdUtils.simpleUUID(); + orderGoods.setOrderGoodsId(orderGoodsId); + orderGoods.setDelFlag(0); + orderGoods.setOrderId(orderId); + orderGoods.setGoodsId(goodsId); + orderGoods.setBuyNum(buyNum); + orderGoods.setGoodsPrice(goodsPrice); + orderGoods.setGoodsDeposit(goodsDeposit); + orderGoods.setGoodsTotalMoney(orderGoodsMoney); + orderGoods.setGoodsReceivableMoney(goodsRealPrice); + orderGoods.setCycleNumFlag(goods.getCycleNumFlag()); + orderGoods.setServiceNum(serviceNum); + orderGoods.setGoodsType(goods.getGoodsType()); + orderGoods.setGoodsTag(goods.getGoodsTags()); + orderGoods.setGoodsName(goods.getGoodsName()); + orderGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + orderGoods.setGoodsPicture(goodsFile.getFileUrl()); + // 保存订单商品 + orderGoodsService.save(orderGoods); + // 清空购物车 + AppShoppingCartDelDto appShoppingCartDelDto = new AppShoppingCartDelDto(); + appShoppingCartDelDto.setGoodsId(goodsId); + appShoppingCartDelDto.setUserId(userId); + remoteShoppingCartService.deleteShoppingCart(appShoppingCartDelDto); + // 根据商品类型添加到商品类型集合中 + if (goods.getGoodsType() == 1) { + goodsTypeSet.add("周期"); + } else if (goods.getGoodsType() == 2) { + goodsTypeSet.add("服务"); + } else if (goods.getGoodsType() == 3) { + goodsTypeSet.add("体验"); + } else if (goods.getGoodsType() == 4) { + goodsTypeSet.add("单品"); + } + String goodsNurse = goods.getGoodsNurses(); + if (StringUtils.isNotBlank(goodsNurse)) { + String[] goodsNurseArr = goodsNurse.split(","); + for (String str : goodsNurseArr) { + goodsNurseSet.add(str); + } + } + // 创建订单,并设置订单ID,删除标志,订单状态,订单号,订单来源,店铺ID,用户ID,订单金额,优惠券金额,折扣金额,应收金额,应收押金,变动应收金额,支付类型 + Order order = new Order(); + order.setOrderId(orderId); + order.setDelFlag(0); + order.setOrderStatus(1); + order.setOrderNo(orderNo); + order.setOrderFrom(2); + order.setShopId(appPlaceActivityDto.getShopId()); + order.setUserId(userId); + order.setOrderMoney(orderGoodsMoney); + order.setCouponMoney(couponDiscount); + order.setDiscountMoney(couponDiscount); + order.setReceivableMoney(orderPayMoney); + order.setReceivableDeposit(orderPayDeposit); + order.setActivityId(activityId); + order.setActivityName(activityGoodsGetVo.getActivityName()); + order.setOfflinePayMoney(BigDecimal.ZERO); + // 根据支付类型设置订单支付金额,在线支付金额,订单支付金额,未支付金额,关闭标志 + if (appPlaceActivityDto.getPayType() == 1) { + order.setPayMoney(orderPayMoney); + order.setOnlinePayMoney(orderPayMoney); + appPlaceOrderVo.setPayMoney(orderPayMoney); + appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + order.setPayType(1); + order.setCloseFlag(1); + order.setChangeReceivableMoney(orderGoodsMoney.subtract(couponDiscount)); + } else if (appPlaceActivityDto.getPayType() == 2) { + order.setPayMoney(orderPayDeposit); + order.setOnlinePayMoney(orderPayDeposit); + appPlaceOrderVo.setPayMoney(orderPayDeposit); + appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + order.setPayType(2); + order.setCloseFlag(0); + order.setChangeReceivableMoney(orderGoodsMoney.subtract(couponDiscount).subtract(orderPayDeposit)); + } + // 设置订单备注,商品数量,创建时间 + order.setOrderRemark(appPlaceActivityDto.getOrderRemark()); + order.setGoodsNum(goodsNum); + order.setCreateTime(new Date()); + //订单是否未绑定时下单 + if(member.getBindingFlag()==0){ + order.setUnbindingFlag(1); + }else{ + order.setUnbindingFlag(0); + } + // 保存订单 + this.save(order); + // 更新用户商品类型 + if (goodsTypeSet != null || goodsNurseSet != null) { + AppMemberGoodsTypeDto appMemberGoodsTypeDto = new AppMemberGoodsTypeDto(); + appMemberGoodsTypeDto.setUserId(userId); + appMemberGoodsTypeDto.setGoodsTypeSet(goodsTypeSet); + appMemberGoodsTypeDto.setGoodsNurseSet(goodsNurseSet); + remoteMemberService.updateMemberGoodsType(appMemberGoodsTypeDto); + } + // 设置订单ID和订单号 + appPlaceOrderVo.setOrderId(orderId); + appPlaceOrderVo.setOrderNo(orderNo); + //改变活动库存 + AGStockChangeDto agStockChangeDto = new AGStockChangeDto(); + agStockChangeDto.setActivityId(activityId); + agStockChangeDto.setGoodsId(goodsId); + agStockChangeDto.setChangeType(2); + agStockChangeDto.setChangeNum(buyNum); + agStockChangeDto.setShopId(order.getShopId()); + agStockChangeDto.setUserId(order.getUserId()); + remoteActivityService.changeActivityStock(agStockChangeDto); + //支付金额大于0走支付 负责直接完成订单 + if(appPlaceOrderVo.getPayMoney().compareTo(BigDecimal.ZERO)>0){ + String outTradeNo = IdUtils.simpleUUID(); + // 保存订单 交易流水 + order.setOutTradeNo(outTradeNo); + this.saveOrUpdate(order); + //自动取消订单任务时间获取 + Integer delayTime = 30; + if (redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)) { + delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); + } + appPlaceOrderVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(), delayTime)); + // 小程序微信下单支付 +// createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), orderGoods.getGoodsName(), outTradeNo, +// orderId, order.getPayMoney(), appPlaceActivityDto.getOpenid(), +// appPlaceActivityDto.getSpbillCreateIp()); + + // 小程序微信下单支付 TODO 更换支付渠道(汇付天下) + createWxPayInfo1(appPlaceOrderVo, userId, order.getShopId(), orderGoods.getGoodsName(), outTradeNo, + orderId, order.getPayMoney(), appPlaceActivityDto.getOpenid(), + appPlaceActivityDto.getSpbillCreateIp()); + //生成自动取消订单延时任务 + String payStr = appPlaceOrderVo.getAppId()+"-"+appPlaceOrderVo.getTimeStamp()+"-"+appPlaceOrderVo.getNonceStr()+"-"+appPlaceOrderVo.getPackageStr()+"-"+appPlaceOrderVo.getSignType()+"-"+appPlaceOrderVo.getPaySign(); + redisService.setCacheObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId, payStr , delayTime.longValue(), TimeUnit.MINUTES); + DelayTask delayTask = new DelayTask(); + delayTask.setDelFlag(0); + delayTask.setCreateTime(new Date()); + delayTask.setEndTime(DateUtils.addMinutes(new Date(), delayTime)); + delayTask.setRedisKey(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId); + remoteConfigService.addDelayTask(delayTask); + appPlaceOrderVo.setZeroFlag(0); + }else{ + order.setOrderStatus(2); + this.saveOrUpdate(order); + appPlaceOrderVo.setZeroFlag(1); + } + //生成活动参加记录 + ActivityRecord activityRecord = new ActivityRecord(); + activityRecord.setDelFlag(0); + activityRecord.setActivityId(activityId); + activityRecord.setUserId(userId); + activityRecord.setOrderTime(order.getCreateTime()); + activityRecord.setOrderMoney(order.getOrderMoney()); + activityRecord.setOrderId(orderId); + activityRecord.setCreateTime(new Date()); + activityRecord.setBuyNum(orderGoods.getBuyNum()); + activityRecord.setGoodsId(orderGoods.getGoodsId()); + activityRecord.setActivityMoney(activityGoodsGetVo.getActivityPrice()); + remoteActivityService.addActivityRecord(activityRecord); + //扣除redis库存 + redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + activityId + "-" + goodsId, surpNum - buyNum); + } catch (Exception e){ + log.error("活动订单购买失败:"+e.getMessage()); + throw new ServiceException(e.getMessage()); + } finally { + redissonLock.unlock(); + } + return appPlaceOrderVo; + } + + + /** * 分页获取用户订单 + * * @param page * @param appUserOrderPageDto * @return */ @Override - public List<AppUserOrderPageVo> pageUserOrder(Page page, AppUserOrderPageDto appUserOrderPageDto){ - List<AppUserOrderPageVo> appUserOrderPageVoList = orderMapper.pageUserOrder(page,appUserOrderPageDto); - if(appUserOrderPageVoList!=null&&!appUserOrderPageVoList.isEmpty()){ + public List<AppUserOrderPageVo> pageUserOrder(Page page, AppUserOrderPageDto appUserOrderPageDto) { + Long userId = appUserOrderPageDto.getUserId(); + Member member = remoteMemberService.getMember(userId).getData(); + List<AppUserOrderPageVo> appUserOrderPageVoList = orderMapper.pageUserOrder(page, appUserOrderPageDto); + //处理商户名称显示 + if (appUserOrderPageVoList != null && !appUserOrderPageVoList.isEmpty()) { Long shopId; - Shop shop; - HashSet<Long> set=new HashSet<Long>(); - for(AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList){ + String activityId; + HashSet<Long> shopSet = new HashSet<Long>(); + HashSet<String> activitySet = new HashSet<String>(); + // 遍历订单列表,获取店铺ID和活动ID + for (AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList) { shopId = appUserOrderPageVo.getShopId(); - set.add(shopId); - } - Map<Long, Shop> shopMap = new HashMap<>(); - set.forEach(shopIdLong -> { - Shop shopTemp = remoteShopService.getShop(shopIdLong).getData(); - shopMap.put(shopIdLong, shopTemp); - }); - for(AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList){ - shop = shopMap.get(appUserOrderPageVo.getShopId()); - appUserOrderPageVo.setShopName(shop.getShopName()); - appUserOrderPageVo.setShopServicePhone(shop.getShopServicePhone()); - if(appUserOrderPageVo.getShopId().equals(appUserOrderPageDto.getShopId())){ - appUserOrderPageVo.setSameShop(1); - }else{ - appUserOrderPageVo.setSameShop(0); + shopSet.add(shopId); + if(appUserOrderPageVo.getOrderFrom()==2){ + activityId = appUserOrderPageVo.getActivityId(); + activitySet.add(activityId); } - appUserOrderPageVo.setVerifyCode("1-"+appUserOrderPageVo.getOrderId()); + } + String shopJoinedString = String.join(",", shopSet.stream().map(Object::toString).collect(Collectors.toList())); + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(shopJoinedString); + List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData(); + Map<Long, MgtSimpleShopVo> shopMap = simpleShopVoList.stream() + .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity())); + MgtSimpleShopVo simpleShopVo; + Integer delayTime = 30; + if (redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)) { + delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); + } + //处理订单回显 + for (AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList) { + if(member.getBindingFlag()==0&&appUserOrderPageVo.getOrderFrom()==2){ + //查询秒杀活动的参与店铺 + R<Activity> activity = remoteActivityService.getActivity(appUserOrderPageVo.getActivityId()); + if(activity.getCode() != 200){ + throw new RuntimeException(activity.getMsg()); + } + Activity data = activity.getData(); + if(data.getAreaFlag() == 1){ + appUserOrderPageVo.setShopNumber(0); + appUserOrderPageVo.setShopName("全部店铺"); + } + if(data.getAreaFlag() == 2 && data.getShopFlag() == 1){ + String designatedArea = data.getDesignatedArea(); + String[] split = designatedArea.split(","); + List<String> list = Arrays.asList(split); + R<List<Shop>> listR = remoteShopService.listShopByCityCode(list); + if(listR.getCode() != 200){ + throw new RuntimeException(listR.getMsg()); + } + List<Shop> data1 = listR.getData(); + appUserOrderPageVo.setShopNumber(1); + appUserOrderPageVo.setShopName(JSON.toJSONString(data1)); + } + if(data.getShopFlag() == 2){ + String applicableShop = data.getApplicableShop(); + String[] split = applicableShop.split(","); + List<String> list = Arrays.asList(split); + R<List<Shop>> listR = remoteShopService.listShopByIds(list); + if(listR.getCode() != 200){ + throw new RuntimeException(listR.getMsg()); + } + List<Shop> data1 = listR.getData(); + appUserOrderPageVo.setShopNumber(1); + appUserOrderPageVo.setShopName(JSON.toJSONString(data1)); + } + }else if(member.getBindingFlag()==1&&appUserOrderPageVo.getOrderFrom()==2){ + Long relationShopId = member.getRelationShopId(); + R<Shop> shop = remoteShopService.getShop(relationShopId); + if(shop.getCode() != 200){ + throw new RuntimeException(shop.getMsg()); + } + Shop data1 = shop.getData(); + //查询秒杀活动的参与店铺 + R<Activity> activity = remoteActivityService.getActivity(appUserOrderPageVo.getActivityId()); + if(activity.getCode() != 200){ + throw new RuntimeException(activity.getMsg()); + } + Activity data = activity.getData(); + if(data.getAreaFlag() == 1){ + appUserOrderPageVo.setShopNumber(2); + appUserOrderPageVo.setShopName(data1.getShopName()); + appUserOrderPageVo.setShopServicePhone(data1.getShopServicePhone()); + } + if(data.getAreaFlag() == 2 && data.getShopFlag() == 1){ + String designatedArea = data.getDesignatedArea(); + String[] split = designatedArea.split(","); + List<String> list = Arrays.asList(split); + R<List<Shop>> listR = remoteShopService.listShopByCityCode(list); + if(listR.getCode() != 200){ + throw new RuntimeException(listR.getMsg()); + } + List<Shop> data2 = listR.getData(); + List<Long> collect = data2.stream().map(Shop::getShopId).collect(Collectors.toList()); + if(collect.contains(relationShopId)){ + appUserOrderPageVo.setShopNumber(2); + appUserOrderPageVo.setShopName(data1.getShopName()); + appUserOrderPageVo.setShopServicePhone(data1.getShopServicePhone()); + }else{ + appUserOrderPageVo.setShopNumber(1); + appUserOrderPageVo.setShopName(JSON.toJSONString(data2)); + } + } + if(data.getShopFlag() == 2){ + String applicableShop = data.getApplicableShop(); + String[] split = applicableShop.split(","); + List<String> list = Arrays.asList(split); + R<List<Shop>> listR = remoteShopService.listShopByIds(list); + if(listR.getCode() != 200){ + throw new RuntimeException(listR.getMsg()); + } + List<Shop> data2 = listR.getData(); + List<Long> collect = data2.stream().map(Shop::getShopId).collect(Collectors.toList()); + if(collect.contains(relationShopId)){ + appUserOrderPageVo.setShopNumber(2); + appUserOrderPageVo.setShopName(data1.getShopName()); + appUserOrderPageVo.setShopServicePhone(data1.getShopServicePhone()); + }else{ + appUserOrderPageVo.setShopNumber(1); + appUserOrderPageVo.setShopName(JSON.toJSONString(data2)); + } + } + + + + }else{ + simpleShopVo = shopMap.get(appUserOrderPageVo.getShopId()); + appUserOrderPageVo.setShopName(simpleShopVo.getShopName()); + appUserOrderPageVo.setShopServicePhone(simpleShopVo.getShopServicePhone()); + appUserOrderPageVo.setShopNumber(2); + if (appUserOrderPageVo.getShopId().equals(appUserOrderPageDto.getShopId())) { + appUserOrderPageVo.setSameShop(1); + } else { + appUserOrderPageVo.setSameShop(0); + } + } + appUserOrderPageVo.setVerifyCode("1-" + appUserOrderPageVo.getOrderId()); + appUserOrderPageVo.setEndTime(DateUtils.addMinutes(appUserOrderPageVo.getCreateTime(), delayTime)); } } return appUserOrderPageVoList; @@ -428,15 +1431,14 @@ /** - * * @param appBaseGetDto * @return */ @Override - public AppUserOrderGetVo getAppOrderDetail(AppBaseGetDto appBaseGetDto){ + public AppUserOrderGetVo getAppOrderDetail(AppBaseGetDto appBaseGetDto) { String orderId = appBaseGetDto.getId(); Order order = this.getById(orderId); - List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listVoByOrderId(orderId); + List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listAppVoByOrderId(orderId); AppUserOrderGetVo appUserOrderGetVo = new AppUserOrderGetVo(); appUserOrderGetVo.setOrderId(orderId); appUserOrderGetVo.setOrderNo(order.getOrderNo()); @@ -446,6 +1448,8 @@ appUserOrderGetVo.setCouponDiscount(order.getCouponMoney()); appUserOrderGetVo.setReceivableDeposit(order.getReceivableDeposit()); appUserOrderGetVo.setReceivableMoney(order.getReceivableMoney()); + appUserOrderGetVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getOnlinePayMoney())); + appUserOrderGetVo.setPayType(order.getPayType()); appUserOrderGetVo.setPayMoney(order.getPayMoney()); appUserOrderGetVo.setOrderRemark(order.getOrderRemark()); appUserOrderGetVo.setShopId(order.getShopId()); @@ -457,27 +1461,95 @@ Shop shop = remoteShopService.getShop(order.getShopId()).getData(); appUserOrderGetVo.setShopName(shop.getShopName()); appUserOrderGetVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList); - appUserOrderGetVo.setVerifyCode("1-"+orderId); + appUserOrderGetVo.setVerifyCode("1-" + orderId); + //获取订单取消时间 + Integer delayTime = 30; + if (redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)) { + delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); + } + appUserOrderGetVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(), delayTime)); return appUserOrderGetVo; } /** * 取消订单 + * * @param orderId */ @Override - public void cancelOrder(String orderId){ + public void cancelOrder(String orderId) { Order order = this.getById(orderId); - if(order.getOrderStatus()!=1){ + // 订单状态-1.删除 0.已取消 1.待支付 2.待核销 3.已完成 + if (order.getOrderStatus() == 0) { + throw new ServiceException(AppErrorConstant.CANCEL_CANCEL_ORDER); + } else if (order.getOrderStatus() == 1) { + //删除待支付超时取消延时任务 + redisService.deleteObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId); + remoteConfigService.deleteDelayTask(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode()+"-"+orderId); + this.autoCancelOrder(orderId); + } else if (order.getOrderStatus() == 2) { + // 2.待核销 -> 订单退款 + this.refundOrder(orderId); + } else { throw new ServiceException(AppErrorConstant.CANCEL_ERROR_ORDER); } - order.setOrderStatus(0); - order.setCancelTime(new Date()); - this.saveOrUpdate(order); + } + + /** + * @description 支付订单 + * @author jqs + * @date 2023/8/27 15:26 + * @param orderId + * @return AppPlaceOrderVo + */ + @Override + public AppPlaceOrderVo payOrder(String orderId){ + // 根据订单ID获取订单 + Order order = this.getById(orderId); + // 如果订单状态不是1(待支付),抛出异常 + if(order.getOrderStatus() != 1){ + throw new ServiceException(AppErrorConstant.CANCEL_CANCEL_ORDER); + } + // 从缓存中获取支付信息 + String payStr = redisService.getCacheObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId); + // 如果支付信息为空,抛出异常 + if(StringUtils.isBlank(payStr)){ + throw new ServiceException(AppErrorConstant.CANCEL_CANCEL_ORDER); + } + // 默认延迟时间为30分钟 + Integer delayTime = 30; + // 如果缓存中存在自动取消订单时间,使用缓存中的值作为延迟时间 + if (redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)) { + delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); + } + // 创建AppPlaceOrderVo对象 + AppPlaceOrderVo appPlaceOrderVo = new AppPlaceOrderVo(); + // 根据未支付订单ID获取订单支付信息 + OrderPayment orderPayment = orderPaymentService.getByUnpaidOrderId(orderId); + // 将支付信息拆分为数组 + String[] payArr = payStr.split("-"); + // 设置AppPlaceOrderVo对象的属性 + appPlaceOrderVo.setOrderId(order.getOrderId()); + appPlaceOrderVo.setOrderNo(order.getOrderNo()); + appPlaceOrderVo.setPayType(order.getPayType()); + appPlaceOrderVo.setPayMoney(order.getPayMoney()); + appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + appPlaceOrderVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(), delayTime)); + appPlaceOrderVo.setAppId(payArr[0]); + appPlaceOrderVo.setMchId(orderPayment.getSubMchId()); + appPlaceOrderVo.setTimeStamp(payArr[1]); + appPlaceOrderVo.setNonceStr(payArr[2]); + appPlaceOrderVo.setPackageStr(payArr[3]); + appPlaceOrderVo.setSignType(payArr[4]); + appPlaceOrderVo.setPaySign(payArr[5]); + appPlaceOrderVo.setPrepayId(orderPayment.getPrepayId()); + // 返回AppPlaceOrderVo对象 + return appPlaceOrderVo; } /** * 获取用户订单统计 + * * @param userId * @return */ @@ -497,35 +1569,187 @@ /** * 获取B端首页统计 + * * @param merHomeShopTotalVo * @return */ @Override - public MerHomeShopTotalVo getMerHomeTotal(MerHomeShopTotalVo merHomeShopTotalVo){ - Long shopId = merHomeShopTotalVo.getShopId(); - Integer todayShop = 0; - Integer unHandleOrder = 0; - BigDecimal shopTurnover = new BigDecimal("0.00"); - Integer cycleSurp = 0; - Integer explorationSurp = 0; + public MerHomeShopTotalVo getMerHomeTotal(MerHomeShopTotalVo merHomeShopTotalVo) { + // 查询用户信息 + QwUserDetailDto qwUserDetail = new QwUserDetailDto(); + Long userId = SecurityUtils.getUserId(); + qwUserDetail.setUserid(userId.toString()); + // 查询用户信息 + R<QwH5LoginVo> userResult = remoteShopService.qwH5Login(qwUserDetail); + if(userResult==null){ + throw new ServiceException(AppErrorConstant.USER_NO_SHOP); + } + if (R.FAIL == userResult.getCode()) + { + throw new ServiceException(userResult.getMsg()); + } + if (401 == userResult.getCode()) + { + throw new ServiceException("商户已被冻结,请联系管理员",401); + } + QwH5LoginVo userInfo = userResult.getData(); + SysUser user = userInfo.getSysUser(); + String username = user.getUserName(); + // IP黑名单校验 + String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST)); + if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) + { + throw new ServiceException("很遗憾,访问IP已被列入系统黑名单"); + } + if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); + } + if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + throw new ServiceException("对不起,您的账号:" + username + " 已停用"); + } + // 查询用户商户 + R<ShopRelUserVo> shopResult = remoteShopService.getShopByUserId(user.getUserId()); + if (R.FAIL == userResult.getCode()) { + throw new ServiceException(userResult.getMsg()); + } + ShopRelUserVo shopInfo = shopResult.getData(); + if(null == shopInfo){ + throw new ServiceException("未查询到商户信息"); + } + Long shopId = shopInfo.getShopId(); + Shop shop = remoteShopService.getShop(shopId).getData(); + if(-1 == shop.getShopStatus()){ + throw new ServiceException("对应商户已删除,请联系管理员"); + } + if(0 == shop.getShopStatus()){ + throw new ServiceException("对应商户已冻结,请联系管理员"); + } + if(2 == shop.getShopStatus()){ + throw new ServiceException("对应商户已终止合作,请联系管理员"); + } + + + shopId = merHomeShopTotalVo.getShopId(); + + //获取今日到店 + Integer todayShop = userServiceRecordService.countShopServicePerson(shopId); + //获取待处理订单和营业额 + merHomeShopTotalVo = orderMapper.getMerHomeShopTotalVo(shopId); + //获取服务统计 + MerHomeShopTotalVo serviceTotalVo = orderMapper.getMerHomeShopServiceTotalVo(shopId); merHomeShopTotalVo.setTodayShop(todayShop); - merHomeShopTotalVo.setUnHandleOrder(unHandleOrder); - merHomeShopTotalVo.setShopTurnover(shopTurnover); - merHomeShopTotalVo.setCycleSurp(cycleSurp); - merHomeShopTotalVo.setExplorationSurp(explorationSurp); + merHomeShopTotalVo.setCycleSurp(serviceTotalVo.getCycleSurp()); + merHomeShopTotalVo.setExplorationSurp(serviceTotalVo.getExplorationSurp()); return merHomeShopTotalVo; } /** * 核销订单 + * * @param orderId * @return */ @Override - public MerVerifyOrderVo verifyOrder(String orderId){ + public MerVerifyOrderVo verifyOrder(String orderId, Long shopId) { + // 创建返回对象 MerVerifyOrderVo merVerifyOrderVo = new MerVerifyOrderVo(); + if(orderId.contains("+")){ + orderId = orderId.substring(0, orderId.indexOf("+")); + } + // 根据订单ID获取订单信息 Order order = this.getById(orderId); - List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listVoByOrderId(orderId); + if (order.getOrderStatus() != 2) { + throw new ServiceException(AppErrorConstant.VERIFY_USED); + } + // 根据订单用户ID获取用户信息 + Member member = remoteMemberService.getMember(order.getUserId()).getData(); + // 根据订单ID获取订单商品列表 + List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listAppVoByOrderId(orderId); + //判断用户是否绑定 + if(member.getBindingFlag()==1){ + //绑定用户判断核销商户 + if (order.getOrderFrom()==2&&!member.getRelationShopId().equals(shopId)) { + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + if(order.getOrderFrom() == 1){ + //商城订单和绑定后活动订单判断核销商户和订单商户和用户关联商户是否统一 + if (!order.getShopId().equals(shopId)) { + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + if (!member.getRelationShopId().equals(shopId)) { + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + }else{ + //未绑定用户判断核销商户 + //商城订单需判断商户 + if(order.getOrderFrom()==1){ + if (!order.getShopId().equals(shopId)) { + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + //未绑定用户的活动订单需判断活动订单是否支持该店铺 + if(order.getOrderFrom()==2){ + String activityId = order.getActivityId(); + MerActivityShopDto merActivityShopDto = new MerActivityShopDto(); + merActivityShopDto.setShopId(shopId); + merActivityShopDto.setActivityId(activityId); + Boolean judge = remoteActivityService.judgeActivityShop(merActivityShopDto).getData(); + if(!judge){ + throw new ServiceException(AppErrorConstant.SHOP_NO_ACTIVITY); + } + } + //未绑定用户需判断核销商城订单判断商品单价和优惠券 + /*StringJoiner goodsIdSJ = new StringJoiner(","); + for (AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList) { + goodsIdSJ.add(appUserOrderGoodsPageVo.getGoodsId()); + } + //获取商品列表 + List<Goods> goodsList = remoteGoodsService.listGoodsByGoodsId(goodsIdSJ.toString()).getData(); + Map<String, Goods> goodsMap = goodsList.stream() + .collect(Collectors.toMap(Goods::getGoodsId, Function.identity())); + Goods goods; + ShopGoods shopGoods; + AppShopGoodsGetDto appShopGoodsGetDto; + for (AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList) { + appShopGoodsGetDto= new AppShopGoodsGetDto(); + appShopGoodsGetDto.setShopId(shopId); + appShopGoodsGetDto.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); + shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); + goods = goodsMap.get(appUserOrderGoodsPageVo.getGoodsId()); + //当商户定制价格不为空时判断商品定制价格否则判断商品价格是否一致 + if(shopGoods!=null){ + if(shopGoods.getSalesPrice().compareTo(appUserOrderGoodsPageVo.getGoodsPrice())!=0){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + if(appUserOrderGoodsPageVo.getCycleNumFlag()==0){ + if(shopGoods.getServiceNum()!=null){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + }else{ + if(shopGoods.getServiceNum()!=appUserOrderGoodsPageVo.getServiceNum()){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + }else{ + if(goods.getSalesPrice().compareTo(appUserOrderGoodsPageVo.getGoodsPrice())!=0){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + if(appUserOrderGoodsPageVo.getCycleNumFlag()==0){ + if(goods.getServiceNum()!=null){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + }else{ + if(goods.getServiceNum()!=appUserOrderGoodsPageVo.getServiceNum()){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + } + }*/ + } + // 设置返回对象的属性值 merVerifyOrderVo.setOrderId(orderId); merVerifyOrderVo.setOrderNo(order.getOrderNo()); merVerifyOrderVo.setOrderStatus(order.getOrderStatus()); @@ -533,63 +1757,185 @@ merVerifyOrderVo.setOrderGoodsMoney(order.getOrderMoney()); merVerifyOrderVo.setCouponDiscount(order.getCouponMoney()); merVerifyOrderVo.setReceivableDeposit(order.getReceivableDeposit()); - merVerifyOrderVo.setReceivableMoney(order.getReceivableMoney()); + if(order.getPayType()==1){ + merVerifyOrderVo.setReceivableMoney(order.getReceivableMoney()); + }else{ + merVerifyOrderVo.setReceivableMoney(order.getOrderMoney().subtract(order.getCouponMoney()).subtract(order.getReceivableDeposit())); + } merVerifyOrderVo.setPayMoney(order.getPayMoney()); merVerifyOrderVo.setOrderRemark(order.getOrderRemark()); merVerifyOrderVo.setCreateTime(order.getCreateTime()); merVerifyOrderVo.setPayTime(order.getPayTime()); merVerifyOrderVo.setUseTime(order.getUseTime()); merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList); - SysUser sysUser = remoteUserService.getSysUser(order.getUserId()).getData(); - merVerifyOrderVo.setUserName(sysUser.getNickName()); - merVerifyOrderVo.setUserMobile(sysUser.getPhonenumber()); + merVerifyOrderVo.setPayType(order.getPayType()); + merVerifyOrderVo.setRealReceiveMoney(order.getChangeReceivableMoney()); + if(order.getPayType()==1){ + merVerifyOrderVo.setReceiveMoney(order.getPayMoney()); + }else{ + if(order.getOfflinePayMoney()!=null){ + merVerifyOrderVo.setReceiveMoney(order.getOfflinePayMoney()); + }else{ + merVerifyOrderVo.setReceiveMoney(BigDecimal.ZERO); + } + } + merVerifyOrderVo.setUnReceiveMoney(merVerifyOrderVo.getRealReceiveMoney().subtract(merVerifyOrderVo.getReceiveMoney())); + merVerifyOrderVo.setUserId(order.getUserId()); + merVerifyOrderVo.setUserName(member.getRealName()); + merVerifyOrderVo.setUserMobile(member.getMobile()); merVerifyOrderVo.setCloseFlag(order.getCloseFlag()); + // 返回结果 return merVerifyOrderVo; } /** * 确认核销订单 + * * @param merVerifyOrderDto * @return */ @Override - public MerVerifyOrderVo sureVerifyOrder(MerVerifyOrderDto merVerifyOrderDto){ + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public MerVerifyOrderVo sureVerifyOrder(MerVerifyOrderDto merVerifyOrderDto) { String orderId = merVerifyOrderDto.getOrderId(); BigDecimal relReceiveMoney = merVerifyOrderDto.getRelReceiveMoney(); BigDecimal relPayMoney = merVerifyOrderDto.getRelPayMoney(); Date nowTime = new Date(); //更新订单信息 Order order = this.getById(orderId); + if (order.getOrderStatus() != 2) { + throw new ServiceException(AppErrorConstant.VERIFY_USED); + } + Member member = remoteMemberService.getMember(order.getUserId()).getData(); + //获取核销商户 + ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(merVerifyOrderDto.getUserId()).getData(); + Long shopId = shopRelUserVo.getShopId(); + log.info("当前核销员工【" + shopRelUserVo.getUserName() + "】门店ID:" + shopId); + //获取订单商品列表 + List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listAppVoByOrderId(orderId); + //绑定用户判断核销商户 + if(member.getBindingFlag()==1){ + //未绑定的活动订单只需要判断店铺是否支持 + if(order.getOrderFrom()==2 && !member.getRelationShopId().equals(shopId)){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + if(order.getOrderFrom()==2 && member.getRelationShopId().equals(shopId)){ + String activityId = order.getActivityId(); + MerActivityShopDto merActivityShopDto = new MerActivityShopDto(); + merActivityShopDto.setShopId(shopId); + merActivityShopDto.setActivityId(activityId); + Boolean judge = remoteActivityService.judgeActivityShop(merActivityShopDto).getData(); + if(!judge){ + throw new ServiceException(AppErrorConstant.SHOP_NO_ACTIVITY); + } + } + }else{ + //商城订单需判断商户 + if(order.getOrderFrom()==1){ + if (!order.getShopId().equals(shopId)) { + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + //未绑定用户需判断活动订单是否支持该店铺 + if(order.getOrderFrom()==2){ + String activityId = order.getActivityId(); + MerActivityShopDto merActivityShopDto = new MerActivityShopDto(); + merActivityShopDto.setShopId(shopId); + merActivityShopDto.setActivityId(activityId); + Boolean judge = remoteActivityService.judgeActivityShop(merActivityShopDto).getData(); + if(!judge){ + throw new ServiceException(AppErrorConstant.SHOP_NO_ACTIVITY); + } + } + } + order.setShopId(shopId); order.setOrderStatus(3); order.setUseTime(nowTime); order.setUseUserId(merVerifyOrderDto.getUserId()); order.setOfflinePayMoney(relPayMoney); - order.setPayMoney(relReceiveMoney.add(relPayMoney)); - order.setCloseFlag(1); + order.setOffPayTime(nowTime); + order.setPayMoney(order.getPayMoney().add(relPayMoney)); + order.setChangeReceivableMoney(relReceiveMoney); + //判断订单是否结清 + if (order.getPayMoney().compareTo(order.getChangeReceivableMoney()) >= 0) { + order.setCloseFlag(1); + } else { + order.setCloseFlag(0); + } this.saveOrUpdate(order); //创建服务商品 - List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listVoByOrderId(orderId); + //获取商品信息(商品简介,调理问题) + StringJoiner goodsIdSj = new StringJoiner(","); + for (AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList) { + goodsIdSj.add(appUserOrderGoodsPageVo.getGoodsId()); + } + String goodsIds = goodsIdSj.toString(); + List<Goods> goodsList = remoteGoodsService.listGoodsByGoodsId(goodsIds).getData(); + Map<String, Goods> goodsMap = goodsList.stream() + .collect(Collectors.toMap(Goods::getGoodsId, Function.identity())); ConsumerGoods consumerGoods; String consumerGoodsId; - for(AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList){ - consumerGoods = new ConsumerGoods(); - consumerGoodsId = IdUtils.simpleUUID(); - consumerGoods.setConsumerGoodsId(consumerGoodsId); - consumerGoods.setDelFlag(0); - consumerGoods.setServiceStatus(1); - consumerGoods.setShopId(order.getShopId()); - consumerGoods.setUserId(order.getUserId()); - consumerGoods.setOrderId(orderId); - consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); - consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); - consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); - consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); - consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); - consumerGoods.setUsedNum(0); - consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); - consumerGoods.setCreateTime(nowTime); - consumerGoodsService.save(consumerGoods); + Goods goods; + //循环生成商品服务 + List<ConsumerGoods> consumerGoodsList = new ArrayList<>(); + for (AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList) { + Integer buyNum = appUserOrderGoodsPageVo.getBuyNum(); + //判断是否次数未确认商品 是则创建未确认周期商品服务 否则循环创建商品服务 + if (appUserOrderGoodsPageVo.getCycleNumFlag() == 0) { + consumerGoods = new ConsumerGoods(); + goods = goodsMap.get(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoodsId = IdUtils.simpleUUID(); + consumerGoods.setConsumerGoodsId(consumerGoodsId); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(order.getShopId()); + consumerGoods.setUserId(order.getUserId()); + consumerGoods.setOrderId(orderId); + consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); + consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); + consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); + consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); + consumerGoods.setUsedNum(0); + consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); + consumerGoods.setGoodsTag(appUserOrderGoodsPageVo.getGoodsTag()); + consumerGoods.setCreateTime(nowTime); + consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + consumerGoods.setGoodsPicture(appUserOrderGoodsPageVo.getGoodsPicture()); + consumerGoods.setGoodsNurses(goods.getGoodsNurses()); + consumerGoods.setSourceFrom(1); + consumerGoods.setSureNum(buyNum); + consumerGoodsList.add(consumerGoods); + } else { + for (int i = 0; i < buyNum; i++) { + consumerGoods = new ConsumerGoods(); + goods = goodsMap.get(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoodsId = IdUtils.simpleUUID(); + consumerGoods.setConsumerGoodsId(consumerGoodsId); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(order.getShopId()); + consumerGoods.setUserId(order.getUserId()); + consumerGoods.setOrderId(orderId); + consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); + consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); + consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); + consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); + consumerGoods.setUsedNum(0); + consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); + consumerGoods.setGoodsTag(appUserOrderGoodsPageVo.getGoodsTag()); + consumerGoods.setCreateTime(nowTime); + consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + consumerGoods.setGoodsPicture(appUserOrderGoodsPageVo.getGoodsPicture()); + consumerGoods.setGoodsNurses(goods.getGoodsNurses()); + consumerGoods.setSourceFrom(1); + consumerGoodsList.add(consumerGoods); + } + } } + consumerGoodsService.saveBatchConsumerGoods(consumerGoodsList); //生成返回 MerVerifyOrderVo merVerifyOrderVo = new MerVerifyOrderVo(); merVerifyOrderVo.setOrderId(orderId); @@ -599,33 +1945,583 @@ merVerifyOrderVo.setOrderGoodsMoney(order.getOrderMoney()); merVerifyOrderVo.setCouponDiscount(order.getCouponMoney()); merVerifyOrderVo.setReceivableDeposit(order.getReceivableDeposit()); - merVerifyOrderVo.setReceivableMoney(order.getReceivableMoney()); merVerifyOrderVo.setPayMoney(order.getPayMoney()); merVerifyOrderVo.setOrderRemark(order.getOrderRemark()); merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList); merVerifyOrderVo.setCreateTime(order.getCreateTime()); merVerifyOrderVo.setPayTime(order.getPayTime()); merVerifyOrderVo.setUseTime(order.getUseTime()); - SysUser sysUser = remoteUserService.getSysUser(order.getUserId()).getData(); - merVerifyOrderVo.setUserName(sysUser.getNickName()); - merVerifyOrderVo.setUserMobile(sysUser.getPhonenumber()); + merVerifyOrderVo.setPayType(order.getPayType()); + merVerifyOrderVo.setRealReceiveMoney(order.getChangeReceivableMoney()); + //根据支付方式返回应收金额和已收金额 + if(order.getPayType()==1){ + merVerifyOrderVo.setReceivableMoney(order.getOrderMoney().subtract(order.getPayMoney())); + merVerifyOrderVo.setReceiveMoney(order.getPayMoney()); + }else{ + merVerifyOrderVo.setReceivableMoney(order.getOrderMoney().subtract(order.getCouponMoney()).subtract(order.getReceivableDeposit())); + if(order.getOfflinePayMoney()!=null){ + merVerifyOrderVo.setReceiveMoney(order.getOfflinePayMoney()); + }else{ + merVerifyOrderVo.setReceiveMoney(BigDecimal.ZERO); + } + } + merVerifyOrderVo.setUnReceiveMoney(merVerifyOrderVo.getRealReceiveMoney().subtract(merVerifyOrderVo.getReceiveMoney())); + merVerifyOrderVo.setUserId(order.getUserId()); + merVerifyOrderVo.setUserName(member.getRealName()); + merVerifyOrderVo.setUserMobile(member.getMobile()); + merVerifyOrderVo.setCloseFlag(order.getCloseFlag()); + //判断用户是否绑定 2023-09-05需求改变核销时绑定用户 + if (member.getBindingFlag() != 1) { + //绑定商户 + AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto(); + appMemberBindingDto.setShopId(order.getShopId()); + appMemberBindingDto.setUserId(order.getUserId()); + appMemberBindingDto.setBindingFlag(1); + if(order.getOrderFrom()==1){ + appMemberBindingDto.setBindingType(1); + }else if(order.getOrderFrom()==2){ + appMemberBindingDto.setBindingType(2); + } + remoteMemberService.updateMemberBinding(appMemberBindingDto); + order.setNewMemberFlag(1); + }else{ + order.setNewMemberFlag(0); + } + this.saveOrUpdate(order); + // 订单金额大于0时进行分账 + OrderPayment orderPayment = orderPaymentService.getOne(new QueryWrapper<OrderPayment>() + .eq("order_id", order.getOrderId()).eq("pay_status", 2) + .eq("del_flag", 0)); + BigDecimal bigDecimal = orderPayment.getPayMoney().subtract(orderPayment.getFeeAmount()).setScale(2, BigDecimal.ROUND_HALF_EVEN); + if (bigDecimal.compareTo(BigDecimal.ZERO)>0) { + // TODO: 2023/10/17 更换分账渠道(汇付天下) +// submitProfitSharing(orderId, order.getOrderNo(), order.getShopId(), order.getOnlinePayMoney(),order.getOrderFrom()); + submitProfitSharing1(orderId, order.getOrderNo(), order.getShopId(), bigDecimal, order.getOrderFrom()); + } + //创建支付记录 + if(merVerifyOrderDto.getRelPayMoney().compareTo(BigDecimal.ZERO)>0){ + PayRecord payRecord = new PayRecord(); + payRecord.setDelFlag(0); + payRecord.setOrderId(order.getOrderId()); + payRecord.setPayMoney(merVerifyOrderDto.getRelPayMoney()); + payRecord.setPayTime(new Date()); + payRecord.setPayType(merVerifyOrderDto.getPayType()); + payRecordService.save(payRecord); + } + //更新用户积分和消费统计 + MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto(); + memberTotalChangeDto.setUserId(order.getUserId()); + // 如果存在积分兑换比例,则计算积分 + if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) { + Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL); + BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue); + BigDecimal integralBig = moneyValueBig.multiply(order.getOnlinePayMoney()).setScale(0,BigDecimal.ROUND_HALF_UP); + Integer integral = Integer.valueOf(integralBig.toString()); + if(integral>0){ + memberTotalChangeDto.setChangeIntegral(integral); + memberTotalChangeDto.setTypeIntegral(1); + memberTotalChangeDto.setOrderId(orderId); + memberTotalChangeDto.setOrderNo(order.getOrderNo()); + } + } + //更新消费时间 + memberTotalChangeDto.setConsumeTime(nowTime); + remoteMemberService.changeMemberTotal(memberTotalChangeDto); return merVerifyOrderVo; } /** + * @description 分账实现 + * @author jqs + * @date 2023/9/8 11:56 + * @param orderId + * @param orderNo + * @param shopId + * @param orderMoney + * @param orderFrom + * @return void + */ + private void submitProfitSharing(String orderId, String orderNo, Long shopId, BigDecimal orderMoney, Integer orderFrom) { + String sendMessage = ""; + String resultMessage = ""; + try { + // 核销完成 开始分账(平台收取服务费) + OrderPayment payment = orderPaymentService.getByOrderId(orderId); + String transactionId = payment.getTransactionId(); + R<String> resultMch = remoteShopService.getShopSubMchId(shopId); + String subMchId = resultMch.getData(); + if (StringUtils.isEmpty(subMchId)) { + throw new ServiceException("获取微信商户号失败"); + } + // 平台特约商户号,用户平台收取服务费 2023-09-05改变分账方式 + String platformTyMacId = WxPayConfiguration.getPlatformTyMacId(); + if (!StringUtils.isEmpty(platformTyMacId)) { + WxPayConfig config = wxService.getConfig(); + ShopProportionVo shopProportion = null; + BigDecimal proportionPercent = null; + //商户订单获取统一分成 活动订单获取活动分成 + if(orderFrom==1){ + proportionPercent = new BigDecimal(redisService.getCacheObject(SecurityConstant.SHOP_COMMON_PROPORTION).toString()); + }else{ + R<ShopProportionVo> resultShopProportion = remoteShopService.getShopProportion(shopId); + shopProportion = resultShopProportion.getData(); + proportionPercent = shopProportion.getProportionPercent(); + } + if (null != proportionPercent) { + ProfitSharingRequest request = new ProfitSharingRequest(); + request.setAppid(config.getAppId()); + request.setSubMchid(platformTyMacId); + request.setTransactionId(transactionId); + request.setOutOrderNo(IdUtils.simpleUUID()); + List<ProfitSharingRequest.Receiver> receiverList = new ArrayList<>(); + String description = "订单:" + orderNo + " 平台分账"; + //商户分成 + if(proportionPercent.compareTo(BigDecimal.ZERO)>0){ + ProfitSharingResult result = new ProfitSharingResult(); + result.setOutOrderNo(orderNo); + result.setStatus("FINISHED"); + // 计算分成金额 + int amount = orderMoney.multiply(proportionPercent).setScale(0, RoundingMode.UP).intValue(); + log.info("订单分账:{} 分账金额: {}", orderNo, amount); + if (amount > 0) { + // 分账创建 + ProfitSharingRequest.Receiver receiver = new ProfitSharingRequest.Receiver(); + receiver.setType("MERCHANT_ID"); + receiver.setReceiverAccount(subMchId); + receiver.setAmount(amount); + receiver.setDescription(description); + receiverList.add(receiver); + request.setReceivers(receiverList); + // 分账完成 + request.setFinish(true); + result = wxService.getEcommerceService().profitSharing(request); + } + // 创建分账记录 + profitSharingService.saveProfitSharing(shopId, orderId, orderMoney, result); + // 保存请求信息 + sendMessage = JSONObject.toJSONString(request); + resultMessage = JSONObject.toJSONString(result); + } + } else { + resultMessage = String.format("订单分账:%s 获取商户分成失败", orderNo); + log.info(resultMessage); + } + } else { + resultMessage = String.format("订单分账:%s 获取微信商户号失败", orderNo); + log.info(resultMessage); + } + } catch (WxPayException e) { + resultMessage = String.format("订单分账:%s 分账失败:%s", orderNo, e.getMessage()); + log.info(resultMessage); + throw new ServiceException(resultMessage); + } + + // 保存分账信息 + paymentMessageService.savePaymentMessage("4", orderId, sendMessage, resultMessage); + } + + + + + /** + * @description 分账实现 + * @author jqs + * @date 2023/9/8 11:56 + * @param orderId + * @param orderNo + * @param shopId + * @param orderMoney + * @param orderFrom + * @return void + */ + private void submitProfitSharing1(String orderId, String orderNo, Long shopId, BigDecimal orderMoney, Integer orderFrom) { + String sendMessage = ""; + String resultMessage = ""; + try { + // 核销完成 开始分账(平台收取服务费) + OrderPayment payment = orderPaymentService.getByOrderId(orderId); + String transactionId = payment.getTransactionId(); + String outTradeNo = payment.getOutTradeNo(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + String org_req_date = sdf.format(payment.getCreateTime()); + R<ShopAuthenticationHftxVo> resultMch = remoteShopService.getShopHFTXSubMchId(shopId); + ShopAuthenticationHftxVo vo = resultMch.getData(); + if (StringUtils.isEmpty(vo.getHuifuId())) { + throw new ServiceException("获取商户号失败"); + } + // 平台特约商户号,用户平台收取服务费 2023-09-05改变分账方式 + String platformTyMacId = WxPayConfiguration.getPlatformTyMacId(); + if (!StringUtils.isEmpty(platformTyMacId)) { + WxPayConfig config = wxService.getConfig(); + ShopProportionVo shopProportion = null; + BigDecimal proportionPercent = null; + //商户订单获取统一分成 活动订单获取活动分成 + if(orderFrom==1){ + if(null == vo.getShareRatio()){ + proportionPercent = new BigDecimal(redisService.getCacheObject(SecurityConstant.SHOP_COMMON_PROPORTION).toString()); + }else{ + proportionPercent = new BigDecimal(vo.getShareRatio()); + } + }else{ + R<ShopProportionVo> resultShopProportion = remoteShopService.getShopProportion(shopId); + shopProportion = resultShopProportion.getData(); + proportionPercent = shopProportion.getProportionPercent(); + } + if (null != proportionPercent) { + ProfitSharingRequest request = new ProfitSharingRequest(); + request.setAppid(config.getAppId()); + request.setSubMchid(platformTyMacId); + request.setTransactionId(transactionId); + request.setOutOrderNo(IdUtils.simpleUUID()); + List<ProfitSharingRequest.Receiver> receiverList = new ArrayList<>(); + String description = "订单:" + orderNo + " 平台分账"; + //商户分成 + if(proportionPercent.compareTo(BigDecimal.ZERO)>0){ + PaymentDelaytransHFTXVo result = new PaymentDelaytransHFTXVo(); + // 计算分成金额 + int amount = orderMoney.multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).intValue(); + BigDecimal multiply = orderMoney.multiply(proportionPercent.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_EVEN); + log.info("订单分账:{} 分账金额: {}", orderNo, amount); + if (amount > 0) { + // 分账创建 + ProfitSharingRequest.Receiver receiver = new ProfitSharingRequest.Receiver(); + receiver.setType("MERCHANT_ID"); + receiver.setReceiverAccount(vo.getHuifuId()); + receiver.setAmount(amount); + receiver.setDescription(description); + receiverList.add(receiver); + request.setReceivers(receiverList); + // 分账完成 + request.setFinish(true); + + //分账对象 + JSONArray acctInfos = new JSONArray(); + if(multiply.compareTo(BigDecimal.ZERO) > 0){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("div_amt", String.format("%.2f", multiply.doubleValue())); + jsonObject.put("huifu_id", vo.getHuifuId()); + acctInfos.add(jsonObject); + } + //平台商户 + BigDecimal pt_amount = orderMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN); + if(pt_amount.compareTo(BigDecimal.ZERO) > 0){ + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("div_amt", String.format("%.2f", pt_amount.doubleValue())); + jsonObject1.put("huifu_id", "6666000141216769"); + acctInfos.add(jsonObject1); + } + + R<PaymentDelaytransHFTXVo> hftxVoR = HuiFuTianXiaUtil.paymentDelaytrans(request.getOutOrderNo(), org_req_date, outTradeNo, acctInfos); + if(hftxVoR.getCode() != 200){ + throw new ServiceException(hftxVoR.getMsg()); + } + result = hftxVoR.getData(); + // 创建分账记录 + profitSharingService.saveProfitSharing1(shopId, orderId, orderMoney, vo.getHuifuId(), multiply.doubleValue(), result); + } + // 保存请求信息 + sendMessage = JSONObject.toJSONString(request); + resultMessage = JSONObject.toJSONString(result); + } + } else { + resultMessage = String.format("订单分账:%s 获取商户分成失败", orderNo); + log.info(resultMessage); + } + } else { + resultMessage = String.format("订单分账:%s 获取微信商户号失败", orderNo); + log.info(resultMessage); + } + } catch (Exception e) { + e.printStackTrace(); + resultMessage = String.format("订单分账:%s 分账失败:%s", orderNo, e.getMessage()); + log.info(resultMessage); + throw new ServiceException(resultMessage); + } + + // 保存分账信息 + paymentMessageService.savePaymentMessage("4", orderId, sendMessage, resultMessage); + } + + + + + /** + * @param merVerifyCouponDto + * @return MerVerifyCouponVo + * @description 确认核销优惠券 + * @author jqs + * @date 2023/6/28 11:26 + */ + @Override + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public MerVerifyCouponVo sureVerifyCoupon(MerVerifyCouponDto merVerifyCouponDto) { + R<MerVerifyCouponGetVo> verifyCoupon = remoteCouponService.getVerifyCoupon(merVerifyCouponDto.getMemberCouponId()); + if(verifyCoupon.getCode() != 200){ + throw new ServiceException(verifyCoupon.getMsg()); + } + MerVerifyCouponGetVo verifyCouponGetVo = verifyCoupon.getData(); + MemberCoupon memberCoupon = verifyCouponGetVo.getMemberCoupon(); + ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(merVerifyCouponDto.getUserId()).getData(); + Long userId = verifyCouponGetVo.getUserId(); + Long shopId = shopRelUserVo.getShopId(); + Shop shop = remoteShopService.getShop(shopId).getData(); + // 调用remoteMemberService的getMember方法获取Member对象 + Member member = remoteMemberService.getMember(userId).getData(); + //如果是商户优惠券,验证商户一致 + if (memberCoupon.getCouponFrom() == 2) { + if(!memberCoupon.getShopId().equals(member.getRelationShopId())){ + throw new ServiceException(AppErrorConstant.BLINDING_VERIFY_SHOP_ERROR); + } + if(!memberCoupon.getShopId().equals(shopId)){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + //如果是平台优惠券,当用户绑定商户时验证商户一致 + if (memberCoupon.getCouponFrom() == 1 && member.getBindingFlag() == 1) { + /*if(!memberCoupon.getShopId().equals(member.getRelationShopId())){ + throw new ServiceException(AppErrorConstant.BLINDING_VERIFY_SHOP_ERROR); + }*/ + //判断绑定商户是否和核销商户一致 + if(!member.getRelationShopId().equals(shopId)){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + memberCoupon.setShopId(shopId); + // 创建MerVerifyCouponVo对象 + MerVerifyCouponVo merVerifyCouponVo = new MerVerifyCouponVo(); + // 调用remoteCouponService的getVerifyCoupon方法获取MerVerifyCouponGetVo对象 + List<Goods> goodsList = verifyCouponGetVo.getGoodsList(); + String relGoodsIds = memberCoupon.getRelGoodsIds(); + String[] relGoodsIdArr = relGoodsIds.split(","); + if(relGoodsIdArr.length!=goodsList.size()){ + throw new ServiceException(AppErrorConstant.GOODS_DOWN); + } + merVerifyCouponVo.setUserName(member.getRealName()); + merVerifyCouponVo.setUserMobile(member.getMobile()); + merVerifyCouponVo.setCouponFrom(verifyCouponGetVo.getCouponFrom()); + merVerifyCouponVo.setCouponName(memberCoupon.getCouponName()); + merVerifyCouponVo.setCreateTime(memberCoupon.getReceiveTime()); + // 将goodsList转换为MerCouponGoodsListVo列表,并设置相应属性 + List<MerCouponGoodsListVo> merCouponGoodsList = new ArrayList<>(); + MerCouponGoodsListVo merCouponGoods; + for(Goods goods : goodsList){ + if(goods.getGoodsStatus()!=1){ + throw new ServiceException(AppErrorConstant.GOODS_DOWN); + } + merCouponGoods = new MerCouponGoodsListVo(); + merCouponGoods.setGoodsId(goods.getGoodsId()); + merCouponGoods.setGoodsName(goods.getGoodsName()); + if (goods.getGoodsType() == 1) { + merCouponGoods.setGoodsType("周期"); + } else if (goods.getGoodsType() == 2) { + merCouponGoods.setGoodsType("服务"); + } else if (goods.getGoodsType() == 3) { + merCouponGoods.setGoodsType("体验"); + } else if (goods.getGoodsType() == 4) { + merCouponGoods.setGoodsType("单品"); + } + merCouponGoodsList.add(merCouponGoods); + } + // 设置merVerifyCouponVo的goodsList属性为merCouponGoodsList + merVerifyCouponVo.setGoodsList(merCouponGoodsList); + //生成服务 + ConsumerGoods consumerGoods; + String consumerGoodsId; + GoodsFile goodsFile; + AppShopGoodsGetDto appShopGoodsGetDto; + ShopGoods shopGoods; + List<ConsumerGoods> consumerGoodsList = new ArrayList<>(); + for (Goods goods : goodsList) { + consumerGoods = new ConsumerGoods(); + consumerGoodsId = IdUtils.simpleUUID(); + consumerGoods.setConsumerGoodsId(consumerGoodsId); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(memberCoupon.getShopId()); + consumerGoods.setUserId(memberCoupon.getUserId()); + consumerGoods.setSourceFrom(2); + consumerGoods.setMemberCouponId(memberCoupon.getId()); + consumerGoods.setGoodsId(goods.getGoodsId()); + consumerGoods.setGoodsName(goods.getGoodsName()); + consumerGoods.setCycleNumFlag(goods.getCycleNumFlag()); + consumerGoods.setServiceNum(goods.getServiceNum()); + appShopGoodsGetDto = new AppShopGoodsGetDto(); + appShopGoodsGetDto.setGoodsId(goods.getGoodsId()); + appShopGoodsGetDto.setShopId(memberCoupon.getShopId()); + //获取商户服务次数 + shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); + if (shopGoods != null) { + consumerGoods.setServiceNum(shopGoods.getServiceNum()); + } + consumerGoods.setUsedNum(0); + consumerGoods.setGoodsType(goods.getGoodsType()); + consumerGoods.setGoodsTag(goods.getGoodsTags()); + consumerGoods.setCreateTime(new Date()); + consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + goodsFile = remoteGoodsService.getGoodsFile(goods.getGoodsId()).getData(); + consumerGoods.setGoodsPicture(goodsFile.getFileUrl()); + consumerGoods.setGoodsNurses(goods.getGoodsNurses()); + consumerGoods.setSourceFrom(1); + consumerGoodsList.add(consumerGoods); + } + MerVerifyMemberCouponDto merVerifyMemberCouponDto = new MerVerifyMemberCouponDto(); + merVerifyMemberCouponDto.setCouponId(memberCoupon.getId()); + merVerifyMemberCouponDto.setShopId(shopId); + remoteCouponService.sureMemberCoupon(merVerifyMemberCouponDto); + consumerGoodsService.saveBatchConsumerGoods(consumerGoodsList); + //绑定未绑定用户 + if (member.getBindingFlag() != 1) { + AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto(); + appMemberBindingDto.setBindingFlag(1); + appMemberBindingDto.setBindingType(4); + appMemberBindingDto.setShopId(shop.getShopId()); + appMemberBindingDto.setShopName(shop.getShopName()); + appMemberBindingDto.setUserId(memberCoupon.getUserId()); + remoteMemberService.updateMemberBinding(appMemberBindingDto); + } + merVerifyCouponVo.setVerifyStatus(2); + return merVerifyCouponVo; + } + + + /** + * @param merVerifyPrizeDto + * @return MerVerifyAwardVo + * @description 确认核销奖品 + * @author jqs + * @date 2023/7/9 9:54 + */ + @Override + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public MerVerifyAwardVo sureVerifyPrize(MerVerifyPrizeDto merVerifyPrizeDto) { + MerVerifyAwardVo merVerifyAwardVo = new MerVerifyAwardVo(); + MemberGiftRecord memberGiftRecord = remoteMemberService.getVerifyPrize(merVerifyPrizeDto.getPrizeId()).getData(); + if (memberGiftRecord == null || memberGiftRecord.getVerifyStatus() != 1) { + throw new ServiceException(AppErrorConstant.COUPON_USED); + } + ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(merVerifyPrizeDto.getUserId()).getData(); + Long shopId = shopRelUserVo.getShopId(); + Shop shop = remoteShopService.getShop(shopId).getData(); + //平台奖品判断 + if (memberGiftRecord.getGiftFrom() == 1) { + BirthdayCard birthdayCard = remoteMemberService.getBirthdayCard().getData(); + //判断生日活动状态 + if(birthdayCard!=null&&birthdayCard.getCardStatus()==1){ + shop = remoteShopService.getShop(shopId).getData(); + //判断指定区域全部店铺 + if(birthdayCard.getAreaFlag()==2&&birthdayCard.getShopFlag()==1&&!StringUtils.checkString(birthdayCard.getDesignatedArea(),shop.getShopCityCode())){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + //判断指定店铺 + if(birthdayCard.getShopFlag()==2&&!StringUtils.checkString(birthdayCard.getApplicableShop(),shopId.toString())){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + }else{ + throw new ServiceException(AppErrorConstant.BIRTHDAY_CARD_ERROR); + } + } + //商户奖品判断 + if (memberGiftRecord.getGiftFrom() == 2 && !memberGiftRecord.getShopId().equals(shopId)) { + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + Member member = remoteMemberService.getMember(memberGiftRecord.getUserId()).getData(); + + merVerifyAwardVo.setUserName(member.getRealName()); + merVerifyAwardVo.setUserMobile(member.getMobile()); + if (memberGiftRecord.getGiftFrom() == 1) { + merVerifyAwardVo.setGiftFrom("平台生日卡"); + } else { + merVerifyAwardVo.setGiftFrom("商户生日卡"); + } + merVerifyAwardVo.setGiftType(memberGiftRecord.getGiftType()); + List<BirthdayGiftSendDto> giftSendDtoList = new ArrayList<>(); + BirthdayGiftSendDto birthdayGiftSendDto = new BirthdayGiftSendDto(); + switch (memberGiftRecord.getGiftType()) { + case 1: + merVerifyAwardVo.setGiftName(memberGiftRecord.getCouponName()); + merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getCouponNumber())); + birthdayGiftSendDto.setUserId(memberGiftRecord.getUserId()); + birthdayGiftSendDto.setGiftType(memberGiftRecord.getGiftType()); + birthdayGiftSendDto.setGiftFrom(memberGiftRecord.getGiftFrom()); + birthdayGiftSendDto.setShopId(memberGiftRecord.getShopId()); + birthdayGiftSendDto.setCouponId(memberGiftRecord.getCouponId()); + birthdayGiftSendDto.setCouponNumber(memberGiftRecord.getCouponNumber()); + giftSendDtoList.add(birthdayGiftSendDto); + remoteCouponService.sendCouponGift(giftSendDtoList); + break; + case 2: + Goods goods = remoteGoodsService.getGoods(memberGiftRecord.getGoodsId()).getData(); + merVerifyAwardVo.setGiftName(memberGiftRecord.getGoodsName()); + merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getGoodsNumber())); + if (goods.getGoodsType() == 1) { + merVerifyAwardVo.setGiftRemark("周期"); + } else if (goods.getGoodsType() == 2) { + merVerifyAwardVo.setGiftRemark("服务"); + } else if (goods.getGoodsType() == 3) { + merVerifyAwardVo.setGiftRemark("体验"); + } else if (goods.getGoodsType() == 4) { + merVerifyAwardVo.setGiftRemark("单品"); + } + birthdayGiftSendDto.setUserId(memberGiftRecord.getUserId()); + birthdayGiftSendDto.setGiftType(memberGiftRecord.getGiftType()); + birthdayGiftSendDto.setGiftFrom(memberGiftRecord.getGiftFrom()); + birthdayGiftSendDto.setShopId(memberGiftRecord.getShopId()); + birthdayGiftSendDto.setGoodsId(memberGiftRecord.getGoodsId()); + birthdayGiftSendDto.setGoodsNumber(memberGiftRecord.getGoodsNumber()); + giftSendDtoList.add(birthdayGiftSendDto); + consumerGoodsService.sendGoodsGift(giftSendDtoList); + break; + case 3: + merVerifyAwardVo.setGiftName("现金"); + merVerifyAwardVo.setGiftNumber(memberGiftRecord.getMoney().doubleValue()); + break; + case 4: + merVerifyAwardVo.setGiftName(memberGiftRecord.getGiftName()); + merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getGiftNumber())); + break; + default: + break; + } + merVerifyAwardVo.setCreateTime(memberGiftRecord.getCreateTime()); + MerVerifyPrizeFinalDto merVerifyPrizeFinalDto = new MerVerifyPrizeFinalDto(); + merVerifyPrizeFinalDto.setPrizeId(memberGiftRecord.getPrizeId()); + merVerifyPrizeFinalDto.setShopId(shop.getShopId()); + remoteMemberService.verifyPrize(merVerifyPrizeFinalDto); + //绑定未绑定用户 + if (member.getBindingFlag() != 1) { + AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto(); + appMemberBindingDto.setBindingFlag(1); + appMemberBindingDto.setBindingType(5); + appMemberBindingDto.setShopId(shop.getShopId()); + appMemberBindingDto.setShopName(shop.getShopName()); + appMemberBindingDto.setUserId(memberGiftRecord.getUserId()); + remoteMemberService.updateMemberBinding(appMemberBindingDto); + } + merVerifyAwardVo.setPrizeId(merVerifyPrizeDto.getPrizeId()); + merVerifyAwardVo.setVerifyStatus(2); + return merVerifyAwardVo; + } + + + /** * 收银未结清订单列表 + * * @param page * @param merMemberNoClearOrderDto * @return */ @Override - public List<MerMemberNoClearOrderVo> pageMerMemberNoClearOrder(Page page, MerMemberNoClearOrderDto merMemberNoClearOrderDto){ - List<MerMemberNoClearOrderVo> merMemberNoClearOrderVoList = orderMapper.pageMerMemberNoClearOrder(page,merMemberNoClearOrderDto.getMemberUserId()); - if(merMemberNoClearOrderVoList!=null&&!merMemberNoClearOrderVoList.isEmpty()){ + public List<MerMemberNoClearOrderVo> pageMerMemberNoClearOrder(Page page, MerMemberNoClearOrderDto merMemberNoClearOrderDto) { + List<MerMemberNoClearOrderVo> merMemberNoClearOrderVoList = orderMapper.pageMerMemberNoClearOrder(page, merMemberNoClearOrderDto); + if (merMemberNoClearOrderVoList != null && !merMemberNoClearOrderVoList.isEmpty()) { BigDecimal zeroBig = new BigDecimal("0.00"); - for(MerMemberNoClearOrderVo merMemberNoClearOrderVo : merMemberNoClearOrderVoList){ - merMemberNoClearOrderVo.setUnPaidMoney(merMemberNoClearOrderVo.getReceivableMoney().subtract(merMemberNoClearOrderVo.getPayMoney())); - if(merMemberNoClearOrderVo.getUnPaidMoney()==null){ + for (MerMemberNoClearOrderVo merMemberNoClearOrderVo : merMemberNoClearOrderVoList) { + if (merMemberNoClearOrderVo.getUnPaidMoney() == null) { + merMemberNoClearOrderVo.setUnPaidMoney(zeroBig); + } + if(merMemberNoClearOrderVo.getUnPaidMoney().compareTo(zeroBig)<0){ merMemberNoClearOrderVo.setUnPaidMoney(zeroBig); } } @@ -635,33 +2531,57 @@ /** * 结清订单 + * * @param merCloseOrderDto */ @Override - public void merCloseOrder(MerCloseOrderDto merCloseOrderDto){ + public void merCloseOrder(MerCloseOrderDto merCloseOrderDto) { Order order = this.getById(merCloseOrderDto.getOrderId()); - order.setOfflinePayMoney(merCloseOrderDto.getPayMoney()); + order.setOfflinePayMoney(order.getOfflinePayMoney().add(merCloseOrderDto.getPayMoney())); + order.setOffPayTime(new Date()); order.setPayMoney(order.getPayMoney().add(merCloseOrderDto.getPayMoney())); - order.setCloseFlag(1); + //支付金额大于实收金额时结清 + if (order.getPayMoney().compareTo(order.getChangeReceivableMoney()) >= 0) { + order.setCloseFlag(1); + } else { + order.setCloseFlag(0); + } this.saveOrUpdate(order); + //创建支付记录 + PayRecord payRecord = new PayRecord(); + payRecord.setDelFlag(0); + payRecord.setOrderId(order.getOrderId()); + payRecord.setPayMoney(merCloseOrderDto.getPayMoney()); + payRecord.setPayTime(new Date()); + payRecord.setPayType(merCloseOrderDto.getPayType()); + payRecordService.save(payRecord); } /** * 创建新订单 + * * @param merNewOrderDto */ @Override - public void createNewOrder(MerNewOrderDto merNewOrderDto){ + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public void createNewOrder(MerNewOrderDto merNewOrderDto) { Long userId = merNewOrderDto.getBuyUserId(); + Date nowTime = new Date(); + Long shopId = merNewOrderDto.getShopId(); + Shop shop = remoteShopService.getShop(shopId).getData(); //如果非指定用户判断是否需要通过手机号创建新用户 - if(userId==null){ + if (userId == null) { String name = merNewOrderDto.getName(); String mobile = merNewOrderDto.getMobile(); Member member = remoteMemberService.getMemberByMobile(mobile).getData(); SysUser sysUser; - if(member!=null){ + if (member != null) { sysUser = remoteUserService.getSysUser(member.getUserId()).getData(); - }else{ + if(member.getBindingFlag()==1&&!member.getRelationShopId().equals(merNewOrderDto.getShopId())){ + throw new ServiceException(AppErrorConstant.USER_BINDING_ERROR); + } + } else { //创建新用户 String memberId = IdUtils.simpleUUID(); sysUser = new SysUser(); @@ -672,7 +2592,6 @@ sysUser.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png"); String password = "hongruitang"; sysUser.setPassword(SecurityUtils.encryptPassword(password)); - log.debug("sysUser"+sysUser.toString()); sysUser = remoteUserService.registerUser(sysUser).getData(); member = new Member(); member.setMemberId(memberId); @@ -680,6 +2599,10 @@ member.setMobile(mobile); member.setRealName(name); member.setNickName(name); + member.setBindingFlag(1); + member.setBindingType(3); + member.setRelationShopId(shopId); + member.setRelationShopName(shop.getShopName()); remoteMemberService.createNewMember(member); } userId = sysUser.getUserId(); @@ -696,14 +2619,14 @@ BigDecimal goodsPrice; BigDecimal goodsTotalPrice; BigDecimal goodsRealPrice; - Long shopId = merNewOrderDto.getShopId(); - Shop shop = remoteShopService.getShop(shopId).getData(); - List<AppMemberCouponVo> appMemberCouponVoList = remoteMemberService.listVoMemberCouponByUserId(userId).getData(); - Map<Long,AppMemberCouponVo> appMemberCouponVoMap = new HashMap<>(); - if(null != appMemberCouponVoList){ + MerBaseDto merBaseDto = new MerBaseDto(); + merBaseDto.setUserId(userId); + merBaseDto.setShopId(shopId); + List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(merBaseDto).getData(); + Map<String, AppMemberCouponVo> appMemberCouponVoMap = new HashMap<>(); + if (null != appMemberCouponVoList) { appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity())); } - AppMemberCouponVo appMemberCouponVo; Integer couponType; BigDecimal moneyThreshold; @@ -718,10 +2641,18 @@ String orderNo = CodeFactoryUtil.getShopOrderNo(); OrderGoods orderGoods; String orderGoodsId; - for(AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList){ + GoodsFile goodsFile; + List<OrderGoods> orderGoodsList = new ArrayList<>(); + ConsumerGoods consumerGoods; + String consumerGoodsId; + List<ConsumerGoods> consumerGoodsList = new ArrayList<>(); + //使用优惠券 + StringJoiner memberCouponSJ = new StringJoiner(","); + for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) { goodsId = appBuyGoodsDto.getGoodsId(); memberCouponId = appBuyGoodsDto.getMemberCouponId(); goods = remoteGoodsService.getGoods(goodsId).getData(); + goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData(); buyNum = appBuyGoodsDto.getBuyNum(); goodsPrice = goods.getSalesPrice(); serviceNum = goods.getServiceNum(); @@ -730,7 +2661,7 @@ appShopGoodsGetDto.setGoodsId(goods.getGoodsId()); appShopGoodsGetDto.setShopId(shopId); ShopGoods shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); - if(shopGoods!=null){ + if (shopGoods != null) { goodsPrice = shopGoods.getSalesPrice(); serviceNum = shopGoods.getServiceNum(); } @@ -738,36 +2669,47 @@ goodsTotalPrice = goodsPrice.multiply(buyNumBig); goodsRealPrice = goodsTotalPrice; //优惠券计算 - if(memberCouponId!=null){ - appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId); - if(null != appMemberCouponVo && (StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId))){ + if (memberCouponId != null) { + log.info("使用优惠券:{}", memberCouponId); + appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId.toString()); + log.info("匹配的优惠券:{}", JSON.toJSONString(appMemberCouponVo)); + if (null != appMemberCouponVo && (StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId))) { + log.info("可以使用优惠券:{}", JSON.toJSONString(appMemberCouponVo)); couponType = appMemberCouponVo.getCouponType(); - if(couponType == 1 && appMemberCouponVo.getMoneyThreshold()!=null && appMemberCouponVo.getDiscountMoney()!=null){ + couponType = appMemberCouponVo.getCouponType(); + if (couponType == 1 && appMemberCouponVo.getMoneyThreshold() != null && appMemberCouponVo.getDiscountMoney() != null) { moneyThreshold = appMemberCouponVo.getMoneyThreshold(); - if(goodsTotalPrice.compareTo(moneyThreshold)>=0){ + if (goodsTotalPrice.compareTo(moneyThreshold) >= 0) { discountMoney = appMemberCouponVo.getDiscountMoney(); goodsRealPrice = goodsTotalPrice.subtract(discountMoney); } - }else if(couponType == 2 && appMemberCouponVo.getDiscountPercent()!=null){ + } else if (couponType == 2 && appMemberCouponVo.getDiscountPercent() != null) { discountPercent = appMemberCouponVo.getDiscountPercent(); - goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN).setScale(2,BigDecimal.ROUND_HALF_UP); - discountMoney = goodsRealPrice.subtract(goodsTotalPrice); - }else if(couponType == 3 && appMemberCouponVo.getDiscountMoney()!=null){ + goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN, 2, BigDecimal.ROUND_HALF_UP); + discountMoney = goodsTotalPrice.subtract(goodsRealPrice); + } else if (couponType == 3 && appMemberCouponVo.getDiscountMoney() != null) { discountMoney = appMemberCouponVo.getDiscountMoney(); goodsRealPrice = goodsTotalPrice.subtract(discountMoney); } + if(goodsRealPrice.compareTo(BigDecimal.ZERO)<0){ + goodsRealPrice = BigDecimal.ZERO; + discountMoney = goodsTotalPrice.subtract(goodsRealPrice); + } + memberCouponSJ.add(memberCouponId + ","); } } - goodsDeposit = goods.getSubscription(); - if(goodsDeposit == null){ + if (goodsDeposit == null || goodsDeposit.compareTo(BigDecimal.ZERO) == 0) { goodsDeposit = new BigDecimal("0.00"); + } else { + goodsDeposit = goodsDeposit.multiply(buyNumBig); } goodsNum = goodsNum + buyNum; orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice); couponDiscount = couponDiscount.add(discountMoney); orderPayDeposit = orderPayDeposit.add(goodsDeposit); orderPayMoney = orderPayMoney.add(goodsRealPrice); + //创建OrderGoods orderGoods = new OrderGoods(); orderGoodsId = IdUtils.simpleUUID(); @@ -776,7 +2718,7 @@ orderGoods.setOrderId(orderId); orderGoods.setGoodsId(goodsId); orderGoods.setBuyNum(buyNum); - if(null != memberCouponId){ + if (null != memberCouponId) { orderGoods.setCouponId(memberCouponId.toString()); } orderGoods.setGoodsPrice(goodsPrice); @@ -785,7 +2727,65 @@ orderGoods.setCycleNumFlag(goods.getCycleNumFlag()); orderGoods.setServiceNum(serviceNum); orderGoods.setGoodsType(goods.getGoodsType()); - orderGoodsService.save(orderGoods); + orderGoods.setGoodsTag(goods.getGoodsTags()); + orderGoods.setGoodsName(goods.getGoodsName()); + orderGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + orderGoods.setGoodsPicture(goodsFile.getFileUrl()); + orderGoodsList.add(orderGoods); + + //创建服务 + Integer buyGoodsNum = orderGoods.getBuyNum(); + //判断是否确认次数 + if (orderGoods.getCycleNumFlag() == 0) { + consumerGoods = new ConsumerGoods(); + consumerGoodsId = IdUtils.simpleUUID(); + consumerGoods.setConsumerGoodsId(consumerGoodsId); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(shopId); + consumerGoods.setUserId(userId); + consumerGoods.setOrderId(orderId); + consumerGoods.setOrderGoodsId(orderGoodsId); + consumerGoods.setGoodsId(orderGoods.getGoodsId()); + consumerGoods.setGoodsName(orderGoods.getGoodsName()); + consumerGoods.setCycleNumFlag(orderGoods.getCycleNumFlag()); + consumerGoods.setServiceNum(orderGoods.getServiceNum()); + consumerGoods.setUsedNum(0); + consumerGoods.setGoodsType(orderGoods.getGoodsType()); + consumerGoods.setGoodsTag(orderGoods.getGoodsTag()); + consumerGoods.setCreateTime(nowTime); + consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + consumerGoods.setGoodsPicture(orderGoods.getGoodsPicture()); + consumerGoods.setGoodsNurses(goods.getGoodsNurses()); + consumerGoods.setSourceFrom(1); + consumerGoods.setSureNum(buyGoodsNum); + consumerGoodsList.add(consumerGoods); + } else { + for (int i = 0; i < buyGoodsNum; i++) { + consumerGoods = new ConsumerGoods(); + consumerGoodsId = IdUtils.simpleUUID(); + consumerGoods.setConsumerGoodsId(consumerGoodsId); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(shopId); + consumerGoods.setUserId(userId); + consumerGoods.setOrderId(orderId); + consumerGoods.setOrderGoodsId(orderGoodsId); + consumerGoods.setGoodsId(orderGoods.getGoodsId()); + consumerGoods.setGoodsName(orderGoods.getGoodsName()); + consumerGoods.setCycleNumFlag(orderGoods.getCycleNumFlag()); + consumerGoods.setServiceNum(orderGoods.getServiceNum()); + consumerGoods.setUsedNum(0); + consumerGoods.setGoodsType(orderGoods.getGoodsType()); + consumerGoods.setGoodsTag(orderGoods.getGoodsTag()); + consumerGoods.setCreateTime(nowTime); + consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + consumerGoods.setGoodsPicture(orderGoods.getGoodsPicture()); + consumerGoods.setGoodsNurses(goods.getGoodsNurses()); + consumerGoods.setSourceFrom(1); + consumerGoodsList.add(consumerGoods); + } + } } //创建订单 Order order = new Order(); @@ -800,107 +2800,141 @@ order.setCouponMoney(couponDiscount); order.setDiscountMoney(couponDiscount); order.setReceivableMoney(orderPayMoney); - order.setReceivableDeposit(new BigDecimal("0.00")); + order.setReceivableDeposit(orderPayDeposit); order.setPayType(1); - if(order.getPayType()==1){ - order.setPayMoney(orderPayMoney); - order.setOnlinePayMoney(orderPayMoney); - order.setCloseFlag(1); - }else if(order.getPayType()==2){ - order.setPayMoney(orderPayDeposit); - order.setOnlinePayMoney(orderPayDeposit); - order.setCloseFlag(0); + //判断实收金额 + if (merNewOrderDto.getChangeMoney() != null) { + order.setChangeReceivableMoney(merNewOrderDto.getChangeMoney()); + } else { + order.setChangeReceivableMoney(orderPayMoney); } order.setOrderRemark(merNewOrderDto.getOrderRemark()); order.setGoodsNum(goodsNum); - order.setCreateTime(new Date()); - order.setPayTime(new Date()); - order.setUseTime(new Date()); + order.setCreateTime(nowTime); + order.setUseTime(nowTime); order.setUseUserId(merNewOrderDto.getUserId()); order.setPayMoney(merNewOrderDto.getPayMoney()); order.setOnlinePayMoney(new BigDecimal("0.00")); order.setOfflinePayMoney(merNewOrderDto.getPayMoney()); - order.setCloseFlag(1); - this.save(order); - //创建服务 - List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listVoByOrderId(orderId); - ConsumerGoods consumerGoods; - String consumerGoodsId; - for(AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList){ - consumerGoods = new ConsumerGoods(); - consumerGoodsId = IdUtils.simpleUUID(); - consumerGoods.setConsumerGoodsId(consumerGoodsId); - consumerGoods.setDelFlag(0); - consumerGoods.setServiceStatus(1); - consumerGoods.setShopId(order.getShopId()); - consumerGoods.setUserId(order.getUserId()); - consumerGoods.setOrderId(orderId); - consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); - consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); - consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); - consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); - consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); - consumerGoods.setUsedNum(0); - consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); - consumerGoods.setCreateTime(new Date()); - consumerGoodsService.save(consumerGoods); + order.setPayMoney(merNewOrderDto.getPayMoney()); + order.setOffPayTime(nowTime); + order.setPayType(1); + //判断结清 + if (order.getPayMoney().compareTo(order.getChangeReceivableMoney()) >= 0) { + order.setCloseFlag(1); + } else { + order.setCloseFlag(0); } + //用户未绑定则绑定商户 Member member = remoteMemberService.getMember(userId).getData(); - if(member!=null&&member.getBindingFlag()!=1){ + if (member != null && member.getBindingFlag() != 1) { //绑定商户 AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto(); appMemberBindingDto.setShopId(shopId); appMemberBindingDto.setShopName(shop.getShopName()); appMemberBindingDto.setUserId(userId); appMemberBindingDto.setBindingFlag(1); + appMemberBindingDto.setBindingType(3); remoteMemberService.updateMemberBinding(appMemberBindingDto); + order.setNewMemberFlag(1); + order.setUnbindingFlag(0); } + //保存订单和服务 + this.save(order); + orderGoodsService.saveBatch(orderGoodsList); + consumerGoodsService.saveBatchConsumerGoods(consumerGoodsList); + //减去优惠券 + if (StringUtils.isNotBlank(memberCouponSJ.toString())) { + log.info("修改优惠券使用状态:{}", JSON.toJSONString(memberCouponSJ)); + remoteCouponService.useMemberCoupon(memberCouponSJ.toString()); + } + //更新会员消费记录 + MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto(); + memberTotalChangeDto.setUserId(order.getUserId()); + memberTotalChangeDto.setConsumeTime(nowTime); + remoteMemberService.changeMemberTotal(memberTotalChangeDto); + //创建支付记录 + PayRecord payRecord = new PayRecord(); + payRecord.setDelFlag(0); + payRecord.setOrderId(orderId); + payRecord.setPayMoney(order.getPayMoney()); + payRecord.setPayTime(order.getOffPayTime()); + payRecord.setPayType(merNewOrderDto.getPayType()); + payRecordService.save(payRecord); } /** - * * @param merOrderPageDto * @return */ @Override - public List<MerOrderPageVo> pageMerOrder(Page page, MerOrderPageDto merOrderPageDto){ + public List<MerOrderPageVo> pageMerOrder(Page page, MerOrderPageDto merOrderPageDto) { + if (StringUtils.isNotBlank(merOrderPageDto.getKeyword())) { + // 获取关键字对应的用户ID + MgtUserIdByKeywordDto userIdByKeywordDto = new MgtUserIdByKeywordDto(); + userIdByKeywordDto.setKeyword(merOrderPageDto.getKeyword()); + MgtUserIdByKeywordVo userIdByKeywordVo = remoteMemberService.getUserIdByKeyword(userIdByKeywordDto).getData(); + if (StringUtils.isNotBlank(userIdByKeywordVo.getUserIds())) { + // 将用户ID转换成List<Long>类型 + List<Long> userIdList = Arrays.stream(userIdByKeywordVo.getUserIds().split(",")) + .map(Long::parseLong) + .collect(Collectors.toList()); + merOrderPageDto.setMemberUserIdList(userIdList); + merOrderPageDto.setMemberUserId(null); + } + } + + // 获取订单列表 List<MerOrderPageVo> merOrderPageVoList = orderMapper.pageMerOrder(page, merOrderPageDto); - if(merOrderPageVoList!=null&&!merOrderPageVoList.isEmpty()){ + if (merOrderPageVoList != null && !merOrderPageVoList.isEmpty()) { Long userId; Member member; Integer orderFrom; String orderFromDesc; BigDecimal zeroBig = new BigDecimal("0.00"); - for(MerOrderPageVo merOrderPageVo : merOrderPageVoList){ + StringJoiner userIdSj = new StringJoiner(","); + // 遍历订单列表 + for (MerOrderPageVo merOrderPageVo : merOrderPageVoList) { userId = merOrderPageVo.getUserId(); - member = remoteMemberService.getMember(userId).getData(); - if(member!=null){ - if(StringUtils.isNotBlank(member.getNickName())){ - merOrderPageVo.setUserName(member.getNickName()); - } - merOrderPageVo.setUserMobile(member.getMobile()); - }else{ - SysUser sysUser = remoteUserService.getSysUser(userId).getData(); - if(StringUtils.isNotBlank(sysUser.getNickName())){ - merOrderPageVo.setUserName(sysUser.getNickName()); - } - merOrderPageVo.setUserMobile(sysUser.getPhonenumber()); - } + userIdSj.add(userId.toString()); orderFrom = merOrderPageVo.getOrderFrom(); - if(orderFrom!=null){ - if(orderFrom == 1){ + // 根据订单来源设置订单来源描述 + if (orderFrom != null) { + if (orderFrom == 1) { orderFromDesc = "商城订单"; - }else{ + } else if (orderFrom == 2) { + orderFromDesc = "平台秒杀活动(" + merOrderPageVo.getActivityName() + ")"; + } else { orderFromDesc = "线下创建"; } - }else{ + } else { orderFromDesc = "商城订单"; } merOrderPageVo.setOrderFromDesc(orderFromDesc); - merOrderPageVo.setUnPaidMoney(merOrderPageVo.getReceivableMoney().subtract(merOrderPageVo.getPayMoney())); - if(merOrderPageVo.getUnPaidMoney()==null){ + // 设置未支付金额为0.00,如果未支付金额小于0,则设置为0.00 + if (merOrderPageVo.getUnPaidMoney() == null) { merOrderPageVo.setUnPaidMoney(zeroBig); + } + if (merOrderPageVo.getUnPaidMoney().compareTo(zeroBig) < 0) { + merOrderPageVo.setUnPaidMoney(zeroBig); + } + } + + // 根据用户ID列表获取用户信息 + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(userIdSj.toString()); + List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(userIdSj.toString()).getData(); + Map<Long, MgtSimpleMemberVo> userMap = simpleMemberVoList.stream() + .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity())); + // 遍历订单列表,设置用户信息 + for (MerOrderPageVo merOrderPageVo : merOrderPageVoList) { + if (merOrderPageVo.getUserId() != null && userMap.get(merOrderPageVo.getUserId()) != null) { + merOrderPageVo.setUserName(userMap.get(merOrderPageVo.getUserId()).getRealName()); + merOrderPageVo.setNickName(userMap.get(merOrderPageVo.getUserId()).getNickName()); + merOrderPageVo.setUserMobile(userMap.get(merOrderPageVo.getUserId()).getUserMobile()); + } else { + log.debug("订单merOrderPageVo" + merOrderPageVo.getOrderId() + "缺少用户"); } } } @@ -908,23 +2942,3396 @@ } /** - * * @param page * @param merMemberNoClearOrderDto * @return */ @Override - public List<MerMemberNoClearOrderVo> pageMerMemberOrder(Page page, MerMemberNoClearOrderDto merMemberNoClearOrderDto){ - List<MerMemberNoClearOrderVo> merMemberNoClearOrderVoList = orderMapper.pageMerMemberOrder(page,merMemberNoClearOrderDto.getMemberUserId()); - if(merMemberNoClearOrderVoList!=null&&!merMemberNoClearOrderVoList.isEmpty()){ + public List<MerMemberOrderVo> pageMerMemberOrder(Page page, MerMemberNoClearOrderDto merMemberNoClearOrderDto) { + List<MerMemberOrderVo> merMemberNoClearOrderVoList = orderMapper.pageMerMemberOrder(page, merMemberNoClearOrderDto.getMemberUserId(),merMemberNoClearOrderDto.getShopId()); + if (merMemberNoClearOrderVoList != null && !merMemberNoClearOrderVoList.isEmpty()) { BigDecimal zeroBig = new BigDecimal("0.00"); - for(MerMemberNoClearOrderVo merMemberNoClearOrderVo : merMemberNoClearOrderVoList){ - merMemberNoClearOrderVo.setUnPaidMoney(merMemberNoClearOrderVo.getReceivableMoney().subtract(merMemberNoClearOrderVo.getPayMoney())); - if(merMemberNoClearOrderVo.getUnPaidMoney()==null){ + for (MerMemberOrderVo merMemberNoClearOrderVo : merMemberNoClearOrderVoList) { + if (merMemberNoClearOrderVo.getUnPaidMoney() == null) { + merMemberNoClearOrderVo.setUnPaidMoney(zeroBig); + } + if(merMemberNoClearOrderVo.getUnPaidMoney().compareTo(zeroBig)<0){ merMemberNoClearOrderVo.setUnPaidMoney(zeroBig); } } } return merMemberNoClearOrderVoList; } + + /** + * 获取用户订单统计 + * + * @param mgtMemberOrderTotalDto + * @return + */ + @Override + public MgtMemberOrderTotalVo getMgtMemberOrderTotal(MgtMemberOrderTotalDto mgtMemberOrderTotalDto) { + MgtMemberOrderTotalVo mgtMemberOrderTotalVo = orderMapper.getMgtMemberOrderTotal(mgtMemberOrderTotalDto); + return mgtMemberOrderTotalVo; + } + + /** + * 分页获取用户订单列表 + * + * @param page + * @param mgtMemberOrderPageDto + * @return + */ + @Override + public List<MgtMemberOrderPageVo> pageMgtMemberOrder(Page page, MgtMemberOrderPageDto mgtMemberOrderPageDto) { + // 通过orderMapper获取MgtMemberOrderPageVoList + List<MgtMemberOrderPageVo> mgtMemberOrderPageVoList = orderMapper.pageMgtMemberOrder(page, mgtMemberOrderPageDto); + // 如果MgtMemberOrderPageVoList不为空 + if (mgtMemberOrderPageVoList != null && !mgtMemberOrderPageVoList.isEmpty()) { + Long shopId; + HashSet<String> set = new HashSet<>(); + BigDecimal zeroBig = new BigDecimal("0.00"); + // 遍历MgtMemberOrderPageVoList,获取shopId并添加到set中 + for (MgtMemberOrderPageVo mgtMemberOrderPageVo : mgtMemberOrderPageVoList) { + if(mgtMemberOrderPageVo.getShopId()!=null){ + if(mgtMemberOrderPageVo.getShopId()!=null){ + shopId = mgtMemberOrderPageVo.getShopId(); + set.add(shopId.toString()); + } + } + + } + // 将set中的shopId转换为逗号分隔的字符串 + String joinedString = String.join(",", set); + // 通过remoteShopService获取MgtSimpleShopVoList + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(joinedString); + List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData(); + // 将MgtSimpleShopVoList转换为Map<Long, MgtSimpleShopVo>,以便后续根据shopId获取对应的MgtSimpleShopVo + Map<Long, MgtSimpleShopVo> map = simpleShopVoList.stream() + .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity())); + // 遍历MgtMemberOrderPageVoList,根据shopId获取对应的MgtSimpleShopVo并将其shopName设置到MgtMemberOrderPageVo中 + for (MgtMemberOrderPageVo mgtMemberOrderPageVo : mgtMemberOrderPageVoList) { + if(mgtMemberOrderPageVo.getShopId()!=null){ + if(mgtMemberOrderPageVo.getShopId()!=null){ + shopId = mgtMemberOrderPageVo.getShopId(); + mgtMemberOrderPageVo.setShopName(map.get(shopId).getShopName()); + BigDecimal unPaidMoney = mgtMemberOrderPageVo.getReceivableMoney().subtract(mgtMemberOrderPageVo.getPayMoney()); + mgtMemberOrderPageVo.setUnPaidMoney(unPaidMoney == null ? zeroBig : unPaidMoney); + } + } + + } + } + // 返回MgtMemberOrderPageVoList + return mgtMemberOrderPageVoList; + } + + /** + * @param page + * @param mgtShopOrderPageDto + * @return List<MgtActivityOrderPageVo> + * @description 分页获取活动订单列表 + * @author jqs + * @date 2023/6/16 10:43 + */ + @Override + public List<MgtActivityOrderPageVo> pageMgtActivityOrder(Page page, MgtShopOrderPageDto mgtShopOrderPageDto) { + //如果区域代码不为null获取对应的商户id + if (StringUtils.isNotBlank(mgtShopOrderPageDto.getKeyword()) || StringUtils.isNotBlank(mgtShopOrderPageDto.getShopProvinceCode()) || StringUtils.isNotBlank(mgtShopOrderPageDto.getShopCityCode()) || StringUtils.isNotBlank(mgtShopOrderPageDto.getShopAreaCode())) { + MgtShopIdByCodeDto mgtShopIdByCodeDto = new MgtShopIdByCodeDto(); + mgtShopIdByCodeDto.setShopProvinceCode(mgtShopOrderPageDto.getShopProvinceCode()); + mgtShopIdByCodeDto.setShopCityCode(mgtShopOrderPageDto.getShopCityCode()); + mgtShopIdByCodeDto.setShopAreaCode(mgtShopOrderPageDto.getShopAreaCode()); + MgtShopIdByCodeVo mgtShopIdByCodeVo = remoteShopService.getShopIdByCode(mgtShopIdByCodeDto).getData(); + if (StringUtils.isNotBlank(mgtShopIdByCodeVo.getShopIds())) { + mgtShopOrderPageDto.setShopIds(mgtShopIdByCodeVo.getShopIds()); + } + } + //如果关键词不为null获取对应的用户id + if (StringUtils.isNotBlank(mgtShopOrderPageDto.getKeyword())) { + MgtUserIdByKeywordDto mgtUserIdByKeywordDto = new MgtUserIdByKeywordDto(); + mgtUserIdByKeywordDto.setKeyword(mgtShopOrderPageDto.getKeyword()); + MgtUserIdByKeywordVo mgtUserIdByKeywordVo = remoteMemberService.getUserIdByKeyword(mgtUserIdByKeywordDto).getData(); + if (StringUtils.isNotBlank(mgtUserIdByKeywordVo.getUserIds())) { + mgtShopOrderPageDto.setUserIds(mgtUserIdByKeywordVo.getUserIds()); + } + } + //数据权限 + List<Long> userId = remoteUserService.getScopeOfAuthorityUserId(); + BoardMemberTotalDto boardMemberTotalDto = new BoardMemberTotalDto(); + boardMemberTotalDto.setUserIds(userId); + List<Shop> shops = remoteShopService.getShopBySysUserIds(boardMemberTotalDto); + if (!shops.isEmpty()) { + List<Long> collect = shops.stream().map(Shop::getShopId).collect(Collectors.toList()); + String join = collect.stream().map(Object::toString).collect(Collectors.joining(",")); + String shopIds = mgtShopOrderPageDto.getShopIds(); + if(StringUtils.isNotEmpty(shopIds)){ + shopIds = shopIds + "," + join; + }else{ + shopIds = join; + } + mgtShopOrderPageDto.setShopIds(shopIds); + } + + + // 从数据库中获取活动订单列表 + List<MgtActivityOrderPageVo> activityOrderPageVoList = orderMapper.pageMgtActivityOrder(page, mgtShopOrderPageDto); + // 如果列表不为空 + if (!activityOrderPageVoList.isEmpty()) { + // 定义变量 + HashSet<Long> shopIdSet = new HashSet<>(); + HashSet<Long> userIdSet = new HashSet<>(); + BigDecimal zeroBig = new BigDecimal("0.00"); + // 遍历列表,获取店铺 ID 和用户 ID + for (MgtActivityOrderPageVo mgtActivityOrderPageVo : activityOrderPageVoList) { + if(mgtActivityOrderPageVo.getShopId()!=null){ + shopIdSet.add(mgtActivityOrderPageVo.getShopId()); + + } + userIdSet.add(mgtActivityOrderPageVo.getUserId()); + } + // 将店铺 ID 和用户 ID 转换为逗号分隔的字符串 + String shopJoinedString = String.join(",", shopIdSet.stream().map(Object::toString).collect(Collectors.toList())); + String userJoinedString = String.join(",", userIdSet.stream().map(Object::toString).collect(Collectors.toList())); + // 从远程服务获取店铺和用户信息 + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(shopJoinedString); + List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData(); + Map<Long, MgtSimpleShopVo> shopMap = simpleShopVoList.stream() + .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity())); + mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(userJoinedString); + List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(userJoinedString).getData(); + Map<Long, MgtSimpleMemberVo> userMap = simpleMemberVoList.stream() + .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity())); + // 遍历列表,设置店铺名称、用户名称和未支付金额 + for (MgtActivityOrderPageVo mgtActivityOrderPageVo : activityOrderPageVoList) { + if(mgtActivityOrderPageVo.getShopId()!=null){ + MgtSimpleShopVo mgtSimpleShopVo = shopMap.get(mgtActivityOrderPageVo.getShopId()); + mgtActivityOrderPageVo.setShopName(null == mgtSimpleShopVo ? "" : mgtSimpleShopVo.getShopName()); + + } + if (userMap.get(mgtActivityOrderPageVo.getUserId()) != null) { + mgtActivityOrderPageVo.setNickName(userMap.get(mgtActivityOrderPageVo.getUserId()).getNickName()); + mgtActivityOrderPageVo.setUserName(userMap.get(mgtActivityOrderPageVo.getUserId()).getRealName()); + mgtActivityOrderPageVo.setUserMobile(userMap.get(mgtActivityOrderPageVo.getUserId()).getUserMobile()); + } + BigDecimal unPaidMoney = mgtActivityOrderPageVo.getReceivableMoney().subtract(mgtActivityOrderPageVo.getPayMoney()); + mgtActivityOrderPageVo.setUnPaidMoney(unPaidMoney == null ? zeroBig : unPaidMoney); + } + } + // 返回处理后的活动订单列表 + return activityOrderPageVoList; + } + + /** + * @param mgtShopOrderPageDto + * @return MgtMemberOrderTotalVo + * @description 获取订单统计 + * @author jqs + * @date 2023/6/16 12:51 + */ + @Override + public MgtOrderTotal getMgtOrderTotal(MgtShopOrderPageDto mgtShopOrderPageDto) { + //如果区域代码不为null获取对应的商户id + if (StringUtils.isNotBlank(mgtShopOrderPageDto.getKeyword()) || StringUtils.isNotBlank(mgtShopOrderPageDto.getShopProvinceCode()) || StringUtils.isNotBlank(mgtShopOrderPageDto.getShopCityCode()) || StringUtils.isNotBlank(mgtShopOrderPageDto.getShopAreaCode())) { + MgtShopIdByCodeDto mgtShopIdByCodeDto = new MgtShopIdByCodeDto(); + mgtShopIdByCodeDto.setShopProvinceCode(mgtShopOrderPageDto.getShopProvinceCode()); + mgtShopIdByCodeDto.setShopCityCode(mgtShopOrderPageDto.getShopCityCode()); + mgtShopIdByCodeDto.setShopAreaCode(mgtShopOrderPageDto.getShopAreaCode()); + MgtShopIdByCodeVo mgtShopIdByCodeVo = remoteShopService.getShopIdByCode(mgtShopIdByCodeDto).getData(); + if (StringUtils.isNotBlank(mgtShopIdByCodeVo.getShopIds())) { + mgtShopOrderPageDto.setShopIds(mgtShopIdByCodeVo.getShopIds()); + } + } + //如果关键词不为null获取对应的用户id + if (StringUtils.isNotBlank(mgtShopOrderPageDto.getKeyword())) { + MgtUserIdByKeywordDto mgtUserIdByKeywordDto = new MgtUserIdByKeywordDto(); + mgtUserIdByKeywordDto.setKeyword(mgtShopOrderPageDto.getKeyword()); + MgtUserIdByKeywordVo mgtUserIdByKeywordVo = remoteMemberService.getUserIdByKeyword(mgtUserIdByKeywordDto).getData(); + if (StringUtils.isNotBlank(mgtUserIdByKeywordVo.getUserIds())) { + mgtShopOrderPageDto.setUserIds(mgtUserIdByKeywordVo.getUserIds()); + } + } + //数据权限 + List<Long> userId = remoteUserService.getScopeOfAuthorityUserId(); + BoardMemberTotalDto boardMemberTotalDto = new BoardMemberTotalDto(); + boardMemberTotalDto.setUserIds(userId); + List<Shop> shops = remoteShopService.getShopBySysUserIds(boardMemberTotalDto); + if (!shops.isEmpty()) { + List<Long> collect = shops.stream().map(Shop::getShopId).collect(Collectors.toList()); + String join = collect.stream().map(Object::toString).collect(Collectors.joining(",")); + String shopIds = mgtShopOrderPageDto.getShopIds(); + if(StringUtils.isNotEmpty(shopIds)){ + shopIds = shopIds + "," + join; + }else{ + shopIds = join; + } + mgtShopOrderPageDto.setShopIds(shopIds); + } + MgtOrderTotal mgtOrderTotal = new MgtOrderTotal(); + MgtOrderTotal mgtOrderTotalFirst = orderMapper.totalOrderFirst(mgtShopOrderPageDto); + MgtOrderTotal mgtOrderTotalSecond = orderMapper.totalOrderSecond(mgtShopOrderPageDto); + MgtOrderTotal mgtOrderTotalThird = orderMapper.totalOrderThird(mgtShopOrderPageDto); + mgtOrderTotal.setOrderTotal(mgtOrderTotalFirst.getOrderTotal()); + mgtOrderTotal.setOrderMoneyTotal(mgtOrderTotalFirst.getOrderMoneyTotal()); + mgtOrderTotal.setShopOrderTotal(mgtOrderTotalSecond.getShopOrderTotal()); + mgtOrderTotal.setShopOrderMoneyTotal(mgtOrderTotalSecond.getShopOrderMoneyTotal()); + mgtOrderTotal.setShopPayMoneyTotal(mgtOrderTotalSecond.getShopPayMoneyTotal()); + mgtOrderTotal.setShopUnPayMoneyTotal(mgtOrderTotalSecond.getShopOrderMoneyTotal().subtract(mgtOrderTotalSecond.getShopPayMoneyTotal())); + mgtOrderTotal.setActivityOrderTotal(mgtOrderTotalThird.getActivityOrderTotal()); + mgtOrderTotal.setActivityOrderMoneyTotal(mgtOrderTotalThird.getActivityOrderMoneyTotal()); + mgtOrderTotal.setActivityPayMoneyTotal(mgtOrderTotalThird.getActivityPayMoneyTotal()); + mgtOrderTotal.setActivityUnPayMoneyTotal(mgtOrderTotalThird.getActivityOrderMoneyTotal().subtract(mgtOrderTotalThird.getActivityPayMoneyTotal())); + return mgtOrderTotal; + } + + /** + * @param page + * @param mgtShopOrderPageDto + * @return List<MgtShopOrderPageVo> + * @description 分页获取门店订单列表 + * @author jqs + * @date 2023/6/16 14:57 + */ + @Override + public List<MgtShopOrderPageVo> pageMgtShopOrder(Page page, MgtShopOrderPageDto mgtShopOrderPageDto) { + //如果区域代码不为null获取对应的商户id + if (StringUtils.isNotBlank(mgtShopOrderPageDto.getKeyword()) || StringUtils.isNotBlank(mgtShopOrderPageDto.getShopProvinceCode()) || StringUtils.isNotBlank(mgtShopOrderPageDto.getShopCityCode()) || StringUtils.isNotBlank(mgtShopOrderPageDto.getShopAreaCode())) { + MgtShopIdByCodeDto mgtShopIdByCodeDto = new MgtShopIdByCodeDto(); + mgtShopIdByCodeDto.setShopProvinceCode(mgtShopOrderPageDto.getShopProvinceCode()); + mgtShopIdByCodeDto.setShopCityCode(mgtShopOrderPageDto.getShopCityCode()); + mgtShopIdByCodeDto.setShopAreaCode(mgtShopOrderPageDto.getShopAreaCode()); + MgtShopIdByCodeVo mgtShopIdByCodeVo = remoteShopService.getShopIdByCode(mgtShopIdByCodeDto).getData(); + if (StringUtils.isNotBlank(mgtShopIdByCodeVo.getShopIds())) { + mgtShopOrderPageDto.setShopIds(mgtShopIdByCodeVo.getShopIds()); + } + } + //如果关键词不为null获取对应的用户id + if (StringUtils.isNotBlank(mgtShopOrderPageDto.getKeyword())) { + MgtUserIdByKeywordDto mgtUserIdByKeywordDto = new MgtUserIdByKeywordDto(); + mgtUserIdByKeywordDto.setKeyword(mgtShopOrderPageDto.getKeyword()); + MgtUserIdByKeywordVo mgtUserIdByKeywordVo = remoteMemberService.getUserIdByKeyword(mgtUserIdByKeywordDto).getData(); + if (StringUtils.isNotBlank(mgtUserIdByKeywordVo.getUserIds())) { + mgtShopOrderPageDto.setUserIds(mgtUserIdByKeywordVo.getUserIds()); + } + } + //数据权限 + List<Long> userId = remoteUserService.getScopeOfAuthorityUserId(); + BoardMemberTotalDto boardMemberTotalDto = new BoardMemberTotalDto(); + boardMemberTotalDto.setUserIds(userId); + List<Shop> shops = remoteShopService.getShopBySysUserIds(boardMemberTotalDto); + if (!shops.isEmpty()) { + List<Long> collect = shops.stream().map(Shop::getShopId).collect(Collectors.toList()); + String join = collect.stream().map(Object::toString).collect(Collectors.joining(",")); + String shopIds = mgtShopOrderPageDto.getShopIds(); + if(StringUtils.isNotEmpty(shopIds)){ + shopIds = shopIds + "," + join; + }else{ + shopIds = join; + } + mgtShopOrderPageDto.setShopIds(shopIds); + } + List<MgtShopOrderPageVo> shopOrderPageVoList = orderMapper.pageMgtShopOrder(page, mgtShopOrderPageDto); + // 如果列表不为空 + if (!shopOrderPageVoList.isEmpty()) { + // 定义变量 + HashSet<Long> shopIdSet = new HashSet<>(); + HashSet<Long> userIdSet = new HashSet<>(); + BigDecimal zeroBig = new BigDecimal("0.00"); + // 遍历列表,获取店铺 ID 和用户 ID + for (MgtShopOrderPageVo mgtShopOrderPageVo : shopOrderPageVoList) { + shopIdSet.add(mgtShopOrderPageVo.getShopId()); + userIdSet.add(mgtShopOrderPageVo.getUserId()); + } + // 从远程服务获取店铺和用户信息 + Map<Long, MgtSimpleShopVo> shopMap = null; + Map<Long, MgtSimpleMemberVo> userMap = null; + if (shopIdSet != null && !shopIdSet.isEmpty()) { + String shopJoinedString = String.join(",", shopIdSet.stream().map(Object::toString).collect(Collectors.toList())); + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(shopJoinedString); + List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData(); + shopMap = simpleShopVoList.stream() + .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity())); + } + if (userIdSet != null && !userIdSet.isEmpty()) { + String userJoinedString = String.join(",", userIdSet.stream().map(Object::toString).collect(Collectors.toList())); + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(userJoinedString); + List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(userJoinedString).getData(); + userMap = simpleMemberVoList.stream() + .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity())); + } + // 遍历列表,设置店铺名称、用户名称和未支付金额 + for (MgtShopOrderPageVo mgtShopOrderPageVo : shopOrderPageVoList) { + if (shopMap != null && !shopMap.isEmpty()) { + if(shopMap.get(mgtShopOrderPageVo.getShopId())!=null){ + mgtShopOrderPageVo.setShopName(shopMap.get(mgtShopOrderPageVo.getShopId()).getShopName()); + } + } + if (userMap != null && !userMap.isEmpty()) { + if (userMap.get(mgtShopOrderPageVo.getUserId()) != null) { + mgtShopOrderPageVo.setNickName(userMap.get(mgtShopOrderPageVo.getUserId()).getNickName()); + mgtShopOrderPageVo.setUserName(userMap.get(mgtShopOrderPageVo.getUserId()).getRealName()); + mgtShopOrderPageVo.setUserMobile(userMap.get(mgtShopOrderPageVo.getUserId()).getUserMobile()); + } + } + BigDecimal unPaidMoney = mgtShopOrderPageVo.getReceivableMoney().subtract(mgtShopOrderPageVo.getPayMoney()); + mgtShopOrderPageVo.setUnPaidMoney(unPaidMoney == null ? zeroBig : unPaidMoney); + } + //处理商品信息 + List<MgtOrderGoodsPageVo> mgtOrderGoodsVoList; + String goodsString; + for (MgtShopOrderPageVo entity : shopOrderPageVoList) { + mgtOrderGoodsVoList = entity.getMgtOrderGoodsPageVoList(); + goodsString = mgtOrderGoodsVoList.stream() + .map(goods -> goods.getGoodsName() + "*" + goods.getBuyNum()) + .collect(Collectors.joining(";")); + entity.setGoodsInfo(goodsString); + } + } + return shopOrderPageVoList; + } + + + /** + * @param orderId + * @return MgtOrderDetailVo + * @description 获取订单详情 + * @author jqs + * @date 2023/6/16 16:49 + */ + @Override + public MgtOrderDetailVo getMgtOrderDetail(String orderId) { + // 创建MgtOrderDetailVo对象 + MgtOrderDetailVo mgtOrderDetailVo = new MgtOrderDetailVo(); + // 获取订单信息 + Order order = this.getById(orderId); + // 获取会员信息 + Member member = remoteMemberService.getMember(order.getUserId()).getData(); + // 获取订单商品详细信息 + List<MgtOrderGoodsDetailVo> orderGoodsDetailVoList = orderGoodsService.listMgtVoByOrderId(orderId); + // 设置MgtOrderDetailVo属性 + mgtOrderDetailVo.setOrderId(orderId); + mgtOrderDetailVo.setUserId(order.getUserId()); + mgtOrderDetailVo.setNickName(member.getNickName()); + mgtOrderDetailVo.setUserName(member.getRealName()); + mgtOrderDetailVo.setUserMobile(member.getMobile()); + mgtOrderDetailVo.setOrderGoodsDetailVoList(orderGoodsDetailVoList); + // 设置订单状态 + switch (order.getOrderStatus()) { + case 0: + mgtOrderDetailVo.setOrderStatus("已取消"); + break; + case 1: + mgtOrderDetailVo.setOrderStatus("待支付"); + break; + case 2: + mgtOrderDetailVo.setOrderStatus("待核销"); + break; + case 3: + mgtOrderDetailVo.setOrderStatus("已完成"); + break; + default: + mgtOrderDetailVo.setOrderStatus("删除"); + break; + } + // 设置订单编号 + mgtOrderDetailVo.setOrderNo(order.getOrderNo()); + mgtOrderDetailVo.setOutTradeNo(order.getOutTradeNo()); + // 设置订单来源 + switch (order.getOrderFrom()) { + case 1: + mgtOrderDetailVo.setOrderFrom("商城"); + break; + case 2: + mgtOrderDetailVo.setOrderFrom("秒杀活动"); + break; + case 3: + mgtOrderDetailVo.setOrderFrom("线下创建"); + break; + default: + mgtOrderDetailVo.setOrderStatus(""); + break; + } + // 设置订单支付相关属性 + mgtOrderDetailVo.setOrderMoney(order.getOrderMoney()); + mgtOrderDetailVo.setReceivableMoney(order.getReceivableMoney()); + mgtOrderDetailVo.setPayMoney(order.getPayMoney()); + mgtOrderDetailVo.setUnPaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + mgtOrderDetailVo.setActivityName(order.getActivityName()); + mgtOrderDetailVo.setCreateTime(order.getCreateTime()); + mgtOrderDetailVo.setOnlinePayMoney(order.getOnlinePayMoney()); + mgtOrderDetailVo.setOfflinePayMoney(order.getOfflinePayMoney()); + mgtOrderDetailVo.setPayTime(order.getPayTime()); + mgtOrderDetailVo.setOffPayTime(order.getOffPayTime()); + mgtOrderDetailVo.setCompleteTime(order.getUseTime()); + mgtOrderDetailVo.setCancelTime(order.getCancelTime()); + mgtOrderDetailVo.setOrderRemark(order.getOrderRemark()); + mgtOrderDetailVo.setShopId(order.getShopId()); + if (3 == order.getOrderStatus()) { + // 获取商店信息 + Shop shop = remoteShopService.getShop(order.getShopId()).getData(); + mgtOrderDetailVo.setShopName(shop.getShopName()); + } else { + mgtOrderDetailVo.setShopName(""); + } + mgtOrderDetailVo.setVerifyTime(order.getUseTime()); + //获取支付记录 + List<MgtOrderPayListVo> orderPayListVoList = payRecordService.listMgtOrderPayVo(orderId); + mgtOrderDetailVo.setOrderPayListVoList(orderPayListVoList); + return mgtOrderDetailVo; + } + + /** + * @param + * @return MgtBulletinBoardVo + * @description boardOrderTotal + * @author jqs34 + * @date 2023/6/18 17:20 + */ + @Override + public MgtBulletinBoardVo boardOrderTotal(List<Long> userIds) { + BoardMemberTotalDto boardMemberTotalDto = new BoardMemberTotalDto(); + boardMemberTotalDto.setUserIds(userIds); + List<Shop> shopList = remoteShopService.getShopBySysUserIds(boardMemberTotalDto); + List<Long> collect = shopList.stream().map(Shop::getShopId).collect(Collectors.toList()); + MgtBulletinBoardVo mgtBulletinBoardVo = orderMapper.boardOrderTotal(collect); + Integer activityUserTotal = orderMapper.activityUserTotal(collect); + mgtBulletinBoardVo.setActivityUserTotal(activityUserTotal); + return mgtBulletinBoardVo; + } + + /** + * @param mgtBaseShopDto + * @return MgtTotalOrderTotalVo + * @description getTotalOrderTotal + * @author jqs34 + * @date 2023/6/19 22:23 + */ + @Override + public MgtTotalOrderTotalVo getTotalOrderTotal(MgtBaseShopDto mgtBaseShopDto) { + //订单数量 订单金额 + MgtTotalOrderTotalVo mgtTotalOrderTotalVo = orderMapper.getTotalOrderTotalOrderFrom(mgtBaseShopDto); + //MgtTotalOrderTotalVo mgtTotalOrderTotalVoGoodsType = orderMapper.getTotalOrderTotalGoodsType(mgtBaseShopDto); + + //获取商品分类销售数据 + List<MgtMapTotalPlusVo> MgtMapIntTotalVoGoodsType = orderMapper.listTotalOrderTotalGoodsType(mgtBaseShopDto); + List<MgtMapIntTotalVo> goodsTypeTotalList = new ArrayList<>(); + List<MgtMapBigTotalVo> goodsTypeMoneyList = new ArrayList<>(); + if (MgtMapIntTotalVoGoodsType != null && MgtMapIntTotalVoGoodsType.size() > 0) { + MgtMapIntTotalVo mgtMapIntTotalVo; + MgtMapBigTotalVo mgtMapBigTotalVo; + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + Boolean noCycle = true; + Boolean noService = true; + Boolean noExperience = true; + Boolean noGoods = true; + mgtTotalOrderTotalVo.setCycleTotal(0); + mgtTotalOrderTotalVo.setCycleMoney(BigDecimal.ZERO); + mgtTotalOrderTotalVo.setServiceTotal(0); + mgtTotalOrderTotalVo.setServiceMoney(BigDecimal.ZERO); + mgtTotalOrderTotalVo.setExperienceTotal(0); + mgtTotalOrderTotalVo.setExperienceMoney(BigDecimal.ZERO); + for (int i = 0; i < MgtMapIntTotalVoGoodsType.size(); i++) { + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapIntTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtMapBigTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond()); + if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("1")) { + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapKey("周期"); + mgtTotalOrderTotalVo.setCycleTotal(mgtTotalOrderTotalVo.getCycleTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setCycleMoney(mgtTotalOrderTotalVo.getCycleMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noCycle= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("2")) { + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapKey("服务"); + mgtTotalOrderTotalVo.setServiceTotal(mgtTotalOrderTotalVo.getServiceTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setServiceMoney(mgtTotalOrderTotalVo.getServiceMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noService= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("3")) { + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapKey("体验"); + mgtTotalOrderTotalVo.setExperienceTotal(mgtTotalOrderTotalVo.getExperienceTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setExperienceMoney(mgtTotalOrderTotalVo.getExperienceMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noExperience = false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("4")) { + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapKey("单品"); + noGoods = false; + } + goodsTypeTotalList.add(mgtMapIntTotalVo); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + //补充缺少类型 + if(noCycle){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noService){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noExperience){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noGoods){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + mgtTotalOrderTotalVo.setGoodsTypeTotalList(goodsTypeTotalList); + mgtTotalOrderTotalVo.setGoodsTypeMoneyList(goodsTypeMoneyList); + } + //获取商品销售排名 + List<MgtMapBigTotalVo> goodsRankList = orderMapper.listTotalOrderTotalGoodsRank(mgtBaseShopDto); + if (goodsRankList != null && goodsRankList.size() > 0) { + goodsRankList = bigListRemoveNull(goodsRankList); + mgtTotalOrderTotalVo.setGoodsRankList(goodsRankList); + } + //获取来源销售排名 + List<MgtMapBigTotalVo> orderFromList = orderMapper.listTotalOrderTotalOrderFrom(mgtBaseShopDto); + if (orderFromList != null && orderFromList.size() > 0) { + orderFromList = bigListRemoveNull(orderFromList); + mgtTotalOrderTotalVo.setOrderFromRankList(orderFromList); + } + //订单分布 + //日期全部时固定为5天 + if(StringUtils.isBlank(mgtBaseShopDto.getStartDate())){ + mgtBaseShopDto.setEndDate(DateUtils.getDate()); + mgtBaseShopDto.setStartDate(DateUtils.parseDateToStr("yyyy-MM-dd",DateUtils.addDays(new Date(),-4))); + } + List<MgtMapTotalPlusVo> MgtMapIntTotalVos = orderMapper.listTotalOrderTotal(mgtBaseShopDto); + if (MgtMapIntTotalVos != null && MgtMapIntTotalVos.size() > 0) { + String[] orderTotalKey = new String[MgtMapIntTotalVos.size()]; + Integer[] orderTotalValue = new Integer[MgtMapIntTotalVos.size()]; + BigDecimal[] orderMoneyValue = new BigDecimal[MgtMapIntTotalVos.size()]; + for (int i = 0; i < MgtMapIntTotalVos.size(); i++) { + orderTotalKey[i] = MgtMapIntTotalVos.get(i).getMapKey(); + orderTotalValue[i] = MgtMapIntTotalVos.get(i).getMapValueFirst(); + orderMoneyValue[i] = MgtMapIntTotalVos.get(i).getMapValueSecond(); + } + mgtTotalOrderTotalVo.setOrderTotalKey(orderTotalKey); + mgtTotalOrderTotalVo.setOrderTotalValue(orderTotalValue); + mgtTotalOrderTotalVo.setOrderMoneyValue(orderMoneyValue); + } + return mgtTotalOrderTotalVo; + } + + /** + * @param MgtMapIntTotalVos + * @return List<MgtMapIntTotalVo> + * @description 去除空字符串 + * @author jqs + * @date 2023/6/27 17:35 + */ + private List<MgtMapIntTotalVo> listRemoveNull(List<MgtMapIntTotalVo> MgtMapIntTotalVos) { + for (int i = 0; i < MgtMapIntTotalVos.size(); i++) { + if (StringUtils.isBlank(MgtMapIntTotalVos.get(i).getMapKey())) { + MgtMapIntTotalVos.remove(i); + } + } + return MgtMapIntTotalVos; + } + + /** + * @param MgtMapIntTotalVos + * @return List<MgtMapIntTotalVo> + * @description 去除空字符串 + * @author jqs + * @date 2023/6/27 17:35 + */ + private List<MgtMapBigTotalVo> bigListRemoveNull(List<MgtMapBigTotalVo> MgtMapIntTotalVos) { + for (int i = 0; i < MgtMapIntTotalVos.size(); i++) { + if (StringUtils.isBlank(MgtMapIntTotalVos.get(i).getMapKey())) { + MgtMapIntTotalVos.remove(i); + } + } + return MgtMapIntTotalVos; + } + + /** + * @param mgtBaseShopDto + * @return MgtTotalActivityTotalVo + * @description + * @author jqs + * @date 2023/6/20 9:27 + */ + @Override + public MgtTotalActivityTotalVo getTotalActivityTotal(MgtBaseShopDto mgtBaseShopDto) { + MgtTotalActivityTotalVo totalActivityTotalVo = new MgtTotalActivityTotalVo(); + totalActivityTotalVo.setOrderTotal(0); + totalActivityTotalVo.setCycleTotal(0); + totalActivityTotalVo.setExperienceTotal(0); + totalActivityTotalVo.setServiceTotal(0); + totalActivityTotalVo.setOrderMoney(new BigDecimal("0")); + totalActivityTotalVo.setCycleMoney(new BigDecimal("0")); + totalActivityTotalVo.setExperienceMoney(new BigDecimal("0")); + totalActivityTotalVo.setServiceMoney(new BigDecimal("0")); + totalActivityTotalVo.setOrderJoinPerson(0); + totalActivityTotalVo.setOrderPerson(0); + totalActivityTotalVo.setCyclePerson(0); + totalActivityTotalVo.setExperiencePerson(0); + totalActivityTotalVo.setServicePerson(0); + totalActivityTotalVo.setOrderTotalKey(new String[0]); + totalActivityTotalVo.setOrderTotalValue(new Integer[0]); + totalActivityTotalVo.setOrderMoneyValue(new BigDecimal[0]); + totalActivityTotalVo.setGoodsTypeTotalList(Lists.newArrayList()); + totalActivityTotalVo.setGoodsTypeMoneyList(Lists.newArrayList()); + totalActivityTotalVo.setJoinMemberTotalKey(new String[0]); + totalActivityTotalVo.setJoinMemberTotalValue(new Integer[0]); + //获取基础统计 总订单数 订单金额 参与人数 + MgtTotalActivityTotalVo mgtTotalActivityTotalVo = orderMapper.getTotalActivityTotal(mgtBaseShopDto); + totalActivityTotalVo.setOrderTotal(mgtTotalActivityTotalVo.getOrderTotal()); + totalActivityTotalVo.setOrderMoney(mgtTotalActivityTotalVo.getOrderMoney()); + totalActivityTotalVo.setOrderJoinPerson(mgtTotalActivityTotalVo.getOrderJoinPerson()); + //获客人数 + MgtTotalActivityTotalVo totalActivityMemberTotalVo = orderMapper.getTotalActivityMemberTotal(mgtBaseShopDto); + totalActivityTotalVo.setOrderPerson(totalActivityMemberTotalVo.getOrderPerson()); + totalActivityTotalVo.setCyclePerson(totalActivityMemberTotalVo.getCyclePerson()); + totalActivityTotalVo.setServicePerson(totalActivityMemberTotalVo.getServicePerson()); + totalActivityTotalVo.setExperiencePerson(totalActivityMemberTotalVo.getExperiencePerson()); + //获取商品分类销售数据 + List<MgtMapTotalPlusVo> MgtMapIntTotalVoGoodsType = orderMapper.listTotalActivityTotalGoodsType(mgtBaseShopDto); + if (MgtMapIntTotalVoGoodsType != null && MgtMapIntTotalVoGoodsType.size() > 0) { + List<MgtMapIntTotalVo> goodsTypeTotalList = new ArrayList<>(); + List<MgtMapBigTotalVo> goodsTypeMoneyList = new ArrayList<>(); + totalActivityTotalVo.setCycleTotal(0); + totalActivityTotalVo.setCycleMoney(BigDecimal.ZERO); + totalActivityTotalVo.setServiceTotal(0); + totalActivityTotalVo.setServiceMoney(BigDecimal.ZERO); + totalActivityTotalVo.setExperienceTotal(0); + totalActivityTotalVo.setExperienceMoney(BigDecimal.ZERO); + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + MgtMapIntTotalVo mgtMapIntTotalVo; + MgtMapBigTotalVo mgtMapBigTotalVo; + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + Boolean noCycle = true; + Boolean noService = true; + Boolean noExperience = true; + Boolean noGoods = true; + for (int i = 0; i < MgtMapIntTotalVoGoodsType.size(); i++) { + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapIntTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtMapBigTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond()); + if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("1")) { + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapKey("周期"); + totalActivityTotalVo.setCycleTotal(totalActivityTotalVo.getCycleTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + totalActivityTotalVo.setCycleMoney(totalActivityTotalVo.getCycleMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noCycle= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("2")) { + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapKey("服务"); + totalActivityTotalVo.setServiceTotal(totalActivityTotalVo.getServiceTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + totalActivityTotalVo.setServiceMoney(totalActivityTotalVo.getServiceMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noService= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("3")) { + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapKey("体验"); + totalActivityTotalVo.setExperienceTotal(totalActivityTotalVo.getExperienceTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + totalActivityTotalVo.setExperienceMoney(totalActivityTotalVo.getExperienceMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noExperience = false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("4")) { + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapKey("单品"); + noGoods = false; + } + goodsTypeTotalList.add(mgtMapIntTotalVo); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + //补充缺少类型 + if(noCycle){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noService){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noExperience){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noGoods){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + totalActivityTotalVo.setGoodsTypeTotalList(goodsTypeTotalList); + totalActivityTotalVo.setGoodsTypeMoneyList(goodsTypeMoneyList); + } + + //获取订单分布 + //日期全部时固定为5天 + if(StringUtils.isBlank(mgtBaseShopDto.getStartDate())){ + mgtBaseShopDto.setEndDate(DateUtils.getDate()); + mgtBaseShopDto.setStartDate(DateUtils.parseDateToStr("yyyy-MM-dd",DateUtils.addDays(new Date(),-4))); + } + List<MgtMapTotalPlusVo> MgtMapIntTotalVos = orderMapper.listTotalActivityTotal(mgtBaseShopDto); + if (MgtMapIntTotalVos != null && MgtMapIntTotalVos.size() > 0) { + String[] orderTotalKey = new String[MgtMapIntTotalVos.size()]; + Integer[] orderTotalValue = new Integer[MgtMapIntTotalVos.size()]; + BigDecimal[] orderMoneyValue = new BigDecimal[MgtMapIntTotalVos.size()]; + for (int i = 0; i < MgtMapIntTotalVos.size(); i++) { + orderTotalKey[i] = MgtMapIntTotalVos.get(i).getMapKey(); + orderTotalValue[i] = MgtMapIntTotalVos.get(i).getMapValueFirst(); + orderMoneyValue[i] = MgtMapIntTotalVos.get(i).getMapValueSecond(); + } + totalActivityTotalVo.setOrderTotalKey(orderTotalKey); + totalActivityTotalVo.setOrderTotalValue(orderTotalValue); + totalActivityTotalVo.setOrderMoneyValue(orderMoneyValue); + } + //参与人数 2023-09-06 另开接口 + /*List<MgtMapIntTotalVo> joinList = orderMapper.getActivityMemberTotal(mgtBaseShopDto); + // 将查询结果转为Map + Map<String, Integer> mgtMapIntTotalVoMap = new HashMap<>(); + if (joinList != null && !joinList.isEmpty()) { + mgtMapIntTotalVoMap = joinList.stream() + .collect(Collectors.toMap(MgtMapIntTotalVo::getMapKey, MgtMapIntTotalVo::getMapValue)); + } + // 获取日期范围 + List<String> dateList = getDateRange(mgtBaseShopDto.getStartDate(), mgtBaseShopDto.getEndDate()); + int size = dateList.size(); + // 创建日期和成员总数的数组 + String[] joinMemberTotalKey = new String[size]; + Integer[] joinMemberTotalValue = new Integer[size]; + // 遍历日期列表,设置日期和成员总数的数组 + String str; + Integer value; + for (int i = 0; i < size; i++) { + str = dateList.get(i); + joinMemberTotalKey[i] = str; + value = mgtMapIntTotalVoMap.get(str); + joinMemberTotalValue[i] = (value != null) ? value : 0; + } + totalActivityTotalVo.setJoinMemberTotalKey(joinMemberTotalKey); + totalActivityTotalVo.setJoinMemberTotalValue(joinMemberTotalValue);*/ + return totalActivityTotalVo; + } + + @Override + public MgtTotalActivityTotalVo getTotalActivityJoinMemberTotal(MgtBaseShopDto mgtBaseShopDto) { + MgtTotalActivityTotalVo totalActivityTotalVo = new MgtTotalActivityTotalVo(); + //日期全部时固定为5天 + if(StringUtils.isBlank(mgtBaseShopDto.getStartDate())){ + mgtBaseShopDto.setEndDate(DateUtils.getDate()); + mgtBaseShopDto.setStartDate(DateUtils.parseDateToStr("yyyy-MM-dd",DateUtils.addDays(new Date(),-4))); + } + if(mgtBaseShopDto.getAgeType()!=null){ + List<Long> userIdList = remoteMemberService.listUserIdByAgeType(mgtBaseShopDto.getAgeType()).getData(); + mgtBaseShopDto.setUserIdList(userIdList); + } + //参与人数 + List<MgtMapIntTotalVo> joinList = orderMapper.getActivityMemberTotal(mgtBaseShopDto); + // 将查询结果转为Map + Map<String, Integer> mgtMapIntTotalVoMap = new HashMap<>(); + if (joinList != null && !joinList.isEmpty()) { + mgtMapIntTotalVoMap = joinList.stream() + .collect(Collectors.toMap(MgtMapIntTotalVo::getMapKey, MgtMapIntTotalVo::getMapValue)); + } + // 获取日期范围 + List<String> dateList = getDateRange(mgtBaseShopDto.getStartDate(), mgtBaseShopDto.getEndDate()); + int size = dateList.size(); + // 创建日期和成员总数的数组 + String[] joinMemberTotalKey = new String[size]; + Integer[] joinMemberTotalValue = new Integer[size]; + // 遍历日期列表,设置日期和成员总数的数组 + String str; + Integer value; + for (int i = 0; i < size; i++) { + str = dateList.get(i); + joinMemberTotalKey[i] = str; + value = mgtMapIntTotalVoMap.get(str); + joinMemberTotalValue[i] = (value != null) ? value : 0; + } + totalActivityTotalVo.setJoinMemberTotalKey(joinMemberTotalKey); + totalActivityTotalVo.setJoinMemberTotalValue(joinMemberTotalValue); + return totalActivityTotalVo; + } + + /** + * @param mgtActivityAgeDto + * @return MgtTotalActivityTotalVo + * @description + * @author jqs + * @date 2023/6/20 9:56 + */ + /*@Override + public MgtTotalActivityTotalVo getTotalActivityAgeRank(MgtActivityAgeDto mgtActivityAgeDto) { + List<Long> userIds = orderMapper.getUserIdAgeRank(mgtActivityAgeDto); + mgtActivityAgeDto.setUserIds(userIds); + userIds = remoteMemberService.listUserIdByAge(mgtActivityAgeDto).getData(); + mgtActivityAgeDto.setUserIds(userIds); + List<MgtMapIntTotalVo> ageRankList = orderMapper.getTotalActivityAgeRank(mgtActivityAgeDto); + ageRankList = listRemoveNull(ageRankList); + MgtTotalActivityTotalVo totalActivityTotalVo = new MgtTotalActivityTotalVo(); + String[] activityAgeKey = new String[ageRankList.size()]; + Integer[] activityAgeValue = new Integer[ageRankList.size()]; + if (!ageRankList.isEmpty()) { + MgtMapIntTotalVo MgtMapIntTotalVo; + for (int i = 0; i < ageRankList.size(); i++) { + MgtMapIntTotalVo = ageRankList.get(i); + activityAgeKey[i] = MgtMapIntTotalVo.getMapKey(); + activityAgeValue[i] = MgtMapIntTotalVo.getMapValue(); + } + } + totalActivityTotalVo.setActivityAgeKey(activityAgeKey); + totalActivityTotalVo.setActivityAgeValue(activityAgeValue); + return totalActivityTotalVo; + }*/ + + /** + * @param mgtBaseShopDto + * @return MgtTotalDataTotalVo + * @description + * @author jqs + * @date 2023/6/20 15:31 + */ + @Override + public MgtTotalDataTotalVo getTotalDataTotal(MgtBaseShopDto mgtBaseShopDto) { + + //营业额 + BigDecimal salesTotal = orderMapper.shopSalesTotal(mgtBaseShopDto); + MgtTotalDataTotalVo mgtTotalDataTotalVo = orderMapper.getTotalDataTotal(mgtBaseShopDto); + // 获取当月时间 + LocalDate currentDate = LocalDate.now(); + LocalDate firstDayOfMonth = currentDate.withDayOfMonth(1); + LocalDate lastDayOfMonth = currentDate.withDayOfMonth(currentDate.lengthOfMonth()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String firstDayOfMonthStr = firstDayOfMonth.format(formatter); + String lastDayOfMonthStr = lastDayOfMonth.format(formatter); + mgtBaseShopDto.setStartDate(firstDayOfMonthStr); + mgtBaseShopDto.setEndDate(lastDayOfMonthStr); + //总进店人数 体验人数 体验开单人数 没体验开单人数 + MgtTotalDataTotalVo mgtTotalDataMemberTotalVo = orderMapper.getTotalDataMemberTotal(mgtBaseShopDto); + mgtTotalDataTotalVo.setOnlyExperiencePerson(mgtTotalDataMemberTotalVo.getOnlyExperiencePerson()); + mgtTotalDataTotalVo.setExperienceCyclePerson(mgtTotalDataMemberTotalVo.getExperienceCyclePerson()); + mgtTotalDataTotalVo.setOnlyCyclePerson(mgtTotalDataMemberTotalVo.getOnlyCyclePerson()); + mgtTotalDataTotalVo.setOrderPerson(mgtTotalDataMemberTotalVo.getOrderPerson()); + //续单人数 + Integer reorderPerson = orderMapper.getReorderPerson(mgtBaseShopDto); + //回头客 + Integer returnedPerson = orderMapper.getReturnedPerson(mgtBaseShopDto); + mgtTotalDataTotalVo.setSalesTotal(salesTotal); + mgtTotalDataTotalVo.setReorderPerson(reorderPerson); + mgtTotalDataTotalVo.setReturnedPerson(returnedPerson); + return mgtTotalDataTotalVo; + } + + /** + * @param mgtBasePlatformDto + * @return List<MgtMapIntTotalVo> + * @description + * @author jqs + * @date 2023/6/21 15:26 + */ + @Override + public List<MgtMapIntTotalVo> listMemberGoodsRank(MgtBasePlatformDto mgtBasePlatformDto) { + return orderMapper.listMemberGoodsRank(mgtBasePlatformDto); + } + + /** + * @param mgtBasePlatformDto + * @return List<MgtTotalDataTotalVo> + * @description 获取平台商户数据统计 + * @author jqs34 + * @date 2023/6/23 14:01 + */ + @Override + public List<MgtTotalDataTotalVo> getPlTotalDataTotal(MgtBasePlatformDto mgtBasePlatformDto) { + //获取需要关联的用户id集合 + if (mgtBasePlatformDto.getDeptId() != null) { + List<Long> userIdList = new ArrayList<>(); + if (mgtBasePlatformDto.getUserId() != null) { + userIdList.add(mgtBasePlatformDto.getUserId()); + } else { + MgtUserIdByDept mgtUserIdByDept = new MgtUserIdByDept(); + mgtUserIdByDept.setDeptId(mgtBasePlatformDto.getDeptId()); + mgtUserIdByDept = remoteConfigService.getUserIdByDept(mgtUserIdByDept).getData(); + userIdList = mgtUserIdByDept.getUserIdList(); + } + if (!userIdList.isEmpty()) { + mgtBasePlatformDto.setUserIdList(userIdList); + } + } + //数据权限 + List<Long> userIds = remoteUserService.getScopeOfAuthorityUserId(); + if(null != userIds){ + List<Long> userIdList = mgtBasePlatformDto.getUserIdList(); + if(null != userIdList){ + userIdList.addAll(userIds); + }else{ + userIdList = userIds; + } + mgtBasePlatformDto.setUserIdList(userIdList); + } + + + List<Long> shopIdList = new ArrayList<>(); + if(mgtBasePlatformDto.getShopId()!=null){ + shopIdList.add(mgtBasePlatformDto.getShopId()); + }else{ + shopIdList = remoteShopService.listShopIdByPlTotal(mgtBasePlatformDto).getData(); + } + List<MgtTotalDataTotalVo> mgtTotalDataTotalVoList = new ArrayList<>(); + MgtBaseShopDto mgtBaseShopDto; + MgtTotalDataTotalVo mgtTotalDataTotalVo; + MgtSimpleShopVo simpleShopVo; + HashSet<String> set = new HashSet<>(); + // 遍历MgtMemberOrderPageVoList,获取shopId并添加到set中 + if(null != shopIdList){ + for (Long entity : shopIdList) { + set.add(entity.toString()); + } + } + String joinedString = String.join(",", set); + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(joinedString); + List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData(); + // 将MgtSimpleShopVoList转换为Map<Long, MgtSimpleShopVo>,以便后续根据shopId获取对应的MgtSimpleShopVo + Map<Long, MgtSimpleShopVo> shopMap = simpleShopVoList.stream() + .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity())); + if (shopIdList != null && !shopIdList.isEmpty()) { + for (Long shopId : shopIdList) { + mgtBaseShopDto = new MgtBaseShopDto(); + mgtBaseShopDto.setStartDate(mgtBasePlatformDto.getStartDate()); + mgtBaseShopDto.setEndDate(mgtBasePlatformDto.getEndDate()); + mgtBaseShopDto.setShopId(shopId); + mgtTotalDataTotalVo = this.getTotalDataTotal(mgtBaseShopDto); + simpleShopVo = shopMap.get(shopId); + if (simpleShopVo!=null) { + mgtTotalDataTotalVo.setShopName(simpleShopVo.getShopName()); + } + mgtTotalDataTotalVoList.add(mgtTotalDataTotalVo); + } + } + return mgtTotalDataTotalVoList; + } + + /** + * @param mgtBasePlatformDto + * @return MgtTotalOrderTotalVo + * @description 获取平台商户订单统计 + * @author jqs34 + * @date 2023/6/19 22:23 + */ + @Override + public MgtTotalOrderTotalVo getPlTotalOrderTotal(MgtBasePlatformDto mgtBasePlatformDto) { + //获取需要关联的用户id集合 + if (mgtBasePlatformDto.getDeptId() != null) { + List<Long> userIdList = new ArrayList<>(); + if (mgtBasePlatformDto.getUserId() != null) { + userIdList.add(mgtBasePlatformDto.getUserId()); + } else { + List<SysUser> data = remoteUserService.getUsersByDeptId(mgtBasePlatformDto.getDeptId()).getData(); + userIdList.addAll(data.stream().map(SysUser::getUserId).collect(Collectors.toList())); + } + if (!userIdList.isEmpty()) { + mgtBasePlatformDto.setUserIdList(userIdList); + } + } + //数据权限 + List<Long> userIdList = mgtBasePlatformDto.getUserIdList(); + List<Long> userIds = remoteUserService.getScopeOfAuthorityUserId(); + if(null != userIds){ + if(null != userIdList){ + userIdList.addAll(userIds); + }else{ + userIdList = userIds; + } + mgtBasePlatformDto.setUserIdList(userIdList); + } + + + MgtTotalOrderTotalVo mgtTotalOrderTotalVo = new MgtTotalOrderTotalVo(); + mgtTotalOrderTotalVo.setOrderTotal(0); + mgtTotalOrderTotalVo.setOnlineTotal(0); + mgtTotalOrderTotalVo.setOfflineTotal(0); + mgtTotalOrderTotalVo.setActivityTotal(0); + mgtTotalOrderTotalVo.setCycleTotal(0); + mgtTotalOrderTotalVo.setExperienceTotal(0); + mgtTotalOrderTotalVo.setServiceTotal(0); + mgtTotalOrderTotalVo.setItemTotal(0); + mgtTotalOrderTotalVo.setOrderMoney(new BigDecimal("0")); + mgtTotalOrderTotalVo.setOnlineMoney(new BigDecimal("0")); + mgtTotalOrderTotalVo.setOfflineMoney(new BigDecimal("0")); + mgtTotalOrderTotalVo.setActivityMoney(new BigDecimal("0")); + mgtTotalOrderTotalVo.setCycleMoney(new BigDecimal("0")); + mgtTotalOrderTotalVo.setExperienceMoney(new BigDecimal("0")); + mgtTotalOrderTotalVo.setServiceMoney(new BigDecimal("0")); + mgtTotalOrderTotalVo.setItemMoney(new BigDecimal("0")); + mgtTotalOrderTotalVo.setOrderTotalKey(new String[0]); + mgtTotalOrderTotalVo.setOrderTotalValue(new Integer[0]); + mgtTotalOrderTotalVo.setOrderMoneyValue(new BigDecimal[0]); + mgtTotalOrderTotalVo.setGoodsTypeTotalList(Lists.newArrayList()); + mgtTotalOrderTotalVo.setGoodsTypeMoneyList(Lists.newArrayList()); + mgtTotalOrderTotalVo.setGoodsRankList(Lists.newArrayList()); + mgtTotalOrderTotalVo.setOrderFromRankList(Lists.newArrayList()); + + List<Long> shopIdList = remoteShopService.listShopIdByPlTotal(mgtBasePlatformDto).getData(); + if (mgtBasePlatformDto.getUserId() != null || StringUtils.isNotBlank(mgtBasePlatformDto.getShopProvinceCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopCityCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopAreaCode())) { + if(shopIdList==null||shopIdList.isEmpty()){ + return mgtTotalOrderTotalVo; + } + } + if(mgtBasePlatformDto.getShopId()!=null){ + shopIdList = new ArrayList<>(); + shopIdList.add(mgtBasePlatformDto.getShopId()); + } + mgtBasePlatformDto.setShopIdList(shopIdList); + //获取基础统计 + MgtTotalOrderTotalVo totalOrderTotalVo = orderMapper.getPlTotalOrderTotalOrderFrom(mgtBasePlatformDto); + mgtTotalOrderTotalVo.setOrderTotal(totalOrderTotalVo.getOrderTotal()); + mgtTotalOrderTotalVo.setOnlineTotal(totalOrderTotalVo.getOnlineTotal()); + mgtTotalOrderTotalVo.setOfflineTotal(totalOrderTotalVo.getOfflineTotal()); + mgtTotalOrderTotalVo.setActivityTotal(totalOrderTotalVo.getActivityTotal()); + mgtTotalOrderTotalVo.setOrderMoney(totalOrderTotalVo.getOrderMoney()); + mgtTotalOrderTotalVo.setOnlineMoney(totalOrderTotalVo.getOnlineMoney()); + mgtTotalOrderTotalVo.setOfflineMoney(totalOrderTotalVo.getOfflineMoney()); + mgtTotalOrderTotalVo.setActivityMoney(totalOrderTotalVo.getActivityMoney()); + //获取商品分类销售数据 + List<MgtMapTotalPlusVo> MgtMapIntTotalVoGoodsType = orderMapper.listPlTotalOrderTotalGoodsType(mgtBasePlatformDto); + List<MgtMapIntTotalVo> goodsTypeTotalList = new ArrayList<>(); + List<MgtMapBigTotalVo> goodsTypeMoneyList = new ArrayList<>(); + mgtTotalOrderTotalVo.setCycleTotal(0); + mgtTotalOrderTotalVo.setCycleMoney(BigDecimal.ZERO); + mgtTotalOrderTotalVo.setServiceTotal(0); + mgtTotalOrderTotalVo.setServiceMoney(BigDecimal.ZERO); + mgtTotalOrderTotalVo.setItemTotal(0); + mgtTotalOrderTotalVo.setItemMoney(BigDecimal.ZERO); + mgtTotalOrderTotalVo.setExperienceTotal(0); + mgtTotalOrderTotalVo.setExperienceMoney(BigDecimal.ZERO); + if (MgtMapIntTotalVoGoodsType != null && MgtMapIntTotalVoGoodsType.size() > 0) { + MgtMapIntTotalVo mgtMapIntTotalVo; + MgtMapBigTotalVo mgtMapBigTotalVo; + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + Boolean noCycle = true; + Boolean noService = true; + Boolean noExperience = true; + Boolean noGoods = true; + for (int i = 0; i < MgtMapIntTotalVoGoodsType.size(); i++) { + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapIntTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtMapBigTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond()); + if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("1")) { + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapKey("周期"); + mgtTotalOrderTotalVo.setCycleTotal(mgtTotalOrderTotalVo.getCycleTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setCycleMoney(mgtTotalOrderTotalVo.getCycleMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noCycle= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("2")) { + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapKey("服务"); + mgtTotalOrderTotalVo.setServiceTotal(mgtTotalOrderTotalVo.getServiceTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setServiceMoney(mgtTotalOrderTotalVo.getServiceMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noService= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("3")) { + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapKey("体验"); + mgtTotalOrderTotalVo.setExperienceTotal(mgtTotalOrderTotalVo.getExperienceTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setExperienceMoney(mgtTotalOrderTotalVo.getExperienceMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noExperience = false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("4")) { + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapKey("单品"); + mgtTotalOrderTotalVo.setItemTotal(mgtTotalOrderTotalVo.getItemTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setItemMoney(mgtTotalOrderTotalVo.getItemMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noGoods = false; + } + goodsTypeTotalList.add(mgtMapIntTotalVo); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + //补充缺少类型 + if(noCycle){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noService){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noExperience){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noGoods){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + mgtTotalOrderTotalVo.setGoodsTypeTotalList(goodsTypeTotalList); + mgtTotalOrderTotalVo.setGoodsTypeMoneyList(goodsTypeMoneyList); + } + //获取商品销售排名 + List<MgtMapBigTotalVo> goodsRankList = orderMapper.listPlTotalOrderTotalGoodsRank(mgtBasePlatformDto); + if (goodsRankList != null && goodsRankList.size() > 0) { + goodsRankList = bigListRemoveNull(goodsRankList); + mgtTotalOrderTotalVo.setGoodsRankList(goodsRankList); + } + //获取来源销售排名 + List<MgtMapBigTotalVo> orderFromList = orderMapper.listPlTotalOrderTotalOrderFrom(mgtBasePlatformDto); + if (orderFromList != null && orderFromList.size() > 0) { + orderFromList = bigListRemoveNull(orderFromList); + mgtTotalOrderTotalVo.setOrderFromRankList(orderFromList); + } + //订单分布 + //日期全部时固定为5天 + Boolean fillZero = false; + if(StringUtils.isBlank(mgtBasePlatformDto.getStartDate())){ + mgtBasePlatformDto.setEndDate(DateUtils.getDate()); + mgtBasePlatformDto.setStartDate(DateUtils.parseDateToStr("yyyy-MM-dd",DateUtils.addDays(new Date(),-4))); + fillZero = true; + } + List<MgtMapTotalPlusVo> MgtMapIntTotalVos = orderMapper.listPlTotalOrderTotal(mgtBasePlatformDto); + if (MgtMapIntTotalVos != null && MgtMapIntTotalVos.size() > 0) { + String[] orderTotalKey = new String[MgtMapIntTotalVos.size()]; + Integer[] orderTotalValue = new Integer[MgtMapIntTotalVos.size()]; + BigDecimal[] orderMoneyValue = new BigDecimal[MgtMapIntTotalVos.size()]; + for (int i = 0; i < MgtMapIntTotalVos.size(); i++) { + orderTotalKey[i] = MgtMapIntTotalVos.get(i).getMapKey(); + orderTotalValue[i] = MgtMapIntTotalVos.get(i).getMapValueFirst(); + orderMoneyValue[i] = MgtMapIntTotalVos.get(i).getMapValueSecond(); + } + if(fillZero){ + MerOrderDistributionTotalVo merOrderDistributionTotalVo = fillOrderTotalKeyAndValuesToRecentFiveDays(orderTotalKey,orderTotalValue,orderMoneyValue); + mgtTotalOrderTotalVo.setOrderTotalKey(merOrderDistributionTotalVo.getOrderTotalKey()); + mgtTotalOrderTotalVo.setOrderTotalValue(merOrderDistributionTotalVo.getOrderTotalValue()); + mgtTotalOrderTotalVo.setOrderMoneyValue(merOrderDistributionTotalVo.getOrderMoneyValue()); + }else{ + mgtTotalOrderTotalVo.setOrderTotalKey(orderTotalKey); + mgtTotalOrderTotalVo.setOrderTotalValue(orderTotalValue); + mgtTotalOrderTotalVo.setOrderMoneyValue(orderMoneyValue); + } + + } + return mgtTotalOrderTotalVo; + } + + /** + * @param mgtBasePlatformDto + * @return MgtTotalActivityTotalVo + * @description + * @author jqs + * @date 2023/6/20 9:27 + */ + @Override + public MgtPlTotalActivityTotalVo getPlTotalActivityTotal(MgtBasePlatformDto mgtBasePlatformDto) { + MgtPlTotalActivityTotalVo totalActivityTotalVo = new MgtPlTotalActivityTotalVo(); + totalActivityTotalVo.setOrderTotal(0); + totalActivityTotalVo.setCycleTotal(0); + totalActivityTotalVo.setExperienceTotal(0); + totalActivityTotalVo.setServiceTotal(0); + totalActivityTotalVo.setOrderMoney(new BigDecimal("0")); + totalActivityTotalVo.setCycleMoney(new BigDecimal("0")); + totalActivityTotalVo.setExperienceMoney(new BigDecimal("0")); + totalActivityTotalVo.setServiceMoney(new BigDecimal("0")); + totalActivityTotalVo.setOrderJoinPerson(0); + totalActivityTotalVo.setOrderPerson(0); + totalActivityTotalVo.setCyclePerson(0); + totalActivityTotalVo.setExperiencePerson(0); + totalActivityTotalVo.setServicePerson(0); + totalActivityTotalVo.setOrderTotalKey(new String[0]); + totalActivityTotalVo.setOrderTotalValue(new Integer[0]); + totalActivityTotalVo.setOrderMoneyValue(new BigDecimal[0]); + totalActivityTotalVo.setGoodsTypeTotalList(Lists.newArrayList()); + totalActivityTotalVo.setGoodsTypeMoneyList(Lists.newArrayList()); + totalActivityTotalVo.setActivityRankList(Lists.newArrayList()); + totalActivityTotalVo.setShopSalesRankKey(new String[0]); + totalActivityTotalVo.setShopSalesRankValue(new BigDecimal[0]); + totalActivityTotalVo.setActivitySalesRankList(Lists.newArrayList()); + totalActivityTotalVo.setJoinMemberTotalKey(new String[0]); + totalActivityTotalVo.setJoinMemberTotalValue(new Integer[0]); + totalActivityTotalVo.setGetMemberTotalKey(new String[0]); + totalActivityTotalVo.setGetMemberTotalValue(new Integer[0]); + //店铺活动返回空 + if(mgtBasePlatformDto.getActivityFrom()!=null&&mgtBasePlatformDto.getActivityFrom()==2){ + return totalActivityTotalVo; + } + + //数据权限 + List<Long> userIds = remoteUserService.getScopeOfAuthorityUserId(); + if(null != userIds){ + List<Long> userIdList = mgtBasePlatformDto.getUserIdList(); + if(null == userIdList){ + userIdList = new ArrayList<>(); + } + userIdList.addAll(userIds); + mgtBasePlatformDto.setUserIdList(userIdList); + } + + List<Long> shopIdList = remoteShopService.listShopIdByPlTotal(mgtBasePlatformDto).getData(); + if (StringUtils.isNotBlank(mgtBasePlatformDto.getShopProvinceCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopCityCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopAreaCode())) { + if(shopIdList==null||shopIdList.isEmpty()){ + return totalActivityTotalVo; + } + } + if(mgtBasePlatformDto.getShopId()!=null){ + shopIdList = new ArrayList<>(); + shopIdList.add(mgtBasePlatformDto.getShopId()); + } + mgtBasePlatformDto.setShopIdList(shopIdList); + + //获取基础统计 + MgtPlTotalActivityTotalVo mgtTotalActivityTotalVo = orderMapper.getPlTotalActivityTotal(mgtBasePlatformDto); + totalActivityTotalVo.setOrderTotal(mgtTotalActivityTotalVo.getOrderTotal()); + totalActivityTotalVo.setOrderMoney(mgtTotalActivityTotalVo.getOrderMoney()); + totalActivityTotalVo.setOrderJoinPerson(mgtTotalActivityTotalVo.getOrderJoinPerson()); + //获客人数 + MgtPlTotalActivityTotalVo totalActivityMemberTotalVo = orderMapper.getPlTotalActivityMemberTotal(mgtBasePlatformDto); + totalActivityTotalVo.setOrderPerson(totalActivityMemberTotalVo.getOrderPerson()); + totalActivityTotalVo.setCyclePerson(totalActivityMemberTotalVo.getCyclePerson()); + totalActivityTotalVo.setServicePerson(totalActivityMemberTotalVo.getServicePerson()); + totalActivityTotalVo.setExperiencePerson(totalActivityMemberTotalVo.getExperiencePerson()); + //获取商品分类销售数据 + List<MgtMapTotalPlusVo> MgtMapIntTotalVoGoodsType = orderMapper.listPlTotalActivityTotalGoodsType(mgtBasePlatformDto); + List<MgtMapIntTotalVo> goodsTypeTotalList = new ArrayList<>(); + List<MgtMapBigTotalVo> goodsTypeMoneyList = new ArrayList<>(); + totalActivityTotalVo.setCycleTotal(0); + totalActivityTotalVo.setCycleMoney(BigDecimal.ZERO); + totalActivityTotalVo.setServiceTotal(0); + totalActivityTotalVo.setServiceMoney(BigDecimal.ZERO); + totalActivityTotalVo.setExperienceTotal(0); + totalActivityTotalVo.setExperienceMoney(BigDecimal.ZERO); + if (MgtMapIntTotalVoGoodsType != null && MgtMapIntTotalVoGoodsType.size() > 0) { + MgtMapIntTotalVo mgtMapIntTotalVo; + MgtMapBigTotalVo mgtMapBigTotalVo; + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + Boolean noCycle = true; + Boolean noService = true; + Boolean noExperience = true; + Boolean noGoods = true; + for (int i = 0; i < MgtMapIntTotalVoGoodsType.size(); i++) { + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapIntTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtMapBigTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond()); + if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("1")) { + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapKey("周期"); + totalActivityTotalVo.setCycleTotal(totalActivityTotalVo.getCycleTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + totalActivityTotalVo.setCycleMoney(totalActivityTotalVo.getCycleMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noCycle= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("2")) { + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapKey("服务"); + totalActivityTotalVo.setServiceTotal(totalActivityTotalVo.getServiceTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + totalActivityTotalVo.setServiceMoney(totalActivityTotalVo.getServiceMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noService= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("3")) { + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapKey("体验"); + totalActivityTotalVo.setExperienceTotal(totalActivityTotalVo.getExperienceTotal() + MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + totalActivityTotalVo.setExperienceMoney(totalActivityTotalVo.getExperienceMoney().add(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond())); + noExperience = false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("4")) { + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapKey("单品"); + noGoods = false; + } + goodsTypeTotalList.add(mgtMapIntTotalVo); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + //补充缺少类型 + if(noCycle){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noService){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noExperience){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noGoods){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + totalActivityTotalVo.setGoodsTypeTotalList(goodsTypeTotalList); + totalActivityTotalVo.setGoodsTypeMoneyList(goodsTypeMoneyList); + } + HashSet<String> set = new HashSet<>(); + // 遍历MgtMemberOrderPageVoList,获取shopId并添加到set中 + if(null != mgtBasePlatformDto.getShopIdList()){ + for (Long shopId : mgtBasePlatformDto.getShopIdList()) { + set.add(shopId.toString()); + } + } + // 将set中的shopId转换为逗号分隔的字符串 + String joinedString = String.join(",", set); + // 通过remoteShopService获取MgtSimpleShopVoList + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(joinedString); + List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData(); + // 将MgtSimpleShopVoList转换为Map<Long, MgtSimpleShopVo>,以便后续根据shopId获取对应的MgtSimpleShopVo + Map<Long, MgtSimpleShopVo> shopMap = simpleShopVoList.stream() + .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity())); + //商户活动次数排名 + List<MgtMapIntTotalVo> shopActivityRank = orderMapper.listPlTotalShopActivityRank(mgtBasePlatformDto); + if (shopActivityRank != null && shopActivityRank.size() > 0) { + for(MgtMapIntTotalVo mgtMapIntTotalVo : shopActivityRank){ + if(shopMap.get(Long.valueOf(mgtMapIntTotalVo.getMapKey()))!=null){ + mgtMapIntTotalVo.setMapKey(shopMap.get(Long.valueOf(mgtMapIntTotalVo.getMapKey())).getShopName()); + } + } + totalActivityTotalVo.setActivityRankList(shopActivityRank); + } + //商户活动销售额排名 + List<MgtMapBigTotalVo> shopActivitySalesRank = orderMapper.listPlTotalShopActivitySalesRank(mgtBasePlatformDto); + if (shopActivitySalesRank != null && shopActivitySalesRank.size() > 0) { + String[] shopSalesRankKey = new String[shopActivitySalesRank.size()]; + BigDecimal[] shopSalesRankValue = new BigDecimal[shopActivitySalesRank.size()]; + MgtMapBigTotalVo mgtMapBigTotalVo; + for(int i=0;i<shopActivitySalesRank.size();i++){ + mgtMapBigTotalVo = shopActivitySalesRank.get(i); + if(shopMap.get(Long.valueOf(mgtMapBigTotalVo.getMapKey()))!=null){ + shopSalesRankKey[i] = shopMap.get(Long.valueOf(mgtMapBigTotalVo.getMapKey())).getShopName(); + } + shopSalesRankValue[i] = mgtMapBigTotalVo.getMapValue(); + } + totalActivityTotalVo.setShopSalesRankKey(shopSalesRankKey); + totalActivityTotalVo.setShopSalesRankValue(shopSalesRankValue); + } + //活动销售额排名 + List<MgtMapBigTotalVo> activitySalesRank = orderMapper.listPlTotalActivitySalesRank(mgtBasePlatformDto); + if (activitySalesRank != null && activitySalesRank.size() > 0) { + activitySalesRank = bigListRemoveNull(activitySalesRank); + totalActivityTotalVo.setActivitySalesRankList(activitySalesRank); + } + MerTotalDto merTotalDto = new MerTotalDto(); + merTotalDto.setAgeType(mgtBasePlatformDto.getAgeType()); + if(mgtBasePlatformDto.getAgeType()!=null){ + List<Long> userIdList = remoteMemberService.listUserIdByAgeType(mgtBasePlatformDto.getAgeType()).getData(); + mgtBasePlatformDto.setUserIdList(userIdList); + } + //日期全部时固定为5天 + if(StringUtils.isBlank(mgtBasePlatformDto.getStartDate())){ + mgtBasePlatformDto.setEndDate(DateUtils.getDate()); + mgtBasePlatformDto.setStartDate(DateUtils.parseDateToStr("yyyy-MM-dd",DateUtils.addDays(new Date(),-4))); + } + //获取订单分布 + List<MgtMapTotalPlusVo> MgtMapIntTotalVos = orderMapper.listPlTotalActivityTotal(mgtBasePlatformDto); + if (MgtMapIntTotalVos != null && MgtMapIntTotalVos.size() > 0) { + String[] orderTotalKey = new String[MgtMapIntTotalVos.size()]; + Integer[] orderTotalValue = new Integer[MgtMapIntTotalVos.size()]; + BigDecimal[] orderMoneyValue = new BigDecimal[MgtMapIntTotalVos.size()]; + for (int i = 0; i < MgtMapIntTotalVos.size(); i++) { + orderTotalKey[i] = MgtMapIntTotalVos.get(i).getMapKey(); + orderTotalValue[i] = MgtMapIntTotalVos.get(i).getMapValueFirst(); + orderMoneyValue[i] = MgtMapIntTotalVos.get(i).getMapValueSecond(); + } + totalActivityTotalVo.setOrderTotalKey(orderTotalKey); + totalActivityTotalVo.setOrderTotalValue(orderTotalValue); + totalActivityTotalVo.setOrderMoneyValue(orderMoneyValue); + } + return totalActivityTotalVo; + } + + + @Override + public MgtPlTotalActivityTotalVo getPlTotalActivityJoinMemberTotal(MgtBasePlatformDto mgtBasePlatformDto) { + //店铺活动返回空 + MgtPlTotalActivityTotalVo totalActivityTotalVo = new MgtPlTotalActivityTotalVo(); + totalActivityTotalVo.setJoinMemberTotalKey(new String[0]); + totalActivityTotalVo.setJoinMemberTotalValue(new Integer[0]); + totalActivityTotalVo.setGetMemberTotalKey(new String[0]); + totalActivityTotalVo.setGetMemberTotalValue(new Integer[0]); + if(mgtBasePlatformDto.getActivityFrom()!=null&&mgtBasePlatformDto.getActivityFrom()==2){ + return totalActivityTotalVo; + } + + List<Long> shopIdList = remoteShopService.listShopIdByPlTotal(mgtBasePlatformDto).getData(); + log.info("shopIdList1-----"+shopIdList.toString()); + log.debug("shopIdList1-----"+shopIdList.toString()); + if (StringUtils.isNotBlank(mgtBasePlatformDto.getShopProvinceCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopCityCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopAreaCode())) { + log.info("shopIdList2-----"+shopIdList.toString()); + log.debug("shopIdList2-----"+shopIdList.toString()); + if(shopIdList==null||shopIdList.isEmpty()){ + return totalActivityTotalVo; + } + } + if(mgtBasePlatformDto.getShopId()!=null){ + shopIdList = new ArrayList<>(); + shopIdList.add(mgtBasePlatformDto.getShopId()); + } + + List<Long> userIds = remoteUserService.getScopeOfAuthorityUserId(); + BoardMemberTotalDto boardMemberTotalDto = new BoardMemberTotalDto(); + boardMemberTotalDto.setUserIds(userIds); + List<Shop> shopList = remoteShopService.getShopBySysUserIds(boardMemberTotalDto); + List<Long> collect = shopList.stream().map(Shop::getShopId).collect(Collectors.toList()); + if(null != shopIdList){ + shopIdList.addAll(collect); + }else{ + shopIdList = collect; + } + mgtBasePlatformDto.setShopIdList(shopIdList); + if(mgtBasePlatformDto.getAgeType()!=null){ + List<Long> userIdList = remoteMemberService.listUserIdByAgeType(mgtBasePlatformDto.getAgeType()).getData(); + log.info("userIdList-----"+userIdList.toString()); + log.debug("userIdList-----"+userIdList.toString()); + mgtBasePlatformDto.setUserIdList(userIdList); + } + //日期全部时固定为5天 + if(StringUtils.isBlank(mgtBasePlatformDto.getStartDate())){ + mgtBasePlatformDto.setEndDate(DateUtils.getDate()); + mgtBasePlatformDto.setStartDate(DateUtils.parseDateToStr("yyyy-MM-dd",DateUtils.addDays(new Date(),-4))); + } + log.info("mgtBasePlatformDto-----"+mgtBasePlatformDto.toString()); + //参与人数 + List<MgtMapIntTotalVo> joinList = orderMapper.getMgtActivityMemberTotal(mgtBasePlatformDto); + // 将查询结果转为Map + Map<String, Integer> mgtMapIntTotalVoMap = new HashMap<>(); + if (joinList != null && !joinList.isEmpty()) { + mgtMapIntTotalVoMap = joinList.stream() + .collect(Collectors.toMap(MgtMapIntTotalVo::getMapKey, MgtMapIntTotalVo::getMapValue)); + } + // 获取日期范围 + List<String> dateList = getDateRange(mgtBasePlatformDto.getStartDate(), mgtBasePlatformDto.getEndDate()); + int size = dateList.size(); + // 创建日期和成员总数的数组 + String[] joinMemberTotalKey = new String[size]; + Integer[] joinMemberTotalValue = new Integer[size]; + // 遍历日期列表,设置日期和成员总数的数组 + String str; + Integer value; + for (int i = 0; i < size; i++) { + str = dateList.get(i); + joinMemberTotalKey[i] = str; + value = mgtMapIntTotalVoMap.get(str); + joinMemberTotalValue[i] = (value != null) ? value : 0; + } + totalActivityTotalVo.setJoinMemberTotalKey(joinMemberTotalKey); + totalActivityTotalVo.setJoinMemberTotalValue(joinMemberTotalValue); + return totalActivityTotalVo; + } + + @Override + public MgtPlTotalActivityTotalVo getPlTotalActivityGetMemberTotal(MgtBasePlatformDto mgtBasePlatformDto) { + //店铺活动返回空 + MgtPlTotalActivityTotalVo totalActivityTotalVo = new MgtPlTotalActivityTotalVo(); + totalActivityTotalVo.setJoinMemberTotalKey(new String[0]); + totalActivityTotalVo.setJoinMemberTotalValue(new Integer[0]); + totalActivityTotalVo.setGetMemberTotalKey(new String[0]); + totalActivityTotalVo.setGetMemberTotalValue(new Integer[0]); + if(mgtBasePlatformDto.getActivityFrom()!=null&&mgtBasePlatformDto.getActivityFrom()==2){ + return totalActivityTotalVo; + } + List<Long> shopIdList = remoteShopService.listShopIdByPlTotal(mgtBasePlatformDto).getData(); + if (StringUtils.isNotBlank(mgtBasePlatformDto.getShopProvinceCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopCityCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopAreaCode())) { + if(shopIdList==null||shopIdList.isEmpty()){ + return totalActivityTotalVo; + } + } + if(mgtBasePlatformDto.getShopId()!=null){ + shopIdList = new ArrayList<>(); + shopIdList.add(mgtBasePlatformDto.getShopId()); + } + //数据权限 + List<Long> userIds = remoteUserService.getScopeOfAuthorityUserId(); + BoardMemberTotalDto boardMemberTotalDto = new BoardMemberTotalDto(); + boardMemberTotalDto.setUserIds(userIds); + List<Shop> shopList = remoteShopService.getShopBySysUserIds(boardMemberTotalDto); + List<Long> collect = shopList.stream().map(Shop::getShopId).collect(Collectors.toList()); + if(null != shopIdList){ + shopIdList.addAll(collect); + }else{ + shopIdList = collect; + } + mgtBasePlatformDto.setShopIdList(shopIdList); + if(mgtBasePlatformDto.getAgeType()!=null){ + List<Long> userIdList = remoteMemberService.listUserIdByAgeType(mgtBasePlatformDto.getAgeType()).getData(); + mgtBasePlatformDto.setUserIdList(userIdList); + } + //日期全部时固定为5天 + if(StringUtils.isBlank(mgtBasePlatformDto.getStartDate())){ + mgtBasePlatformDto.setEndDate(DateUtils.getDate()); + mgtBasePlatformDto.setStartDate(DateUtils.parseDateToStr("yyyy-MM-dd",DateUtils.addDays(new Date(),-4))); + } + //获客人数 + List<MgtMapIntTotalVo> getList = orderMapper.getMgtActivityGetMemberTotal(mgtBasePlatformDto); + // 将查询结果转为Map + Map<String, Integer> getMemberMap = new HashMap<>(); + if (getList != null && !getList.isEmpty()) { + getMemberMap = getList.stream() + .collect(Collectors.toMap(MgtMapIntTotalVo::getMapKey, MgtMapIntTotalVo::getMapValue)); + } + // 获取日期范围 + List<String> dateList = getDateRange(mgtBasePlatformDto.getStartDate(), mgtBasePlatformDto.getEndDate()); + int size = dateList.size(); + // 创建日期和成员总数的数组 + String[] getMemberTotalKey = new String[size]; + Integer[] getMemberTotalValue = new Integer[size]; + // 遍历日期列表,设置日期和成员总数的数组 + String str; + Integer value; + // 遍历日期列表,设置日期和成员总数的数组 + for (int i = 0; i < size; i++) { + str = dateList.get(i); + getMemberTotalKey[i] = str; + value = getMemberMap.get(str); + getMemberTotalValue[i] = (value != null) ? value : 0; + } + totalActivityTotalVo.setGetMemberTotalKey(getMemberTotalKey); + totalActivityTotalVo.setGetMemberTotalValue(getMemberTotalValue); + return totalActivityTotalVo; + } + + + /** + * @param mgtPlActivityAgeDto + * @return MgtTotalActivityTotalVo + * @description + * @author jqs + * @date 2023/6/20 9:56 + */ + /*@Override + public MgtPlTotalActivityTotalVo getPlTotalActivityAgeRank(MgtPlActivityAgeDto mgtPlActivityAgeDto) { + List<Long> userIds = orderMapper.getPlUserIdAgeRank(mgtPlActivityAgeDto); + MgtActivityAgeDto mgtActivityAgeDto = new MgtActivityAgeDto(); + mgtActivityAgeDto.setUserIds(userIds); + mgtActivityAgeDto.setAgeType(mgtPlActivityAgeDto.getAgeType()); + userIds = remoteMemberService.listUserIdByAge(mgtActivityAgeDto).getData(); + mgtPlActivityAgeDto.setUserIds(userIds); + List<MgtMapIntTotalVo> ageRankList = orderMapper.getPlTotalActivityAgeRank(mgtPlActivityAgeDto); + ageRankList = listRemoveNull(ageRankList); + MgtPlTotalActivityTotalVo plTotalActivityTotalVo = new MgtPlTotalActivityTotalVo(); + String[] activityAgeKey = new String[ageRankList.size()]; + Integer[] activityAgeValue = new Integer[ageRankList.size()]; + if (!ageRankList.isEmpty()) { + MgtMapIntTotalVo MgtMapIntTotalVo; + for (int i = 0; i < ageRankList.size(); i++) { + MgtMapIntTotalVo = ageRankList.get(i); + activityAgeKey[i] = MgtMapIntTotalVo.getMapKey(); + activityAgeValue[i] = MgtMapIntTotalVo.getMapValue(); + } + } + plTotalActivityTotalVo.setActivityAgeKey(activityAgeKey); + plTotalActivityTotalVo.setActivityAgeValue(activityAgeValue); + return plTotalActivityTotalVo; + }*/ + + /** + * @param verifyCode + * @return MerVerifyCouponVo + * @description 获取优惠券核销信息 + * @author jqs + * @date 2023/6/27 11:10 + */ + @Override + public MerVerifyCouponVo verifyCoupon(String verifyCode, Long shopId) { + if(verifyCode.contains("+")){ + verifyCode = verifyCode.substring(0, verifyCode.indexOf("+")); + } + // 创建MerVerifyCouponVo对象 + MerVerifyCouponVo merVerifyCouponVo = new MerVerifyCouponVo(); + // 调用remoteCouponService的getVerifyCoupon方法获取MerVerifyCouponGetVo对象 + R<MerVerifyCouponGetVo> verifyCoupon = remoteCouponService.getVerifyCoupon(Long.valueOf(verifyCode)); + if(verifyCoupon.getCode() != 200){ + throw new ServiceException(verifyCoupon.getMsg()); + } + MerVerifyCouponGetVo verifyCouponGetVo = verifyCoupon.getData(); + MemberCoupon memberCoupon = verifyCouponGetVo.getMemberCoupon(); + // 检查优惠券状态 + int couponStatus = memberCoupon.getCouponStatus(); + if (couponStatus == 0) { + throw new ServiceException(AppErrorConstant.COUPON_EXPIRED); + } else if (couponStatus == 2) { + throw new ServiceException(AppErrorConstant.COUPON_USED); + } else if (couponStatus != 1) { + throw new ServiceException(AppErrorConstant.COUPON_NO_FIND); + } + Long userId = verifyCouponGetVo.getUserId(); + Member member = remoteMemberService.getMember(userId).getData(); + //如果是商户优惠券,验证商户一致 + if (memberCoupon.getCouponFrom() == 2) { + if(!memberCoupon.getShopId().equals(member.getRelationShopId())){ + throw new ServiceException(AppErrorConstant.BLINDING_VERIFY_SHOP_ERROR); + } + if(!memberCoupon.getShopId().equals(shopId)){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + //如果是平台优惠券,当用户绑定商户时验证商户一致 + if (memberCoupon.getCouponFrom() == 1 && member.getBindingFlag() == 1) { + /*if(!memberCoupon.getShopId().equals(member.getRelationShopId())){ + throw new ServiceException(AppErrorConstant.BLINDING_VERIFY_SHOP_ERROR); + }*/ + //判断绑定商户是否和核销商户一致 + if(!member.getRelationShopId().equals(shopId)){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + List<Goods> goodsList = verifyCouponGetVo.getGoodsList(); + // 调用remoteMemberService的getMember方法获取Member对象 + merVerifyCouponVo.setUserName(member.getRealName()); + merVerifyCouponVo.setUserMobile(member.getMobile()); + merVerifyCouponVo.setCouponFrom(verifyCouponGetVo.getCouponFrom()); + merVerifyCouponVo.setCouponName(memberCoupon.getCouponName()); + merVerifyCouponVo.setCreateTime(memberCoupon.getReceiveTime()); + // 将goodsList转换为MerCouponGoodsListVo列表,并设置相应属性 + List<MerCouponGoodsListVo> merCouponGoodsList = goodsList.stream() + .map(goods -> { + MerCouponGoodsListVo merCouponGoods = new MerCouponGoodsListVo(); + merCouponGoods.setGoodsId(goods.getGoodsId()); + merCouponGoods.setGoodsName(goods.getGoodsName()); + merCouponGoods.setGoodsNum(1); + if (goods.getGoodsType() == 1) { + merCouponGoods.setGoodsType("周期"); + } else if (goods.getGoodsType() == 2) { + merCouponGoods.setGoodsType("服务"); + } else if (goods.getGoodsType() == 3) { + merCouponGoods.setGoodsType("体验"); + } else if (goods.getGoodsType() == 4) { + merCouponGoods.setGoodsType("单品"); + } + // 设置其他属性 + return merCouponGoods; + }) + .collect(Collectors.toList()); + // 设置merVerifyCouponVo的goodsList属性为merCouponGoodsList + merVerifyCouponVo.setGoodsList(merCouponGoodsList); + merVerifyCouponVo.setVerifyStatus(1); + merVerifyCouponVo.setMemberCouponId(memberCoupon.getId()); + return merVerifyCouponVo; + } + + /** + * @param verifyCode + * @param shopId + * @return MerVerifyAwardVo + * @description 获取核销奖品 + * @author jqs + * @date 2023/7/8 17:46 + */ + @Override + public MerVerifyAwardVo verifyPrize(String verifyCode, Long shopId) { + MerVerifyAwardVo merVerifyAwardVo = new MerVerifyAwardVo(); + MemberGiftRecord memberGiftRecord = remoteMemberService.getVerifyPrize(verifyCode).getData(); + if (memberGiftRecord == null || memberGiftRecord.getVerifyStatus() != 1) { + throw new ServiceException(AppErrorConstant.COUPON_USED); + } + Shop shop = null; + Member member = remoteMemberService.getMember(memberGiftRecord.getUserId()).getData(); + //判断是否在绑定店铺核销 + if(member.getBindingFlag()==1){ + if(!member.getRelationShopId().equals(shopId)){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + //平台奖品判断 + if (memberGiftRecord.getGiftFrom() == 1) { + BirthdayCard birthdayCard = remoteMemberService.getBirthdayCard().getData(); + //判断生日活动状态 + if(birthdayCard!=null&&birthdayCard.getCardStatus()==1){ + shop = remoteShopService.getShop(shopId).getData(); + //判断指定区域全部店铺 + if(birthdayCard.getAreaFlag()==2&&birthdayCard.getShopFlag()==1&&!StringUtils.checkString(birthdayCard.getDesignatedArea(),shop.getShopCityCode())){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + //判断指定店铺 + if(birthdayCard.getShopFlag()==2&&!StringUtils.checkString(birthdayCard.getApplicableShop(),shopId.toString())){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + }else{ + throw new ServiceException(AppErrorConstant.BIRTHDAY_CARD_ERROR); + } + } + //商户奖品判断 + if (memberGiftRecord.getGiftFrom() == 2 && !memberGiftRecord.getShopId().equals(shopId)) { + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + + merVerifyAwardVo.setUserName(member.getRealName()); + merVerifyAwardVo.setUserMobile(member.getMobile()); + if (memberGiftRecord.getGiftFrom() == 1) { + merVerifyAwardVo.setGiftFrom("平台生日卡"); + } else { + merVerifyAwardVo.setGiftFrom("商户生日卡"); + } + merVerifyAwardVo.setGiftType(memberGiftRecord.getGiftType()); + //礼物类型1优惠券2商品3现金4实物 + switch (memberGiftRecord.getGiftType()) { + case 1: + merVerifyAwardVo.setGiftName(memberGiftRecord.getCouponName()); + merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getCouponNumber())); + break; + case 2: + Goods goods = remoteGoodsService.getGoods(memberGiftRecord.getGoodsId()).getData(); + merVerifyAwardVo.setGiftName(memberGiftRecord.getGoodsName()); + merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getGoodsNumber())); + if (goods.getGoodsType() == 1) { + merVerifyAwardVo.setGiftRemark("周期"); + } else if (goods.getGoodsType() == 2) { + merVerifyAwardVo.setGiftRemark("服务"); + } else if (goods.getGoodsType() == 3) { + merVerifyAwardVo.setGiftRemark("体验"); + } else if (goods.getGoodsType() == 4) { + merVerifyAwardVo.setGiftRemark("单品"); + } + break; + case 3: + merVerifyAwardVo.setGiftName("现金"); + merVerifyAwardVo.setGiftNumber(memberGiftRecord.getMoney().doubleValue()); + break; + case 4: + merVerifyAwardVo.setGiftName(memberGiftRecord.getGiftName()); + merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getGiftNumber())); + break; + default: + break; + } + merVerifyAwardVo.setCreateTime(memberGiftRecord.getCreateTime()); + merVerifyAwardVo.setVerifyStatus(1); + merVerifyAwardVo.setPrizeId(verifyCode); + return merVerifyAwardVo; + } + + /** + * @param merBaseDto + * @return BigDecimal + * @description 获取用户未支付金额 + * @author jqs + * @date 2023/6/29 18:00 + */ + @Override + public BigDecimal getMemberUnpaidOrder(MerBaseDto merBaseDto) { + BigDecimal unpaidMoney = orderMapper.getMemberUnpaidOrder(merBaseDto); + return unpaidMoney; + } + + /** + * @param merTotalDto + * @return MerOrderTotalVo + * @description 商户获取订单统计 + * @author jqs + * @date 2023/7/3 19:29 + */ + @Override + public MerOrderTotalVo getMerOrderTotal(MerTotalDto merTotalDto) { + if (merTotalDto.getShopAllFlag() != null && merTotalDto.getShopAllFlag() == 1) { + List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData(); + merTotalDto.setShopIdList(shopIdList); + merTotalDto.setShopId(null); + } + //线上线下活动订单 + MerOrderTotalVo orderTotalVo = orderMapper.getMerOrderTotalOrderFrom(merTotalDto); + //分类型订单 + MerOrderTotalVo goodsTypeVo = orderMapper.getMerTotalOrderTotalGoodsType(merTotalDto); + orderTotalVo.setCycleTotal(goodsTypeVo.getCycleTotal()); + orderTotalVo.setCycleMoney(goodsTypeVo.getCycleMoney()); + orderTotalVo.setExperienceTotal(goodsTypeVo.getExperienceTotal()); + orderTotalVo.setExperienceMoney(goodsTypeVo.getExperienceMoney()); + orderTotalVo.setServiceTotal(goodsTypeVo.getServiceTotal()); + orderTotalVo.setServiceMoney(goodsTypeVo.getServiceMoney()); + return orderTotalVo; + } + + + /** + * @param merTotalDto + * @return MerOrderDistributionTotalVo + * @description + * @author jqs + * @date 2023/7/4 9:29 + */ + @Override + public MerOrderDistributionTotalVo MerOrderDistributionTotalVo(MerTotalDto merTotalDto) { + //获取查询的商户列表 + if (merTotalDto.getShopAllFlag() != null && merTotalDto.getShopAllFlag() == 1) { + List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData(); + merTotalDto.setShopIdList(shopIdList); + merTotalDto.setShopId(null); + } + if(merTotalDto.getGoodsType()!=null&&merTotalDto.getGoodsType()==0){ + merTotalDto.setGoodsType(null); + } + MerOrderDistributionTotalVo orderDistributionTotalVo = new MerOrderDistributionTotalVo(); + // 获取订单年龄用户列表 + //List<MerOrderAgeUserVo> orderAgeUserVoList = remoteMemberService.listOrderAgeUser(merTotalDto).getData(); + // 如果订单年龄用户列表不为空 + /*if (orderAgeUserVoList != null && !orderAgeUserVoList.isEmpty()) { + // 定义变量 + Integer ageType; + List<Long> userIdList; + MerOrderAgeUserVo orderAgeUserVo; + MgtMapTotalPlusVo mgtMapTotalPlusVo; + String[] orderTotalKey = new String[5]; + Integer[] orderTotalValue = new Integer[5]; + BigDecimal[] orderMoneyValue = new BigDecimal[5]; + // 遍历订单年龄用户列表 + for (int i = 0; i < orderAgeUserVoList.size(); i++) { + orderAgeUserVo = orderAgeUserVoList.get(i); + ageType = orderAgeUserVo.getAgeType(); + userIdList = orderAgeUserVo.getUserIdList(); + // 根据年龄类型设置订单总数键 + switch (ageType) { + case 1: + orderTotalKey[i] = "<20"; + break; + case 2: + orderTotalKey[i] = "21-30"; + break; + case 3: + orderTotalKey[i] = "31-40"; + break; + case 4: + orderTotalKey[i] = "41-50"; + break; + case 5: + orderTotalKey[i] = ">50"; + break; + } + // 如果用户ID列表不为空 + if (userIdList != null && !userIdList.isEmpty()) { + mgtMapTotalPlusVo = orderMapper.listMerOrderDistributionTotal(userIdList); + orderTotalValue[i] = mgtMapTotalPlusVo.getMapValueFirst(); + orderMoneyValue[i] = mgtMapTotalPlusVo.getMapValueSecond(); + } else { + orderTotalValue[i] = 0; + orderMoneyValue[i] = BigDecimal.ZERO; + } + }*/ + List<MgtMapTotalPlusVo> mgtMapTotalPlusVoList = orderMapper.listMerOrderDistributionTotal(merTotalDto); + String[] orderTotalKey = new String[mgtMapTotalPlusVoList.size()]; + Integer[] orderTotalValue = new Integer[mgtMapTotalPlusVoList.size()]; + BigDecimal[] orderMoneyValue = new BigDecimal[mgtMapTotalPlusVoList.size()]; + //数据为空返回空数组 + if (mgtMapTotalPlusVoList != null && !mgtMapTotalPlusVoList.isEmpty()) { + MgtMapTotalPlusVo mgtMapTotalPlusVo; + for (int i = 0; i < mgtMapTotalPlusVoList.size(); i++) { + mgtMapTotalPlusVo = mgtMapTotalPlusVoList.get(i); + orderTotalKey[i] = mgtMapTotalPlusVo.getMapKey(); + orderTotalValue[i] = mgtMapTotalPlusVo.getMapValueFirst(); + orderMoneyValue[i] = mgtMapTotalPlusVo.getMapValueSecond(); + } + //补充日期到近5日 + orderDistributionTotalVo = fillOrderTotalKeyAndValuesToRecentFiveDays(orderTotalKey,orderTotalValue,orderMoneyValue); + }else{ + orderDistributionTotalVo.setOrderTotalKey(orderTotalKey); + orderDistributionTotalVo.setOrderTotalValue(orderTotalValue); + orderDistributionTotalVo.setOrderMoneyValue(orderMoneyValue); + } + // 返回订单分布总数对象 + return orderDistributionTotalVo; + } + + /** + * @param merTotalDto + * @return MerOrderTypeTotalVo + * @description 商户获取销售占比统计 + * @author jqs + * @date 2023/7/4 13:58 + */ + @Override + public MerOrderTypeTotalVo getMerOrderTypeTotal(MerTotalDto merTotalDto) { + if (merTotalDto.getShopAllFlag() != null && merTotalDto.getShopAllFlag() == 1) { + List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData(); + merTotalDto.setShopIdList(shopIdList); + merTotalDto.setShopId(null); + } + MerOrderTypeTotalVo orderTypeTotalVo = new MerOrderTypeTotalVo(); + //获取商品分类销售数据 + List<MgtMapTotalPlusVo> MgtMapIntTotalVoGoodsType = orderMapper.listMerOrderTotalGoodsType(merTotalDto); + List<MgtMapIntTotalVo> goodsTypeTotalList = new ArrayList<>(); + List<MgtMapBigTotalVo> goodsTypeMoneyList = new ArrayList<>(); + if (MgtMapIntTotalVoGoodsType != null && MgtMapIntTotalVoGoodsType.size() > 0) { + MgtMapIntTotalVo mgtMapIntTotalVo; + MgtMapBigTotalVo mgtMapBigTotalVo; + Integer intTotal = 0; + BigDecimal bigTotal = BigDecimal.ZERO; + for(MgtMapTotalPlusVo mgtMapTotalPlusVo : MgtMapIntTotalVoGoodsType){ + intTotal = intTotal + mgtMapTotalPlusVo.getMapValueFirst(); + bigTotal = bigTotal.add(mgtMapTotalPlusVo.getMapValueSecond()); + } + BigDecimal hundredBig = new BigDecimal("100"); + BigDecimal intTotalBig = hundredBig; + if(intTotal!=0){ + intTotalBig = new BigDecimal(intTotal.toString()); + } + if(bigTotal.compareTo(BigDecimal.ZERO)<1){ + bigTotal = hundredBig; + } + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + Boolean noCycle = true; + Boolean noService = true; + Boolean noExperience = true; + Boolean noGoods = true; + for (int i = 0; i < MgtMapIntTotalVoGoodsType.size(); i++) { + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapIntTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtMapIntTotalVo.setMapPercent(BigDecimal.valueOf(MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()).divide(intTotalBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig)); + mgtMapBigTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond()); + mgtMapBigTotalVo.setMapPercent(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond().divide(bigTotal,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig)); + if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("1")) { + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapKey("周期"); + noCycle= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("2")) { + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapKey("服务"); + noService= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("3")) { + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapKey("体验"); + noExperience = false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("4")) { + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapKey("单品"); + noGoods = false; + } + goodsTypeTotalList.add(mgtMapIntTotalVo); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + //补充缺少类型 + if(noCycle){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noService){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noExperience){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noGoods){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + orderTypeTotalVo.setGoodsTypeTotalList(goodsTypeTotalList); + orderTypeTotalVo.setGoodsTypeMoneyList(goodsTypeMoneyList); + } + return orderTypeTotalVo; + } + + + /** + * @param merTotalDto + * @return MerOrderGoodsRankVo + * @description 商户端获取销售排行 + * @author jqs + * @date 2023/7/4 14:23 + */ + @Override + public MerOrderGoodsRankVo getMerOrderGoodsRank(MerTotalDto merTotalDto) { + if (merTotalDto.getShopAllFlag() != null && merTotalDto.getShopAllFlag() == 1) { + List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData(); + merTotalDto.setShopIdList(shopIdList); + merTotalDto.setShopId(null); + } + MerOrderGoodsRankVo orderGoodsRankVo = new MerOrderGoodsRankVo(); + List<MgtMapBigTotalVo> goodsRankList = orderMapper.listMerOrderTotalGoodsRank(merTotalDto); + if (goodsRankList != null && goodsRankList.size() > 0) { + goodsRankList = bigListRemoveNull(goodsRankList); + Collections.reverse(goodsRankList); + orderGoodsRankVo.setGoodsRankList(goodsRankList); + } + return orderGoodsRankVo; + } + + + /** + * @param merTotalDto + * @return MerOrderFromRankVo + * @description 商户端获取渠道排行 + * @author jqs + * @date 2023/7/4 14:51 + */ + @Override + public MerOrderFromRankVo getMerOrderFromRank(MerTotalDto merTotalDto) { + if (merTotalDto.getShopAllFlag() != null && merTotalDto.getShopAllFlag() == 1) { + List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData(); + merTotalDto.setShopIdList(shopIdList); + merTotalDto.setShopId(null); + } + MerOrderFromRankVo merOrderFromRankVo = new MerOrderFromRankVo(); + //获取来源销售排名 + List<MgtMapBigTotalVo> orderFromList = orderMapper.listMerOrderTotalOrderFrom(merTotalDto); + if (orderFromList != null && orderFromList.size() > 0) { + orderFromList = bigListRemoveNull(orderFromList); + Collections.reverse(orderFromList); + merOrderFromRankVo.setOrderFromRankList(orderFromList); + } + return merOrderFromRankVo; + } + + /** + * @param merOrderPageDto + * @return MerTotalOrderVo + * @description 商户端订单管理统计 + * @author jqs + * @date 2023/7/31 10:53 + */ + @Override + public MerTotalOrderVo totalMerOrder(MerOrderPageDto merOrderPageDto) { + MerTotalOrderVo merTotalOrderVo = new MerTotalOrderVo(); + if (StringUtils.isNotBlank(merOrderPageDto.getKeyword())) { + MgtUserIdByKeywordDto userIdByKeywordDto = new MgtUserIdByKeywordDto(); + userIdByKeywordDto.setKeyword(merOrderPageDto.getKeyword()); + MgtUserIdByKeywordVo userIdByKeywordVo = remoteMemberService.getUserIdByKeyword(userIdByKeywordDto).getData(); + if (StringUtils.isNotBlank(userIdByKeywordVo.getUserIds())) { + List<Long> userIdList = Arrays.stream(userIdByKeywordVo.getUserIds().split(",")) + .map(Long::parseLong) + .collect(Collectors.toList()); + merOrderPageDto.setMemberUserIdList(userIdList); + merOrderPageDto.setMemberUserId(null); + } + } + merTotalOrderVo = orderMapper.totalMerOrder(merOrderPageDto); + return merTotalOrderVo; + } + + /** + * @param page + * @param mgtShopAllOrderPageDto + * @return List<MgtShopAllOrderPageVo> + * @description 平台获取商户订单记录 + * @author jqs + * @date 2023/7/5 20:17 + */ + @Override + public List<MgtShopAllOrderPageVo> pageMgtShopAllOrder(Page page, MgtShopAllOrderPageDto mgtShopAllOrderPageDto) { + List<MgtShopAllOrderPageVo> shopAllOrderPageVoList = orderMapper.pageMgtShopAllOrder(page, mgtShopAllOrderPageDto); + if (!shopAllOrderPageVoList.isEmpty()) { + // 定义变量 + HashSet<Long> userIdSet = new HashSet<>(); + BigDecimal zeroBig = new BigDecimal("0.00"); + // 遍历列表,获取店铺 ID 和用户 ID + for (MgtShopAllOrderPageVo mgtShopOrderPageVo : shopAllOrderPageVoList) { + userIdSet.add(mgtShopOrderPageVo.getUserId()); + } + // 从远程服务获取店铺和用户信息 + Map<Long, MgtSimpleMemberVo> userMap = null; + if (userIdSet != null && !userIdSet.isEmpty()) { + String userJoinedString = String.join(",", userIdSet.stream().map(Object::toString).collect(Collectors.toList())); + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(userJoinedString); + List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(userJoinedString).getData(); + userMap = simpleMemberVoList.stream() + .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity())); + } + // 遍历列表,设置店铺名称、用户名称和未支付金额 + String userInfo; + String mobile; + for (MgtShopAllOrderPageVo mgtShopOrderPageVo : shopAllOrderPageVoList) { + if (userMap != null && !userMap.isEmpty()) { + if (userMap.get(mgtShopOrderPageVo.getUserId()) != null) { + userInfo = userMap.get(mgtShopOrderPageVo.getUserId()).getNickName(); + mobile = userMap.get(mgtShopOrderPageVo.getUserId()).getUserMobile(); + if (StringUtils.isNotBlank(mobile)) { + userInfo = userInfo + "(" + mobile + ")"; + } + mgtShopOrderPageVo.setUserInfo(userInfo); + } + } + } + //处理商品信息 + List<MgtOrderGoodsPageVo> mgtOrderGoodsVoList; + String goodsString; + for (MgtShopAllOrderPageVo entity : shopAllOrderPageVoList) { + mgtOrderGoodsVoList = entity.getMgtOrderGoodsPageVoList(); + goodsString = mgtOrderGoodsVoList.stream() + .map(goods -> goods.getGoodsName() + "*" + goods.getBuyNum()) + .collect(Collectors.joining(";")); + entity.setGoodsInfo(goodsString); + } + } + return shopAllOrderPageVoList; + } + + /** + * @param orderId + * @return void + * @description 自动取消订单 + * @author jqs + * @date 2023/7/13 17:15 + */ + @Override + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public void autoCancelOrder(String orderId) { + //更新订单信息 + Order order = this.getById(orderId); + order.setOrderStatus(0); + order.setCancelTime(new Date()); + this.saveOrUpdate(order); + //活动订单回退库存 + if (order.getOrderFrom() == 2) { + List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId); + if (orderGoodsList != null && !orderGoodsList.isEmpty()) { + for (OrderGoods orderGoods : orderGoodsList) { + //redis库存控制极简版 + String goodsLock = "goods_lock_" + order.getActivityId() + "_" + orderGoods.getGoodsId(); + RLock redissonLock = redissonClient.getLock(goodsLock); + try { + redissonLock.lock(30, TimeUnit.SECONDS); + Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId()); + if(null == surpNum){ + surpNum = 0; + } + redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId(), surpNum + orderGoods.getBuyNum()); + } finally { + redissonLock.unlock(); + } + //改变活动库存 + AGStockChangeDto agStockChangeDto = new AGStockChangeDto(); + agStockChangeDto.setActivityId(order.getActivityId()); + agStockChangeDto.setGoodsId(orderGoods.getGoodsId()); + agStockChangeDto.setChangeType(1); + agStockChangeDto.setChangeNum(orderGoods.getBuyNum()); + agStockChangeDto.setShopId(order.getShopId()); + agStockChangeDto.setUserId(order.getUserId()); + remoteActivityService.changeActivityStock(agStockChangeDto); + //删除活动记录 + ActivityRecord activityRecord = new ActivityRecord(); + activityRecord.setActivityId(order.getActivityId()); + activityRecord.setGoodsId(orderGoods.getGoodsId()); + activityRecord.setUserId(order.getUserId()); + activityRecord.setOrderTime(order.getCreateTime()); + remoteActivityService.delActivityRecord(activityRecord); + } + } + } else { + if (order.getCouponMoney().compareTo(BigDecimal.ZERO) > 0) { + //回退优惠券 + List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId); + if (orderGoodsList != null && !orderGoodsList.isEmpty()) { + StringJoiner memberCouponSJ = new StringJoiner(","); + for (OrderGoods orderGoods : orderGoodsList) { + memberCouponSJ.add(orderGoods.getCouponId()); + } + if (memberCouponSJ != null) { + remoteCouponService.backMemberCoupon(memberCouponSJ.toString()); + + } + } + } + } + } + + /** + * @param transaction + * @return void + * @description 订单支付回调 + * @author jqs + * @date 2023/7/13 17:57 + */ + @Override + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public void payBack(PartnerTransactionsResult transaction, BigDecimal feeAmount) { + log.info("订单支付回调---"+transaction.toString()); + // 更新订单状态 outTradeNo + String outTradeNo = transaction.getOutTradeNo(); + Order order = this.getByOutTradeNo(outTradeNo); + if(order.getOrderStatus() != 1){ + return; + } + String orderId = order.getOrderId(); + order.setOrderStatus(2); + order.setPayTime(new Date()); + this.saveOrUpdate(order); + // 初始化各类商品的收款金额 + BigDecimal cycleMoney = new BigDecimal("0.00"); + BigDecimal experienceMoney = new BigDecimal("0.00"); + BigDecimal serviceMoney = new BigDecimal("0.00"); + BigDecimal goodsMoney = new BigDecimal("0.00"); + // 初始化各类商品的存在状态 + Boolean haveCycle = false; + Boolean haveService = false; + Boolean haveExperience = false; + Boolean haveGoods = false; + // 获取订单中的所有商品 + List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId); + List<GoodsTotalChangeDto> goodsTotalChangeDtoList = new ArrayList<>(); + GoodsTotalChangeDto goodsTotalChangeDto; + // 遍历订单中的所有商品,根据商品类型累加收款金额,并标记商品存在状态 + for (OrderGoods orderGoods : orderGoodsList) { + switch (orderGoods.getGoodsType()) { + case 1: + cycleMoney = cycleMoney.add(orderGoods.getGoodsReceivableMoney()); + haveCycle = true; + break; + case 2: + serviceMoney = serviceMoney.add(orderGoods.getGoodsReceivableMoney()); + haveService = true; + break; + case 3: + experienceMoney = experienceMoney.add(orderGoods.getGoodsReceivableMoney()); + haveExperience = true; + break; + case 4: + goodsMoney = goodsMoney.add(orderGoods.getGoodsReceivableMoney()); + haveGoods = true; + break; + default: + break; + } + goodsTotalChangeDto = new GoodsTotalChangeDto(); + goodsTotalChangeDto.setGoodsId(orderGoods.getGoodsId()); + goodsTotalChangeDto.setChangeType(1); + goodsTotalChangeDto.setChangeNum(orderGoods.getBuyNum()); + goodsTotalChangeDto.setMoney(orderGoods.getGoodsReceivableMoney()); + Integer bugGoodsNum = orderMapper.countUserBuyGoodsNum(orderGoods.getGoodsId()); + goodsTotalChangeDto.setPersonNum(bugGoodsNum); + goodsTotalChangeDtoList.add(goodsTotalChangeDto); + } + //更新商品统计 + remoteGoodsService.changeGoodsTotal(goodsTotalChangeDtoList); + // 初始化会员统计信息 + MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto(); + memberTotalChangeDto.setUserId(order.getUserId()); + // 设置会员支付金额和支付时间 + memberTotalChangeDto.setPayMoney(order.getPayMoney()); + memberTotalChangeDto.setPayTime(new Date()); + // 根据商品存在状态,设置会员统计信息 + if (haveCycle) { + memberTotalChangeDto.setCycleOrderChange(1); + } + if (haveService) { + memberTotalChangeDto.setServiceOrderChange(1); + } + if (haveExperience) { + memberTotalChangeDto.setExperienceOrderChange(1); + } + if (haveGoods) { + memberTotalChangeDto.setGoodsOrderChange(1); + } + if(order.getOrderFrom()==2){ + memberTotalChangeDto.setActivityTime(order.getCreateTime()); + } + // 更新会员统计信息 + remoteMemberService.changeMemberTotal(memberTotalChangeDto); + // 如果订单来源于活动,则更新活动统计信息 + if (order.getOrderFrom() == 2) { + ActivityTotalChangeDto activityTotalChangeDto = new ActivityTotalChangeDto(); + activityTotalChangeDto.setActivityId(order.getActivityId()); + activityTotalChangeDto.setChangeType(1); + activityTotalChangeDto.setChangeNum(1); + activityTotalChangeDto.setMoney(order.getPayMoney()); + Integer userActivityNum = orderMapper.countUserActivityByActivity(order.getUserId(), order.getActivityId()); + //判断用户是否下过单 如果只有当前订单则为1 + if (userActivityNum == 1) { + activityTotalChangeDto.setPersonNum(1); + } else { + activityTotalChangeDto.setPersonNum(0); + } + activityTotalChangeDto.setUserId(order.getUserId()); + remoteActivityService.changeActivityTotal(activityTotalChangeDto); + //活动订单进行分账 + /*ProfitSharingApplyRequest request=new ProfitSharingApplyRequest(); + request.setAppid(this.appId); + request.setSubMchid(""); + request.setTransactionId(transaction.getTransactionId()); + profitsSharingService.applyProfitSharing(request);*/ + } + //修改支付记录生成支付记录 + orderPaymentService.updatePaySuccess(transaction.getOutTradeNo(), feeAmount, transaction.getTransactionId()); + PayRecord payRecord = new PayRecord(); + payRecord.setDelFlag(0); + payRecord.setOrderId(orderId); + payRecord.setPayMoney(order.getPayMoney()); + payRecord.setPayTime(order.getPayTime()); + payRecord.setPayType(1); + payRecordService.save(payRecord); + //删除超时取消延时任务 + redisService.deleteObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId); + remoteConfigService.deleteDelayTask(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode()+"-"+orderId); + } + + @Override + public Order getByOrderNo(String orderNo) { + LambdaQueryWrapper<Order> queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(Order::getOrderNo, orderNo) + .last(" limit 1 "); + return this.getOne(queryWrapper); + } + + @Override + public Order getByOutTradeNo(String outTradeNo) { + LambdaQueryWrapper<Order> queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(Order::getOutTradeNo, outTradeNo) + .last(" limit 1 "); + return this.getOne(queryWrapper); + } + + /** + * @param orderId + * @return void + * @description 订单退款 + * @author jqs + * @date 2023/7/13 18:36 + */ + @Override + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public void refundOrder(String orderId) { + // 更新订单信息 + Order order = this.getById(orderId); + order.setOrderStatus(0); + order.setCancelTime(new Date()); + this.saveOrUpdate(order); + OrderRefund orderRefund = new OrderRefund(); + String refundId = IdUtils.simpleUUID(); + orderRefund.setRefundId(refundId); + orderRefund.setDelFlag(0); + orderRefund.setRefundType(1); + orderRefund.setOrderId(order.getOrderId()); + orderRefund.setUserId(order.getUserId()); + orderRefund.setShopId(order.getShopId()); + orderRefund.setRefundMoney(order.getOnlinePayMoney()); + orderRefund.setOrderMoney(order.getPayMoney()); + orderRefund.setCreateTime(new Date()); + // 初始化各类商品的收款金额 + BigDecimal cycleMoney = new BigDecimal("0.00"); + BigDecimal experienceMoney = new BigDecimal("0.00"); + BigDecimal serviceMoney = new BigDecimal("0.00"); + BigDecimal goodsMoney = new BigDecimal("0.00"); + // 初始化各类商品的存在状态 + Boolean haveCycle = false; + Boolean haveService = false; + Boolean haveExperience = false; + Boolean haveGoods = false; + //商品统计回退 + List<GoodsTotalChangeDto> goodsTotalChangeDtoList = new ArrayList<>(); + GoodsTotalChangeDto goodsTotalChangeDto; + List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId); + if (orderGoodsList != null && !orderGoodsList.isEmpty()) { + StringJoiner memberCouponSJ = new StringJoiner(","); + for (OrderGoods orderGoods : orderGoodsList) { + if (order.getOrderFrom() == 2) { + //redis库存控制极简版 + //活动订单回退库存 + String goodsLock = "goods_lock_" + order.getActivityId() + "_" + orderGoods.getGoodsId(); + RLock redissonLock = redissonClient.getLock(goodsLock); + try { + redissonLock.lock(30, TimeUnit.SECONDS); + Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId()); + if(null == surpNum){ + surpNum = 0; + } + redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId(), surpNum + orderGoods.getBuyNum()); + } finally { + redissonLock.unlock(); + } + //改变活动库存 + AGStockChangeDto agStockChangeDto = new AGStockChangeDto(); + agStockChangeDto.setActivityId(order.getActivityId()); + agStockChangeDto.setGoodsId(orderGoods.getGoodsId()); + agStockChangeDto.setChangeType(1); + agStockChangeDto.setChangeNum(orderGoods.getBuyNum()); + agStockChangeDto.setShopId(order.getShopId()); + agStockChangeDto.setUserId(order.getUserId()); + remoteActivityService.changeActivityStock(agStockChangeDto); + //删除活动记录 + ActivityRecord activityRecord = new ActivityRecord(); + activityRecord.setActivityId(order.getActivityId()); + activityRecord.setGoodsId(orderGoods.getGoodsId()); + activityRecord.setUserId(order.getUserId()); + activityRecord.setOrderTime(order.getCreateTime()); + remoteActivityService.delActivityRecord(activityRecord); + } else { + memberCouponSJ.add(orderGoods.getCouponId()); + } + //会员统计更新 + switch (orderGoods.getGoodsType()) { + case 1: + cycleMoney = cycleMoney.add(orderGoods.getGoodsReceivableMoney()); + haveCycle = true; + break; + case 2: + serviceMoney = serviceMoney.add(orderGoods.getGoodsReceivableMoney()); + haveService = true; + break; + case 3: + experienceMoney = experienceMoney.add(orderGoods.getGoodsReceivableMoney()); + haveExperience = true; + break; + case 4: + goodsMoney = goodsMoney.add(orderGoods.getGoodsReceivableMoney()); + haveGoods = true; + break; + default: + break; + } + //商品统计更新 + goodsTotalChangeDto = new GoodsTotalChangeDto(); + goodsTotalChangeDto.setGoodsId(orderGoods.getGoodsId()); + goodsTotalChangeDto.setChangeType(2); + goodsTotalChangeDto.setChangeNum(orderGoods.getBuyNum()); + goodsTotalChangeDto.setMoney(orderGoods.getGoodsReceivableMoney()); + Integer bugGoodsNum = orderMapper.countUserBuyGoodsNum(orderGoods.getGoodsId()); + goodsTotalChangeDto.setPersonNum(bugGoodsNum); + goodsTotalChangeDtoList.add(goodsTotalChangeDto); + } + remoteGoodsService.changeGoodsTotal(goodsTotalChangeDtoList); + //回退优惠券 + if (memberCouponSJ != null) { + remoteCouponService.backMemberCoupon(memberCouponSJ.toString()); + } + } + // 初始化会员统计信息 + MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto(); + memberTotalChangeDto.setUserId(order.getUserId()); + // 设置会员支付金额和支付时间 + memberTotalChangeDto.setPayMoney(order.getPayMoney().negate()); + // 根据商品存在状态,设置会员统计信息 + if (haveCycle) { + memberTotalChangeDto.setCycleOrderChange(-1); + } + if (haveService) { + memberTotalChangeDto.setServiceOrderChange(-1); + } + if (haveExperience) { + memberTotalChangeDto.setExperienceOrderChange(-1); + } + if (haveGoods) { + memberTotalChangeDto.setGoodsOrderChange(-1); + } + // 更新会员统计信息 + remoteMemberService.changeMemberTotal(memberTotalChangeDto); + // 如果订单来源于活动,则更新活动统计信息 + if (order.getOrderFrom() == 2) { + ActivityTotalChangeDto activityTotalChangeDto = new ActivityTotalChangeDto(); + activityTotalChangeDto.setActivityId(order.getActivityId()); + activityTotalChangeDto.setChangeType(2); + activityTotalChangeDto.setChangeNum(1); + activityTotalChangeDto.setRefundNum(1); + activityTotalChangeDto.setMoney(order.getPayMoney()); + Integer userActivityNum = orderMapper.countUserActivityByActivity(order.getUserId(), order.getActivityId()); + //判断用户是否还有活动订单 无则减少人数 + if (userActivityNum > 0) { + activityTotalChangeDto.setPersonNum(0); + } else { + activityTotalChangeDto.setPersonNum(1); + } + activityTotalChangeDto.setUserId(order.getUserId()); + remoteActivityService.changeActivityTotal(activityTotalChangeDto); + } + + log.info("用户取消订单退款, 检查退款"); + // 用户取消订单退款 + BigDecimal onlinePayMoney = order.getOnlinePayMoney(); + if(BigDecimal.ZERO.compareTo(onlinePayMoney) < 0){ + log.info("订单支付金额大于0,可发起退款"); + // 订单支付金额大于0,可发起退款 +// orderWxApplyRefund(orderId, refundId, onlinePayMoney, orderRefund); + // 订单支付金额大于0,可发起退款 todo 修改渠道(汇付天下) + orderWxApplyRefund1(orderId, refundId, onlinePayMoney, orderRefund); + } + + orderRefund.setRefundStatus(1); + orderRefundService.saveOrUpdate(orderRefund); + } + + /** + * 申请退款API + */ + private void orderWxApplyRefund(String orderId, String outRefundNo, BigDecimal payMoney, OrderRefund orderRefund){ + try { + // 创建支付订单 + OrderPayment orderPayment = orderPaymentService.getByOrderId(orderId); + if (null == orderPayment) { + return; + } + + log.info("调用微信退款---发起退款"); + + String subMchId = orderPayment.getSubMchId(); + WxPayConfig config = wxService.getConfig(); + + RefundsRequest request = new RefundsRequest(); + request.setSpAppid(config.getAppId()); + request.setSubMchid(subMchId); + request.setTransactionId(orderPayment.getTransactionId()); + request.setOutRefundNo(outRefundNo); + request.setReason("用户取消订单"); + // 订单金额 + int total = orderPayment.getPayMoney().multiply(new BigDecimal(100)).intValue(); + + RefundsRequest.Amount amount = RefundsRequest.Amount.builder().refund(total).total(total).currency("CNY").build(); + request.setAmount(amount); + request.setNotifyUrl(config.getNotifyUrl()); + + RefundsResult result = wxService.getEcommerceService().refunds(request); + + // 微信退款id + orderRefund.setWxRefundId(result.getRefundId()); + + // 请求参数 + Gson gson = new Gson(); + String refundRequestJson = gson.toJson(request); + // 返回参数 + String refundResponseJson = gson.toJson(result); + + log.info("调用微信退款返回参数---{}", refundResponseJson); + + // 保存支付订单统一下单日志 + paymentMessageService.savePaymentMessage("3", orderId, refundRequestJson, refundResponseJson); + + } catch (WxPayException e) { + throw new ServiceException(e.getMessage()); + } + } + + + + /** + * 申请退款API + */ + private void orderWxApplyRefund1(String orderId, String outRefundNo, BigDecimal payMoney, OrderRefund orderRefund){ + try { + // 创建支付订单 + OrderPayment orderPayment = orderPaymentService.getByOrderId(orderId); + if (null == orderPayment) { + return; + } + + log.info("调用微信退款---发起退款"); + + String subMchId = orderPayment.getSubMchId(); +// WxPayConfig config = wxService.getConfig(); + + RefundsRequest request = new RefundsRequest(); +// request.setSpAppid(config.getAppId()); + request.setSubMchid(subMchId); + request.setTransactionId(orderPayment.getTransactionId()); + request.setOutRefundNo(outRefundNo); + request.setReason("用户取消订单"); + // 订单金额 + int total = orderPayment.getPayMoney().multiply(new BigDecimal(100)).intValue(); + + RefundsRequest.Amount amount = RefundsRequest.Amount.builder().refund(total).total(total).currency("CNY").build(); + request.setAmount(amount); + request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentRefundCallback"); + +// RefundsResult result = wxService.getEcommerceService().refunds(request); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + String org_req_date = sdf.format(orderPayment.getCreateTime()); + String outTradeNo = orderPayment.getOutTradeNo(); + R<String> r = HuiFuTianXiaUtil.weixinPaymentRefund(outRefundNo, orderPayment.getPayMoney().doubleValue(), org_req_date, outTradeNo, request.getNotifyUrl()); + if(r.getCode() != 200){ + throw new ServiceException(r.getMsg()); + } + + // 微信退款id + orderRefund.setWxRefundId(r.getData()); + + // 请求参数 + Gson gson = new Gson(); + String refundRequestJson = gson.toJson(request); + // 返回参数 +// String refundResponseJson = gson.toJson(result); + +// log.info("调用微信退款返回参数---{}", refundResponseJson); + + // 保存支付订单统一下单日志 +// paymentMessageService.savePaymentMessage("3", orderId, refundRequestJson, refundResponseJson); + + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } + + /** + * @param staffTotalDto + * @return StaffActivityOrderTotalVo + * @description 员工端活动订单统计 + * @author jqs + * @date 2023/7/17 15:25 + */ + @Override + public StaffActivityOrderTotalVo getStaffActivityOrderTotal(StaffTotalDto staffTotalDto) { + StaffActivityOrderTotalVo staffActivityOrderTotalVo = new StaffActivityOrderTotalVo(); + if(staffTotalDto.getActivityFrom()==1){ + staffActivityOrderTotalVo = orderMapper.getStaffActivityOrderTotal(staffTotalDto); + StaffActivityOrderTotalVo staffActivityOrderGoodsTotalVo = orderMapper.getStaffActivityOrderGoodsTotal(staffTotalDto); + staffActivityOrderTotalVo.setCycleTotal(staffActivityOrderGoodsTotalVo.getCycleTotal()); + staffActivityOrderTotalVo.setServiceTotal(staffActivityOrderGoodsTotalVo.getServiceTotal()); + staffActivityOrderTotalVo.setExperienceTotal(staffActivityOrderGoodsTotalVo.getExperienceTotal()); + } + return staffActivityOrderTotalVo; + } + + /** + * @param staffTotalDto + * @return StaffActivityTotalVo + * @description 员工端活动统计 + * @author jqs + * @date 2023/7/17 15:51 + */ + @Override + public StaffActivityTotalVo getStaffActivityTotal(StaffTotalDto staffTotalDto) { + StaffActivityTotalVo staffActivityTotalVo = new StaffActivityTotalVo(); + if(staffTotalDto.getActivityFrom()==1){ + staffActivityTotalVo = orderMapper.getStaffActivityTotal(staffTotalDto); + } + return staffActivityTotalVo; + } + + /** + * @param staffTotalDto + * @return MerOrderDistributionTotalVo + * @description 员工端活动统计订单分布 + * @author jqs + * @date 2023/7/17 16:16 + */ + @Override + public MerOrderDistributionTotalVo getStaffOrderDistributionTotal(StaffTotalDto staffTotalDto) { + if(staffTotalDto.getGoodsType()!=null&&staffTotalDto.getGoodsType()==0){ + staffTotalDto.setGoodsType(null); + } + MerOrderDistributionTotalVo orderDistributionTotalVo = new MerOrderDistributionTotalVo(); + // 获取订单年龄用户列表 + //MerTotalDto merTotalDto = new MerTotalDto(); + //merTotalDto.setShopId(staffTotalDto.getShopId()); + //List<MerOrderAgeUserVo> orderAgeUserVoList = remoteMemberService.listOrderAgeUser(merTotalDto).getData(); + // 如果订单年龄用户列表不为空 + /*if (orderAgeUserVoList != null && !orderAgeUserVoList.isEmpty()) { + // 定义变量 + Integer ageType; + List<Long> userIdList; + MerOrderAgeUserVo orderAgeUserVo; + MgtMapTotalPlusVo mgtMapTotalPlusVo; + String[] orderTotalKey = new String[5]; + Integer[] orderTotalValue = new Integer[5]; + BigDecimal[] orderMoneyValue = new BigDecimal[5]; + // 遍历订单年龄用户列表 + for (int i = 0; i < orderAgeUserVoList.size(); i++) { + orderAgeUserVo = orderAgeUserVoList.get(i); + ageType = orderAgeUserVo.getAgeType(); + userIdList = orderAgeUserVo.getUserIdList(); + // 根据年龄类型设置订单总数键 + switch (ageType) { + case 1: + orderTotalKey[i] = "<20"; + break; + case 2: + orderTotalKey[i] = "21-30"; + break; + case 3: + orderTotalKey[i] = "31-40"; + break; + case 4: + orderTotalKey[i] = "41-50"; + break; + case 5: + orderTotalKey[i] = ">50"; + break; + } + // 如果用户ID列表不为空 + if (userIdList != null && !userIdList.isEmpty()) { + mgtMapTotalPlusVo = orderMapper.listStaffActivityOrderDistributionTotal(userIdList, staffTotalDto.getShopId(), staffTotalDto.getActivityId()); + orderTotalValue[i] = mgtMapTotalPlusVo.getMapValueFirst(); + orderMoneyValue[i] = mgtMapTotalPlusVo.getMapValueSecond(); + } else { + orderTotalValue[i] = 0; + orderMoneyValue[i] = BigDecimal.ZERO; + } + } + // 设置订单分布总数对象的属性值 + orderDistributionTotalVo.setOrderTotalKey(orderTotalKey); + orderDistributionTotalVo.setOrderTotalValue(orderTotalValue); + orderDistributionTotalVo.setOrderMoneyValue(orderMoneyValue); + }*/ + if(staffTotalDto.getActivityFrom()==1){ + List<MgtMapTotalPlusVo> mgtMapTotalPlusVoList = orderMapper.listStaffActivityOrderDistributionTotal(staffTotalDto); + String[] orderTotalKey = new String[mgtMapTotalPlusVoList.size()]; + Integer[] orderTotalValue = new Integer[mgtMapTotalPlusVoList.size()]; + BigDecimal[] orderMoneyValue = new BigDecimal[mgtMapTotalPlusVoList.size()]; + if (mgtMapTotalPlusVoList != null && !mgtMapTotalPlusVoList.isEmpty()) { + MgtMapTotalPlusVo mgtMapTotalPlusVo; + for (int i = 0; i < mgtMapTotalPlusVoList.size(); i++) { + mgtMapTotalPlusVo = mgtMapTotalPlusVoList.get(i); + orderTotalKey[i] = mgtMapTotalPlusVo.getMapKey(); + orderTotalValue[i] = mgtMapTotalPlusVo.getMapValueFirst(); + orderMoneyValue[i] = mgtMapTotalPlusVo.getMapValueSecond(); + } + orderDistributionTotalVo = fillOrderTotalKeyAndValuesToRecentFiveDays(orderTotalKey,orderTotalValue,orderMoneyValue); + }else{ + orderDistributionTotalVo.setOrderTotalKey(orderTotalKey); + orderDistributionTotalVo.setOrderTotalValue(orderTotalValue); + orderDistributionTotalVo.setOrderMoneyValue(orderMoneyValue); + } + } + // 返回订单分布总数对象 + return orderDistributionTotalVo; + } + + /** + * @description 补时间 + * @author jqs + * @date 2023/8/28 15:03 + * @param orderTotalKey + * @param orderTotalValue + * @param orderMoneyValue + * @return MerOrderDistributionTotalVo + */ + public MerOrderDistributionTotalVo fillOrderTotalKeyAndValuesToRecentFiveDays(String[] orderTotalKey,Integer[] orderTotalValue,BigDecimal[] orderMoneyValue) { + MerOrderDistributionTotalVo orderDistributionTotalVo = new MerOrderDistributionTotalVo(); + // 获取当前日期 + LocalDate currentDate = LocalDate.now(); + + // 创建最近五天日期列表 + List<String> recentFiveDays = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + LocalDate date = currentDate.minusDays(i); + recentFiveDays.add(date.toString()); + } + + // 创建新的数组 + String[] newOrderTotalKey = new String[5]; + Integer[] newOrderTotalValue = new Integer[5]; + BigDecimal[] newOrderMoneyValue = new BigDecimal[5]; + + // 遍历最近五天日期列表,并补充数据 + for (int i = 0; i < 5; i++) { + String day = recentFiveDays.get(i); + int index = getIndexInOrderTotalKey(day,orderTotalKey); + if (index != -1) { + newOrderTotalKey[i] = orderTotalKey[index]; + newOrderTotalValue[i] = orderTotalValue[index]; + newOrderMoneyValue[i] = orderMoneyValue[index]; + } else { + newOrderTotalKey[i] = day; + newOrderTotalValue[i] = 0; + newOrderMoneyValue[i] = BigDecimal.ZERO; + } + } + + // 更新属性 + orderTotalKey = newOrderTotalKey; + orderTotalValue = newOrderTotalValue; + orderMoneyValue = newOrderMoneyValue; + orderDistributionTotalVo.setOrderTotalKey(orderTotalKey); + orderDistributionTotalVo.setOrderTotalValue(orderTotalValue); + orderDistributionTotalVo.setOrderMoneyValue(orderMoneyValue); + return orderDistributionTotalVo; + } + + + private int getIndexInOrderTotalKey(String day,String[] orderTotalKey) { + for (int i = 0; i < orderTotalKey.length; i++) { + if (orderTotalKey[i].equals(day)) { + return i; + } + } + return -1; + } + + + /** + * @param staffTotalDto + * @return MerOrderTypeTotalVo + * @description 员工端活动统计销售占比 + * @author jqs + * @date 2023/7/17 17:03 + */ + @Override + public MerOrderTypeTotalVo getStaffOrderTypeTotal(StaffTotalDto staffTotalDto) { + MerOrderTypeTotalVo orderTypeTotalVo = new MerOrderTypeTotalVo(); + if(staffTotalDto.getActivityFrom()==1){ + //获取商品分类销售数据 + List<MgtMapTotalPlusVo> MgtMapIntTotalVoGoodsType = orderMapper.listStaffOrderTotalGoodsType(staffTotalDto); + List<MgtMapIntTotalVo> goodsTypeTotalList = new ArrayList<>(); + List<MgtMapBigTotalVo> goodsTypeMoneyList = new ArrayList<>(); + if (MgtMapIntTotalVoGoodsType != null && MgtMapIntTotalVoGoodsType.size() > 0) { + MgtMapIntTotalVo mgtMapIntTotalVo; + MgtMapBigTotalVo mgtMapBigTotalVo; + Integer intTotal = 0; + BigDecimal bigTotal = BigDecimal.ZERO; + for(MgtMapTotalPlusVo mgtMapTotalPlusVo : MgtMapIntTotalVoGoodsType){ + intTotal = intTotal + mgtMapTotalPlusVo.getMapValueFirst(); + bigTotal = bigTotal.add(mgtMapTotalPlusVo.getMapValueSecond()); + } + BigDecimal hundredBig = new BigDecimal("100"); + BigDecimal intTotalBig = hundredBig; + if(intTotal!=0){ + intTotalBig = new BigDecimal(intTotal.toString()); + } + if(bigTotal.compareTo(BigDecimal.ZERO)<1){ + bigTotal = hundredBig; + } + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + Boolean noCycle = true; + Boolean noService = true; + Boolean noExperience = true; + Boolean noGoods = true; + for (int i = 0; i < MgtMapIntTotalVoGoodsType.size(); i++) { + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapIntTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()); + mgtMapIntTotalVo.setMapPercent(BigDecimal.valueOf(MgtMapIntTotalVoGoodsType.get(i).getMapValueFirst()).divide(intTotalBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig)); + mgtMapBigTotalVo.setMapValue(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond()); + mgtMapBigTotalVo.setMapPercent(MgtMapIntTotalVoGoodsType.get(i).getMapValueSecond().divide(bigTotal,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig)); + if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("1")) { + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapKey("周期"); + noCycle= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("2")) { + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapKey("服务"); + noService= false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("3")) { + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapKey("体验"); + noExperience = false; + } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("4")) { + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapKey("单品"); + noGoods = false; + } + goodsTypeTotalList.add(mgtMapIntTotalVo); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + //补充缺少类型 + if(noCycle){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("周期"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("周期"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noService){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("服务"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("服务"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noExperience){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("体验"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("体验"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + if(noGoods){ + mgtMapIntTotalVo = new MgtMapIntTotalVo(); + mgtMapIntTotalVo.setMapKey("单品"); + mgtMapIntTotalVo.setMapValue(0); + goodsTypeTotalList.add(mgtMapIntTotalVo); + mgtMapBigTotalVo = new MgtMapBigTotalVo(); + mgtMapBigTotalVo.setMapKey("单品"); + mgtMapBigTotalVo.setMapValue(BigDecimal.ZERO); + goodsTypeMoneyList.add(mgtMapBigTotalVo); + } + orderTypeTotalVo.setGoodsTypeTotalList(goodsTypeTotalList); + orderTypeTotalVo.setGoodsTypeMoneyList(goodsTypeMoneyList); + } + } + return orderTypeTotalVo; + } + + /** + * @param staffTotalDto + * @return StaffActivityDateMemberTotalVo + * @description 员工端获客人数 + * @author jqs + * @date 2023/7/17 18:42 + */ + @Override + public StaffActivityDateMemberTotalVo getStaffActivityGetMemberTotal(StaffTotalDto staffTotalDto) { + // 创建返回对象 + StaffActivityDateMemberTotalVo staffActivityDateMemberTotalVo = new StaffActivityDateMemberTotalVo(); + if(staffTotalDto.getActivityFrom()==1){ + // 查询数据库获取数据 + List<MgtMapIntTotalVo> mgtMapIntTotalVoList = orderMapper.getStaffActivityGetMemberTotal(staffTotalDto); + // 将查询结果转为Map + Map<String, Integer> map = new HashMap<>(); + if (mgtMapIntTotalVoList != null && !mgtMapIntTotalVoList.isEmpty()) { + map = mgtMapIntTotalVoList.stream() + .collect(Collectors.toMap(MgtMapIntTotalVo::getMapKey, MgtMapIntTotalVo::getMapValue)); + } + // 获取日期范围 + List<String> dateList = getDateRange(staffTotalDto.getStartDate(), staffTotalDto.getEndDate()); + int size = dateList.size(); + // 创建日期和成员总数的数组 + String[] dateMemberTotalKey = new String[size]; + Integer[] dateMemberTotalValue = new Integer[size]; + // 遍历日期列表,设置日期和成员总数的数组 + String str; + Integer value; + for (int i = 0; i < size; i++) { + str = dateList.get(i); + dateMemberTotalKey[i] = str; + value = map.get(str); + dateMemberTotalValue[i] = (value != null) ? value : 0; + } + // 设置返回对象的日期和成员总数数组 + staffActivityDateMemberTotalVo.setDateMemberTotalKey(dateMemberTotalKey); + staffActivityDateMemberTotalVo.setDateMemberTotalValue(dateMemberTotalValue); + } + // 返回结果对象 + return staffActivityDateMemberTotalVo; + } + + /** + * @param staffTotalDto + * @return StaffActivityDateMemberTotalVo + * @description 员工端获客人数 + * @author jqs + * @date 2023/7/17 18:42 + */ + @Override + public StaffActivityDateMemberTotalVo getStaffActivityMemberTotal(StaffTotalDto staffTotalDto) { + // 创建返回对象 + StaffActivityDateMemberTotalVo staffActivityDateMemberTotalVo = new StaffActivityDateMemberTotalVo(); + if(staffTotalDto.getActivityFrom()==1){ + MerTotalDto merTotalDto = new MerTotalDto(); + merTotalDto.setAgeType(staffTotalDto.getAgeType()); + if(staffTotalDto.getAgeType()!=null){ + List<Long> userIdList = remoteMemberService.listUserIdByAgeType(staffTotalDto.getAgeType()).getData(); + staffTotalDto.setUserIdList(userIdList); + } + // 查询数据库获取数据 + List<MgtMapIntTotalVo> mgtMapIntTotalVoList = orderMapper.getStaffActivityMemberTotal(staffTotalDto); + // 将查询结果转为Map + Map<String, Integer> map = new HashMap<>(); + if (mgtMapIntTotalVoList != null && !mgtMapIntTotalVoList.isEmpty()) { + map = mgtMapIntTotalVoList.stream() + .collect(Collectors.toMap(MgtMapIntTotalVo::getMapKey, MgtMapIntTotalVo::getMapValue)); + } + // 获取日期范围 + List<String> dateList = getDateRange(staffTotalDto.getStartDate(), staffTotalDto.getEndDate()); + int size = dateList.size(); + // 创建日期和成员总数的数组 + String[] dateMemberTotalKey = new String[size]; + Integer[] dateMemberTotalValue = new Integer[size]; + // 遍历日期列表,设置日期和成员总数的数组 + String str; + Integer value; + for (int i = 0; i < size; i++) { + str = dateList.get(i); + dateMemberTotalKey[i] = str; + value = map.get(str); + dateMemberTotalValue[i] = (value != null) ? value : 0; + } + // 设置返回对象的日期和成员总数数组 + staffActivityDateMemberTotalVo.setDateMemberTotalKey(dateMemberTotalKey); + staffActivityDateMemberTotalVo.setDateMemberTotalValue(dateMemberTotalValue); + } + // 返回结果对象 + return staffActivityDateMemberTotalVo; + } + + /** + * @param startDate + * @param endDate + * @return List<String> + * @description 获取时间段日期 + * @author jqs + * @date 2023/7/17 19:11 + */ + public static List<String> getDateRange(String startDate, String endDate) { + List<String> dateList = new ArrayList<>(); + LocalDate start = LocalDate.parse(startDate); + LocalDate end = LocalDate.parse(endDate); + while (!start.isAfter(end)) { + dateList.add(start.format(DateTimeFormatter.ISO_DATE)); + start = start.plusDays(1); + } + return dateList; + } + + /** + * @param + * @return void + * @description 检查订单状态定时任务 + * @author jqs + * @date 2023/7/25 14:40 + */ + @Override + public void checkOrderStatus() { + Integer delayTime = 30; + if (redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)) { + delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); + } + delayTime = delayTime + 5; + Date checkTime = DateUtils.addMinutes(new Date(), -delayTime); + LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Order::getDelFlag, 0); + queryWrapper.lt(Order::getCreateTime, checkTime); + queryWrapper.eq(Order::getOrderStatus, 1); + List<Order> orderList = this.list(queryWrapper); + if (orderList != null && !orderList.isEmpty()) { + for (Order order : orderList) { + autoTimeCancelOrder(order); + } + } + } + + @Override + public void profitSharingBack(ProfitSharingNotifyResult result) { + + try { + String outOrderNo = result.getOutOrderNo(); + ProfitSharing profitSharing = profitSharingService.getById(outOrderNo); + if(null != profitSharing){ + profitSharing.setWxOrderId(result.getOrderId()); + profitSharing.setFinishTime(result.getSuccessTime()); + profitSharing.setFinishFlag(1); + + profitSharingService.saveOrUpdate(profitSharing); + } + } catch (Exception e){ + + log.error("==分账回成功回调操作====【{}】========={}", result.getOutOrderNo(), e.getMessage()); + } + } + + @Override + public void orderRefundBack(RefundNotifyResult result) { + try { + String outRefundNo = result.getOutRefundNo(); + String refundStatus = result.getRefundStatus(); + OrderRefund orderRefund = orderRefundService.getById(outRefundNo); + if(null != orderRefund){ + orderRefund.setWxRefundId(result.getRefundId()); + orderRefund.setBackTime(result.getSuccessTime()); + orderRefund.setRefundStatus(IDict.getCodeByText(RefundStatusEnum.class, refundStatus)); + orderRefundService.saveOrUpdate(orderRefund); + } + } catch (Exception e){ + + log.error("==退款回成功回调操作====【{}】========={}", result.getOutRefundNo(), e.getMessage()); + } + } + + @GlobalTransactional(rollbackFor = Exception.class) + private void autoTimeCancelOrder(Order order) { + String orderId = order.getOrderId(); + order.setOrderStatus(0); + order.setCancelTime(new Date()); + this.saveOrUpdate(order); + //活动订单回退库存 + if (order.getOrderFrom() == 2) { + List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId); + if (orderGoodsList != null && !orderGoodsList.isEmpty()) { + for (OrderGoods orderGoods : orderGoodsList) { + //redis库存控制极简版 + String goodsLock = "goods_lock_" + order.getActivityId() + "_" + orderGoods.getGoodsId(); + RLock redissonLock = redissonClient.getLock(goodsLock); + try { + redissonLock.lock(30, TimeUnit.SECONDS); + Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId()); + if(null == surpNum){ + surpNum = 0; + } + redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId(), surpNum + orderGoods.getBuyNum()); + } finally { + redissonLock.unlock(); + } + //改变活动库存 + AGStockChangeDto agStockChangeDto = new AGStockChangeDto(); + agStockChangeDto.setActivityId(order.getActivityId()); + agStockChangeDto.setGoodsId(orderGoods.getGoodsId()); + agStockChangeDto.setChangeType(1); + agStockChangeDto.setChangeNum(orderGoods.getBuyNum()); + agStockChangeDto.setShopId(order.getShopId()); + agStockChangeDto.setUserId(order.getUserId()); + remoteActivityService.changeActivityStock(agStockChangeDto); + //删除活动记录 + ActivityRecord activityRecord = new ActivityRecord(); + activityRecord.setActivityId(order.getActivityId()); + activityRecord.setGoodsId(orderGoods.getGoodsId()); + activityRecord.setUserId(order.getUserId()); + activityRecord.setOrderTime(order.getCreateTime()); + remoteActivityService.delActivityRecord(activityRecord); + } + } + } else { + if (order.getCouponMoney().compareTo(BigDecimal.ZERO) > 0) { + //回退优惠券 + List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId); + if (orderGoodsList != null && !orderGoodsList.isEmpty()) { + StringJoiner memberCouponSJ = new StringJoiner(","); + for (OrderGoods orderGoods : orderGoodsList) { + memberCouponSJ.add(orderGoods.getCouponId()); + } + if (memberCouponSJ != null) { + remoteCouponService.backMemberCoupon(memberCouponSJ.toString()); + + } + } + } + } + } + + /** + * @description 获取商户订单统计 + * @author jqs + * @date 2023/8/4 10:25 + * @param mgtShopAllOrderPageDto + * @return MgtShopAllOrderTotal + */ + @Override + public MgtShopAllOrderTotal getMgtShopAllOrderTotal(MgtShopAllOrderPageDto mgtShopAllOrderPageDto){ + MgtShopAllOrderTotal shopAllOrderTotal = orderMapper.getMgtShopAllOrderTotal(mgtShopAllOrderPageDto); + return shopAllOrderTotal; + } + + /** + * 分页获取会员消费记录 + * @param merOrderPageDto + * @return + */ + @Override + public List<MerOrderPageVo> pageMerMemberPayOrder(Page page,MerMemberNoClearOrderDto merOrderPageDto){ + // 获取订单列表 + List<MerOrderPageVo> merOrderPageVoList = orderMapper.pageMerMemberPayOrder(page, merOrderPageDto); + // 如果订单列表不为空 + if (merOrderPageVoList != null && !merOrderPageVoList.isEmpty()) { + Long userId; + BigDecimal zeroBig = new BigDecimal("0.00"); + StringJoiner userIdSj = new StringJoiner(","); + // 遍历订单列表 + for (MerOrderPageVo merOrderPageVo : merOrderPageVoList) { + userId = merOrderPageVo.getUserId(); + userIdSj.add(userId.toString()); + // 如果未支付金额小于零,则设置为零 + if (merOrderPageVo.getUnPaidMoney().compareTo(zeroBig) < 0) { + merOrderPageVo.setUnPaidMoney(zeroBig); + } + } + // 获取用户列表 + MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); + mgtBaseBathDto.setIds(userIdSj.toString()); + List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(userIdSj.toString()).getData(); + // 将用户列表转换为Map,以便根据用户ID快速查找用户信息 + Map<Long, MgtSimpleMemberVo> userMap = simpleMemberVoList.stream() + .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity())); + // 遍历订单列表 + for (MerOrderPageVo merOrderPageVo : merOrderPageVoList) { + // 如果订单的用户ID不为空,并且用户Map中存在对应的用户信息 + if (merOrderPageVo.getUserId() != null && userMap.get(merOrderPageVo.getUserId()) != null) { + // 设置订单的用户名、昵称和手机号 + merOrderPageVo.setUserName(userMap.get(merOrderPageVo.getUserId()).getRealName()); + merOrderPageVo.setNickName(userMap.get(merOrderPageVo.getUserId()).getNickName()); + merOrderPageVo.setUserMobile(userMap.get(merOrderPageVo.getUserId()).getUserMobile()); + } else { + log.debug("订单merOrderPageVo" + merOrderPageVo.getOrderId() + "缺少用户"); + } + } + } + return merOrderPageVoList; + } + + /** + * @description 获取销售排行 + * @author jqs + * @date 2023/8/24 18:00 + * @param shopIdList + * @return List<MgtMapIntTotalVo> + */ + @Override + public List<MgtMapBigTotalVo> shopSalesRank(List<Long> shopIdList){ + return orderMapper.shopSalesRank(shopIdList); + } + + /** + * @description 获取商户服务统计 + * @author jqs + * @date 2023/8/24 18:28 + * @param shopId + * @return MerHomeShopTotalVo + */ + @Override + public MerHomeShopTotalVo getShopServiceTotal(Long shopId){ + MerHomeShopTotalVo serviceTotalVo = orderMapper.getMerHomeShopServiceTotalVo(shopId); + return serviceTotalVo; + } + + /** + * @description 获取区域统计 + * @author jqs + * @date 2023/8/25 11:49 + * @param shopIdList + * @return AgencyTotalVo + */ + @Override + public AgencyTotalVo getAgencyTotalVo(List<Long> shopIdList){ + AgencyTotalVo agencyTotalVo = orderMapper.getAgencyTotalVo(shopIdList); + return agencyTotalVo; + } + + /** + * @description 商户端会员订单统计 + * @author jqs + * @date 2023/8/29 17:39 + * @param merBaseDto + * @return MerMemberSimpleTotalVo + */ + @Override + public MerMemberSimpleTotalVo getMerMemberSimpleTotalVo(MerBaseDto merBaseDto){ + return orderMapper.getMerMemberSimpleTotalVo(merBaseDto); + } + + @Override + public ProfitSharingResult queryBill(String orderId) throws WxPayException { + OrderPayment orderPayment = orderPaymentService.getByOrderId(orderId); + ProfitSharing profitSharing = profitSharingService.getByOrderId(orderId); + ProfitSharingQueryRequest request = new ProfitSharingQueryRequest(); + request.setSubMchid("1650744551"); + request.setTransactionId(orderPayment.getTransactionId()); + request.setOutOrderNo(profitSharing.getShareId()); + ProfitSharingResult profitSharingResult = wxService.getEcommerceService().queryProfitSharing(request); + return profitSharingResult; + } + + @Override + public List<String> getActivityOrderGoods(String activityId) { + List<Order> orders = this.baseMapper.selectList(new QueryWrapper<Order>() + .eq("del_flag", 0) + .in("order_status", Arrays.asList(1, 2, 3)) + .eq("activity_id", activityId) + ); + if(orders.size() > 0){ + List<String> collect = orders.stream().map(Order::getOrderId).collect(Collectors.toList()); + List<OrderGoods> list = orderGoodsService.list(new QueryWrapper<OrderGoods>() + .eq("del_flag", 0) + .in("order_id", collect) + ); + return list.stream().map(OrderGoods::getGoodsId).collect(Collectors.toList()); + } + return new ArrayList<>(); + } } -- Gitblit v1.7.1