diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/api/AccTradeApi.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/api/AccTradeApi.java index 12ae9f8e..2586783e 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/api/AccTradeApi.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/api/AccTradeApi.java @@ -1,14 +1,27 @@ package com.bonus.core.account.v3.api; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.bonus.core.account.v3.api.dto.AccRechargeSumApiDTO; import com.bonus.core.account.v3.api.vo.AccRechargeSumApiVO; +import com.bonus.core.account.v3.api.vo.AccTradeOrderBalanceVO; +import com.bonus.core.account.v3.api.vo.AccTradeOrderWalletPayVO; +import com.bonus.core.account.v3.model.AccTrade; +import com.bonus.core.account.v3.model.AccTradeWalletDetail; import com.bonus.core.account.v3.service.AccTradeService; +import com.bonus.core.account.v3.service.AccTradeWalletDetailService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Service public class AccTradeApi { @@ -16,8 +29,37 @@ public class AccTradeApi { @Resource @Lazy private AccTradeService accTradeService; + @Autowired + @Lazy + private AccTradeWalletDetailService accTradeWalletDetailService; + public AccRechargeSumApiVO getAccRechargeSum(AccRechargeSumApiDTO accRechargeSumApiDTO) { return this.accTradeService.getAccRechargeSum(accRechargeSumApiDTO); } + + public Map listOrderAccPayDetail(List leOrdNos) { + //List accTradeList = this.accTradeService.list((Wrapper) Wrappers.lambdaQuery(AccTrade.class) + // .select(new SFunction[]{AccTrade::getId, AccTrade::getLeOrdNo, AccTrade::getWalletBalTotal}) + // .in(AccTrade::getLeOrdNo, leOrdNos)); + List accTradeList = this.accTradeService.list(Wrappers.lambdaQuery(AccTrade.class) + .select(AccTrade::getId, AccTrade::getLeOrdNo, AccTrade::getWalletBalTotal) + .in(AccTrade::getLeOrdNo, leOrdNos)); + if (CollUtil.isEmpty(accTradeList)) { + return MapUtil.empty(); + } else { + Map> leOrdNo_accTrade = (Map)accTradeList.stream().collect(Collectors.groupingBy(AccTrade::getLeOrdNo)); + Map> accTradeId_walletDetail = this.accTradeWalletDetailService.queryAccTradeWalletDetailByTradeIdList(accTradeList.stream().map(AccTrade::getId).collect(Collectors.toList())); + Map resultMap = MapUtil.newHashMap(); + leOrdNo_accTrade.keySet().forEach((leOrdNo) -> { + AccTrade accTrade = (AccTrade)((List)leOrdNo_accTrade.get(leOrdNo)).get(0); + List walletPayVOList = accTradeId_walletDetail.get(accTrade.getId()).stream().map((item) -> { + return (new AccTradeOrderWalletPayVO()).setWalletId(item.getWalletId()).setAmount(item.getAmount()).setWalletBal(item.getWalletBal()); + }).collect(Collectors.toList()); + resultMap.put(leOrdNo, (new AccTradeOrderBalanceVO()).setAccTradeId(accTrade.getId()).setLeOrdNo(accTrade.getLeOrdNo()).setWalletBalTotal(accTrade.getWalletBalTotal()).setWalletPayDetail(walletPayVOList)); + }); + return resultMap; + } + } + } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeWalletDetailMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeWalletDetailMapper.java index 97e31b71..6819d766 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeWalletDetailMapper.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeWalletDetailMapper.java @@ -27,5 +27,5 @@ public interface AccTradeWalletDetailMapper extends BaseMapper queryAccTradeOrderDetailByLeOrderNo(@Param("leOrderNo") Long leOrderNo, @Param("leOrderNoList") List leOrderNoList); - + List queryAccTradeWalletDetailByTradeIdList(@Param("tradeIdList") List tradeIdList); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeWalletDetailService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeWalletDetailService.java index 7a78d742..927acff5 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeWalletDetailService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeWalletDetailService.java @@ -9,6 +9,7 @@ import com.bonus.core.account.v3.web.vo.AccOrdTradeVO; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; public interface AccTradeWalletDetailService { @@ -29,4 +30,6 @@ public interface AccTradeWalletDetailService { List queryAccTradeWalletDetailByOriginTradeId(Long originTradeId, Integer tradeType); AccOrdTradeVO queryAccTradeOrderDetailByLeOrderNo(Long leOrderNo); + + Map> queryAccTradeWalletDetailByTradeIdList(List tradeIdList); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeWalletDetailServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeWalletDetailServiceImpl.java index e245c47f..81782965 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeWalletDetailServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeWalletDetailServiceImpl.java @@ -17,6 +17,7 @@ import com.bonus.core.account.v3.service.AccTradeWalletDetailService; import com.bonus.core.account.v3.web.vo.AccOrdTradeVO; import com.bonus.core.account.v3.po.AccWalletPayPO; import com.bonus.i18n.I18n; +import com.google.common.collect.Maps; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -111,4 +112,9 @@ public class AccTradeWalletDetailServiceImpl extends ServiceImpl> queryAccTradeWalletDetailByTradeIdList(List tradeIdList) { + List list = ((AccTradeWalletDetailMapper)this.baseMapper).queryAccTradeWalletDetailByTradeIdList(tradeIdList); + return (Map)(ObjectUtil.isEmpty(list) ? Maps.newHashMap() : (Map)list.stream().collect(Collectors.groupingBy(AccTradeWalletDetail::getTradeId))); + } + } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/android/business/OrderDishesAndroidBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/android/business/OrderDishesAndroidBusiness.java new file mode 100644 index 00000000..caaa12b5 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/android/business/OrderDishesAndroidBusiness.java @@ -0,0 +1,11 @@ +package com.bonus.core.order.android.business; + +import com.bonus.core.order.common.model.OrderInfo; +import java.time.LocalDate; +import java.util.List; + +public interface OrderDishesAndroidBusiness { + + void initOrderMealCode(OrderInfo orderInfo); + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/android/business/impl/OrderDishesAndroidBusinessImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/android/business/impl/OrderDishesAndroidBusinessImpl.java new file mode 100644 index 00000000..e53f2776 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/android/business/impl/OrderDishesAndroidBusinessImpl.java @@ -0,0 +1,79 @@ +package com.bonus.core.order.android.business.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ObjectUtil; +import com.bonus.core.allocation.api.AllocStallApi; +import com.bonus.core.allocation.canteen.model.AllocStall; +import com.bonus.core.customer.constants.OrderTypeEnum; +import com.bonus.core.order.android.business.OrderDishesAndroidBusiness; +import com.bonus.core.order.common.model.OrderInfo; +import com.bonus.core.order.custom.OrderCustomBusiness; +import com.bonus.core.order.utils.LeNumUtil; +import com.bonus.core.supermarket.api.SupermarketApi; +import com.bonus.core.supermarket.model.SupermarketInfo; +import org.redisson.api.RLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class OrderDishesAndroidBusinessImpl implements OrderDishesAndroidBusiness { + private static final Logger log = LoggerFactory.getLogger(OrderDishesAndroidBusinessImpl.class); + + @Autowired + @Lazy + protected OrderCustomBusiness orderCustomBusiness; + + @Autowired + @Lazy + protected AllocStallApi allocStallApi; + @Autowired + @Lazy + protected SupermarketApi supermarketApi; + @Lazy + @Autowired + protected LeNumUtil numUtil; + + public void initOrderMealCode(OrderInfo orderInfo) { + if (!CharSequenceUtil.isNotEmpty(orderInfo.getMealCode())) { + String mealCode = this.createMealCode(orderInfo.getOrderType(), orderInfo.getCanteenId(), orderInfo.getStallId(), orderInfo.getOrderDate(), orderInfo.getMealtimeType()); + orderInfo.setMealCode(mealCode); + } + } + + public String createMealCode(Integer orderType, Long canteenId, Long stallId, LocalDate orderDate, Integer mealtimeType) { + String mealCode = this.orderCustomBusiness.android().willCreateOrderMealCode(canteenId, stallId, orderDate, mealtimeType); + if (CharSequenceUtil.isNotEmpty(mealCode)) { + return this.orderCustomBusiness.android().didCreateOrderMealCode(canteenId, stallId, orderDate, mealtimeType, mealCode); + } else { + String prefix = null; + if (OrderTypeEnum.isShopCategory(orderType)) { + SupermarketInfo supermarketInfoById = this.supermarketApi.getSupermarketInfoById(canteenId); + prefix = supermarketInfoById != null ? supermarketInfoById.getMealCode() : ""; + } else if (OrderTypeEnum.isCanteenCategory(orderType) && LeNumUtil.isValidId(stallId)) { + AllocStall allocStall = this.allocStallApi.getAllocStall(stallId); + if (allocStall != null) { + prefix = OrderTypeEnum.isAndroidCategory(orderType) ? allocStall.getOffLineMealCodePrefix() : allocStall.getOnLineMealCodePrefix(); + } + } + + mealCode = this.numUtil.getMealCode(prefix, canteenId, stallId, orderDate, mealtimeType); + log.info("创建叫号码:{}", mealCode); + return this.orderCustomBusiness.android().didCreateOrderMealCode(canteenId, stallId, orderDate, mealtimeType, mealCode); + } + } + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/OrderPlaceBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/OrderPlaceBusiness.java index b3d80a2c..cc653426 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/OrderPlaceBusiness.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/OrderPlaceBusiness.java @@ -2,14 +2,13 @@ package com.bonus.core.order.common.business; import com.bonus.core.marketing.coupon.model.MktCouponPayModel; import com.bonus.core.menu.model.AllocMealtimeModel; -import com.bonus.core.order.common.model.OrderAmountChange; -import com.bonus.core.order.common.model.OrderDelivery; -import com.bonus.core.order.common.model.OrderDetail; -import com.bonus.core.order.common.model.OrderInfo; +import com.bonus.core.order.common.dto.OrderDidPayInfoDTO; +import com.bonus.core.order.common.model.*; import com.bonus.core.order.common.vo.OrderDeliveryResultVO; import com.bonus.core.order.mq.po.OrderSavePO; import com.bonus.core.pay.api.dto.UnifyPayDTO; import com.bonus.core.pay.api.vo.UnifyPayVO; +import com.bonus.core.pay.common.vo.TradeChannelVO; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -64,9 +63,9 @@ public interface OrderPlaceBusiness { // // List removeDetailDishes(List orderDetailList, List removeList); // -// List calcOrderRealAmount(List orderInfoList, List orderDetailList, List orderAmountChangeList, BigDecimal payAmount, List channelDetailList); -// -// void updateOrderFieldAfterPay(OrderInfo orderInfo, OrderDidPayInfoDTO didPayInfoDTO); + List calcOrderRealAmount(List orderInfoList, List orderDetailList, List orderAmountChangeList, BigDecimal payAmount, List channelDetailList); + + void updateOrderFieldAfterPay(OrderInfo orderInfo, OrderDidPayInfoDTO didPayInfoDTO); // // boolean ifUseCall(OrderInfo orderInfo); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/OrderResultBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/OrderResultBusiness.java index fd5a2a3b..d781a681 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/OrderResultBusiness.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/OrderResultBusiness.java @@ -3,12 +3,13 @@ package com.bonus.core.order.common.business; import com.bonus.core.order.common.model.OrderDetail; import com.bonus.core.order.common.model.OrderInfo; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; import java.util.List; public interface OrderResultBusiness { -// UnifyPaySelectVO reSyncOrderPayResult(Long orderId); -// + UnifyPaySelectVO reSyncOrderPayResult(Long orderId); + // UnifyRefundSelectVO reSyncOrderRefundResult(Long orderRefundId); // // String asyncPayResultHandler(PayResultPO payResultPO); diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/impl/OrderPlaceBusinessImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/impl/OrderPlaceBusinessImpl.java index 5a541c43..44517bb8 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/impl/OrderPlaceBusinessImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/impl/OrderPlaceBusinessImpl.java @@ -1,6 +1,5 @@ package com.bonus.core.order.common.business.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.text.CharSequenceUtil; @@ -8,8 +7,13 @@ import cn.hutool.core.util.NumberUtil; import com.bonus.common.core.exception.ServiceException; import com.bonus.constant.LeConstants; import com.bonus.constant.RetCodeEnum; +import com.bonus.constant.SourceTypeEnum; +import com.bonus.core.account.v3.api.AccTradeApi; +import com.bonus.core.account.v3.api.vo.AccTradeOrderBalanceVO; +import com.bonus.core.allocation.api.AllocStallApi; import com.bonus.core.allocation.canteen.dto.AllocCanteenDeliveryDTO; import com.bonus.core.allocation.canteen.dto.AllocCanteenDeliveryModel; +import com.bonus.core.allocation.canteen.model.AllocStall; import com.bonus.core.common.enums.DeliveryTypeEnum; import com.bonus.core.common.enums.MetadataModelTypeEnum; import com.bonus.core.common.redis.RedisUtil; @@ -30,6 +34,7 @@ import com.bonus.core.menu.api.MenuRecipeApi; import com.bonus.core.menu.dto.MenuRecipeChangeSurplusNum; import com.bonus.core.menu.dto.OrderRecipeDishesDto; import com.bonus.core.menu.model.AllocMealtimeModel; +import com.bonus.core.order.android.business.OrderDishesAndroidBusiness; import com.bonus.core.order.client.OrderModuleClient; import com.bonus.core.order.client.po.MealtimeCheckNowParam; import com.bonus.core.order.client.po.MealtimeQueryParam; @@ -37,22 +42,24 @@ import com.bonus.core.order.client.po.MetaDataValueParam; import com.bonus.core.order.client.po.OrderConfigQueryParam; import com.bonus.core.order.common.business.OrderPlaceBusiness; import com.bonus.core.order.common.constants.*; -import com.bonus.core.order.common.model.OrderAmountChange; -import com.bonus.core.order.common.model.OrderDelivery; -import com.bonus.core.order.common.model.OrderDetail; -import com.bonus.core.order.common.model.OrderInfo; +import com.bonus.core.order.common.dto.OrderDidPayInfoDTO; +import com.bonus.core.order.common.model.*; import com.bonus.core.order.common.service.*; import com.bonus.core.order.common.vo.OrderDeliveryResultVO; import com.bonus.core.order.custom.OrderCustomBusiness; import com.bonus.core.order.mq.po.OrderSavePO; import com.bonus.core.order.utils.LeNumUtil; +import com.bonus.core.order.utils.LeOrderUtil; import com.bonus.core.pay.api.PayApi; import com.bonus.core.pay.api.dto.UnifyPayDTO; import com.bonus.core.pay.api.vo.UnifyPayVO; +import com.bonus.core.pay.channel.account.vo.AccPayResultVO; import com.bonus.core.pay.common.constants.PayChannelEnum; import com.bonus.core.pay.common.constants.PayChannelSelectEnum; +import com.bonus.core.pay.common.constants.PayStateEnum; import com.bonus.core.pay.common.constants.PayTypeEnum; import com.bonus.core.pay.common.vo.PayChannelSplitVO; +import com.bonus.core.pay.common.vo.TradeChannelVO; import com.bonus.core.supermarket.api.SupermarketApi; import com.bonus.core.supermarket.dto.SmtCheckProductLimitBuyDTO; import com.bonus.core.supermarket.dto.SmtCheckProductLimitBuyDetailDTO; @@ -84,9 +91,9 @@ public class OrderPlaceBusinessImpl implements OrderPlaceBusiness { @Autowired @Lazy protected OrderCustomBusiness orderCustomBusiness; -// @Autowired -// @Lazy -// protected OrderDishesAndroidBusiness orderDishesAndroidBusiness; + @Autowired + @Lazy + protected OrderDishesAndroidBusiness orderDishesAndroidBusiness; @Autowired @Lazy protected OrderInfoService orderInfoService; @@ -132,12 +139,12 @@ public class OrderPlaceBusinessImpl implements OrderPlaceBusiness { // @Autowired // @Lazy // protected DeviceApi deviceApi; -// @Autowired -// @Lazy -// protected AllocStallApi allocStallApi; -// @Autowired -// @Lazy -// protected AccTradeApi accTradeApi; + @Autowired + @Lazy + protected AllocStallApi allocStallApi; + @Autowired + @Lazy + protected AccTradeApi accTradeApi; public void checkOrderSubmitted(String repeatedId) { if (!CharSequenceUtil.isEmpty(repeatedId)) { @@ -863,133 +870,133 @@ public class OrderPlaceBusinessImpl implements OrderPlaceBusiness { return this.orderCustomBusiness.place().didFillOrderDeliveryAmountV2(orderInfoList, orderDetailList, orderDeliveryList, resultVO); } } -// -// public List calcOrderRealAmount(List orderInfoList, List orderDetailList, List orderAmountChangeList, BigDecimal payAmount, List channelDetailList) { -// List orderAmountDetailList = CollUtil.newArrayList(new OrderAmountDetail[0]); -// if (!this.orderCustomBusiness.place().willCalcOrderRealAmount(orderInfoList, orderDetailList, payAmount, channelDetailList, orderAmountDetailList)) { -// this.orderCustomBusiness.place().didCalcOrderRealAmount(orderInfoList, orderDetailList, payAmount, channelDetailList, orderAmountDetailList); -// return orderAmountDetailList; -// } else { -// LeOrderUtil.calcOrderAmount(orderInfoList, payAmount, OrderInfo::setRealAmount); -// this.fillAccChannelPayDetailIfNecessary(channelDetailList); -// Iterator var7 = channelDetailList.iterator(); -// -// while(var7.hasNext()) { -// TradeChannelVO tradeChannelVO = (TradeChannelVO)var7.next(); -// if (PayStateEnum.isPaidState(tradeChannelVO.getTradeState())) { -// LeOrderUtil.calcOrderAmount(orderInfoList, tradeChannelVO.getAmount(), (orderInfox, amount) -> { -// orderAmountDetailList.add(tradeChannelVO.convertToOrderAmountDetail(orderInfox.getOrderId(), orderInfox.getOrderDate(), (Long)null, amount, OrderAmountDetailTypeEnum.PAY)); -// if (PayChannelEnum.ACC.getKey().equals(tradeChannelVO.getPayChannel())) { -// orderInfox.setAccPayAmount(amount); -// } else if (PayChannelEnum.COUPON.getKey().equals(tradeChannelVO.getPayChannel())) { -// orderInfox.setCouponAmount(amount); -// } else { -// orderInfox.setOutPayAmount(amount); -// } -// -// }); -// tradeChannelVO.shareAccPayResult(orderAmountDetailList); -// if (PayChannelEnum.COUPON.getKey().equals(tradeChannelVO.getPayChannel())) { -// String couponId = tradeChannelVO.getParam() != null ? tradeChannelVO.getParam().path("couponId").asText() : ""; -// if (CharSequenceUtil.isNotEmpty(couponId)) { -// orderInfoList.forEach((s) -> { -// s.setCouponId(couponId); -// }); -// } -// } -// } -// } -// -// var7 = orderInfoList.iterator(); -// -// while(var7.hasNext()) { -// OrderInfo orderInfo = (OrderInfo)var7.next(); -// BigDecimal detailRealAmount = orderInfo.getRealAmount(); -// if (CollUtil.isNotEmpty(orderAmountChangeList)) { -// BigDecimal additionalFee = (BigDecimal)orderAmountChangeList.stream().filter((s) -> { -// return s.getOrderId().equals(orderInfo.getOrderId()) && ChangeDetailTypeEnum.ifAdditionalFee(s.getChangeDetailType()); -// }).map((s) -> { -// return NumberUtil.null2Zero(s.getChangeAmount()).abs(); -// }).reduce(BigDecimal.ZERO, BigDecimal::add); -// detailRealAmount = detailRealAmount.subtract(additionalFee); -// } -// -// if (detailRealAmount.compareTo(BigDecimal.ZERO) < 0) { -// detailRealAmount = BigDecimal.ZERO; -// } -// -// List detailList = (List)orderDetailList.stream().filter((s) -> { -// return s.getOrderId().equals(orderInfo.getOrderId()); -// }).collect(Collectors.toList()); -// LeNumUtil.calcShareAmount(detailList, detailRealAmount, OrderDetail::getCalcTotalAmount, OrderDetail::setRealAmount); -// } -// -// this.orderCustomBusiness.place().didCalcOrderRealAmount(orderInfoList, orderDetailList, payAmount, channelDetailList, orderAmountDetailList); -// return orderAmountDetailList; -// } -// } -// -// public void updateOrderFieldAfterPay(OrderInfo orderInfo, OrderDidPayInfoDTO didPayInfoDTO) { -// orderInfo.setPayState(didPayInfoDTO.getPayState()); -// orderInfo.setPayTime(didPayInfoDTO.getPayTime() != null ? didPayInfoDTO.getPayTime() : LocalDateTime.now()); -// orderInfo.setPayType(didPayInfoDTO.getPayType()); -// orderInfo.setPayChannel(didPayInfoDTO.getPayChannel()); -// this.orderDishesAndroidBusiness.initOrderMealCode(orderInfo); -// boolean callFlag = this.ifUseCall(orderInfo); -// OrderStateEnum orderStateEnum = OrderStateEnum.PLACE; -// DishesStateEnum dishesStateEnum = DishesStateEnum.UN_MAKE; -// if (OrderTypeEnum.isAndroidType(orderInfo.getOrderType())) { -// if (this.ifMealtimeAfterCurrent(orderInfo)) { -// log.info("[当餐点餐下单] 当前餐次之后的订单"); -// } else if (callFlag) { -// dishesStateEnum = DishesStateEnum.MAKING; -// } else if (DeliveryTypeEnum.isNeedDeliveryType(orderInfo.getDeliveryType())) { -// dishesStateEnum = DishesStateEnum.WAIT_DELIVERY; -// } else { -// dishesStateEnum = DishesStateEnum.ALREADY_TAKE; -// orderStateEnum = OrderStateEnum.FINISH; -// } -// } else if (OrderTypeEnum.isCurrMealType(orderInfo.getOrderType())) { -// if (callFlag) { -// dishesStateEnum = DishesStateEnum.MAKING; -// } else if (DeliveryTypeEnum.isNeedDeliveryType(orderInfo.getDeliveryType())) { -// dishesStateEnum = DishesStateEnum.WAIT_DELIVERY; -// } else { -// dishesStateEnum = DishesStateEnum.WAIT_TAKE; -// } -// } else if (OrderTypeEnum.isShopType(orderInfo.getOrderType())) { -// if (SourceTypeEnum.getAppTypeList().contains(orderInfo.getSourceType())) { -// dishesStateEnum = DishesStateEnum.WAIT_TAKE; -// } else { -// orderStateEnum = OrderStateEnum.FINISH; -// dishesStateEnum = DishesStateEnum.ALREADY_TAKE; -// } -// } else if (OrderTypeEnum.isBuffetType(orderInfo.getOrderType()) || OrderTypeEnum.isRoomCategory(orderInfo.getOrderType()) || OrderTypeEnum.isMobileScanCategory(orderInfo.getOrderType())) { -// orderStateEnum = OrderStateEnum.FINISH; -// dishesStateEnum = DishesStateEnum.ALREADY_TAKE; -// } -// -// if (!OrderStateEnum.isFinishState(orderInfo.getOrderState())) { -// orderInfo.setOrderState(orderStateEnum.getKey()); -// orderInfo.setDishesState(dishesStateEnum.getKey()); -// } -// -// this.orderCustomBusiness.place().didUpdateOrderFieldAfterPay(orderInfo, didPayInfoDTO); -// } -// -// public boolean ifUseCall(OrderInfo orderInfo) { -// if (LocalDate.now().isAfter(orderInfo.getOrderDate())) { -// log.warn("[叫号] 今天之前的订单不叫号"); -// } else if ((OrderTypeEnum.isAndroidType(orderInfo.getOrderType()) || OrderTypeEnum.isCurrMealType(orderInfo.getOrderType())) && LeNumUtil.isValidId(orderInfo.getStallId())) { -// AllocStall allocStall = this.allocStallApi.getAllocStall(orderInfo.getStallId()); -// if (allocStall != null && LeConstants.COMMON_YES.equals(allocStall.getIfUseCallNum())) { -// log.info("[当餐点餐下单] 开启叫号"); -// return true; -// } -// } -// -// return false; -// } + + public List calcOrderRealAmount(List orderInfoList, List orderDetailList, List orderAmountChangeList, BigDecimal payAmount, List channelDetailList) { + List orderAmountDetailList = CollUtil.newArrayList(new OrderAmountDetail[0]); + if (!this.orderCustomBusiness.place().willCalcOrderRealAmount(orderInfoList, orderDetailList, payAmount, channelDetailList, orderAmountDetailList)) { + this.orderCustomBusiness.place().didCalcOrderRealAmount(orderInfoList, orderDetailList, payAmount, channelDetailList, orderAmountDetailList); + return orderAmountDetailList; + } else { + LeOrderUtil.calcOrderAmount(orderInfoList, payAmount, OrderInfo::setRealAmount); + this.fillAccChannelPayDetailIfNecessary(channelDetailList); + Iterator var7 = channelDetailList.iterator(); + + while(var7.hasNext()) { + TradeChannelVO tradeChannelVO = (TradeChannelVO)var7.next(); + if (PayStateEnum.isPaidState(tradeChannelVO.getTradeState())) { + LeOrderUtil.calcOrderAmount(orderInfoList, tradeChannelVO.getAmount(), (orderInfox, amount) -> { + orderAmountDetailList.add(tradeChannelVO.convertToOrderAmountDetail(orderInfox.getOrderId(), orderInfox.getOrderDate(), (Long)null, amount, OrderAmountDetailTypeEnum.PAY)); + if (PayChannelEnum.ACC.getKey().equals(tradeChannelVO.getPayChannel())) { + orderInfox.setAccPayAmount(amount); + } else if (PayChannelEnum.COUPON.getKey().equals(tradeChannelVO.getPayChannel())) { + orderInfox.setCouponAmount(amount); + } else { + orderInfox.setOutPayAmount(amount); + } + + }); + tradeChannelVO.shareAccPayResult(orderAmountDetailList); + if (PayChannelEnum.COUPON.getKey().equals(tradeChannelVO.getPayChannel())) { + String couponId = tradeChannelVO.getParam() != null ? tradeChannelVO.getParam().path("couponId").asText() : ""; + if (CharSequenceUtil.isNotEmpty(couponId)) { + orderInfoList.forEach((s) -> { + s.setCouponId(couponId); + }); + } + } + } + } + + var7 = orderInfoList.iterator(); + + while(var7.hasNext()) { + OrderInfo orderInfo = (OrderInfo)var7.next(); + BigDecimal detailRealAmount = orderInfo.getRealAmount(); + if (CollUtil.isNotEmpty(orderAmountChangeList)) { + BigDecimal additionalFee = (BigDecimal)orderAmountChangeList.stream().filter((s) -> { + return s.getOrderId().equals(orderInfo.getOrderId()) && ChangeDetailTypeEnum.ifAdditionalFee(s.getChangeDetailType()); + }).map((s) -> { + return NumberUtil.null2Zero(s.getChangeAmount()).abs(); + }).reduce(BigDecimal.ZERO, BigDecimal::add); + detailRealAmount = detailRealAmount.subtract(additionalFee); + } + + if (detailRealAmount.compareTo(BigDecimal.ZERO) < 0) { + detailRealAmount = BigDecimal.ZERO; + } + + List detailList = (List)orderDetailList.stream().filter((s) -> { + return s.getOrderId().equals(orderInfo.getOrderId()); + }).collect(Collectors.toList()); + LeNumUtil.calcShareAmount(detailList, detailRealAmount, OrderDetail::getCalcTotalAmount, OrderDetail::setRealAmount); + } + + this.orderCustomBusiness.place().didCalcOrderRealAmount(orderInfoList, orderDetailList, payAmount, channelDetailList, orderAmountDetailList); + return orderAmountDetailList; + } + } + + public void updateOrderFieldAfterPay(OrderInfo orderInfo, OrderDidPayInfoDTO didPayInfoDTO) { + orderInfo.setPayState(didPayInfoDTO.getPayState()); + orderInfo.setPayTime(didPayInfoDTO.getPayTime() != null ? didPayInfoDTO.getPayTime() : LocalDateTime.now()); + orderInfo.setPayType(didPayInfoDTO.getPayType()); + orderInfo.setPayChannel(didPayInfoDTO.getPayChannel()); + this.orderDishesAndroidBusiness.initOrderMealCode(orderInfo); + boolean callFlag = this.ifUseCall(orderInfo); + OrderStateEnum orderStateEnum = OrderStateEnum.PLACE; + DishesStateEnum dishesStateEnum = DishesStateEnum.UN_MAKE; + if (OrderTypeEnum.isAndroidType(orderInfo.getOrderType())) { + if (this.ifMealtimeAfterCurrent(orderInfo)) { + log.info("[当餐点餐下单] 当前餐次之后的订单"); + } else if (callFlag) { + dishesStateEnum = DishesStateEnum.MAKING; + } else if (DeliveryTypeEnum.isNeedDeliveryType(orderInfo.getDeliveryType())) { + dishesStateEnum = DishesStateEnum.WAIT_DELIVERY; + } else { + dishesStateEnum = DishesStateEnum.ALREADY_TAKE; + orderStateEnum = OrderStateEnum.FINISH; + } + } else if (OrderTypeEnum.isCurrMealType(orderInfo.getOrderType())) { + if (callFlag) { + dishesStateEnum = DishesStateEnum.MAKING; + } else if (DeliveryTypeEnum.isNeedDeliveryType(orderInfo.getDeliveryType())) { + dishesStateEnum = DishesStateEnum.WAIT_DELIVERY; + } else { + dishesStateEnum = DishesStateEnum.WAIT_TAKE; + } + } else if (OrderTypeEnum.isShopType(orderInfo.getOrderType())) { + if (SourceTypeEnum.getAppTypeList().contains(orderInfo.getSourceType())) { + dishesStateEnum = DishesStateEnum.WAIT_TAKE; + } else { + orderStateEnum = OrderStateEnum.FINISH; + dishesStateEnum = DishesStateEnum.ALREADY_TAKE; + } + } else if (OrderTypeEnum.isBuffetType(orderInfo.getOrderType()) || OrderTypeEnum.isRoomCategory(orderInfo.getOrderType()) || OrderTypeEnum.isMobileScanCategory(orderInfo.getOrderType())) { + orderStateEnum = OrderStateEnum.FINISH; + dishesStateEnum = DishesStateEnum.ALREADY_TAKE; + } + + if (!OrderStateEnum.isFinishState(orderInfo.getOrderState())) { + orderInfo.setOrderState(orderStateEnum.getKey()); + orderInfo.setDishesState(dishesStateEnum.getKey()); + } + + this.orderCustomBusiness.place().didUpdateOrderFieldAfterPay(orderInfo, didPayInfoDTO); + } + + public boolean ifUseCall(OrderInfo orderInfo) { + if (LocalDate.now().isAfter(orderInfo.getOrderDate())) { + log.warn("[叫号] 今天之前的订单不叫号"); + } else if ((OrderTypeEnum.isAndroidType(orderInfo.getOrderType()) || OrderTypeEnum.isCurrMealType(orderInfo.getOrderType())) && LeNumUtil.isValidId(orderInfo.getStallId())) { + AllocStall allocStall = this.allocStallApi.getAllocStall(orderInfo.getStallId()); + if (allocStall != null && LeConstants.COMMON_YES.equals(allocStall.getIfUseCallNum())) { + log.info("[当餐点餐下单] 开启叫号"); + return true; + } + } + + return false; + } protected void calcOrderAndDetailTotalAmount(OrderInfo orderInfo, List orderDetailList) { boolean usePrefPrice = !OrderTypeEnum.isShopCategory(orderInfo.getOrderType()) || this.supermarketApi.ifSupermarketMember(orderInfo.getCustId(), orderInfo.getCanteenId()); @@ -1002,18 +1009,17 @@ public class OrderPlaceBusinessImpl implements OrderPlaceBusiness { orderInfo.setPayableAmount((BigDecimal)orderDetailList.stream().map(OrderDetail::getTotalAmount).reduce(BigDecimal.ZERO, BigDecimal::add)); } -// -// protected void fillAccChannelPayDetailIfNecessary(List channelDetailList) { -// List lacksAccPayDetailChannelIds = (List)channelDetailList.stream().filter(TradeChannelVO::ifLacksAccPayDetail).map(TradeChannelVO::getTradeChannelId).collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(lacksAccPayDetailChannelIds)) { -// Map accPayDetailMap = this.accTradeApi.listOrderAccPayDetail(lacksAccPayDetailChannelIds); -// channelDetailList.stream().filter(TradeChannelVO::ifLacksAccPayDetail).forEach((s) -> { -// s.setAccPayResultVO(AccPayResultVO.of((AccTradeOrderBalanceVO)accPayDetailMap.get(s.getTradeChannelId()))); -// }); -// } -// -// } -// + + protected void fillAccChannelPayDetailIfNecessary(List channelDetailList) { + List lacksAccPayDetailChannelIds = (List)channelDetailList.stream().filter(TradeChannelVO::ifLacksAccPayDetail).map(TradeChannelVO::getTradeChannelId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(lacksAccPayDetailChannelIds)) { + Map accPayDetailMap = this.accTradeApi.listOrderAccPayDetail(lacksAccPayDetailChannelIds); + channelDetailList.stream().filter(TradeChannelVO::ifLacksAccPayDetail).forEach((s) -> { + s.setAccPayResultVO(AccPayResultVO.of((AccTradeOrderBalanceVO)accPayDetailMap.get(s.getTradeChannelId()))); + }); + } + } + // protected OrderAmountChange packageOrderAmountChange(Long orderId, LocalDate orderDate, BigDecimal changeAmount, ChangeDetailTypeEnum changeDetailType) { // return this.packageOrderAmountChange(orderId, orderDate, changeAmount, changeDetailType, (String)null); // } @@ -1041,15 +1047,15 @@ public class OrderPlaceBusinessImpl implements OrderPlaceBusiness { rulePriceDTO.setPayChannel(((OrderInfo)orderInfoList.get(0)).getPayChannel()); return rulePriceDTO; } -// -// protected boolean ifMealtimeAfterCurrent(OrderInfo orderInfo) { -// if (orderInfo.getOrderDate().isBefore(LocalDate.now())) { -// return false; -// } else if (orderInfo.getOrderDate().isAfter(LocalDate.now())) { -// return true; -// } else { -// AllocMealtimeModel currentMealtime = this.orderModuleClient.mealtimeQuery(MealtimeQueryParam.ofAssignTime(orderInfo.getOrderTime().toLocalTime(), orderInfo.getCanteenId(), orderInfo.getStallId())); -// return currentMealtime != null && currentMealtime.getMealtimeType().compareTo(orderInfo.getMealtimeType()) < 0; -// } -// } + + protected boolean ifMealtimeAfterCurrent(OrderInfo orderInfo) { + if (orderInfo.getOrderDate().isBefore(LocalDate.now())) { + return false; + } else if (orderInfo.getOrderDate().isAfter(LocalDate.now())) { + return true; + } else { + AllocMealtimeModel currentMealtime = this.orderModuleClient.mealtimeQuery(MealtimeQueryParam.ofAssignTime(orderInfo.getOrderTime().toLocalTime(), orderInfo.getCanteenId(), orderInfo.getStallId())); + return currentMealtime != null && currentMealtime.getMealtimeType().compareTo(orderInfo.getMealtimeType()) < 0; + } + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/impl/OrderResultBusinessImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/impl/OrderResultBusinessImpl.java index 1a6158f3..1afca1a1 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/impl/OrderResultBusinessImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/business/impl/OrderResultBusinessImpl.java @@ -7,13 +7,29 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.bonus.constant.LeConstants; +import com.bonus.core.common.utils.LogUtil; import com.bonus.core.marketing.v2.api.MarketApi; import com.bonus.core.order.common.business.OrderPlaceBusiness; import com.bonus.core.order.common.business.OrderResultBusiness; -import com.bonus.core.order.common.model.OrderDetail; -import com.bonus.core.order.common.model.OrderInfo; +import com.bonus.core.order.common.dto.OrderDidPayInfoDTO; +import com.bonus.core.order.common.model.*; +import com.bonus.core.order.common.service.OrderAmountChangeService; +import com.bonus.core.order.common.service.OrderDeliveryService; +import com.bonus.core.order.common.service.OrderDetailService; import com.bonus.core.order.common.service.OrderInfoService; import com.bonus.core.order.custom.OrderCustomBusiness; +import com.bonus.core.order.mq.OrderMessageSend; +import com.bonus.core.order.mq.po.OrderSavePO; +import com.bonus.core.order.repair.service.OrderRepairService; +import com.bonus.core.pay.api.PayApi; +import com.bonus.core.pay.api.TradeRecordApi; +import com.bonus.core.pay.api.dto.UnifyPaySelectDTO; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; +import com.bonus.core.pay.api.vo.UnifyPayVO; +import com.bonus.core.pay.common.constants.PayStateEnum; +import com.bonus.core.pay.common.model.TradeOrderRecharge; +import com.bonus.core.pay.common.model.TradeRecord; +import com.bonus.core.pay.common.po.PayResultPO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -48,36 +64,36 @@ public class OrderResultBusinessImpl implements OrderResultBusiness { @Autowired @Lazy protected OrderInfoService orderInfoService; -// @Autowired -// @Lazy -// protected OrderDetailService orderDetailService; + @Autowired + @Lazy + protected OrderDetailService orderDetailService; // @Autowired // @Lazy // protected OrderRefundDetailService orderRefundDetailService; -// @Autowired -// @Lazy -// protected OrderAmountChangeService orderAmountChangeService; + @Autowired + @Lazy + protected OrderAmountChangeService orderAmountChangeService; // @Autowired // @Lazy // protected OrderAmountDetailService orderAmountDetailService; -// @Autowired -// @Lazy -// protected OrderDeliveryService orderDeliveryService; + @Autowired + @Lazy + protected OrderDeliveryService orderDeliveryService; // @Autowired // @Lazy // protected MacWeighBindService macWeighBindService; // @Autowired // @Lazy // protected OrderRefundService orderRefundService; -// @Autowired -// @Lazy -// protected OrderRepairService orderRepairService; -// @Autowired -// @Lazy -// protected PayApi payApi; -// @Autowired -// @Lazy -// protected TradeRecordApi tradeRecordApi; + @Autowired + @Lazy + protected OrderRepairService orderRepairService; + @Autowired + @Lazy + protected PayApi payApi; + @Autowired + @Lazy + protected TradeRecordApi tradeRecordApi; // @Autowired // @Lazy // protected MktCouponApi mktCouponApi; @@ -94,30 +110,31 @@ public class OrderResultBusinessImpl implements OrderResultBusiness { @Lazy protected MarketApi marketApi; -// public UnifyPaySelectVO reSyncOrderPayResult(Long orderId) { -// UnifyPaySelectVO unifyPaySelectVO = this.orderCustomBusiness.result().willReSyncOrderPayResult(orderId); -// if (unifyPaySelectVO != null) { -// return unifyPaySelectVO; -// } else { -// OrderInfo orderInfo = this.orderInfoService.checkAndGetOrderInfo(orderId); -// this.orderPlaceBusiness.orderHandlerLock(orderInfo.getMacOrderId(), 45); -// -// UnifyPaySelectVO var9; -// try { -// UnifyPaySelectVO paySelectVO = this.payApi.paySelect((new UnifyPaySelectDTO()).setOrderRechargeId(orderId)); -// if (PayStateEnum.isFinishedState(paySelectVO.getCode())) { -// TradeRecord tradeRecord = this.tradeRecordApi.getTradeRecordById(paySelectVO.getTradeId()); -// this.asyncPayResultHandler(PayResultPO.of(tradeRecord)); -// } -// -// var9 = paySelectVO; -// } finally { -// this.orderPlaceBusiness.orderHandlerUnLock(orderInfo.getMacOrderId()); -// } -// -// return var9; -// } -// } + public UnifyPaySelectVO reSyncOrderPayResult(Long orderId) { + UnifyPaySelectVO unifyPaySelectVO = this.orderCustomBusiness.result().willReSyncOrderPayResult(orderId); + if (unifyPaySelectVO != null) { + return unifyPaySelectVO; + } else { + OrderInfo orderInfo = this.orderInfoService.checkAndGetOrderInfo(orderId); + this.orderPlaceBusiness.orderHandlerLock(orderInfo.getMacOrderId(), 45); + + UnifyPaySelectVO var9; + try { + UnifyPaySelectVO paySelectVO = this.payApi.paySelect((new UnifyPaySelectDTO()).setOrderRechargeId(orderId)); + if (PayStateEnum.isFinishedState(paySelectVO.getCode())) { + TradeRecord tradeRecord = this.tradeRecordApi.getTradeRecordById(paySelectVO.getTradeId()); + this.asyncPayResultHandler(PayResultPO.of(tradeRecord)); + } + + var9 = paySelectVO; + } finally { + this.orderPlaceBusiness.orderHandlerUnLock(orderInfo.getMacOrderId()); + } + + return var9; + } + } + // // public UnifyRefundSelectVO reSyncOrderRefundResult(Long orderRefundId) { // UnifyRefundSelectVO unifyRefundSelectVO = this.orderCustomBusiness.result().willReSyncOrderRefundResult(orderRefundId); @@ -143,60 +160,60 @@ public class OrderResultBusinessImpl implements OrderResultBusiness { // return var9; // } // } -// -// public String asyncPayResultHandler(PayResultPO payResultPO) { -// LogUtil.info("订单异步支付|支付结果处理", payResultPO); -// if (!this.orderCustomBusiness.result().willHandleAsyncPayResult(payResultPO)) { -// return null; -// } else { -// List orderInfoList = this.orderInfoService.getOrderInfoListByTradeId(payResultPO.getTradeId()); -// if (CollUtil.isEmpty(orderInfoList)) { -// log.warn("订单异步支付|支付结果处理|订单不存在 tradeId={}", payResultPO.getTradeId()); -// return null; -// } else if (orderInfoList.stream().anyMatch((s) -> { -// return PayStateEnum.isPaidState(s.getPayState()); -// }) && !this.orderRepeatPayCheck(payResultPO, orderInfoList)) { -// LogUtil.info("订单异步支付|支付结果处理|订单已支付 ", orderInfoList); -// return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); -// } else if (((OrderInfo)orderInfoList.get(0)).getPayState().equals(payResultPO.getTradeState())) { -// LogUtil.info("订单异步支付|支付结果处理|订单支付状态已处理 ", orderInfoList); -// return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); -// } else if (PayStateEnum.isPayingState(payResultPO.getTradeState())) { -// LogUtil.info("订单异步支付|支付结果处理|支付中 "); -// return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); -// } else { -// List orderIdList = (List)orderInfoList.stream().map(OrderInfo::getOrderId).collect(Collectors.toList()); -// List orderDateList = (List)orderInfoList.stream().map(OrderInfo::getOrderDate).collect(Collectors.toList()); -// List orderDetailList = this.orderDetailService.getOrderDetailList((List)orderIdList, (Collection)orderDateList); -// if (PayStateEnum.isPayingState(payResultPO.getTradeState())) { -// orderInfoList.forEach((s) -> { -// this.orderInfoService.updateOrderState(s.getOrderId(), s.getOrderDate(), payResultPO.getTradeState(), (Integer)null, (Integer)null, (String)null); -// }); -// return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); -// } else if (PayStateEnum.isFailedState(payResultPO.getTradeState())) { -// this.orderDidFailedHandler(orderInfoList, orderDetailList, payResultPO.getTradeState(), true); -// return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); -// } else { -// List amountChangeList = this.orderAmountChangeService.listByOrderIds(orderIdList, orderDateList); -// UnifyPayVO payVO = UnifyPayVO.of(this.tradeRecordApi.getTradeRecordById(payResultPO.getTradeId()), this.tradeRecordApi.listChannelDetailByTradeId(payResultPO.getTradeId())); -// List orderAmountDetails = this.orderPlaceBusiness.calcOrderRealAmount(orderInfoList, orderDetailList, amountChangeList, payVO.getRealAmount(), payVO.getDetailList()); -// Iterator var9 = orderInfoList.iterator(); -// -// while(var9.hasNext()) { -// OrderInfo orderInfo = (OrderInfo)var9.next(); -// this.orderPlaceBusiness.updateOrderFieldAfterPay(orderInfo, OrderDidPayInfoDTO.of(payVO)); -// } -// -// this.orderInfoService.initOrderCustInfo(orderInfoList, payVO.getCustId()); -// this.orderPlaceBusiness.save(OrderSavePO.byOrderInfo(orderInfoList, orderDetailList, ListUtil.empty(), orderAmountDetails), false, false); -// List orderDeliveryList = this.orderDeliveryService.listOrderDeliveryByOrderIds(orderIdList, orderDateList); -// OrderMessageSend.orderV3Placed(payResultPO.getOutTradeNo(), orderInfoList, orderDetailList, orderDeliveryList, amountChangeList, orderAmountDetails); -// return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); -// } -// } -// } -// } -// + + public String asyncPayResultHandler(PayResultPO payResultPO) { + LogUtil.info("订单异步支付|支付结果处理", payResultPO); + if (!this.orderCustomBusiness.result().willHandleAsyncPayResult(payResultPO)) { + return null; + } else { + List orderInfoList = this.orderInfoService.getOrderInfoListByTradeId(payResultPO.getTradeId()); + if (CollUtil.isEmpty(orderInfoList)) { + log.warn("订单异步支付|支付结果处理|订单不存在 tradeId={}", payResultPO.getTradeId()); + return null; + } else if (orderInfoList.stream().anyMatch((s) -> { + return PayStateEnum.isPaidState(s.getPayState()); + }) && !this.orderRepeatPayCheck(payResultPO, orderInfoList)) { + LogUtil.info("订单异步支付|支付结果处理|订单已支付 ", orderInfoList); + return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); + } else if (((OrderInfo)orderInfoList.get(0)).getPayState().equals(payResultPO.getTradeState())) { + LogUtil.info("订单异步支付|支付结果处理|订单支付状态已处理 ", orderInfoList); + return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); + } else if (PayStateEnum.isPayingState(payResultPO.getTradeState())) { + LogUtil.info("订单异步支付|支付结果处理|支付中 "); + return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); + } else { + List orderIdList = (List)orderInfoList.stream().map(OrderInfo::getOrderId).collect(Collectors.toList()); + List orderDateList = (List)orderInfoList.stream().map(OrderInfo::getOrderDate).collect(Collectors.toList()); + List orderDetailList = this.orderDetailService.getOrderDetailList((List)orderIdList, (Collection)orderDateList); + if (PayStateEnum.isPayingState(payResultPO.getTradeState())) { + orderInfoList.forEach((s) -> { + this.orderInfoService.updateOrderState(s.getOrderId(), s.getOrderDate(), payResultPO.getTradeState(), (Integer)null, (Integer)null, (String)null); + }); + return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); + } else if (PayStateEnum.isFailedState(payResultPO.getTradeState())) { + this.orderDidFailedHandler(orderInfoList, orderDetailList, payResultPO.getTradeState(), true); + return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); + } else { + List amountChangeList = this.orderAmountChangeService.listByOrderIds(orderIdList, orderDateList); + UnifyPayVO payVO = UnifyPayVO.of(this.tradeRecordApi.getTradeRecordById(payResultPO.getTradeId()), this.tradeRecordApi.listChannelDetailByTradeId(payResultPO.getTradeId())); + List orderAmountDetails = this.orderPlaceBusiness.calcOrderRealAmount(orderInfoList, orderDetailList, amountChangeList, payVO.getRealAmount(), payVO.getDetailList()); + Iterator var9 = orderInfoList.iterator(); + + while(var9.hasNext()) { + OrderInfo orderInfo = (OrderInfo)var9.next(); + this.orderPlaceBusiness.updateOrderFieldAfterPay(orderInfo, OrderDidPayInfoDTO.of(payVO)); + } + + this.orderInfoService.initOrderCustInfo(orderInfoList, payVO.getCustId()); + this.orderPlaceBusiness.save(OrderSavePO.byOrderInfo(orderInfoList, orderDetailList, ListUtil.empty(), orderAmountDetails), false, false); + List orderDeliveryList = this.orderDeliveryService.listOrderDeliveryByOrderIds(orderIdList, orderDateList); + OrderMessageSend.orderV3Placed(payResultPO.getOutTradeNo(), orderInfoList, orderDetailList, orderDeliveryList, amountChangeList, orderAmountDetails); + return ((OrderInfo)orderInfoList.get(0)).getMacOrderId(); + } + } + } + } + // public void asyncRefundResultHandler(RefundResultPO refundResultPO) { // LogUtil.info("订单异步退款|支付结果处理", refundResultPO); // if (this.orderCustomBusiness.result().willHandleAsyncRefundResult(refundResultPO)) { @@ -390,30 +407,30 @@ public class OrderResultBusinessImpl implements OrderResultBusiness { } } -// public boolean orderRepeatPayCheck(PayResultPO payResultPO, List orderInfoList) { -// if (!PayStateEnum.isPaidState(payResultPO.getTradeState())) { -// log.warn("本次交易不成功,跳过重复交易检查 tradeId={}", payResultPO.getTradeId()); -// return false; -// } else { -// List orderIds = (List)orderInfoList.stream().map(OrderInfo::getOrderId).collect(Collectors.toList()); -// List repeatPaidTrades = (List)this.tradeRecordApi.listSuccessByOrderIds(orderIds).stream().filter((s) -> { -// return !s.getTradeId().equals(payResultPO.getTradeId()); -// }).collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(repeatPaidTrades)) { -// log.warn("订单产生多笔支付成功的交易 {}", repeatPaidTrades); -// OrderSavePO orderSavePO = this.orderRepairService.packageNewPaidOrderInfo(orderInfoList); -// this.tradeRecordApi.updateOrderRechargeId(payResultPO.getTradeId(), orderSavePO.getMacOrderId(), (List)orderSavePO.getOrderInfoList().stream().map(OrderInfo::getOrderId).collect(Collectors.toList())); -// this.orderPlaceBusiness.save(orderSavePO, false, false); -// CollUtil.clear(new Collection[]{orderInfoList}); -// orderInfoList.addAll(orderSavePO.getOrderInfoList()); -// return true; -// } else { -// log.warn("订单未产生多笔支付成功的交易,跳过 orderId={}", orderInfoList.stream().map(OrderInfo::getOrderId).collect(Collectors.toList())); -// return false; -// } -// } -// } -// + public boolean orderRepeatPayCheck(PayResultPO payResultPO, List orderInfoList) { + if (!PayStateEnum.isPaidState(payResultPO.getTradeState())) { + log.warn("本次交易不成功,跳过重复交易检查 tradeId={}", payResultPO.getTradeId()); + return false; + } else { + List orderIds = (List)orderInfoList.stream().map(OrderInfo::getOrderId).collect(Collectors.toList()); + List repeatPaidTrades = (List)this.tradeRecordApi.listSuccessByOrderIds(orderIds).stream().filter((s) -> { + return !s.getTradeId().equals(payResultPO.getTradeId()); + }).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(repeatPaidTrades)) { + log.warn("订单产生多笔支付成功的交易 {}", repeatPaidTrades); + OrderSavePO orderSavePO = this.orderRepairService.packageNewPaidOrderInfo(orderInfoList); + this.tradeRecordApi.updateOrderRechargeId(payResultPO.getTradeId(), orderSavePO.getMacOrderId(), (List)orderSavePO.getOrderInfoList().stream().map(OrderInfo::getOrderId).collect(Collectors.toList())); + this.orderPlaceBusiness.save(orderSavePO, false, false); + CollUtil.clear(new Collection[]{orderInfoList}); + orderInfoList.addAll(orderSavePO.getOrderInfoList()); + return true; + } else { + log.warn("订单未产生多笔支付成功的交易,跳过 orderId={}", orderInfoList.stream().map(OrderInfo::getOrderId).collect(Collectors.toList())); + return false; + } + } + } + // public OrderRefund orderRepeatRefundCheck(RefundResultPO refundResultPO, OrderRefund orderRefund) { // List paidTradeRecords = (List)this.tradeRecordApi.listTradeRecordByOrderRechargeId(orderRefund.getOrderRefundId()).stream().filter((s) -> { // return PayStateEnum.isPaidState(s.getTradeState()); diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/dto/OrderDidPayInfoDTO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/dto/OrderDidPayInfoDTO.java new file mode 100644 index 00000000..1dc8919c --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/dto/OrderDidPayInfoDTO.java @@ -0,0 +1,69 @@ +package com.bonus.core.order.common.dto; + + +import com.bonus.core.pay.api.vo.UnifyPayVO; +import com.bonus.core.pay.common.model.TradeRecord; + +import java.time.LocalDateTime; + +public class OrderDidPayInfoDTO { + private Integer payState; + private Integer payType; + private Integer payChannel; + private LocalDateTime payTime; + + public static OrderDidPayInfoDTO of(Integer payState, Integer payType, Integer payChannel) { + return new OrderDidPayInfoDTO(payState, payType, payChannel, LocalDateTime.now()); + } + + public static OrderDidPayInfoDTO of(UnifyPayVO payVO) { + return new OrderDidPayInfoDTO(payVO.getCode(), payVO.getPayType(), payVO.getPayChannel(), payVO.getPayTime()); + } + + public static OrderDidPayInfoDTO of(TradeRecord tradeRecord) { + return new OrderDidPayInfoDTO(tradeRecord.getTradeState(), tradeRecord.getPayType(), tradeRecord.getPayChannel(), tradeRecord.getTradeTime()); + } + + public Integer getPayState() { + return this.payState; + } + + public Integer getPayType() { + return this.payType; + } + + public Integer getPayChannel() { + return this.payChannel; + } + + public LocalDateTime getPayTime() { + return this.payTime; + } + + public void setPayState(final Integer payState) { + this.payState = payState; + } + + public void setPayType(final Integer payType) { + this.payType = payType; + } + + public void setPayChannel(final Integer payChannel) { + this.payChannel = payChannel; + } + + public void setPayTime(final LocalDateTime payTime) { + this.payTime = payTime; + } + + + public OrderDidPayInfoDTO() { + } + + public OrderDidPayInfoDTO(final Integer payState, final Integer payType, final Integer payChannel, final LocalDateTime payTime) { + this.payState = payState; + this.payType = payType; + this.payChannel = payChannel; + this.payTime = payTime; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/model/OrderInfo.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/model/OrderInfo.java index 7bc278ac..cde238c1 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/model/OrderInfo.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/model/OrderInfo.java @@ -1,6 +1,7 @@ package com.bonus.core.order.common.model; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.NumberUtil; import com.baomidou.mybatisplus.annotation.TableName; import com.bonus.constant.LeConstants; @@ -10,6 +11,7 @@ import com.bonus.core.order.common.constants.DeductionTypeEnum; import com.bonus.core.order.common.constants.DishesStateEnum; import com.bonus.core.order.common.constants.OrderRefundStateEnum; import com.bonus.core.order.common.constants.OrderStateEnum; +import com.bonus.core.order.utils.LeNumUtil; import com.bonus.core.pay.api.dto.UnifyPayDTO; import com.bonus.core.pay.common.constants.PayChannelEnum; import com.bonus.core.pay.common.constants.PayStateEnum; @@ -234,10 +236,10 @@ public class OrderInfo { } } -// -// public boolean hasCustInfo(Long custId) { -// return LeNumUtil.idOrDefault(this.custId).equals(LeNumUtil.idOrDefault(custId)) && CharSequenceUtil.isNotBlank(this.orgFullName); -// } + + public boolean hasCustInfo(Long custId) { + return LeNumUtil.idOrDefault(this.custId).equals(LeNumUtil.idOrDefault(custId)) && CharSequenceUtil.isNotBlank(this.orgFullName); + } public static String[] logFields() { return new String[]{"orderId", "macOrderId", "machineSn", "custId", "sourceType", "canteenId", "stallId", "orderType", "orderDate", "orderTime", "orderState", "orderRefundState", "payType", "payChannel", "payState", "deliveryType", "dishesState", "commentState", "inventoryOutId", "ifQuickFail", "payableAmount", "discountsAmount", "couponAmount", "deliveryAmount", "packingAmount", "realAmount", "accPayAmount", "outPayAmount", "refundAmount", "payParam", "remark"}; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderDeliveryService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderDeliveryService.java index 1b5eee0e..020bef14 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderDeliveryService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderDeliveryService.java @@ -13,4 +13,6 @@ public interface OrderDeliveryService { void deleteByOrderIds(List orderIds, Collection orderDates); void insertList(Collection entityList); + + List listOrderDeliveryByOrderIds(List orderIds, Collection orderDates); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderDetailService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderDetailService.java index 55926695..12bbc4e1 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderDetailService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderDetailService.java @@ -21,7 +21,7 @@ public interface OrderDetailService { List getOrderDetailList(Long orderId, LocalDate orderDate); // -// List getOrderDetailList(List orderIdList, Collection orderDates); + List getOrderDetailList(List orderIdList, Collection orderDates); List getOrderDetailList(List orderIdList, Collection orderDates, List detailStateList); // diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderInfoService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderInfoService.java index 222c83da..c9350229 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderInfoService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/OrderInfoService.java @@ -9,6 +9,7 @@ import com.bonus.core.order.mobile.vo.OrderListMobileVO; import com.bonus.core.order.web.dto.OrderUserPermissionDTO; import java.math.BigDecimal; +import javax.validation.constraints.NotNull; import java.time.LocalDate; import java.util.Collection; import java.util.List; @@ -40,7 +41,7 @@ public interface OrderInfoService { // // long existReserveOrderUnPrint(Long canteenId, Long stallId, Integer mealtimeType); // -// String getMaxMealCodeOfDate(@NotNull LocalDate orderDate, Integer mealtimeType, Long canteenId, Long stallId); + String getMaxMealCodeOfDate(@NotNull LocalDate orderDate, Integer mealtimeType, Long canteenId, Long stallId); OrderInfo getById(Long id, LocalDate... orderDates); @@ -70,7 +71,7 @@ public interface OrderInfoService { // List getPlacedOrderInfoList(Long custId, LocalDate nowDate); // -// void initOrderCustInfo(List orderInfoList, Long custId); + void initOrderCustInfo(List orderInfoList, Long custId); // // void fillOrderCustName(List orderInfoList, boolean skipIfNameExists); // diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/impl/OrderDeliveryServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/impl/OrderDeliveryServiceImpl.java index e81a618e..ec9c2804 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/impl/OrderDeliveryServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/impl/OrderDeliveryServiceImpl.java @@ -61,4 +61,19 @@ public class OrderDeliveryServiceImpl extends ServiceImpl listOrderDeliveryByOrderIds(List orderIds, Collection orderDates) { + if (CollUtil.isEmpty(orderIds)) { + return CollUtil.newArrayList(new OrderDelivery[0]); + } else { + List dateRange = LeOrderUtil.queryDateRange((Collection)orderIds, (Collection)orderDates); + //return ((OrderDeliveryMapper)this.baseMapper).selectList((Wrapper)((LambdaQueryWrapper)Wrappers.lambdaQuery(OrderDelivery.class) + // .in(OrderDelivery::getOrderId, orderIds)) + // .between(OrderDelivery::getOrderDate, dateRange.get(0), dateRange.get(1))); + List result = ((OrderDeliveryMapper)this.baseMapper).selectList(Wrappers.lambdaQuery(OrderDelivery.class) + .in(OrderDelivery::getOrderId, orderIds) + .between(OrderDelivery::getOrderDate, dateRange.get(0), dateRange.get(1))); + return result; + } + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/impl/OrderInfoServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/impl/OrderInfoServiceImpl.java index 1ce8f9bf..c3cc0332 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/impl/OrderInfoServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/service/impl/OrderInfoServiceImpl.java @@ -9,14 +9,20 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bonus.common.core.exception.ServiceException; import com.bonus.constant.LeConstants; import com.bonus.core.common.constant.LeRetCodeEnum; import com.bonus.core.order.android.vo.OrderListAndroidVO; import com.bonus.core.order.common.constants.OrderRefundStateEnum; +import com.bonus.core.common.enums.AllocMealtimeTypeEnum; +import com.bonus.core.customer.vo.CustPayVO; +import com.bonus.core.order.client.OrderModuleClient; +import com.bonus.core.order.client.po.CustPayInfoQueryParam; import com.bonus.core.order.common.constants.OrderStateEnum; import com.bonus.core.order.common.constants.OrderTips; +import com.bonus.core.order.common.constants.OrderTypeEnum; import com.bonus.core.order.common.dto.OrderSearchParam; import com.bonus.core.order.common.mapper.OrderInfoMapper; import com.bonus.core.order.common.model.OrderInfo; @@ -33,6 +39,7 @@ import com.bonus.core.pay.common.model.TradeOrderRecharge; import com.bonus.i18n.I18n; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -65,9 +72,9 @@ public class OrderInfoServiceImpl extends ServiceImpl didListShoppingCartByCust(OrderShoppingSearchDTO searchDTO, List resultList) { return resultList; } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomPlaceBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomPlaceBusiness.java index ffeeeb00..c35ff04a 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomPlaceBusiness.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomPlaceBusiness.java @@ -8,6 +8,7 @@ import com.bonus.core.marketing.coupon.model.MktCouponPayModel; import com.bonus.core.marketing.v2.rule.price.dto.RulePriceDTO; import com.bonus.core.menu.dto.MenuRecipeChangeSurplusNum; import com.bonus.core.order.common.constants.ChangeDetailTypeEnum; +import com.bonus.core.order.common.dto.OrderDidPayInfoDTO; import com.bonus.core.order.common.model.*; import com.bonus.core.order.common.vo.OrderDeliveryResultVO; import com.bonus.core.order.mq.po.OrderSavePO; @@ -126,10 +127,10 @@ public class OrderCustomPlaceBusiness implements CustomBusiness { public boolean willDishesInventoryRepair(OrderInfo orderInfo, List orderDetailList, List changeSurplusNumList) { return true; } -// -// public boolean willCalcOrderRealAmount(List orderInfoList, List orderDetailList, BigDecimal payAmount, List channelDetailList, List orderAmountDetailList) { -// return true; -// } + + public boolean willCalcOrderRealAmount(List orderInfoList, List orderDetailList, BigDecimal payAmount, List channelDetailList, List orderAmountDetailList) { + return true; + } public UnifyPayVO willOrderPayV2(UnifyPayDTO unifyPayDTO, List orderInfoList, List orderDetailList) { return null; @@ -138,8 +139,8 @@ public class OrderCustomPlaceBusiness implements CustomBusiness { public void didCalcOrderRealAmount(List orderInfoList, List orderDetailList, BigDecimal payAmount, List channelDetailList, List orderAmountDetailList) { } -// public void didUpdateOrderFieldAfterPay(OrderInfo orderInfo, OrderDidPayInfoDTO didPayInfoDTO) { -// } + public void didUpdateOrderFieldAfterPay(OrderInfo orderInfo, OrderDidPayInfoDTO didPayInfoDTO) { + } public boolean willHandleOrderDidFailed(List orderInfoList, List orderDetailList, Integer payState, boolean orderExists) { diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomRepairBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomRepairBusiness.java new file mode 100644 index 00000000..64c4f731 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomRepairBusiness.java @@ -0,0 +1,29 @@ +package com.bonus.core.order.custom; + +import cn.hutool.core.collection.CollUtil; +import com.bonus.core.common.custom.business.CustomBusiness; +import com.bonus.core.order.common.model.OrderInfo; +import com.bonus.core.order.mq.po.OrderSavePO; +import com.bonus.core.pay.common.model.TradeRecord; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class OrderCustomRepairBusiness implements CustomBusiness { + public String name() { + return "订单(数据修复)"; + } + + public List versions() { + return CollUtil.newArrayList(new CustomBusiness.Version[0]); + } + + public OrderSavePO didPackageNewPaidOrderInfo(List originalOrderInfoList, OrderSavePO newOrderSavePO) { + return newOrderSavePO; + } + +// public OrderSavePO didPackageNotExistsOrderInfo(TradeRecord tradeRecord, OrderListRepairInfoVO repairVO, OrderSavePO newOrderSavePO) { +// return newOrderSavePO; +// } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomResultBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomResultBusiness.java new file mode 100644 index 00000000..c603ec77 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/custom/OrderCustomResultBusiness.java @@ -0,0 +1,25 @@ +package com.bonus.core.order.custom; + +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; +import com.bonus.core.pay.common.po.PayResultPO; +import com.bonus.core.pay.common.po.RefundResultPO; +import org.springframework.stereotype.Service; + +@Service +public class OrderCustomResultBusiness { + public UnifyPaySelectVO willReSyncOrderPayResult(Long orderId) { + return null; + } + +// public UnifyRefundSelectVO willReSyncOrderRefundResult(Long orderRefundId) { +// return null; +// } + + public boolean willHandleAsyncPayResult(PayResultPO payResultPO) { + return true; + } + + public boolean willHandleAsyncRefundResult(RefundResultPO refundResultPO) { + return true; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/controller/OrderInfoMobileController.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/controller/OrderInfoMobileController.java index 23e9f76e..67e629ae 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/controller/OrderInfoMobileController.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/controller/OrderInfoMobileController.java @@ -19,6 +19,7 @@ import com.bonus.core.order.mobile.vo.OrderInfoMobileVO; import com.bonus.core.order.mobile.vo.OrderListMobileVO; import com.bonus.core.order.mobile.vo.OrderShoppingCartAddResultVO; import com.bonus.core.order.mobile.vo.OrderShoppingCartListMobileVO; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -78,13 +79,13 @@ public class OrderInfoMobileController extends BaseController { OrderInfoMobileVO orderInfo = this.orderInfoMobileBusiness.orderInfo(request.getOrderId()); return R.ok(orderInfo); } -// -// @PostMapping({"/sync-pay-state"}) -// public LeResponse orderSyncPayState(@RequestBody LeRequest request) { -// JavaxValidateUtils.validate((OrderSyncPayStateMobileDTO)request.getContent()); -// return LeResponse.succ(this.orderInfoMobileBusiness.orderSyncPayState((OrderSyncPayStateMobileDTO)request.getContent())); -// } -// + + @PostMapping({"/sync-pay-state"}) + public AjaxResult orderSyncPayState(@RequestBody OrderSyncPayStateMobileDTO dto) { + JavaxValidateUtils.validate(dto); + return AjaxResult.success(this.orderInfoMobileBusiness.orderSyncPayState(dto)); + } + // @PostMapping({"/weight-info"}) // @ApiOperation("获取自助餐订单详情") // public LeResponse weightOrderInfo(@RequestBody LeRequest request) { diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/dto/OrderSyncPayStateMobileDTO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/dto/OrderSyncPayStateMobileDTO.java new file mode 100644 index 00000000..7835e2e5 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/dto/OrderSyncPayStateMobileDTO.java @@ -0,0 +1,28 @@ +package com.bonus.core.order.mobile.dto; + +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.NotNull; + +public class OrderSyncPayStateMobileDTO { + @ApiModelProperty("订单号") + private @NotNull Long orderId; + @ApiModelProperty("是否手动同步") + private Integer ifManualSync; + + public Long getOrderId() { + return this.orderId; + } + + public Integer getIfManualSync() { + return this.ifManualSync; + } + + public void setOrderId(final Long orderId) { + this.orderId = orderId; + } + + public void setIfManualSync(final Integer ifManualSync) { + this.ifManualSync = ifManualSync; + } + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/service/OrderInfoMobileBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/service/OrderInfoMobileBusiness.java index 983a81e7..6e1d869c 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/service/OrderInfoMobileBusiness.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/service/OrderInfoMobileBusiness.java @@ -3,15 +3,17 @@ package com.bonus.core.order.mobile.service; import com.bonus.core.common.page.PageVO; import com.bonus.core.order.common.dto.RequestHeaderDTO; import com.bonus.core.order.mobile.dto.OrderListMobileDTO; +import com.bonus.core.order.mobile.dto.OrderSyncPayStateMobileDTO; import com.bonus.core.order.mobile.vo.OrderInfoMobileVO; import com.bonus.core.order.mobile.vo.OrderListMobileVO; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; import java.util.List; public interface OrderInfoMobileBusiness { // void orderPayCancel(Long orderId); // -// UnifyPaySelectVO orderSyncPayState(OrderSyncPayStateMobileDTO dto); + UnifyPaySelectVO orderSyncPayState(OrderSyncPayStateMobileDTO dto); PageVO orderList(OrderListMobileDTO orderListDTO, RequestHeaderDTO headerDTO); // diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/service/impl/OrderInfoMobileBusinessImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/service/impl/OrderInfoMobileBusinessImpl.java index 4f346b85..76ded268 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/service/impl/OrderInfoMobileBusinessImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mobile/service/impl/OrderInfoMobileBusinessImpl.java @@ -5,12 +5,14 @@ import cn.hutool.core.collection.ListUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ObjectUtil; +import com.bonus.constant.LeConstants; import com.bonus.core.common.page.PageVO; import com.bonus.core.device.api.DeviceApi; import com.bonus.core.device.manage.dto.DeviceSearchDTO; import com.bonus.core.device.manage.model.DeviceInfo; import com.bonus.core.menu.api.MenuDishesApi; import com.bonus.core.menu.utils.NutritionEntity; +import com.bonus.core.order.common.business.OrderResultBusiness; import com.bonus.core.order.common.constants.CheckStateEnum; import com.bonus.core.order.common.constants.DetailTypeEnum; import com.bonus.core.order.common.constants.OrderTypeEnum; @@ -22,6 +24,7 @@ import com.bonus.core.order.common.service.*; import com.bonus.core.order.common.vo.OrderIdDateVO; import com.bonus.core.order.custom.OrderCustomBusiness; import com.bonus.core.order.mobile.dto.OrderListMobileDTO; +import com.bonus.core.order.mobile.dto.OrderSyncPayStateMobileDTO; import com.bonus.core.order.mobile.service.OrderInfoMobileBusiness; import com.bonus.core.order.mobile.vo.OrderDetailMobileVO; import com.bonus.core.order.mobile.vo.OrderInfoMobileVO; @@ -32,6 +35,9 @@ import com.bonus.core.order.web.dto.OrderUserPermissionDTO; import com.bonus.core.order.weight.service.MacPlateidBindSerialService; import com.bonus.core.order.weight.model.MacPlateidBindSerial; import com.bonus.core.order.weight.vo.RefundDetailStateVO; +import com.bonus.core.pay.api.TradeRecordApi; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; +import com.bonus.core.pay.common.model.TradeRecord; import com.bonus.utils.AesEncryptUtil; import com.bonus.core.menu.model.MenuDishesTypeModel; import com.github.pagehelper.page.PageMethod; @@ -67,6 +73,9 @@ public class OrderInfoMobileBusinessImpl implements OrderInfoMobileBusiness { protected OrderCustomBusiness orderCustomBusiness; @Lazy @Autowired + protected OrderResultBusiness orderResultBusiness; + @Lazy + @Autowired protected DeviceApi deviceApi; @Lazy @Autowired @@ -80,6 +89,9 @@ public class OrderInfoMobileBusinessImpl implements OrderInfoMobileBusiness { @Lazy @Autowired protected OrderRefundDetailService orderRefundDetailService; + @Lazy + @Autowired + protected TradeRecordApi tradeRecordApi; @Override public PageVO orderList(OrderListMobileDTO orderListDTO, RequestHeaderDTO headerDTO) { @@ -251,4 +263,16 @@ public class OrderInfoMobileBusinessImpl implements OrderInfoMobileBusiness { } + public UnifyPaySelectVO orderSyncPayState(OrderSyncPayStateMobileDTO dto) { + UnifyPaySelectVO unifyPaySelectVO = this.orderCustomBusiness.mobile().willReSyncOrderPayResult(dto.getOrderId()); + if (ObjectUtil.isNotNull(unifyPaySelectVO)) { + return unifyPaySelectVO; + } else if (LeConstants.COMMON_YES.equals(dto.getIfManualSync())) { + return this.orderResultBusiness.reSyncOrderPayResult(dto.getOrderId()); + } else { + TradeRecord tradeRecord = this.tradeRecordApi.getLastTradeRecordByOrderId(dto.getOrderId()); + return UnifyPaySelectVO.of(tradeRecord); + } + } + } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mq/OrderMessageSend.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mq/OrderMessageSend.java index 6eed088f..35abaf97 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mq/OrderMessageSend.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mq/OrderMessageSend.java @@ -10,6 +10,7 @@ import com.bonus.core.order.common.model.*; import com.bonus.core.order.mq.po.OrderCancelPO; import com.bonus.core.order.mq.po.OrderDishesStateUpdatePO; import com.bonus.core.order.mq.po.OrderRefundPO; +import com.bonus.core.order.mq.po.OrderPlacedPO; import com.bonus.core.pay.common.po.PayResultPO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -169,27 +170,27 @@ public class OrderMessageSend { // // } // } -// -// public static void orderV3Placed(String outTradeNo, List orderInfoList, List detailList, List orderDeliveryList, List amountChangeList, List amountDetailList) { -// log.info("[订单MQv3]发送订单已下单通知"); -// OrderPlacedPO orderSavePO = new OrderPlacedPO(); -// orderSavePO.setTraceId(LogUtil.getCurrentTraceId()); -// orderSavePO.setTenantId(TenantContextHolder.getTenantId()); -// orderSavePO.setOutTradeNo(outTradeNo); -// orderSavePO.setOrderInfoList(orderInfoList); -// orderSavePO.setDetailList(detailList); -// orderSavePO.setOrderDeliveryList(orderDeliveryList); -// orderSavePO.setAmountChangeList(amountChangeList); -// orderSavePO.setAmountDetailList(amountDetailList); -// -// try { -// MqUtil.sendByTxEnd(JacksonUtil.writeValueAsString(orderSavePO), LeMqConstant.Topic.ORDER_V3_PLACED); -// } catch (Exception var8) { -// log.error("发送MQ消息失败", var8); -// } -// -// } -// + + public static void orderV3Placed(String outTradeNo, List orderInfoList, List detailList, List orderDeliveryList, List amountChangeList, List amountDetailList) { + log.info("[订单MQv3]发送订单已下单通知"); + OrderPlacedPO orderSavePO = new OrderPlacedPO(); + orderSavePO.setTraceId(LogUtil.getCurrentTraceId()); + orderSavePO.setTenantId(TenantContextHolder.getTenantId()); + orderSavePO.setOutTradeNo(outTradeNo); + orderSavePO.setOrderInfoList(orderInfoList); + orderSavePO.setDetailList(detailList); + orderSavePO.setOrderDeliveryList(orderDeliveryList); + orderSavePO.setAmountChangeList(amountChangeList); + orderSavePO.setAmountDetailList(amountDetailList); + + try { + MqUtil.sendByTxEnd(JacksonUtil.writeValueAsString(orderSavePO), LeMqConstant.Topic.ORDER_V3_PLACED); + } catch (Exception var8) { + log.error("发送MQ消息失败", var8); + } + + } + // public static void orderV3Canceled(OrderInfo orderInfo, List detailList) { // log.info("[订单MQv3]发送订单已取消通知"); // OrderCanceledPO po = new OrderCanceledPO(); diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mq/po/OrderPlacedPO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mq/po/OrderPlacedPO.java new file mode 100644 index 00000000..fde11dff --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/mq/po/OrderPlacedPO.java @@ -0,0 +1,82 @@ +package com.bonus.core.order.mq.po; + +import cn.hutool.core.collection.CollUtil; +import com.bonus.core.order.common.model.*; + +import java.util.List; + +public class OrderPlacedPO { + private String traceId; + private Long tenantId; + private String outTradeNo; + private List orderInfoList = CollUtil.newArrayList(new OrderInfo[0]); + private List detailList = CollUtil.newArrayList(new OrderDetail[0]); + private List orderDeliveryList = CollUtil.newArrayList(new OrderDelivery[0]); + private List amountChangeList = CollUtil.newArrayList(new OrderAmountChange[0]); + private List amountDetailList = CollUtil.newArrayList(new OrderAmountDetail[0]); + + public String getTraceId() { + return this.traceId; + } + + public Long getTenantId() { + return this.tenantId; + } + + public String getOutTradeNo() { + return this.outTradeNo; + } + + public List getOrderInfoList() { + return this.orderInfoList; + } + + public List getDetailList() { + return this.detailList; + } + + public List getOrderDeliveryList() { + return this.orderDeliveryList; + } + + public List getAmountChangeList() { + return this.amountChangeList; + } + + public List getAmountDetailList() { + return this.amountDetailList; + } + + public void setTraceId(final String traceId) { + this.traceId = traceId; + } + + public void setTenantId(final Long tenantId) { + this.tenantId = tenantId; + } + + public void setOutTradeNo(final String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public void setOrderInfoList(final List orderInfoList) { + this.orderInfoList = orderInfoList; + } + + public void setDetailList(final List detailList) { + this.detailList = detailList; + } + + public void setOrderDeliveryList(final List orderDeliveryList) { + this.orderDeliveryList = orderDeliveryList; + } + + public void setAmountChangeList(final List amountChangeList) { + this.amountChangeList = amountChangeList; + } + + public void setAmountDetailList(final List amountDetailList) { + this.amountDetailList = amountDetailList; + } + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/repair/service/OrderRepairService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/repair/service/OrderRepairService.java new file mode 100644 index 00000000..7486740d --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/repair/service/OrderRepairService.java @@ -0,0 +1,54 @@ +package com.bonus.core.order.repair.service; + +import com.bonus.core.order.common.constants.*; +import com.bonus.core.order.common.model.*; +import com.bonus.core.order.custom.OrderCustomBusiness; +import com.bonus.core.order.mq.po.OrderSavePO; +import com.bonus.core.pay.common.constants.PayStateEnum; +import com.bonus.utils.id.Id; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class OrderRepairService { + @Autowired + @Lazy + protected OrderCustomBusiness orderCustomBusiness; + + + public OrderSavePO packageNewPaidOrderInfo(List orderInfoList) { + String newMacOrderId = Id.nextString(); + OrderSavePO orderSavePO = OrderSavePO.byLockKey(newMacOrderId); + Iterator var4 = orderInfoList.iterator(); + + while(var4.hasNext()) { + OrderInfo existOrderInfo = (OrderInfo)var4.next(); + OrderInfo newOrderInfo = existOrderInfo.copyInstance(); + newOrderInfo.setOrderId(Id.next()); + newOrderInfo.setMacOrderId(newMacOrderId); + newOrderInfo.resetAmountsZero(); + newOrderInfo.setOrderType(OrderTypeEnum.DEDUCT.getKey()); + newOrderInfo.setOrderState(OrderStateEnum.WAIT_PLACE.getKey()); + newOrderInfo.setPayState(PayStateEnum.UN_PAY.getKey()); + newOrderInfo.setOrderRefundState(OrderRefundStateEnum.UN_APPLY.getKey()); + newOrderInfo.setPayableAmount(existOrderInfo.calcUnRefundAmount()); + orderSavePO.getOrderInfoList().add(newOrderInfo); + OrderDetail newOrderDetail = OrderDetail.newDefaultDetail(existOrderInfo.calcUnRefundAmount(), DetailTypeEnum.DEDUCT.getKey()); + newOrderDetail.setDetailId(Id.next()); + newOrderDetail.setOrderId(newOrderInfo.getOrderId()); + newOrderDetail.setOrderDate(newOrderInfo.getOrderDate()); + orderSavePO.getOrderDetailList().add(newOrderDetail); + } + + return this.orderCustomBusiness.repair().didPackageNewPaidOrderInfo(orderInfoList, orderSavePO); + } + + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/utils/LeNumUtil.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/utils/LeNumUtil.java index 2f663a64..793d15cc 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/utils/LeNumUtil.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/utils/LeNumUtil.java @@ -1,15 +1,28 @@ package com.bonus.core.order.utils; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; import com.bonus.constant.LeConstants; +import com.bonus.core.common.utils.TenantContextHolder; +import com.bonus.core.order.common.service.OrderInfoService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.BoundValueOperations; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; - import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.Duration; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Function; @@ -18,6 +31,16 @@ import java.util.stream.Collectors; @Component public class LeNumUtil { private static final Logger log = LoggerFactory.getLogger(LeNumUtil.class); + + @Autowired + @Lazy + private OrderInfoService orderInfoService; + @Autowired + @Lazy + private RedisTemplate redisTemplate; + @Value("${system.order.call.max-num:}") + private Long callMaxNum; + private static final long EPOCH = LocalDateTime.of(2021, 12, 29, 9, 2).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); // @Autowired // @Lazy @@ -50,41 +73,41 @@ public class LeNumUtil { // // return differentFlag ? superNum + "-" + latestNum : superNum + latestNum; // } -// -// public String getMealCode(String prefix, Long canteenId, Long stallId, LocalDate orderDate, Integer mealtimeType) { -// if (!isValidId(canteenId) && !isValidId(stallId)) { -// return ""; -// } else if (LocalDate.now().isAfter(orderDate)) { -// return ""; -// } else { -// String callNumPrefix = CharSequenceUtil.isNotBlank(prefix) ? prefix : ""; -// Long merchantId = TenantContextHolder.getTenantId(); -// String dateStr = orderDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); -// String shopIdStr = isValidId(stallId) ? String.valueOf(stallId) : String.valueOf(canteenId); -// String mealtimeStr = isValidId(mealtimeType) ? String.valueOf(mealtimeType) : "-1"; -// String redisKey = CharSequenceUtil.format("yst:{}:meal-code:{}:{}:{}:{}", new Object[]{merchantId, shopIdStr, dateStr, mealtimeStr, callNumPrefix}); -// log.info("叫号缓存key:{}", redisKey); -// BoundValueOperations valueOperations = this.redisTemplate.boundValueOps(redisKey); -// Object s = valueOperations.get(); -// if (ObjectUtil.isNull(s)) { -// String maxMealCodeOfDate = this.orderInfoService.getMaxMealCodeOfDate(orderDate, mealtimeType, canteenId, stallId); -// log.info("当前最大叫号:{}", maxMealCodeOfDate); -// maxMealCodeOfDate = CharSequenceUtil.removePrefix(maxMealCodeOfDate, callNumPrefix); -// int currentNum = NumberUtil.isNumber(maxMealCodeOfDate) ? NumberUtil.parseInt(maxMealCodeOfDate) : 0; -// Duration expireDuration = LocalDateTimeUtil.between(LocalDateTimeUtil.now(), LocalDateTimeUtil.endOfDay(LocalDateTimeUtil.now())); -// valueOperations.setIfAbsent(currentNum, expireDuration); -// } -// -// Long increment = valueOperations.increment(1L); -// if (this.callMaxNum != null && increment != null && increment > this.callMaxNum) { -// increment = increment % this.callMaxNum; -// } -// -// String format = String.format("%03d", increment); -// log.info("叫的多少号{}", callNumPrefix + format); -// return callNumPrefix + format; -// } -// } + + public String getMealCode(String prefix, Long canteenId, Long stallId, LocalDate orderDate, Integer mealtimeType) { + if (!isValidId(canteenId) && !isValidId(stallId)) { + return ""; + } else if (LocalDate.now().isAfter(orderDate)) { + return ""; + } else { + String callNumPrefix = CharSequenceUtil.isNotBlank(prefix) ? prefix : ""; + Long merchantId = TenantContextHolder.getTenantId(); + String dateStr = orderDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String shopIdStr = isValidId(stallId) ? String.valueOf(stallId) : String.valueOf(canteenId); + String mealtimeStr = isValidId(mealtimeType) ? String.valueOf(mealtimeType) : "-1"; + String redisKey = CharSequenceUtil.format("yst:{}:meal-code:{}:{}:{}:{}", new Object[]{merchantId, shopIdStr, dateStr, mealtimeStr, callNumPrefix}); + log.info("叫号缓存key:{}", redisKey); + BoundValueOperations valueOperations = this.redisTemplate.boundValueOps(redisKey); + Object s = valueOperations.get(); + if (ObjectUtil.isNull(s)) { + String maxMealCodeOfDate = this.orderInfoService.getMaxMealCodeOfDate(orderDate, mealtimeType, canteenId, stallId); + log.info("当前最大叫号:{}", maxMealCodeOfDate); + maxMealCodeOfDate = CharSequenceUtil.removePrefix(maxMealCodeOfDate, callNumPrefix); + int currentNum = NumberUtil.isNumber(maxMealCodeOfDate) ? NumberUtil.parseInt(maxMealCodeOfDate) : 0; + Duration expireDuration = LocalDateTimeUtil.between(LocalDateTimeUtil.now(), LocalDateTimeUtil.endOfDay(LocalDateTimeUtil.now())); + valueOperations.setIfAbsent(currentNum, expireDuration); + } + + Long increment = valueOperations.increment(1L); + if (this.callMaxNum != null && increment != null && increment > this.callMaxNum) { + increment = increment % this.callMaxNum; + } + + String format = String.format("%03d", increment); + log.info("叫的多少号{}", callNumPrefix + format); + return callNumPrefix + format; + } + } public static boolean isValidId(Long id) { return id != null && id != -1L && id != 0L; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/utils/LeOrderUtil.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/utils/LeOrderUtil.java index ce8517b0..8b679194 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/utils/LeOrderUtil.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/utils/LeOrderUtil.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.NumberUtil; +import com.bonus.core.order.common.model.OrderInfo; import java.math.BigDecimal; import java.time.*; @@ -94,9 +95,9 @@ public class LeOrderUtil { // }).collect(Collectors.joining("+")); // } // -// public static void calcOrderAmount(List orderInfoList, BigDecimal totalAmount, BiConsumer saveField) { -// LeNumUtil.calcShareAmount(orderInfoList, totalAmount, OrderInfo::calcNeedPayAmount, saveField); -// } + public static void calcOrderAmount(List orderInfoList, BigDecimal totalAmount, BiConsumer saveField) { + LeNumUtil.calcShareAmount(orderInfoList, totalAmount, OrderInfo::calcNeedPayAmount, saveField); + } // // public static boolean checkNowTimeWithin(String startTimeStr, String endTimeStr) { // LocalTime startTime = null; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/TradeRecordApi.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/TradeRecordApi.java index 6a2eccd6..82f92e36 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/TradeRecordApi.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/TradeRecordApi.java @@ -46,6 +46,13 @@ public class TradeRecordApi { @Lazy @Resource protected OrderInfoService orderInfoService; + @Lazy + @Autowired + protected TradeChannelService tradeChannelService; + + public TradeRecord getTradeRecordById(Long tradeId) { + return this.tradeRecordService.getTradeRecordById(tradeId); + } public TradeRecordParamVO getParamVOByTradeId(Long tradeId) { TradeRecord tradeRecord = this.tradeRecordService.getTradeRecordById(tradeId); @@ -64,4 +71,28 @@ public class TradeRecordApi { public List listOrderRechargeByTradeId(Long tradeId) { return this.tradeRecordService.queryOrderRechargeTrade(tradeId); } + + public List listSuccessByOrderIds(List orderIds) { + return this.tradeRecordService.listSuccessByOrderIds(orderIds); + } + + public List listChannelDetailByTradeId(Long tradeId) { + return this.tradeChannelService.listChannelDetailByTradeId(tradeId); + } + + @Transactional( + rollbackFor = {Exception.class} + ) + public void updateOrderRechargeId(Long tradeId, String newMacOrderId, List newOrderRechargeIds) { + if (!CollUtil.isEmpty(newOrderRechargeIds)) { + this.tradeRecordService.deleteOrderRechargeTrade(tradeId); + this.tradeRecordService.insertOrderRechargeTrade(newOrderRechargeIds.stream().map((s) -> { + return new TradeOrderRecharge(tradeId, s, newMacOrderId, (LocalDateTime)null, (LocalDateTime)null); + }).collect(Collectors.toList())); + } + } + + public TradeRecord getLastTradeRecordByOrderId(Long orderId) { + return (TradeRecord)this.tradeRecordService.queryTradeRecordInfoList((String)null, orderId, (Integer)null, (Integer)null).stream().sorted(Comparator.comparing(TradeRecord::getId).reversed()).findFirst().orElse((TradeRecord) null); + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeOrderRechargeMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeOrderRechargeMapper.java index ab099286..8bdf44b9 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeOrderRechargeMapper.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeOrderRechargeMapper.java @@ -6,10 +6,13 @@ import com.bonus.core.pay.common.model.TradeOrderRecharge; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.time.LocalDateTime; import java.util.List; @Mapper @InterceptorIgnore public interface TradeOrderRechargeMapper extends BaseMapper { void batchInsert(@Param("tradeOrderRechargeList") List tradeOrderRechargeList); + + List listSuccessByOrderIds(@Param("orderIds") List orderIds, @Param("stratTime") LocalDateTime stratTime, @Param("endTime") LocalDateTime endTime); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeRecordMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeRecordMapper.java index 95bf67cc..686395c9 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeRecordMapper.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeRecordMapper.java @@ -13,5 +13,6 @@ import java.util.List; @InterceptorIgnore public interface TradeRecordMapper extends BaseMapper { + List queryTradeRecordInfo(@Param("macOrderId") String macOrderId, @Param("orderRechargeId") Long orderRechargeId, @Param("tradeState") Integer tradeState, @Param("tradeType") Integer tradeType, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); List listTradeRecordByOrderRechargeId(@Param("orderRechargeId") Long orderRechargeId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("tradeState") Integer... tradeState); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeRecordService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeRecordService.java index 87f1437e..019eae2c 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeRecordService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeRecordService.java @@ -21,9 +21,15 @@ public interface TradeRecordService { List queryOrderRechargeTrade(Long tradeId); + List listSuccessByOrderIds(List orderIds); + TradeRecord getTradeRecordByOrderRechargeId(Long orderRechargeId, Integer... tradeState); void insertTradeRecord(TradeRecord tradeRecord); void insertOrderRechargeTrade(List tradeOrderRechargeList); + + void deleteOrderRechargeTrade(Long tradeId); + + List queryTradeRecordInfoList(String macOrderId, Long orderRechargeId, Integer tradeState, Integer tradeType); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeRecordServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeRecordServiceImpl.java index 6bfad9fb..07098d23 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeRecordServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeRecordServiceImpl.java @@ -97,6 +97,15 @@ public class TradeRecordServiceImpl extends ServiceImpl listSuccessByOrderIds(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return CollUtil.newArrayList(new TradeOrderRecharge[0]); + } else { + List timeRange = LeOrderUtil.queryCreateTimeRange(); + return this.tradeOrderRechargeMapper.listSuccessByOrderIds(orderIds, (LocalDateTime)timeRange.get(0), (LocalDateTime)timeRange.get(1)); + } + } + @Override public TradeRecord getTradeRecordByOrderRechargeId(Long orderRechargeId, Integer... tradeState) { log.info("[交易记录] getTradeRecordByOrderRechargeId 开始"); @@ -110,4 +119,21 @@ public class TradeRecordServiceImpl extends ServiceImpl queryTradeRecordInfoList(String macOrderId, Long orderRechargeId, Integer tradeState, Integer tradeType) { + if (CharSequenceUtil.isEmpty(macOrderId) && !LeNumUtil.isValidId(orderRechargeId)) { + return CollUtil.newArrayList(new TradeRecord[0]); + } else { + log.info("[交易记录] queryTradeRecordInfoList 开始"); + List timeRange = LeOrderUtil.queryCreateTimeRange(); + List tradeRecordList = ((TradeRecordMapper)this.baseMapper).queryTradeRecordInfo(macOrderId, orderRechargeId, tradeState, tradeType, (LocalDateTime)timeRange.get(0), (LocalDateTime)timeRange.get(1)); + log.info("[交易记录] queryTradeRecordInfoList 结束"); + return tradeRecordList; + } + } + } diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/bootstrap.yml b/bonus-modules/bonus-smart-canteen/src/main/resources/bootstrap.yml index 149c891c..80f501d6 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/resources/bootstrap.yml +++ b/bonus-modules/bonus-smart-canteen/src/main/resources/bootstrap.yml @@ -92,6 +92,9 @@ system: sqbqrapi: ${SQB_QR_API:https://qr.shouqianba.com/gateway} #收钱吧网关地址 alismsdomain: ${API_ALI_SMS_DOMAIN:dysmsapi.aliyuncs.com} #阿里云短信请求地址 feieapi: ${API_FEI_E:http://api.feieyun.cn} #飞鹅api + order: + call: + max-num: ${ORDER_CALL_MAX_NUM:999} data-config: sm4-key: ${SENSITIVE_SM4KEY:jY7bZz6Pjml+H/WZYfNSNA==} diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeOrderRechargeMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeOrderRechargeMapper.xml index dbf72ef9..65c67d92 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeOrderRechargeMapper.xml +++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeOrderRechargeMapper.xml @@ -12,4 +12,21 @@ + + diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeRecordMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeRecordMapper.xml index a6e10359..5e9ea549 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeRecordMapper.xml +++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeRecordMapper.xml @@ -4,6 +4,46 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + +