diff --git a/mallinkAdmin/src/main/java/com/iformall/config/RedisConfig.java b/mallinkAdmin/src/main/java/com/iformall/config/RedisConfig.java index 4376ff5fb..1e583d264 100644 --- a/mallinkAdmin/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkAdmin/src/main/java/com/iformall/config/RedisConfig.java @@ -2,6 +2,7 @@ package com.iformall.config; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponChannelVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -194,4 +195,21 @@ public class RedisConfig extends CachingConfigurerSupport { return template; } + @Bean("couponDetailRedisTemplate") + public RedisTemplate getCouponDetailRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer(WxCouponCVo.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } + } diff --git a/mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java b/mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java index 0502a5eeb..857f38ec2 100644 --- a/mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java @@ -2,6 +2,7 @@ package com.iformall.config; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponChannelVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -154,4 +155,21 @@ public class RedisConfig extends CachingConfigurerSupport { template.setConnectionFactory(connectionFactory); return template; } + + @Bean("couponDetailRedisTemplate") + public RedisTemplate getCouponDetailRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer(WxCouponCVo.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } } diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxInfoController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxInfoController.java index 0c2edf9d5..5388ee302 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxInfoController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxInfoController.java @@ -219,6 +219,9 @@ public class WxInfoController extends BaseController { } WxAppinfo wxAppinfo = getAppInfo(appId); + if (wxAppinfo == null) { + return new ResultData(Result.ERROR, "APP无权限"); + } TenantEntity tenantEntity = new TenantEntity() {{ setTenantId(wxAppinfo.getTenantId()); }}; diff --git a/mallinkCallback/src/main/java/com/iformall/config/RedisConfig.java b/mallinkCallback/src/main/java/com/iformall/config/RedisConfig.java index cd0636c2b..081c8fed4 100644 --- a/mallinkCallback/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkCallback/src/main/java/com/iformall/config/RedisConfig.java @@ -2,6 +2,7 @@ package com.iformall.config; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponChannelVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -192,4 +193,21 @@ public class RedisConfig extends CachingConfigurerSupport { template.setConnectionFactory(connectionFactory); return template; } + + @Bean("couponDetailRedisTemplate") + public RedisTemplate getCouponDetailRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer(WxCouponCVo.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } } diff --git a/mallinkMQConsumer/src/main/java/com/iformall/config/RedisConfig.java b/mallinkMQConsumer/src/main/java/com/iformall/config/RedisConfig.java index 28031fe0a..c98f8ea36 100644 --- a/mallinkMQConsumer/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkMQConsumer/src/main/java/com/iformall/config/RedisConfig.java @@ -2,6 +2,7 @@ package com.iformall.config; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponChannelVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -178,4 +179,21 @@ public class RedisConfig extends CachingConfigurerSupport { template.setConnectionFactory(connectionFactory); return template; } + + @Bean("couponDetailRedisTemplate") + public RedisTemplate getCouponDetailRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer(WxCouponCVo.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } } diff --git a/mallinkPosApi/src/main/java/com/iformall/config/RedisConfig.java b/mallinkPosApi/src/main/java/com/iformall/config/RedisConfig.java index 1fd287467..bc14001a4 100644 --- a/mallinkPosApi/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkPosApi/src/main/java/com/iformall/config/RedisConfig.java @@ -2,6 +2,7 @@ package com.iformall.config; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponChannelVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -156,4 +157,21 @@ public class RedisConfig extends CachingConfigurerSupport { template.setConnectionFactory(connectionFactory); return template; } + + @Bean("couponDetailRedisTemplate") + public RedisTemplate getCouponDetailRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer(WxCouponCVo.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } } diff --git a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java index ffab6c2d6..28475f560 100644 --- a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java +++ b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java @@ -1891,7 +1891,13 @@ public class PosServiceImpl implements PosService { Long posOrderId, Long memId, Integer orderAmount, Date orderTime, String orderCreateSn) { WxOrder order = createOrderByPos(buUser, memId, posOrderId, orderAmount, orderTime, orderCreateSn); String payDetail = params.get(WxPayConstant.PAY_DETAIL); - JSONObject payDetailObj = JSON.parseObject(payDetail); + JSONObject payDetailObj = null; + try { + payDetailObj = JSON.parseObject(payDetail); + } catch (Exception e) { + logger.error("parse PAY_DETAIL error: {}", e.getMessage()); + throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); + } PromotionCalc scoreCreditCalc = new PromotionCalc(); scoreCreditCalc.setScore(0); scoreCreditCalc.setCredit(0); @@ -2185,8 +2191,13 @@ public class PosServiceImpl implements PosService { throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR); } WxCardSpend cardSpend = cardSpendService.getById(cardSpendId); - cardSpend.setOrderId(order.getId()); - cardSpendService.cardSpendForPosPay(scoreCreditCalc, cardSpend, merchant, buUser); + if (cardSpend != null) { + cardSpend.setOrderId(order.getId()); + cardSpendService.cardSpendForPosPay(scoreCreditCalc, cardSpend, merchant, buUser); + } else { + logger.error("卡支付ID未发现: " + cardSpendId); + throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR); + } return payOrder; } diff --git a/mallinkSchedule/src/main/java/com/iformall/config/RedisConfig.java b/mallinkSchedule/src/main/java/com/iformall/config/RedisConfig.java index 307350e95..5688e5374 100644 --- a/mallinkSchedule/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkSchedule/src/main/java/com/iformall/config/RedisConfig.java @@ -2,6 +2,7 @@ package com.iformall.config; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponChannelVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -179,4 +180,21 @@ public class RedisConfig extends CachingConfigurerSupport { return template; } + @Bean("couponDetailRedisTemplate") + public RedisTemplate getCouponDetailRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer(WxCouponCVo.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } + } diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java index 5dfdfce85..b412d4e75 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java @@ -1,6 +1,7 @@ package com.iformall.schedule; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.iformall.common.ErrorCode; import com.iformall.domain.dto.WxSharingOrderDto; import com.iformall.domain.po.*; import com.iformall.enums.*; @@ -9,6 +10,7 @@ import com.iformall.mapper.*; import com.iformall.service.WxOrderService; import com.iformall.service.WxProfitSharingOrderService; import com.iformall.service.WxRefundOrderService; +import com.iformall.utils.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -119,11 +121,20 @@ public class CouponOrderExpiringSchedule { appinfo.setType(EnumAppType.B.getCode()); appinfo = wxAppinfoMapper.findList(appinfo).get(0); + Date limitDate = DateUtils.getTimeAfterDays(360, co.getCreateDate()); + if (limitDate.before(new Date())) { + // 系统只自动处理360天内的订单 + return; + } + try { wxRefundOrderService.createRefundOrder(appinfo, co.getId(), EnumPayType.PAY_AUTO_REFUND, null); } catch (MallinkException e) { - logger.error("退款失败:"+e.getMessage()+"couponOrderId="+co.getId()); - throw new MallinkException(e.getErrorCode(), e.getMessage()); + if (e.getErrorCode() == ErrorCode.REFUND_NOT_ALLOW.getCode()) { + } else { + logger.error("退款失败:" + e.getMessage() + "couponOrderId=" + co.getId()); + throw new MallinkException(e.getErrorCode(), e.getMessage()); + } } } diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java index 9400fb5d2..156c2c39e 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java @@ -1,18 +1,21 @@ package com.iformall.schedule; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.iformall.common.ErrorCode; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxOrder; import com.iformall.enums.EnumAppType; import com.iformall.enums.EnumOrderStatus; import com.iformall.enums.EnumOrderType; import com.iformall.enums.EnumRefundStatus; +import com.iformall.exception.MallinkException; import com.iformall.mapper.WxAppinfoMapper; import com.iformall.mapper.WxCouponMapper; import com.iformall.mapper.WxOrderGroupMapper; import com.iformall.mapper.WxOrderMapper; import com.iformall.service.WxOrderService; import com.iformall.service.WxRefundOrderService; +import com.iformall.utils.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -208,10 +211,22 @@ public class OrderExpiringSchedule { appinfo.updateTenantInfo(order); appinfo.setType(EnumAppType.C.getCode()); appinfo = wxAppinfoMapper.findList(appinfo).get(0); + Date limitDate = DateUtils.getTimeAfterDays(360, order.getCreateDate()); + if (limitDate.before(new Date())) { + // 系统只自动处理180内的订单 + return; + } //退款流程 boolean has = wxRefundOrderService.hasRefundOrder(order.getId(), EnumRefundStatus.REFUND_SUCCESS.getCode()); if (!has) { - wxRefundOrderService.returnMoney(appinfo, order.getId()); + try { + wxRefundOrderService.returnMoney(appinfo, order.getId()); + } catch (MallinkException e) { + if (e.getErrorCode() == ErrorCode.REFUND_NOT_ALLOW.getCode()) { + + } + throw new MallinkException(e.getErrorCode(), e.getMessage()); + } } } diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java index 23e33e92d..11b6d21bb 100644 --- a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java @@ -296,6 +296,7 @@ public enum ErrorCode{ REFUND_ORDER_NOTIFY_CHECK_SIGN_ERROR(12014, "退款验签失败"), REFUND_ORDER_BUSER_IS_NULL(12015, "B端用户不存在"), REFUND_ORDER_BUSER_NOT_EQUAL(12016, "B端用户无操作权限"), + REFUND_NOT_ALLOW(12017, "退款订单不允许退款"), APP_ID_NOT_FOUND(12020, "APPID没找到"), MCH_INFO_NOT_FOUND(12021, "微信商户平台信息没找到"), diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumNeuPosPamentType.java b/mallinkService/src/main/java/com/iformall/enums/EnumNeuPosPamentType.java index 8673744f9..7d3cb28fa 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumNeuPosPamentType.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumNeuPosPamentType.java @@ -5,13 +5,15 @@ package com.iformall.enums; */ public enum EnumNeuPosPamentType { - // 来源于Neusoft的定义 0微信;1支付宝;2现金;3优惠券;4预付卡;5银行卡 + // 来源于Neusoft的定义 0微信;1支付宝;2现金;3-会员折扣, 4优惠券;5预付卡;6银行卡7记账 WECHAT(0, "微信"), ALIPAY(1, "支付宝"), CASH(2, "现金"), - MEM_COUPON(3, "优惠券"), - MEM_CARD(4, "预付卡"), - MEM_BANKCARD(5, "银行卡"), + MEM_DEDUCT(3, "会员折扣"), + MEM_COUPON(4, "优惠券"), + MEM_CARD(5, "预付卡"), + MEM_BANKCARD(6, "银行卡"), + RECORD(7, "记账"), ; public static EnumNeuPosPamentType getEnum(Integer code) { for (EnumNeuPosPamentType value : values()) { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java index 0ecefd21e..63054c3c1 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java @@ -10,6 +10,7 @@ import com.iformall.common.ErrorCode; import com.iformall.common.IdWorker; import com.iformall.common.ResultData; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponChannelVo; import com.iformall.enums.EnumCouponChannelStatus; import com.iformall.enums.EnumCouponChannelType; @@ -24,11 +25,15 @@ import com.iformall.service.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.concurrent.TimeUnit; @Service public class WxGameServiceImpl implements WxGameService { @@ -58,6 +63,10 @@ public class WxGameServiceImpl implements WxGameService { @Autowired private QrCodeService qrCodeService; + @Autowired + @Qualifier("couponDetailRedisTemplate") + RedisTemplate cdRedisTemplate; + @Override public PageInfo listAsPage(WxGame record, Integer pageIndex, Integer pageSize) { PageInfo page = PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxGameMapper.findList(record)); @@ -176,6 +185,7 @@ public class WxGameServiceImpl implements WxGameService { // get game's coupon List couponIdsList = new ArrayList(); JSONArray couponChannelIds = JSON.parseArray(record.getCouponIds()); + ValueOperations operations = cdRedisTemplate.opsForValue(); for(int i=0; i cUserTokenRedisTemplate; + @Override public WxOrder saveOrderForCoupon(WxCUser user, WxCoupon coupon, OrderSaveDto orderSaveDto, boolean isPress) { WxOrder order = null; + // 防止同一用户重复抽奖(一分钟内) + // 1. 订单保存时 加入redis缓存,key --> action:userId:couponId , 时间1000ms + // 2. 如果存在,说明该用户正在下单,返回异常提示 + // 3. 方法结束时清除 key if (checkCouponIsFree(coupon)) { // 免费券 + String key = StringUtils.join("action", ":", user.getId(), coupon.getId()); + boolean hasKey = cUserTokenRedisTemplate.hasKey(key); + if (hasKey) { + logger.error("用户正在下单,请求异常返回,user: {} " + JSON.toJSONString(user)); + throw new MallinkException(ErrorCode.SYS_REPEAT_SUBMIT_EXCEPTION); + } + cUserTokenRedisTemplate.opsForValue().set(key, user, 1000, TimeUnit.MILLISECONDS); order = saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null); if (order != null) { // 6. 下订单完成,发送内部消息 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java index e6b8e0a7d..f196bb745 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java @@ -511,6 +511,12 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR); } } else { + String errDesc = returnMap.get("err_code_des"); + if (errDesc.equalsIgnoreCase("订单已全额退款")) { + record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_SUCCESS.getCode()); + wxRefundOrderMapper.updateById(record); + return new ResultData(Result.SUCCESS, "退款订单申请成功", returnMap); + } logger.error("微信退款订单申请失败: " + response); String errMsg = ""; JSONObject errObj = errorRefundReqMap.getJSONObject(result_no); @@ -523,6 +529,10 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { } record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_FAIL.getCode()); wxRefundOrderMapper.updateById(record); + if (errDesc.equalsIgnoreCase("超期订单不允许退款")) { + // 更新券状态 + throw new MallinkException(ErrorCode.REFUND_NOT_ALLOW); + } return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), errMsg, returnMap); } } else { @@ -590,6 +600,13 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), "订单状态更新失败"); } } else { + // 特殊处理 + String errDesc = returnMap.get("err_code_des"); + if (errDesc.equalsIgnoreCase("订单已全额退款")) { + record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_SUCCESS.getCode()); + wxRefundOrderMapper.updateById(record); + return new ResultData(Result.SUCCESS, "退款订单申请成功", returnMap); + } logger.error("微信退款订单申请失败: " + response); String errMsg = ""; JSONObject errObj = errorRefundReqMap.getJSONObject(result_no); @@ -602,6 +619,10 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { } record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_FAIL.getCode()); wxRefundOrderMapper.updateById(record); + if (errDesc.equalsIgnoreCase("超期订单不允许退款")) { + // 更新券状态 + throw new MallinkException(ErrorCode.REFUND_NOT_ALLOW); + } throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), errMsg); } } @@ -800,6 +821,12 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR); } } else { + String errDesc = returnMap.get("err_code_des"); + if (errDesc.equalsIgnoreCase("订单已全额退款")) { + record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_SUCCESS.getCode()); + wxRefundOrderMapper.updateById(record); + return new ResultData(Result.SUCCESS, "退款订单申请成功", returnMap); + } logger.error("微信退款订单申请失败: " + response); String errMsg = ""; JSONObject errObj = errorRefundReqMap.getJSONObject(result_no); @@ -812,6 +839,10 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { } record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_FAIL.getCode()); wxRefundOrderMapper.updateById(record); + if (errDesc.equalsIgnoreCase("超期订单不允许退款")) { + // 更新券状态 + throw new MallinkException(ErrorCode.REFUND_NOT_ALLOW); + } return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), errMsg, returnMap); } } else { @@ -879,6 +910,12 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), "订单状态更新失败"); } } else { + String errDesc = returnMap.get("err_code_des"); + if (errDesc.equalsIgnoreCase("订单已全额退款")) { + record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_SUCCESS.getCode()); + wxRefundOrderMapper.updateById(record); + return new ResultData(Result.SUCCESS, "退款订单申请成功", returnMap); + } logger.error("微信退款订单申请失败: " + response); String errMsg = ""; JSONObject errObj = errorRefundReqMap.getJSONObject(result_no); @@ -891,6 +928,10 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { } record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_FAIL.getCode()); wxRefundOrderMapper.updateById(record); + if (errDesc.equalsIgnoreCase("超期订单不允许退款")) { + // 更新券状态 + throw new MallinkException(ErrorCode.REFUND_NOT_ALLOW); + } throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), errMsg); } } @@ -1404,6 +1445,12 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR); } } else { + String errDesc = returnMap.get("err_code_des"); + if (errDesc.equalsIgnoreCase("订单已全额退款")) { + record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_SUCCESS.getCode()); + wxRefundOrderMapper.updateById(record); + return new ResultData(Result.SUCCESS, "退款订单申请成功", returnMap); + } logger.error("微信退款订单申请失败: " + response); String errMsg = ""; JSONObject errObj = errorRefundReqMap.getJSONObject(result_no); @@ -1416,6 +1463,10 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { } record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_FAIL.getCode()); wxRefundOrderMapper.updateById(record); + if (errDesc.equalsIgnoreCase("超期订单不允许退款")) { + // 更新券状态 + throw new MallinkException(ErrorCode.REFUND_NOT_ALLOW); + } return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), errMsg, returnMap); } } else { @@ -1476,6 +1527,12 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), "订单状态更新失败"); } } else { + String errDesc = returnMap.get("err_code_des"); + if (errDesc.equalsIgnoreCase("订单已全额退款")) { + record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_SUCCESS.getCode()); + wxRefundOrderMapper.updateById(record); + return new ResultData(Result.SUCCESS, "退款订单申请成功", returnMap); + } logger.error("微信退款订单申请失败: " + response); String errMsg = ""; JSONObject errObj = errorRefundReqMap.getJSONObject(result_no); @@ -1488,6 +1545,10 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { } record.setRefundOrderStatus(EnumRefundStatus.REFUND_REQ_FAIL.getCode()); wxRefundOrderMapper.updateById(record); + if (errDesc.equalsIgnoreCase("超期订单不允许退款")) { + // 更新券状态 + throw new MallinkException(ErrorCode.REFUND_NOT_ALLOW); + } throw new MallinkException(ErrorCode.REFUND_ORDER_ERROR.getCode(), errMsg); } } diff --git a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml index 780eba22e..a1db4c92c 100644 --- a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml @@ -538,12 +538,12 @@ @@ -588,6 +588,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + co.id,co.tenant_id,co.coupon_id,co.coupon_type,co.expired_time,co.coupon_order_status,co.create_date,co.update_date,co.coupon_price, c.title,c.sale_price,c.use_price,c.price,c.unit,c.auto_refund,c.business,c.subsidy_type,ms.subsidy subsidy_num, @@ -607,7 +642,7 @@ m.name as merchant_name,m.id as merchant_id - select from wx_coupon_order co inner join wx_coupon c on c.id = co.coupon_id diff --git a/mallinkSysAdmin/src/main/java/com/iformall/config/RedisConfig.java b/mallinkSysAdmin/src/main/java/com/iformall/config/RedisConfig.java index ac36c58fb..327b56626 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/config/RedisConfig.java @@ -2,6 +2,7 @@ package com.iformall.config; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponChannelVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -192,4 +193,21 @@ public class RedisConfig extends CachingConfigurerSupport { return template; } + @Bean("couponDetailRedisTemplate") + public RedisTemplate getCouponDetailRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer(WxCouponCVo.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } + } diff --git a/mallinkWebSocketServer/src/main/java/com/iformall/config/RedisConfig.java b/mallinkWebSocketServer/src/main/java/com/iformall/config/RedisConfig.java index 28d61d711..e5a9fbd1d 100644 --- a/mallinkWebSocketServer/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkWebSocketServer/src/main/java/com/iformall/config/RedisConfig.java @@ -2,6 +2,7 @@ package com.iformall.config; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponChannelVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -177,4 +178,21 @@ public class RedisConfig extends CachingConfigurerSupport { template.setConnectionFactory(connectionFactory); return template; } + + @Bean("couponDetailRedisTemplate") + public RedisTemplate getCouponDetailRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer(WxCouponCVo.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } }