diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java index 500a0f96d..a45c4caa9 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java @@ -149,6 +149,13 @@ public class WxCouponOrderController extends BaseController { return wxCouponOrderService.listOnDateAsPageV2(getLoginBUser().getId(), startDate, endDate, pageNum, pageSize, true); } + @ApiOperation("核销流水统计接口") + @GetMapping("sumVerified") + public ResultData sumVerified(@RequestParam("startDate") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date startDate, + @RequestParam("endDate") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date endDate) { + return wxCouponOrderService.sumVerified(getLoginBUser(), startDate, endDate); + } + @ApiOperation("某日期交易总流水") @GetMapping("getUnverifiedAmountOnDate") @ApiImplicitParams({ diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java index 9439d1864..6ae807016 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java @@ -276,6 +276,14 @@ public class WxMicroPayController extends BaseController { return wxOrderService.microPayListOnDateAsPageV2(getLoginBUser().getId(), EnumOrderType.MICROPAY.getCode(), startDate, endDate, pageNum, pageSize); } + @RedisCache + @ApiOperation("付款码支付交易流水分页列表接口") + @GetMapping("sumMicroPay") + public ResultData sumMicroPay(@RequestParam("startDate") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date startDate, + @RequestParam("endDate") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date endDate) { + return wxOrderService.sumMicroPay(getLoginBUser(), EnumOrderType.MICROPAY.getCode(), startDate, endDate); + } + @RedisCache @ApiOperation("付款码支付某日期交易总流水") @GetMapping("getMicroPayAmountOnDate") diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/car/WxParkCallBackBaseController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/car/WxParkCallBackBaseController.java index c556fc451..9e8db84e8 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/callback/car/WxParkCallBackBaseController.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/car/WxParkCallBackBaseController.java @@ -13,6 +13,7 @@ import com.iformall.service.park.ParkFactory; import com.iformall.service.park.entity.ParkNotifyParam; import com.iformall.service.park.utils.ParkCacheUtils; import com.iformall.utils.DateUtils; +import com.iformall.utils.RedisCacheUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -168,9 +169,15 @@ public class WxParkCallBackBaseController extends BaseController { if (null == param) { return new Result(); } + // 回调去重 + String key = "callback:" + param.getCarNumber(); + if (RedisCacheUtils.hasKey(redisTemplate, key)) { + logger.info("回调数据重复=========>{}", JSON.toJSONString(param)); + return new Result(); + } + RedisCacheUtils.cache(redisTemplate, key, "", 60 * 2); String carNumber = param.getCarNumber(); - ParkCacheUtils.removeCache(redisTemplate, vendor.getMessage(), carNumber); ParkCacheUtils.setCarCouponUnUseCacheLock(redisTemplate, vendor.getMessage(), carNumber); diff --git a/mallinkPublicApi/src/main/java/com/iformall/utils/CallTest.java b/mallinkPublicApi/src/main/java/com/iformall/utils/CallTest.java index 8945ced5a..8caeb86bb 100644 --- a/mallinkPublicApi/src/main/java/com/iformall/utils/CallTest.java +++ b/mallinkPublicApi/src/main/java/com/iformall/utils/CallTest.java @@ -12,9 +12,9 @@ public class CallTest { private static final String BASIC_URL = "https://openapitest.malls.iformall.com"; public static void main(String[] args) { - String appId = "CP6nwHvZ"; - String appKey = "b257eb97bb9380714306a077a66086e8b1f10639"; - String signKey = "C61842C8570524AA81756C53B8096978A06AE00D"; + String appId = "YhCW8Dra"; + String appKey = "389ac85b768b19427685bcc4adea0474cef22a14"; + String signKey = "B0AB3E2CBCB484D04AEAD0BEF933F7CF5489450C"; // 会员注册 // userRegister(appId, appKey, signKey); diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/SumMicroPayVO.java b/mallinkService/src/main/java/com/iformall/domain/vo/SumMicroPayVO.java new file mode 100644 index 000000000..810b8532e --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/SumMicroPayVO.java @@ -0,0 +1,11 @@ +package com.iformall.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class SumMicroPayVO { + private BigDecimal amount; + private Integer total; +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/SumVerifiedVO.java b/mallinkService/src/main/java/com/iformall/domain/vo/SumVerifiedVO.java new file mode 100644 index 000000000..e2a774c0f --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/SumVerifiedVO.java @@ -0,0 +1,11 @@ +package com.iformall.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class SumVerifiedVO { + private BigDecimal amount; + private Integer total; +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java index 35a51fff3..7b7fc5f98 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java @@ -112,4 +112,14 @@ public interface WxCouponOrderMapper extends CommonMapper { * @return */ List findVerifiedUserIds(@Param("tenantId")String tenantId, @Param("verifiedStartTime")Date verifiedStartTime, @Param("verifiedEndTime")Date verifiedEndTime); + + /** + * 统计核销记录总金额 + * @param tenantId + * @param merchantId + * @param startDate + * @param endDate + * @return {@link Integer} + */ + SumVerifiedVO sumVerified(@Param("tenantId") String tenantId, @Param("bMerchantId") Long merchantId, @Param("startDate") Date startDate, @Param("endDate") Date endDate); } diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxOrderMapper.java index 4d7adf803..c6412caee 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxOrderMapper.java @@ -67,4 +67,6 @@ public interface WxOrderMapper extends CommonMapper { void updateCUserId(WxOrder updateOrder); List getComposeOrderIds(WxOrder wxOrder); + + SumMicroPayVO sumMicroPay(Map dateMap); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java index fee13d1f1..004281646 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java @@ -239,6 +239,7 @@ public interface WxCouponOrderService { List findAvailCouponOrder(TenantEntity tenantEntity,Long cUserId,Long merchantId,Long posOrderId); PageInfo userTradeDetailList(WxMerchant wxMerchant,Date startTime,Date endTime,Integer pageIndex,Integer pageSize); - - + + + ResultData sumVerified(WxMerchantBUser bUser, Date startDate, Date endDate); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 0658f155b..f7a7b781c 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -200,6 +200,14 @@ public interface WxOrderService { void updateStatusByPressCouponId(Long couponId, TenantEntity tenantEntity,int orderStatus); + /** + * 通过优惠券id更新订单状态 + * @param tenantId + * @param couponId + * @param orderStatus + */ + void updateStatusByPressCouponId(String tenantId, Long couponId, int orderStatus); + void updateOrderStatus(WxOrder order); void updateOrderGroupStatusByCouponId(Long id, TenantEntity tenantEntity, Integer code); @@ -284,4 +292,5 @@ public interface WxOrderService { ResultData handlerPushOrder(TenantEntity tenantEntity, Long composeOrderId, String batchExtParam, List goods); + ResultData sumMicroPay(WxMerchantBUser bUser, Integer type, Date startDate, Date endDate); } diff --git a/mallinkService/src/main/java/com/iformall/service/helper/WxOrderServiceHelper.java b/mallinkService/src/main/java/com/iformall/service/helper/WxOrderServiceHelper.java index 5fd12a9fd..e2b01ff2f 100644 --- a/mallinkService/src/main/java/com/iformall/service/helper/WxOrderServiceHelper.java +++ b/mallinkService/src/main/java/com/iformall/service/helper/WxOrderServiceHelper.java @@ -2,10 +2,14 @@ package com.iformall.service.helper; import com.iformall.common.ErrorCode; import com.iformall.domain.po.WxCoupon; +import com.iformall.domain.po.base.TenantEntity; import com.iformall.enums.EnumCacheKey; +import com.iformall.enums.EnumOrderStatus; +import com.iformall.enums.EnumYesOrNo; import com.iformall.exception.MallinkException; import com.iformall.service.WxCouponChannelService; import com.iformall.service.WxCouponService; +import com.iformall.service.WxOrderService; import com.iformall.utils.RedisLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,48 +17,63 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.util.concurrent.CompletableFuture; + @Service public class WxOrderServiceHelper { - private static final Logger logger = LoggerFactory.getLogger(WxOrderServiceHelper.class); - + private static final Logger logger = LoggerFactory.getLogger(WxOrderServiceHelper.class); + @Lazy @Autowired WxCouponChannelService wxCouponChannelService; - + @Lazy @Autowired WxCouponService wxCouponService; - + + @Lazy + @Autowired + private WxOrderService wxOrderService; + @Autowired RedisLock redisLock; + /** * 微信订单是否可以支付 */ - public void reduceStock(boolean isChannelStockReduce, WxCoupon coupon,Long couponChannelId,int number) throws Exception{ - if (isChannelStockReduce) { - try { - wxCouponChannelService.reduceChannelStock(coupon,couponChannelId,number); - long stock = redisLock.decrease(EnumCacheKey.COUPON_CHANNEL_STOCK.getMessage()+couponChannelId, number); - if (stock < 0 ) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]渠道["+couponChannelId+"]库存已为零!"); - } - } catch (RuntimeException e) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]渠道["+couponChannelId+"]库存更新失败!"+e.getMessage()); - } - - }else { - try { - wxCouponService.reduceRemainInventory(coupon,coupon.getId(),number); - long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), number); - if (stock < 0 ) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]库存已为零!"); - } - } catch (RuntimeException e) { - logger.error("此券减库存失败, couponId: " + coupon.getId(),e); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]库存更新失败!"+e.getMessage()); - } - } + public void reduceStock(boolean isChannelStockReduce, WxCoupon coupon, Long couponChannelId, int number, Boolean isPressOrder) throws Exception { + long stock; + if (isChannelStockReduce) { + try { + wxCouponChannelService.reduceChannelStock(coupon, couponChannelId, number); + stock = redisLock.decrease(EnumCacheKey.COUPON_CHANNEL_STOCK.getMessage() + couponChannelId, number); + if (stock < 0) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "券[" + coupon.getTitle() + "]渠道[" + couponChannelId + "]库存已为零!"); + } + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "券[" + coupon.getTitle() + "]渠道[" + couponChannelId + "]库存更新失败!" + e.getMessage()); + } + + } else { + try { + wxCouponService.reduceRemainInventory(coupon, coupon.getId(), number); + stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage() + coupon.getId(), number); + if (stock < 0) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "券[" + coupon.getTitle() + "]库存已为零!"); + } + } catch (RuntimeException e) { + logger.error("此券减库存失败, couponId: " + coupon.getId(), e); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "券[" + coupon.getTitle() + "]库存更新失败!" + e.getMessage()); + } + } + + // 砍价订单,支付时扣库存,库存不足 则修改砍价订单状态 + CompletableFuture.runAsync(() -> { + if (isPressOrder && null != coupon.getPressPayReduceStock() && coupon.getPressPayReduceStock().intValue() == EnumYesOrNo.YES.getCode().intValue() && stock <= 0 ) { + wxOrderService.updateStatusByPressCouponId(coupon.getTenantId(), coupon.getCouponId(), EnumOrderStatus.ORDER_STATUS_PRESS_CANCEL.getCode()); + } + }); } - + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java index 63a5b738c..68d404b13 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java @@ -320,8 +320,6 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { if (isVerified) { PageInfo pageResult = findListOfVerifiedByDateForBUser(wxMerchant, wxMerchant.getId(), startDate, endDate, pageIndex, pageSize); resultMap.put("list", pageResult); - int amount = pageResult.getList() != null ? pageResult.getList().stream().mapToInt(WxCouponOrderBVo::getCouponPrice).sum() : 0; - resultMap.put("amount", amount); }else { resultMap.put("list", findListOfOrderedByDateForBUser(wxMerchant,wxMerchant.getId(),startDate,endDate,pageIndex,pageSize)); } @@ -3255,8 +3253,14 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { retPageInfo.setList(couponOrderListToTradeDetailVoList(wxMerchant,pageInfo.getList())); return retPageInfo; } - - private List couponOrderListToTradeDetailVoList(TenantEntity tenantEntity,List couponOrderList) { + + @Override + public ResultData sumVerified(WxMerchantBUser bUser, Date startDate, Date endDate) { + SumVerifiedVO vo = wxCouponOrderMapper.sumVerified(bUser.getTenantId(), bUser.getMerchantId(), startDate, endDate); + return new ResultData(vo); + } + + private List couponOrderListToTradeDetailVoList(TenantEntity tenantEntity,List couponOrderList) { if (null == couponOrderList || couponOrderList.size() <=0 ) { return null; } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 9a08bd3aa..a89a928ca 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -312,8 +312,6 @@ public class WxOrderServiceImpl implements WxOrderService { } else { PageInfo pageResult = orderPayVoPageInfo(wxMerchantBUser, pageIndex, pageSize, dateMap); resultMap.put("list", pageResult); - int amount = pageResult.getList() != null ? pageResult.getList().stream().mapToInt(WxOrderPayVo::getPayment).sum() : 0; - resultMap.put("amount", amount); } return resultMap; } @@ -1121,7 +1119,7 @@ public class WxOrderServiceImpl implements WxOrderService { } if (isReduceStock) { try { - wxOrderServiceHelper.reduceStock(isChannelStockReduce,coupon,couponChannelId, number); + wxOrderServiceHelper.reduceStock(isChannelStockReduce,coupon,couponChannelId, number, isPressOrder); }catch (Exception e) { throw new MallinkException(ErrorCode.DB_FAIL.getCode(),e.getMessage()); } @@ -3056,6 +3054,16 @@ public class WxOrderServiceImpl implements WxOrderService { wxOrderMapper.updateStatusByPressCouponId(updateOrder); } + @Override + public void updateStatusByPressCouponId(String tenantId, Long couponId, int orderStatus) { + WxOrder updateOrder = new WxOrder(); + updateOrder.setTenantId(tenantId); + updateOrder.setOrderStatus(orderStatus); + updateOrder.setProductId(couponId); + updateOrder.setUpdateDate(new Date()); + wxOrderMapper.updateStatusByPressCouponId(updateOrder); + } + @Autowired @Qualifier("cUserBasicInfoRedisTemplate") RedisTemplate cUserBasicInfoRedisTemplate; @@ -3951,6 +3959,27 @@ public class WxOrderServiceImpl implements WxOrderService { // } } + @Override + public ResultData sumMicroPay(WxMerchantBUser bUser, Integer type, Date startDate, Date endDate) { + Map dataMap = new HashMap(); + dataMap.put("startDate", startDate); + dataMap.put("endDate", endDate); + dataMap.put("merchantId", bUser.getMerchantId()); + dataMap.put("type", type); + dataMap.put("tenantId", bUser.getTenantId()); + dataMap.put("finalTenantId", bUser.getFinalTenantId()); + WxMerchantBUser merchantBUserQ = new WxMerchantBUser(); + merchantBUserQ.updateTenantInfo(bUser); + merchantBUserQ.setMerchantId(bUser.getMerchantId()); + List bUserIds = wxMerchantBUserMapper.findIdList(merchantBUserQ); + if (null == bUserIds || bUserIds.size() <= 0 ) { + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + dataMap.put("bUserIds", bUserIds); + SumMicroPayVO vo = wxOrderMapper.sumMicroPay(dataMap); + return new ResultData(vo); + } + private Map> getBatchOrderMap(TenantEntity tenantEntity,List batchOrderIds){ WxOrder recordQ = new WxOrder(); recordQ.updateTenantInfo(tenantEntity); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 3df03d19b..798158b87 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -214,7 +214,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if (null != coupon && coupon.getType().intValue() == EnumCouponType.COUPON_PRESS.getCode().intValue() && null != coupon.getPressPayReduceStock() && coupon.getPressPayReduceStock().intValue() == EnumYesOrNo.YES.getCode().intValue()) { try { - wxOrderServiceHelper.reduceStock(false,coupon,order.getCouponChannelId(), 1); + wxOrderServiceHelper.reduceStock(false,coupon,order.getCouponChannelId(), 1, true); return true; }catch(Exception e) { //如果此时扣库存失败,则需要给订单退款 diff --git a/mallinkService/src/main/java/com/iformall/utils/RedisCacheUtils.java b/mallinkService/src/main/java/com/iformall/utils/RedisCacheUtils.java index 790cdb8e3..1f699f105 100644 --- a/mallinkService/src/main/java/com/iformall/utils/RedisCacheUtils.java +++ b/mallinkService/src/main/java/com/iformall/utils/RedisCacheUtils.java @@ -167,4 +167,8 @@ public class RedisCacheUtils { Set keys = template.keys(prefix+"*"); template.delete(keys); } + + public static Boolean hasKey(RedisTemplate template,String key) { + return template.hasKey(key); + } } diff --git a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml index 3920e10f6..c3eaa6301 100644 --- a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml @@ -1182,5 +1182,20 @@ and update_date >= #{verifiedStartTime} and update_date <= #{verifiedEndTime} + \ No newline at end of file diff --git a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml index 6494f9cec..a6fd2a1bd 100644 --- a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml @@ -1171,5 +1171,34 @@ - + +