| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.core.exception.ServiceException; |
| | | import com.ruoyi.common.core.utils.DateUtils; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | import com.ruoyi.common.core.utils.uuid.IdUtils; |
| | | 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.domain.dto.*; |
| | | import com.ruoyi.order.domain.pojo.account.OrderPayment; |
| | | import com.ruoyi.order.domain.pojo.account.OrderRefund; |
| | | 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.vo.*; |
| | | import com.ruoyi.order.mapper.order.OrderMapper; |
| | | import com.ruoyi.order.mapper.order.UserServiceRecordMapper; |
| | | import com.ruoyi.order.service.order.ConsumerGoodsService; |
| | | import com.ruoyi.order.service.order.OrderGoodsService; |
| | | import com.ruoyi.order.service.order.OrderService; |
| | | import com.ruoyi.order.service.order.UserServiceRecordService; |
| | | 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.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.sys.SysUser; |
| | | import com.ruoyi.system.api.domain.vo.*; |
| | | import com.ruoyi.system.api.service.*; |
| | | import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction; |
| | | import org.redisson.api.RLock; |
| | | import org.redisson.api.RedissonClient; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | 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; |
| | | |
| | |
| | | private RemoteActivityService remoteActivityService; |
| | | |
| | | @Resource |
| | | private UserServiceRecordMapper userServiceRecordMapper; |
| | | |
| | | @Resource |
| | | private RedisService redisService; |
| | | |
| | | //@Resource |
| | | //@Qualifier("profitsSharingServiceImpl") |
| | | //private ProfitsSharingService profitsSharingService; |
| | | |
| | | @Autowired |
| | | private RedissonClient redissonClient; |
| | | |
| | | /** 商户号 */ |
| | | public static String merchantId = ""; |
| | | /** 商户API私钥路径 */ |
| | | public static String privateKeyPath = ""; |
| | | /** 商户证书序列号 */ |
| | | public static String merchantSerialNumber = ""; |
| | | /** 微信支付平台证书路径 */ |
| | | public static String wechatPayCertificatePath = ""; |
| | | /** 微信支付 APIv3 密钥 */ |
| | | public static String apiV3Key = ""; |
| | | /** 微信支付APPID */ |
| | | public static String appId=""; |
| | | /** 微信支付商户ID */ |
| | | public static String mchId=""; |
| | | /** 通知地址 */ |
| | | public static String notifyUrl=""; |
| | | |
| | | /** |
| | | * @description: buyGoods |
| | |
| | | @Override |
| | | public AppSureOrderVo buyGoods(AppSureOrderDto appSureOrderDto) { |
| | | Long userId = appSureOrderDto.getUserId(); |
| | | // 初始化订单对象 |
| | | 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.getSubscription()!=null&&goods.getSubscription().compareTo(BigDecimal.ZERO)>0){ |
| | | haveDeposit = true; |
| | | } |
| | | } |
| | | String goodsId; |
| | | Integer buyNum; |
| | | BigDecimal buyNumBig; |
| | |
| | | BigDecimal goodsPrice; |
| | | BigDecimal goodsTotalPrice; |
| | | BigDecimal goodsRealPrice; |
| | | List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(userId).getData(); |
| | | List<AppMemberCouponVo> appGoodsMemberCouponVoList; |
| | | Map<String, 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; |
| | |
| | | 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"); |
| | | // 遍历购买商品列表 |
| | | HashSet<String> 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()); |
| | | //商品图片 |
| | | // 获取商品图片 |
| | | goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData(); |
| | | appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl()); |
| | | appSureOrderGoodsVo.setBuyNum(buyNum); |
| | | goodsPrice = goods.getSalesPrice(); |
| | | //商户定制价格 |
| | | // 获取商户定制价格 |
| | | AppShopGoodsGetDto appShopGoodsGetDto = new AppShopGoodsGetDto(); |
| | | appShopGoodsGetDto.setGoodsId(goods.getGoodsId()); |
| | | appShopGoodsGetDto.setShopId(appSureOrderDto.getShopId()); |
| | |
| | | buyNumBig = BigDecimal.valueOf(buyNum); |
| | | goodsTotalPrice = goodsPrice.multiply(buyNumBig); |
| | | goodsRealPrice = goodsTotalPrice; |
| | | if (memberCouponId != null) { |
| | | // 处理优惠券 |
| | | if (StringUtils.isNotBlank(memberCouponId)) { |
| | | appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId); |
| | | if (StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId)) { |
| | | couponType = appMemberCouponVo.getCouponType(); |
| | | 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); |
| | | } |
| | | } 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); |
| | | useCoupon = 1; |
| | | userCouponIdSet.add(memberCouponId); |
| | | appSureOrderGoodsVo.setMemberCouponId(memberCouponId); |
| | | } 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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | 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); |
| | | // 计算订单总金额 |
| | | 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&&entity.getDiscountMoney().compareTo(sureOrderGoodsVo.getGoodsTotalPrice())<0){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | } |
| | | }else if(entity.getCouponType()==2){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | }else if(entity.getCouponType()==3){ |
| | | if(entity.getDiscountMoney().compareTo(sureOrderGoodsVo.getGoodsTotalPrice())<0){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | sureOrderGoodsVo.setAppMemberCouponVoList(appGoodsMemberCouponVoList); |
| | | } |
| | | } |
| | | /*if (appMemberCouponVoList != null && !appMemberCouponVoList.isEmpty()) { |
| | | // 获取商品关联优惠券 |
| | | appGoodsMemberCouponVoList = new ArrayList<>(); |
| | | for(AppSureOrderGoodsVo sureOrderGoodsVo : appSureOrderGoodsVoList){ |
| | | for (AppMemberCouponVo entity : appMemberCouponVoList) { |
| | | if (StringUtils.isBlank(entity.getRelGoodsIds())) { |
| | | if (entity.getCouponType() == 1 && entity.getMoneyThreshold() != null && entity.getDiscountMoney() != null) { |
| | | moneyThreshold = entity.getMoneyThreshold(); |
| | | if (sureOrderGoodsVo.getGoodsTotalPrice().compareTo(moneyThreshold) >= 0) { |
| | | if(userCouponIdSet==null||!userCouponIdSet.contains(entity.getMemberCouponId())){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | }else{ |
| | | if(sureOrderGoodsVo.getMemberCouponId()!=null&&sureOrderGoodsVo.getMemberCouponId().equals(entity.getMemberCouponId())){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | } |
| | | } |
| | | } |
| | | }else{ |
| | | if(userCouponIdSet==null||!userCouponIdSet.contains(entity.getMemberCouponId())){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | }else{ |
| | | if(sureOrderGoodsVo.getMemberCouponId()!=null&&sureOrderGoodsVo.getMemberCouponId().equals(entity.getMemberCouponId())){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | } |
| | | } |
| | | } |
| | | } else if (entity.getRelGoodsIds().contains(sureOrderGoodsVo.getGoodsId())) { |
| | | if (entity.getCouponType() == 1 && entity.getMoneyThreshold() != null && entity.getDiscountMoney() != null) { |
| | | moneyThreshold = entity.getMoneyThreshold(); |
| | | if (sureOrderGoodsVo.getGoodsTotalPrice().compareTo(moneyThreshold) >= 0) { |
| | | if(userCouponIdSet==null||!userCouponIdSet.contains(entity.getMemberCouponId())){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | }else{ |
| | | if(sureOrderGoodsVo.getMemberCouponId()!=null&&sureOrderGoodsVo.getMemberCouponId().equals(entity.getMemberCouponId())){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | } |
| | | } |
| | | } |
| | | }else{ |
| | | if(userCouponIdSet==null||!userCouponIdSet.contains(entity.getMemberCouponId())){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | }else{ |
| | | if(sureOrderGoodsVo.getMemberCouponId()!=null&&sureOrderGoodsVo.getMemberCouponId().equals(entity.getMemberCouponId())){ |
| | | appGoodsMemberCouponVoList.add(entity); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | sureOrderGoodsVo.setAppMemberCouponVoList(appGoodsMemberCouponVoList); |
| | | } |
| | | }*/ |
| | | // 设置订单相关金额 |
| | | appSureOrderVo.setOrderGoodsMoney(orderGoodsMoney); |
| | | appSureOrderVo.setCouponDiscount(couponDiscount); |
| | | appSureOrderVo.setOrderPayDeposit(orderPayDeposit); |
| | | appSureOrderVo.setOrderPayMoney(orderPayMoney); |
| | | // 设置订单商品列表 |
| | | appSureOrderVo.setAppSureOrderGoodsVoList(appSureOrderGoodsVoList); |
| | | return appSureOrderVo; |
| | | } |
| | |
| | | if (activityGoodsGetVo.getAvailableBuyNum() < 1) { |
| | | throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL); |
| | | } |
| | | 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.setGoodsId(goodsId); |
| | | appPanicBuyVo.setGoodsName(goods.getGoodsName()); |
| | | appPanicBuyVo.setGoodsIntroduction(goods.getGoodsIntroduction()); |
| | |
| | | appPanicBuyVo.setGoodsTotalPrice(goodsTotalPrice); |
| | | appPanicBuyVo.setGoodsRealPrice(goodsRealPrice); |
| | | goodsDeposit = activityGoodsGetVo.getActivitySubscription(); |
| | | if (goodsDeposit == null) { |
| | | 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); |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public AppPlaceOrderVo placeOrder(AppPlaceOrderDto appPlaceOrderDto) { |
| | | // 获取用户ID |
| | | Long userId = appPlaceOrderDto.getUserId(); |
| | |
| | | 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 goodsPrice; |
| | | BigDecimal goodsTotalPrice; |
| | | BigDecimal goodsRealPrice; |
| | | MerBaseDto merBaseDto = new MerBaseDto(); |
| | | merBaseDto.setUserId(userId); |
| | | merBaseDto.setShopId(appPlaceOrderDto.getShopId()); |
| | | // 获取用户优惠券列表 |
| | | List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(userId).getData(); |
| | | List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(merBaseDto).getData(); |
| | | // 将用户优惠券列表转换为Map,方便后续查找 |
| | | Map<String, AppMemberCouponVo> appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity())); |
| | | AppMemberCouponVo appMemberCouponVo; |
| | |
| | | String orderGoodsId; |
| | | // 创建商品类型集合,用于记录订单中所有商品的类型 |
| | | HashSet<String> goodsTypeSet = new HashSet<>(); |
| | | //使用优惠券 |
| | | StringJoiner memberCouponSJ = new StringJoiner(","); |
| | | // 遍历购买的商品列表 |
| | | for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) { |
| | | appSureOrderGoodsVo = new AppSureOrderGoodsVo(); |
| | |
| | | goodsId = appBuyGoodsDto.getGoodsId(); |
| | | memberCouponId = appBuyGoodsDto.getMemberCouponId(); |
| | | // 获取商品信息 |
| | | goods = remoteGoodsService.getGoods(goodsId).getData(); |
| | | goods = goodsMap.get(goodsId); |
| | | // 设置商品信息 |
| | | appSureOrderGoodsVo.setGoodsId(goodsId); |
| | | appSureOrderGoodsVo.setGoodsName(goods.getGoodsName()); |
| | |
| | | useCoupon = 1; |
| | | } |
| | | } |
| | | memberCouponSJ.add(memberCouponId); |
| | | } |
| | | appSureOrderGoodsVo.setUseCoupon(useCoupon); |
| | | appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice); |
| | |
| | | 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); |
| | | // 计算商品总数量、商品总价、优惠总金额、支付押金、支付金额 |
| | |
| | | order.setReceivableMoney(orderPayMoney); |
| | | order.setReceivableDeposit(orderPayDeposit); |
| | | order.setChangeReceivableMoney(orderPayMoney); |
| | | order.setPayType(appPlaceOrderDto.getPayType()); |
| | | // 根据支付类型计算支付金额 |
| | | if (order.getPayType() == 1) { |
| | | if (appPlaceOrderDto.getPayType() == 1) { |
| | | order.setPayMoney(orderPayMoney); |
| | | order.setOnlinePayMoney(orderPayMoney); |
| | | appPlaceOrderVo.setPayMoney(orderPayMoney); |
| | | appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); |
| | | 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.setPayType(2); |
| | | order.setCloseFlag(0); |
| | | } |
| | | order.setOrderRemark(appPlaceOrderDto.getOrderRemark()); |
| | |
| | | appPlaceOrderVo.setOrderId(orderId); |
| | | appPlaceOrderVo.setOrderNo(orderNo); |
| | | // 调用支付 |
| | | /* CombineTransactionsJsRequest request=new CombineTransactionsJsRequest(); |
| | | request.setCombineAppid(); |
| | | request.setCombineMchid(); |
| | | profitsSharingService.combineTransactions(request);*/ |
| | | |
| | | //构建预下单支付对象 |
| | | /*PrepayRequest request = new PrepayRequest(); |
| | | Amount amount = new Amount(); |
| | | amount.setTotal(Integer.parseInt(order.getPayMoney().multiply(new BigDecimal(100)).toString())); |
| | | request.setAmount(amount); |
| | | request.setAppid(this.appId); |
| | | request.setMchid(this.mchId); |
| | | request.setDescription(order.getGoodsInfo()); |
| | | request.setNotifyUrl(this.notifyUrl); |
| | | request.setOutTradeNo(order.getOrderId()); |
| | | Payer payer = new Payer(); |
| | | payer.setOpenid("oLTPCuN5a-nBD4rAL_fa********"); |
| | | request.setPayer(payer);*/ |
| | | //返回前端唤醒支付结果信息 |
| | | /*PrepayWithRequestPaymentResponse res = this.getJsApIResponse(request); |
| | | appPlaceOrderVo.setAppId(this.appId); |
| | | appPlaceOrderVo.setTimeStamp(res.getTimeStamp()); |
| | | appPlaceOrderVo.setNonceStr(res.getNonceStr()); |
| | | appPlaceOrderVo.setPackageStr(res.getPackageVal()); |
| | | appPlaceOrderVo.setTradeType(res.getSignType()); |
| | | appPlaceOrderVo.setPaySign(res.getPaySign());*/ |
| | | |
| | | |
| | | //减去优惠券 |
| | | if(memberCouponSJ!=null&&StringUtils.isNotBlank(memberCouponSJ.toString())){ |
| | | remoteCouponService.useMemberCoupon(memberCouponSJ.toString()); |
| | | } |
| | | //生成自动取消订单延时任务 |
| | | Integer delayTime = 30; |
| | | if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){ |
| | | delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); |
| | | } |
| | | redisService.setCacheObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId, orderId, 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.setEndTime(DateUtils.addMinutes(order.getCreateTime(),delayTime)); |
| | | return appPlaceOrderVo; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @param appPlaceActivityDto |
| | |
| | | * @date 2023/7/6 17:59 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public AppPlaceOrderVo placeActivityOrder(AppPlaceActivityDto appPlaceActivityDto) { |
| | | Long userId = appPlaceActivityDto.getUserId(); |
| | | // 创建订单对象 |
| | |
| | | String goodsId = appPlaceActivityDto.getGoodsId(); |
| | | Integer buyNum = appPlaceActivityDto.getBuyNum(); |
| | | //redis库存控制极简版 |
| | | Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId); |
| | | if(surpNum==null||surpNum<buyNum){ |
| | | throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL); |
| | | }else{ |
| | | redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId,surpNum-buyNum); |
| | | String goodsLock = "goods_lock_"+activityId+"_"+goodsId; |
| | | RLock redissonLock = redissonClient.getLock(goodsLock); |
| | | try{ |
| | | redissonLock.lock(30, TimeUnit.SECONDS); |
| | | Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId); |
| | | if(surpNum==null||surpNum<buyNum){ |
| | | throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL); |
| | | }else{ |
| | | redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId,surpNum-buyNum); |
| | | } |
| | | }finally{ |
| | | redissonLock.unlock(); |
| | | } |
| | | // 定义购买数量,服务数量,商品数量 |
| | | BigDecimal buyNumBig; |
| | |
| | | if (activityGoodsGetVo.getAvailableBuyNum() < 1) { |
| | | throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL); |
| | | } |
| | | if (buyNum < activityGoodsGetVo.getAvailableBuyNum()) { |
| | | throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL); |
| | | if (activityGoodsGetVo.getAvailableBuyNum() < buyNum) { |
| | | throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_BEYOND); |
| | | } |
| | | // 创建订单ID和订单号 |
| | | String orderId = IdUtils.simpleUUID(); |
| | |
| | | String orderGoodsId; |
| | | // 创建商品类型集合 |
| | | HashSet<String> goodsTypeSet = new HashSet<>(); |
| | | HashSet<String> goodsNurseSet = new HashSet<>(); |
| | | // 创建商品订单对象,并设置商品ID,商品名称,商品介绍,商品类型 |
| | | appSureOrderGoodsVo = new AppSureOrderGoodsVo(); |
| | | useCoupon = 0; |
| | |
| | | appSureOrderGoodsVo.setGoodsRealPrice(goodsRealPrice); |
| | | // 获取商品押金 |
| | | goodsDeposit = activityGoodsGetVo.getActivitySubscription(); |
| | | if (goodsDeposit == null) { |
| | | if (goodsDeposit == null || goodsDeposit.compareTo(BigDecimal.ZERO)==0) { |
| | | goodsDeposit = new BigDecimal("0.00"); |
| | | }else{ |
| | | goodsDeposit = goodsDeposit.multiply(buyNumBig); |
| | | } |
| | | appSureOrderGoodsVo.setGoodsDeposit(goodsDeposit); |
| | | // 计算商品数量,订单商品金额,优惠券折扣,订单支付押金,订单支付金额 |
| | |
| | | } 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(1); |
| | | order.setOrderFrom(2); |
| | | order.setShopId(appPlaceActivityDto.getShopId()); |
| | | order.setUserId(userId); |
| | | order.setOrderMoney(orderGoodsMoney); |
| | |
| | | order.setReceivableMoney(orderPayMoney); |
| | | order.setReceivableDeposit(orderPayDeposit); |
| | | order.setChangeReceivableMoney(orderPayMoney); |
| | | order.setPayType(appPlaceActivityDto.getPayType()); |
| | | // 根据支付类型设置订单支付金额,在线支付金额,订单支付金额,未支付金额,关闭标志 |
| | | if (order.getPayType() == 1) { |
| | | 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); |
| | | } else if (order.getPayType() == 2) { |
| | | } 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); |
| | | } |
| | | // 设置订单备注,商品数量,创建时间 |
| | |
| | | // 保存订单 |
| | | this.save(order); |
| | | // 更新用户商品类型 |
| | | if (goodsTypeSet != null && goodsTypeSet.size() > 0) { |
| | | 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); |
| | | // 调用支付 |
| | | /*PrepayRequest request = new PrepayRequest(); |
| | | Amount amount = new Amount(); |
| | | amount.setTotal(Integer.parseInt(order.getPayMoney().multiply(new BigDecimal(100)).toString())); |
| | | request.setAmount(amount); |
| | | request.setAppid(this.appId); |
| | | request.setMchid(this.mchId); |
| | | request.setDescription(order.getGoodsInfo()); |
| | | request.setNotifyUrl(this.notifyUrl); |
| | | request.setOutTradeNo(order.getOrderId()); |
| | | Payer payer = new Payer(); |
| | | // TODO 获取openID |
| | | payer.setOpenid("oLTPCuN5a-nBD4rAL_fa********"); |
| | | |
| | | request.setPayer(payer);*/ |
| | | |
| | | //设置订单允许分账 秒杀活动才允许分账 |
| | | /*if(order.getOrderFrom()==2){ |
| | | SettleInfo settleInfo=new SettleInfo(); |
| | | settleInfo.setProfitSharing(true); |
| | | request.setSettleInfo(settleInfo); |
| | | }*/ |
| | | |
| | | |
| | | //返回前端唤醒支付结果信息 |
| | | /*PrepayWithRequestPaymentResponse res = this.getJsApIResponse(request); |
| | | |
| | | appPlaceOrderVo.setAppId(this.appId); |
| | | appPlaceOrderVo.setTimeStamp(res.getTimeStamp()); |
| | | appPlaceOrderVo.setNonceStr(res.getNonceStr()); |
| | | appPlaceOrderVo.setPackageStr(res.getPackageVal()); |
| | | appPlaceOrderVo.setTradeType(res.getSignType()); |
| | | appPlaceOrderVo.setPaySign(res.getPaySign()); |
| | | */ |
| | | //生成活动参加记录 |
| | | 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); |
| | | //生成自动取消订单延时任务 |
| | | Integer delayTime = 30; |
| | | if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){ |
| | | delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); |
| | | } |
| | | redisService.setCacheObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId, orderId, 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.setEndTime(DateUtils.addMinutes(order.getCreateTime(),delayTime)); |
| | | return appPlaceOrderVo; |
| | | } |
| | | |
| | |
| | | Shop shopTemp = remoteShopService.getShop(shopIdLong).getData(); |
| | | shopMap.put(shopIdLong, shopTemp); |
| | | }); |
| | | Integer delayTime = 30; |
| | | if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){ |
| | | delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); |
| | | } |
| | | for (AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList) { |
| | | shop = shopMap.get(appUserOrderPageVo.getShopId()); |
| | | appUserOrderPageVo.setShopName(shop.getShopName()); |
| | |
| | | appUserOrderPageVo.setSameShop(0); |
| | | } |
| | | appUserOrderPageVo.setVerifyCode("1-" + appUserOrderPageVo.getOrderId()); |
| | | appUserOrderPageVo.setEndTime(DateUtils.addMinutes(appUserOrderPageVo.getCreateTime(),delayTime)); |
| | | } |
| | | } |
| | | return appUserOrderPageVoList; |
| | |
| | | appUserOrderGetVo.setCouponDiscount(order.getCouponMoney()); |
| | | appUserOrderGetVo.setReceivableDeposit(order.getReceivableDeposit()); |
| | | appUserOrderGetVo.setReceivableMoney(order.getReceivableMoney()); |
| | | appUserOrderGetVo.setPayType(order.getPayType()); |
| | | appUserOrderGetVo.setPayMoney(order.getPayMoney()); |
| | | appUserOrderGetVo.setOrderRemark(order.getOrderRemark()); |
| | | appUserOrderGetVo.setShopId(order.getShopId()); |
| | |
| | | @Override |
| | | public void cancelOrder(String orderId) { |
| | | Order order = this.getById(orderId); |
| | | if (order.getOrderStatus() != 1) { |
| | | if (order.getOrderStatus() == 1) { |
| | | this.autoCancelOrder(orderId); |
| | | }else if(order.getOrderStatus() == 2){ |
| | | this.refundOrder(orderId); |
| | | }else{ |
| | | throw new ServiceException(AppErrorConstant.CANCEL_ERROR_ORDER); |
| | | } |
| | | order.setOrderStatus(0); |
| | | order.setCancelTime(new Date()); |
| | | this.saveOrUpdate(order); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Override |
| | | public MerHomeShopTotalVo getMerHomeTotal(MerHomeShopTotalVo merHomeShopTotalVo) { |
| | | List<Long> shopIds = merHomeShopTotalVo.getShopIds(); |
| | | if (null != shopIds && shopIds.size() != 0) { |
| | | Integer todayShop = userServiceRecordMapper.countShopServicePersons(shopIds); |
| | | merHomeShopTotalVo = orderMapper.getMerHomeShopsTotalVo(shopIds); |
| | | merHomeShopTotalVo.setTodayShop(todayShop); |
| | | }else{ |
| | | Long shopId = merHomeShopTotalVo.getShopId(); |
| | | Integer todayShop = userServiceRecordService.countShopServicePerson(shopId); |
| | | merHomeShopTotalVo.setTodayShop(todayShop); |
| | | merHomeShopTotalVo = orderMapper.getMerHomeShopTotalVo(shopId); |
| | | |
| | | } |
| | | Long shopId = merHomeShopTotalVo.getShopId(); |
| | | Integer todayShop = userServiceRecordService.countShopServicePerson(shopId); |
| | | merHomeShopTotalVo = orderMapper.getMerHomeShopTotalVo(shopId); |
| | | merHomeShopTotalVo.setTodayShop(todayShop); |
| | | return merHomeShopTotalVo; |
| | | } |
| | | |
| | |
| | | merVerifyOrderVo.setUseTime(order.getUseTime()); |
| | | merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList); |
| | | // 根据订单用户ID获取用户信息 |
| | | SysUser sysUser = remoteUserService.getSysUser(order.getUserId()).getData(); |
| | | merVerifyOrderVo.setUserName(sysUser.getNickName()); |
| | | merVerifyOrderVo.setUserMobile(sysUser.getPhonenumber()); |
| | | Member member = remoteMemberService.getMember(order.getUserId()).getData(); |
| | | merVerifyOrderVo.setUserName(member.getRealName()); |
| | | merVerifyOrderVo.setUserMobile(member.getMobile()); |
| | | merVerifyOrderVo.setCloseFlag(order.getCloseFlag()); |
| | | // 返回结果 |
| | | return merVerifyOrderVo; |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public MerVerifyOrderVo sureVerifyOrder(MerVerifyOrderDto merVerifyOrderDto) { |
| | | String orderId = merVerifyOrderDto.getOrderId(); |
| | | BigDecimal relReceiveMoney = merVerifyOrderDto.getRelReceiveMoney(); |
| | |
| | | Order order = this.getById(orderId); |
| | | if (order.getOrderStatus() != 2) { |
| | | throw new ServiceException(AppErrorConstant.VERIFY_USED); |
| | | } |
| | | |
| | | ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(merVerifyOrderDto.getUserId()).getData(); |
| | | if(!shopRelUserVo.getShopId().equals(order.getShopId())){ |
| | | throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); |
| | | } |
| | | order.setOrderStatus(3); |
| | | order.setUseTime(nowTime); |
| | |
| | | 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()); |
| | | Member member = remoteMemberService.getMember(order.getUserId()).getData(); |
| | | merVerifyOrderVo.setUserName(member.getRealName()); |
| | | merVerifyOrderVo.setUserMobile(member.getMobile()); |
| | | merVerifyOrderVo.setCloseFlag(order.getCloseFlag()); |
| | | // |
| | | if(order.getOrderFrom()==2){ |
| | | |
| | | //profitsSharingService.applyProfitSharing(); |
| | | } |
| | | return merVerifyOrderVo; |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | * @date 2023/6/28 11:26 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public MerVerifyCouponVo sureVerifyCoupon(MerVerifyCouponDto merVerifyCouponDto) { |
| | | MerVerifyCouponGetVo verifyCouponGetVo = remoteCouponService.getVerifyCoupon(merVerifyCouponDto.getMemberCouponId()).getData(); |
| | | ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(merVerifyCouponDto.getUserId()).getData(); |
| | | if(!shopRelUserVo.getShopId().equals(verifyCouponGetVo.getMemberCoupon().getShopId())){ |
| | | throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); |
| | | } |
| | | // 创建MerVerifyCouponVo对象 |
| | | MerVerifyCouponVo merVerifyCouponVo = new MerVerifyCouponVo(); |
| | | // 调用remoteCouponService的getVerifyCoupon方法获取MerVerifyCouponGetVo对象 |
| | |
| | | Long userId = verifyCouponGetVo.getUserId(); |
| | | // 调用remoteMemberService的getMember方法获取Member对象 |
| | | Member member = remoteMemberService.getMember(userId).getData(); |
| | | merVerifyCouponVo.setUserName(member.getNickName()); |
| | | merVerifyCouponVo.setUserName(member.getRealName()); |
| | | merVerifyCouponVo.setUserMobile(member.getMobile()); |
| | | merVerifyCouponVo.setCouponFrom(verifyCouponGetVo.getCouponFrom()); |
| | | merVerifyCouponVo.setCouponName(verifyCouponGetVo.getMemberCoupon().getCouponName()); |
| | |
| | | * @return MerVerifyAwardVo |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | 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(); |
| | | if(!shopRelUserVo.getShopId().equals(memberGiftRecord.getShopId())){ |
| | | throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); |
| | | } |
| | | Member member = remoteMemberService.getMember(memberGiftRecord.getUserId()).getData(); |
| | | merVerifyAwardVo.setUserName(member.getNickName()); |
| | | merVerifyAwardVo.setUserName(member.getRealName()); |
| | | merVerifyAwardVo.setUserMobile(member.getMobile()); |
| | | if(memberGiftRecord.getGiftFrom()==1){ |
| | | merVerifyAwardVo.setGiftFrom("平台生日卡"); |
| | |
| | | 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) { |
| | | String name = merNewOrderDto.getName(); |
| | |
| | | member.setMobile(mobile); |
| | | member.setRealName(name); |
| | | member.setNickName(name); |
| | | member.setBindingFlag(1); |
| | | member.setRelationShopId(shopId); |
| | | member.setRelationShopName(shop.getShopName()); |
| | | remoteMemberService.createNewMember(member); |
| | | } |
| | | userId = sysUser.getUserId(); |
| | |
| | | BigDecimal goodsPrice; |
| | | BigDecimal goodsTotalPrice; |
| | | BigDecimal goodsRealPrice; |
| | | Long shopId = merNewOrderDto.getShopId(); |
| | | Shop shop = remoteShopService.getShop(shopId).getData(); |
| | | List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(userId).getData(); |
| | | 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())); |
| | |
| | | } |
| | | |
| | | 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); |
| | |
| | | order.setOnlinePayMoney(new BigDecimal("0.00")); |
| | | order.setOfflinePayMoney(merNewOrderDto.getPayMoney()); |
| | | order.setOffPayTime(nowTime); |
| | | order.setPayType(1); |
| | | order.setCloseFlag(1); |
| | | this.save(order); |
| | | //创建服务 |
| | |
| | | } |
| | | ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto(); |
| | | shopTotalChangeDto.setShopId(order.getShopId()); |
| | | shopTotalChangeDto.setOrderType(1); |
| | | shopTotalChangeDto.setCycleMoney(cycleMoney); |
| | | shopTotalChangeDto.setServiceMoney(serviceMoney); |
| | | shopTotalChangeDto.setExperienceMoney(experienceMoney); |
| | |
| | | Long userId = verifyCouponGetVo.getUserId(); |
| | | // 调用remoteMemberService的getMember方法获取Member对象 |
| | | Member member = remoteMemberService.getMember(userId).getData(); |
| | | merVerifyCouponVo.setUserName(member.getNickName()); |
| | | merVerifyCouponVo.setUserName(member.getRealName()); |
| | | merVerifyCouponVo.setUserMobile(member.getMobile()); |
| | | merVerifyCouponVo.setCouponFrom(verifyCouponGetVo.getCouponFrom()); |
| | | merVerifyCouponVo.setCouponName(verifyCouponGetVo.getMemberCoupon().getCouponName()); |
| | |
| | | throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); |
| | | } |
| | | Member member = remoteMemberService.getMember(memberGiftRecord.getUserId()).getData(); |
| | | merVerifyAwardVo.setUserName(member.getNickName()); |
| | | merVerifyAwardVo.setUserName(member.getRealName()); |
| | | merVerifyAwardVo.setUserMobile(member.getMobile()); |
| | | if(memberGiftRecord.getGiftFrom()==1){ |
| | | merVerifyAwardVo.setGiftFrom("平台生日卡"); |
| | |
| | | } |
| | | return shopAllOrderPageVoList; |
| | | } |
| | | |
| | | /** |
| | | * @description 自动取消订单 |
| | | * @author jqs |
| | | * @date 2023/7/13 17:15 |
| | | * @param orderId |
| | | * @return void |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | 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()); |
| | | 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/7/13 17:57 |
| | | * @param transaction |
| | | * @return void |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public void payBack(Transaction transaction) { |
| | | // 更新订单状态 |
| | | String orderId=transaction.getOutTradeNo(); |
| | | Order order = this.getById(orderId); |
| | | 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(order.getUserId(),orderGoods.getGoodsId()); |
| | | if(bugGoodsNum==null||bugGoodsNum<1){ |
| | | goodsTotalChangeDto.setPersonNum(1); |
| | | } |
| | | goodsTotalChangeDtoList.add(goodsTotalChangeDto); |
| | | } |
| | | //更新商品统计 |
| | | // 更新商户统计信息 |
| | | ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto(); |
| | | shopTotalChangeDto.setShopId(order.getShopId()); |
| | | shopTotalChangeDto.setOrderType(1); |
| | | shopTotalChangeDto.setCycleMoney(cycleMoney); |
| | | shopTotalChangeDto.setServiceMoney(serviceMoney); |
| | | shopTotalChangeDto.setExperienceMoney(experienceMoney); |
| | | shopTotalChangeDto.setGoodsMoney(goodsMoney); |
| | | remoteShopService.changeShopTotal(shopTotalChangeDto); |
| | | // 初始化会员统计信息 |
| | | 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.getPayMoney()); |
| | | Integer integral = Integer.valueOf(integralBig.toString()); |
| | | memberTotalChangeDto.setChangeIntegral(integral); |
| | | memberTotalChangeDto.setTypeIntegral(1); |
| | | } |
| | | // 设置会员支付金额和支付时间 |
| | | 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); |
| | | } |
| | | // 更新会员统计信息 |
| | | 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()); |
| | | 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);*/ |
| | | } |
| | | //生成支付记录 |
| | | OrderPayment orderPayment = new OrderPayment(); |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * @description 订单退款 |
| | | * @author jqs |
| | | * @date 2023/7/13 18:36 |
| | | * @param orderId |
| | | * @return void |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | 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.getPayMoney()); |
| | | 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<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()); |
| | | 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; |
| | | } |
| | | } |
| | | //回退优惠券 |
| | | if(memberCouponSJ!=null){ |
| | | remoteCouponService.backMemberCoupon(memberCouponSJ.toString()); |
| | | } |
| | | } |
| | | // 更新商户统计信息 |
| | | ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto(); |
| | | shopTotalChangeDto.setOrderType(2); |
| | | shopTotalChangeDto.setShopId(order.getShopId()); |
| | | shopTotalChangeDto.setCycleMoney(cycleMoney); |
| | | shopTotalChangeDto.setServiceMoney(serviceMoney); |
| | | shopTotalChangeDto.setExperienceMoney(experienceMoney); |
| | | shopTotalChangeDto.setGoodsMoney(goodsMoney); |
| | | remoteShopService.changeShopTotal(shopTotalChangeDto); |
| | | // 初始化会员统计信息 |
| | | 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.getPayMoney()); |
| | | Integer integral = Integer.valueOf(integralBig.toString()); |
| | | memberTotalChangeDto.setChangeIntegral(integral); |
| | | memberTotalChangeDto.setTypeIntegral(2); |
| | | }*/ |
| | | // 设置会员支付金额和支付时间 |
| | | 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(1); |
| | | } else { |
| | | activityTotalChangeDto.setPersonNum(0); |
| | | } |
| | | activityTotalChangeDto.setUserId(order.getUserId()); |
| | | remoteActivityService.changeActivityTotal(activityTotalChangeDto); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description 员工端活动订单统计 |
| | | * @author jqs |
| | | * @date 2023/7/17 15:25 |
| | | * @param staffTotalDto |
| | | * @return StaffActivityOrderTotalVo |
| | | */ |
| | | @Override |
| | | public StaffActivityOrderTotalVo getStaffActivityOrderTotal(StaffTotalDto staffTotalDto){ |
| | | StaffActivityOrderTotalVo staffActivityOrderTotalVo = orderMapper.getStaffActivityOrderTotal(staffTotalDto); |
| | | return staffActivityOrderTotalVo; |
| | | } |
| | | |
| | | /** |
| | | * @description 员工端活动统计 |
| | | * @author jqs |
| | | * @date 2023/7/17 15:51 |
| | | * @param staffTotalDto |
| | | * @return StaffActivityTotalVo |
| | | */ |
| | | @Override |
| | | public StaffActivityTotalVo getStaffActivityTotal(StaffTotalDto staffTotalDto){ |
| | | StaffActivityTotalVo staffActivityTotalVo = orderMapper.getStaffActivityTotal(staffTotalDto); |
| | | return staffActivityTotalVo; |
| | | } |
| | | |
| | | /** |
| | | * @description 员工端活动统计订单分布 |
| | | * @author jqs |
| | | * @date 2023/7/17 16:16 |
| | | * @param staffTotalDto |
| | | * @return MerOrderDistributionTotalVo |
| | | */ |
| | | @Override |
| | | public MerOrderDistributionTotalVo getStaffOrderDistributionTotal(StaffTotalDto staffTotalDto){ |
| | | 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); |
| | | } |
| | | // 返回订单分布总数对象 |
| | | return orderDistributionTotalVo; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @description 员工端活动统计销售占比 |
| | | * @author jqs |
| | | * @date 2023/7/17 17:03 |
| | | * @param staffTotalDto |
| | | * @return MerOrderTypeTotalVo |
| | | */ |
| | | @Override |
| | | public MerOrderTypeTotalVo getStaffOrderTypeTotal(StaffTotalDto staffTotalDto){ |
| | | MerOrderTypeTotalVo orderTypeTotalVo = new MerOrderTypeTotalVo(); |
| | | //获取商品分类销售数据 |
| | | 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; |
| | | // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 |
| | | 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("周期"); |
| | | } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("2")) { |
| | | MgtMapIntTotalVo.setMapKey("服务"); |
| | | mgtMapBigTotalVo.setMapKey("服务"); |
| | | } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("3")) { |
| | | MgtMapIntTotalVo.setMapKey("体验"); |
| | | mgtMapBigTotalVo.setMapKey("体验"); |
| | | } else if (MgtMapIntTotalVoGoodsType.get(i).getMapKey().equals("4")) { |
| | | MgtMapIntTotalVo.setMapKey("单品"); |
| | | mgtMapBigTotalVo.setMapKey("单品"); |
| | | } |
| | | goodsTypeTotalList.add(MgtMapIntTotalVo); |
| | | goodsTypeMoneyList.add(mgtMapBigTotalVo); |
| | | } |
| | | orderTypeTotalVo.setGoodsTypeTotalList(goodsTypeTotalList); |
| | | orderTypeTotalVo.setGoodsTypeMoneyList(goodsTypeMoneyList); |
| | | } |
| | | return orderTypeTotalVo; |
| | | } |
| | | |
| | | /** |
| | | * @description 员工端获客人数 |
| | | * @author jqs |
| | | * @date 2023/7/17 18:42 |
| | | * @param staffTotalDto |
| | | * @return StaffActivityDateMemberTotalVo |
| | | */ |
| | | @Override |
| | | public StaffActivityDateMemberTotalVo getStaffActivityGetMemberTotal(StaffTotalDto staffTotalDto) { |
| | | // 创建返回对象 |
| | | StaffActivityDateMemberTotalVo staffActivityDateMemberTotalVo = new StaffActivityDateMemberTotalVo(); |
| | | // 查询数据库获取数据 |
| | | 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; |
| | | } |
| | | |
| | | /** |
| | | * @description 员工端获客人数 |
| | | * @author jqs |
| | | * @date 2023/7/17 18:42 |
| | | * @param staffTotalDto |
| | | * @return StaffActivityDateMemberTotalVo |
| | | */ |
| | | @Override |
| | | public StaffActivityDateMemberTotalVo getStaffActivityMemberTotal(StaffTotalDto staffTotalDto) { |
| | | // 创建返回对象 |
| | | StaffActivityDateMemberTotalVo staffActivityDateMemberTotalVo = new StaffActivityDateMemberTotalVo(); |
| | | // 查询数据库获取数据 |
| | | 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; |
| | | } |
| | | |
| | | /** |
| | | * @description 获取时间段日期 |
| | | * @author jqs |
| | | * @date 2023/7/17 19:11 |
| | | * @param startDate |
| | | * @param endDate |
| | | * @return List<String> |
| | | */ |
| | | 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; |
| | | } |
| | | |
| | | /** |
| | | * @description 检查订单状态定时任务 |
| | | * @author jqs |
| | | * @date 2023/7/25 14:40 |
| | | * @param |
| | | * @return void |
| | | */ |
| | | @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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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()); |
| | | 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()); |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |