diff --git a/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java b/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java index 4c84be6bf..5ae10dc1e 100644 --- a/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java +++ b/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java @@ -102,6 +102,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/wechat/login", "anon"); // 微信第三方登录callback filterChainDefinitionMap.put("/wechat/callback", "anon"); // 微信网页登录回调 filterChainDefinitionMap.put("/wechat/weChatUserLogin", "anon"); // 微信第三方登录 + // 验证码 filterChainDefinitionMap.put("/captcha.jpg", "anon"); // 官网 @@ -116,7 +117,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/wxMallApply/sendvalidationcode", "anon"); // 补发消息 - filterChainDefinitionMap.put("/msgrecord/resendMsg", "anon"); + filterChainDefinitionMap.put("/wxCoupon/updateStokeAndValidDate", "anon"); // static files filterChainDefinitionMap.put("/css/**", "anon"); @@ -145,6 +146,8 @@ public class ShiroConfig { filterChainDefinitionMap.put("/version", "anon"); filterChainDefinitionMap.put("/wxDeviceScreenAd/**", "anon"); // filterChainDefinitionMap.put("/role/**", "corsFilter,token"); + //商场初始化init + filterChainDefinitionMap.put("/wxProjectConfig/**", "anon"); //配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了 diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/base/BaseController.java b/mallinkAdmin/src/main/java/com/iformall/controller/base/BaseController.java index 032d699dd..c6e190b5e 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/base/BaseController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/base/BaseController.java @@ -66,7 +66,6 @@ public class BaseController { public TenantEntity getTenantInfo(){ Session session = SecurityUtils.getSubject().getSession(); String tenantId = (String)session.getAttribute(UserSession.tenantId); - TenantEntity tenantEntity = new TenantEntity(){{ setTenantId(tenantId); }}; diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/basic/WxProjectConfigController.java b/mallinkAdmin/src/main/java/com/iformall/controller/basic/WxProjectConfigController.java new file mode 100644 index 000000000..fee07fe25 --- /dev/null +++ b/mallinkAdmin/src/main/java/com/iformall/controller/basic/WxProjectConfigController.java @@ -0,0 +1,39 @@ +package com.iformall.controller.basic; + +import com.iformall.annotation.SystemControllerLog; +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.controller.base.BaseController; +import com.iformall.service.WxProjectConfigService; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("wxProjectConfig") +public class WxProjectConfigController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxProjectConfigService wxProjectConfigService; + + @ApiOperation("添加商场基础数据") + @GetMapping(value = "/init/{id}") + @SystemControllerLog(description = "商场基础数据") + public ResultData init(@PathVariable Long id) { + logger.debug("[" + getIpAddr() + "] WxProjectConfigController::init"); + try { + wxProjectConfigService.initProjectConfig(id); + return new ResultData(); + }catch (Exception e){ + logger.error(e.getMessage(),e); + return new ResultData(ErrorCode.SYS_SERVER_ERROR); + } + + + } + + +} diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java index b30fc1625..bac20381a 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java @@ -17,6 +17,8 @@ import com.iformall.service.WxCouponPasswordService; import com.iformall.service.WxCouponService; import com.iformall.service.WxFlowService; import com.iformall.utils.DateUtils; +import com.iformall.utils.RedisLock; + import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -46,6 +48,8 @@ public class WxCouponController extends BaseController { private WxCouponChannelMapper wxCouponChannelMapper; @Autowired private WxFlowService wxFlowService; + @Autowired + RedisLock redisLock; @ApiOperation("分页列表接口") @GetMapping("list") @@ -95,7 +99,7 @@ public class WxCouponController extends BaseController { if (resultData.code != 200) { return resultData; } - + redisLock.setCouponStock(wxCoupon.getId(), wxCoupon.getRemainInventory()); //启动投放审批 if(wxCoupon.getFlowParams() !=null && wxCoupon.getFlowParams().size()>0) { wxCoupon.getFlowParams().put("businessId",wxCoupon.getId()); @@ -124,7 +128,7 @@ public class WxCouponController extends BaseController { return new ResultData(ResultData.ERROR, "有活动正在上架,请先下架。"); } } - + redisLock.setCouponStock(wxCoupon.getId(), wxCoupon.getRemainInventory()); //启动审批流 if (wxCoupon.getFlowParams() != null && wxCoupon.getFlowParams().size() > 0) { logger.info("------coupon.update().businessType:"+wxCoupon.getFlowParams().get("businessType")); @@ -139,6 +143,7 @@ public class WxCouponController extends BaseController { wxCoupon.setPutApplyStatus(EnumRentContractAppStatus.APPLYING.getCode()); } } + return wxCouponService.saveOrUpdate(wxCoupon); } @@ -246,7 +251,9 @@ public class WxCouponController extends BaseController { updateCoupon.setStockApplyStatus(EnumRentContractAppStatus.APPLYING.getCode()); updateCoupon.setUpdateDate(new Date()); wxCouponService.update(updateCoupon); + redisLock.setCouponStock(wxCoupon.getId(), wxCoupon.getRemainInventory()); } else { + redisLock.setCouponStock(wxCoupon.getId(), wxCoupon.getRemainInventory()); return wxCouponService.updateCouponStockAndEndTime(wxCoupon); } diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/sys/HomeController.java b/mallinkAdmin/src/main/java/com/iformall/controller/sys/HomeController.java index d98767270..ba0dba130 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/sys/HomeController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/sys/HomeController.java @@ -411,6 +411,7 @@ public class HomeController extends BaseController { @GetMapping("/version") public ResultData version() { logger.debug("[" + getIpAddr() + "] HomeController::version"); + logger.info(">>>>>>>>>>>>>"+version); return new ResultData(version); } } \ No newline at end of file diff --git a/mallinkAdmin/src/main/resources/application-dev.yml b/mallinkAdmin/src/main/resources/application-dev.yml index f00d9ad01..5e27cca43 100644 --- a/mallinkAdmin/src/main/resources/application-dev.yml +++ b/mallinkAdmin/src/main/resources/application-dev.yml @@ -1,9 +1,10 @@ spring: profiles: - include: rabbitMQ + include: aliyunRocketMQ + #include: rabbitMQ # JDBC datasource: - url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true&allowMultiQueries=true + url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true&allowMultiQueries=true username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4) type: com.alibaba.druid.pool.DruidDataSource @@ -26,7 +27,7 @@ spring: #date-format: yyyy-MM-dd HH:mm:ss # REDIS redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 @@ -72,6 +73,11 @@ spring: publisher-confirms: true publisher-returns: false virtual-host: / + aliyunRocketmq: + accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" + accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" + groupId: "GID_P_1" + namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" flyway: enabled: false @@ -92,7 +98,7 @@ wechat: componentToken: "formall2018" componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 diff --git a/mallinkAdmin/src/main/resources/application.yml b/mallinkAdmin/src/main/resources/application.yml index 836b08aee..0ea90c067 100644 --- a/mallinkAdmin/src/main/resources/application.yml +++ b/mallinkAdmin/src/main/resources/application.yml @@ -21,22 +21,22 @@ spring: cache-names: redis_cache #缓存的名字(可以不指定) redis: time-to-live: 60000ms #很重要,缓存的有效时间,以便缓存的过期(单位为毫秒) - rocketmq: - nameServer: 202.165.179.86:9876 - producer: - retry-times-when-send-async-failed: 0 - send-msg-timeout: 300000 - compress-msg-body-over-howmuch: 4096 - max-message-size: 4194304 - retry-another-broker-when-not-store-ok: false - retry-times-when-send-failed: 2 - rabbitmq: - host: 202.165.179.86 - port: 5672 - username: guest - password: guest - publisher-confirms: true - virtual-host: / +# rocketmq: +# nameServer: 202.165.179.86:9876 +# producer: +# retry-times-when-send-async-failed: 0 +# send-msg-timeout: 300000 +# compress-msg-body-over-howmuch: 4096 +# max-message-size: 4194304 +# retry-another-broker-when-not-store-ok: false +# retry-times-when-send-failed: 2 +# rabbitmq: +# host: 202.165.179.86 +# port: 5672 +# username: guest +# password: guest +# publisher-confirms: true +# virtual-host: / # FLOWABLE flowable: async-executor-activate: false diff --git a/mallinkBApi/src/main/resources/application-dev.yml b/mallinkBApi/src/main/resources/application-dev.yml index e9c8847e3..3e922e7b6 100644 --- a/mallinkBApi/src/main/resources/application-dev.yml +++ b/mallinkBApi/src/main/resources/application-dev.yml @@ -1,9 +1,10 @@ spring: profiles: - include: rabbitMQ + include: aliyunRocketMQ + #include: rabbitMQ # JDBC datasource: - url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true + url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4) type: com.alibaba.druid.pool.DruidDataSource @@ -25,7 +26,7 @@ spring: #date-format: yyyy-MM-dd HH:mm:ss # REDIS redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 @@ -71,6 +72,11 @@ spring: publisher-confirms: true publisher-returns: false virtual-host: / + aliyunRocketmq: + accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" + accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" + groupId: "GID_P_1" + namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" aws: clientRegion: cn-northwest-1 @@ -84,12 +90,12 @@ jasypt: wechat: open: - componentAppId: "wx897e4673286c915d" - componentSecret: "cdfdfda65c45689beb6766c4c427eed2" + componentAppId: "wxdfc8fb4e62d6b52b" + componentSecret: "98daa62b316dd6feabaad708327ce233" componentToken: "formall2018" componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 diff --git a/mallinkBApi/src/main/resources/application.yml b/mallinkBApi/src/main/resources/application.yml index 0b1867eca..8f0d421b9 100644 --- a/mallinkBApi/src/main/resources/application.yml +++ b/mallinkBApi/src/main/resources/application.yml @@ -12,15 +12,15 @@ spring: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 default-property-inclusion: non_null - rocketmq: - nameServer: 127.0.0.1:9876 - producer: - retry-times-when-send-async-failed: 0 - send-msg-timeout: 300000 - compress-msg-body-over-howmuch: 4096 - max-message-size: 4194304 - retry-another-broker-when-not-store-ok: false - retry-times-when-send-failed: 2 +# rocketmq: +# nameServer: 127.0.0.1:9876 +# producer: +# retry-times-when-send-async-failed: 0 +# send-msg-timeout: 300000 +# compress-msg-body-over-howmuch: 4096 +# max-message-size: 4194304 +# retry-another-broker-when-not-store-ok: false +# retry-times-when-send-failed: 2 # MybatisPlus mybatis-plus: diff --git a/mallinkCApi/src/main/java/com/iformall/CApplication.java b/mallinkCApi/src/main/java/com/iformall/CApplication.java index c401d5678..4e5aeb268 100644 --- a/mallinkCApi/src/main/java/com/iformall/CApplication.java +++ b/mallinkCApi/src/main/java/com/iformall/CApplication.java @@ -1,12 +1,14 @@ package com.iformall; -import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import org.mybatis.spring.annotation.MapperScan; import org.rocketmq.starter.annotation.EnableRocketMQ; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; /** * @author chenkx @@ -16,6 +18,7 @@ import org.springframework.context.annotation.Bean; @MapperScan(basePackages = {"com.iformall.mapper"}) @EnableEncryptableProperties @EnableRocketMQ +@EnableAspectJAutoProxy(exposeProxy = true) public class CApplication { @Value("${fm.exception}") diff --git a/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java b/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java index 8005c6bd0..8657cce81 100644 --- a/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java +++ b/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java @@ -64,6 +64,7 @@ public class RedisCacheAspect { if (StringUtils.isBlank(token)) { token = request.getParameter("token"); } + log.info("token>>>>>>>>>>>>>>>"+token); String tenantId; WxCUser wxCUser = null ; if(StringUtils.isNotBlank(token)) { diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java index 657395cca..e297af145 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java @@ -1,11 +1,23 @@ package com.iformall.controller; +import java.util.Date; +import java.util.Map; + +import org.apache.commons.collections.map.HashedMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import com.github.pagehelper.PageInfo; import com.iformall.annotation.RedisCache; import com.iformall.common.ResultData; -import com.iformall.domain.po.base.BaseEntity; import com.iformall.domain.po.WxCouponChannel; import com.iformall.domain.po.WxMerchant; +import com.iformall.domain.po.base.BaseEntity; import com.iformall.domain.vo.WxCouponChannelVo; import com.iformall.enums.EnumCouponChannelActivityStatus; import com.iformall.enums.EnumCouponChannelStatus; @@ -13,21 +25,11 @@ import com.iformall.enums.EnumCouponChannelType; import com.iformall.enums.EnumCouponStatus; import com.iformall.service.WxCouponChannelService; import com.iformall.service.WxMerchantService; + import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import org.apache.commons.collections.map.HashedMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Date; -import java.util.Map; @RestController @RequestMapping("/api/wxCouponChannel") @@ -41,6 +43,7 @@ public class WxCouponChannelController extends BaseController { @Autowired private WxMerchantService wxMerchantService; + @RedisCache(expireTime = 100) @ApiOperation("分页列表接口") @GetMapping("list") @ApiImplicitParams({ @@ -98,7 +101,7 @@ public class WxCouponChannelController extends BaseController { } } - @RedisCache + @RedisCache(expireTime = 100) @ApiOperation("分页列表接口") @GetMapping("change") public ResultData change(@ModelAttribute WxCouponChannel wxCouponChannel) { diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponController.java index 4b4c8ed21..678e223af 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponController.java @@ -31,6 +31,7 @@ import com.iformall.service.WxCouponChannelService; import com.iformall.service.WxCouponService; import com.iformall.service.WxMerchantService; import com.iformall.utils.Constant; +import com.iformall.utils.RedisLock; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -103,6 +104,7 @@ public class WxCouponController extends BaseController { } // end of 更新状态 updateActivityStatus(wxCouponCVo); + return new ResultData(wxCouponCVo); } diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java index 21d7cf328..85250ba75 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java @@ -78,7 +78,7 @@ public class WxCouponOrderController extends BaseController { else wxCouponOrder.setSortColumns(BaseEntity.SortField.UpdateDate_DESC, BaseEntity.SortField.Id_DESC); - PageInfo page = wxCouponOrderService.listCUserVoAsPage(wxCouponOrder, pageNum, pageSize); + PageInfo page = wxCouponOrderService.listCUserVoAsPageOptimize(wxCouponOrder, pageNum, pageSize); Date now = new Date(); page.getList().stream().forEach(co->{ diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java index 9c6c6c175..5c324e947 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java @@ -18,6 +18,8 @@ import com.iformall.service.WxCouponChannelService; import com.iformall.service.WxCouponService; import com.iformall.service.WxOrderService; import com.iformall.utils.Constant; +import com.iformall.utils.RedisLock; + import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -56,6 +58,9 @@ public class WxOrderController extends BaseController { @Autowired @Qualifier("couponDetailRedisTemplate") RedisTemplate cdRedisTemplate; + + @Autowired + RedisLock redisLock; @ApiOperation(value = "下订单", notes = "{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\",\"formId\":\"String\"}") @PostMapping("save") @@ -79,6 +84,21 @@ public class WxOrderController extends BaseController { return new ResultData(ErrorCode.MEMBER_IS_LOCKED); } + WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId()); + if (null == coupon) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); + } + //判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制 + if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) { + int ordercount = wxOrderService.countUserCouponGroupOrder(user.getId(),coupon.getId()); + if (ordercount>=coupon.getUseLimitQuantity()) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"您当前此券的有效拼团数量达到券的限购次数。"); + } + } + WxCouponCVo wxCouponCVo = null; String key = "cc:" + orderSaveDto.getCouponChannelId(); @@ -100,6 +120,12 @@ public class WxOrderController extends BaseController { return new ResultData(ErrorCode.COUPON_IS_EMPTY); } + //此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。 + boolean hascache = redisLock.hasCouponStockCache(wxCouponCVo.getCouponId()); + if (!hascache) { + redisLock.setCouponStock(wxCouponCVo.getCouponId(), coupon.getRemainInventory()); + } + resultData = couponUserCheck(user, wxCouponCVo); if (resultData != null) return resultData; @@ -112,14 +138,6 @@ public class WxOrderController extends BaseController { boolean isPress = orderSaveDto.getPress() != null ? orderSaveDto.getPress() : false; try { - - WxCoupon coupon = wxCouponService.getById(couponId); - if (coupon == null) { - return new ResultData(ErrorCode.COUPON_IS_EMPTY); - } - if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { - return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); - } WxOrder order = wxOrderService.saveOrderForCoupon(user, coupon, orderSaveDto, isPress); return new ResultData(order); } catch (MallinkException e) { diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java index 56c779ab7..3e64b4306 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java @@ -1,30 +1,49 @@ package com.iformall.controller; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + import com.github.pagehelper.PageInfo; import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; import com.iformall.common.Result; import com.iformall.common.ResultData; -import com.iformall.domain.po.*; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxCUser; +import com.iformall.domain.po.WxCUserBasicInfo; +import com.iformall.domain.po.WxCoupon; +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxPayOrder; import com.iformall.enums.EnumCreditLockedStatus; +import com.iformall.enums.EnumOrderStatus; import com.iformall.enums.EnumPayStatus; import com.iformall.enums.EnumPayWay; import com.iformall.exception.MallinkException; import com.iformall.service.WxCUserBasicInfoService; +import com.iformall.service.WxCouponService; import com.iformall.service.WxOrderService; +import com.iformall.service.WxPayAccountService; import com.iformall.service.WxPayOrderService; import com.iformall.utils.IPUtil; + import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; -import java.util.Map; @RestController @RequestMapping("/api/pay") @@ -40,8 +59,15 @@ public class WxPayOrderController extends BaseController { @Autowired private WxCUserBasicInfoService wxCUserBasicInfoService; - - @ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}") + + @Autowired + private WxPayAccountService wxPayAccountService; + + @Autowired + private WxCouponService wxCouponService; + + + //@ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}") @RequestMapping(value = "/create", method = RequestMethod.POST) public ResultData _create(@RequestBody Map paramMap, HttpServletRequest request) throws Exception { logger.info("/api/pay/create" + paramMap.toString()); @@ -69,7 +95,6 @@ public class WxPayOrderController extends BaseController { } WxPayOrder record = new WxPayOrder(); record.setOrderId(orderId); - try { record.setIp(IPUtil.getIpAddr(request)); return wxPayOrderService.createPayOrder(appInfo, user, record, EnumPayWay.PAY_WAY_WECHAT); @@ -121,24 +146,64 @@ public class WxPayOrderController extends BaseController { payOrder.setPayOrderStatus(status); payOrder.setFailReason(reasonStr); - WxOrder order = null; - try { //有价券支付成功 if (status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { // 前端提示支付成功, 不作为支付成功标志,只检查支付订单状态 // 有价券不走update, callback更新 + if (payOrderId<=0) { + logger.error("/api/pay/updatePayOrder error : payOrderId不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId非法"+payOrderId+"[payOrderIdStr:"+payOrderIdStr+"]"); + } payOrder = wxPayOrderService.getById(payOrderId); - if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { - order = wxOrderService.getById(orderId); - return new ResultData(Result.SUCCESS, "支付状态更新成功", order); - } else { - return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付状态未知,请等待!!"); + if (null == payOrder) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到payOrder."); + } + WxOrder order = wxOrderService.getById(orderId); + if (null == order) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到Order["+orderId+"]."); + } + WxCoupon wxCoupon = wxCouponService.getById(order.getProductId()); + if (null == wxCoupon) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到优惠券[orderId:"+orderId+"]."); } + + //拼团的订单,如果查询到是拼团待付款的,则重新查询是否已经真的支付,其他的直接返回订单信息 + if (wxPayOrderService.isOrderGroupCoupon(payOrder, wxCoupon)) { + if (order.getOrderStatus()!=EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + }else { + //非拼团的订单,支付成功,关闭订单,撤销支付订单,支付转退款的,直接返回订单信息,其他需要查询真实支付状态 + if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_CLOSE.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REVERSE.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REFUND.getCode())) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + } + //查询微信订单状态并更新 + WxCUser user = getUser(); + WxAppinfo appInfo = getAppInfo(user.getAppId()); + if (null == appInfo) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "当前用户appId["+user.getAppId()+"]找不到appInfo"); + } + WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId()); + try { + WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, order, appInfo, payAccount, IdWorker.get(),false); + if (null != wo) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + }catch(MallinkException e) { + //已经同步了微信的支付状态,表示已经更新 + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!"); } else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) { // 有价券支付失败 wxPayOrderService.handlePayOrderFail(payOrder, EnumPayStatus.PAY_STATUS_FAIL.getCode()); - } + } return new ResultData(Result.SUCCESS, "支付状态更新成功"); } catch (MallinkException e) { logger.error("支付状态更新失败2: " + payOrder.toString() + ", e:" + e.getMessage()); diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPressOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPressOrderController.java index 50661e33b..9abf71790 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPressOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPressOrderController.java @@ -147,7 +147,7 @@ public class WxPressOrderController extends BaseController { return new ResultData(ErrorCode.COUPON_PRESS_HAD_FINISHED); } - long time = System.currentTimeMillis() + RedisLock.TIMEOUT; + long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; String timeStr = String.valueOf(time); if (!redisLock.lock(orderIdStr, timeStr)) { logger.error("此砍价订单被锁定, orderId: " + orderIdStr); diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java index 56abf8d50..2ef2c0e8a 100755 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java @@ -136,7 +136,7 @@ public class WxUserGrantController extends BaseController { @PostMapping("/login") @ApiOperation(value = "用户登录", notes = "{\"appId\":\"string\",\"code\":\"string\",\"scene\":\"string\",\"sceneAddress\":\"string\",\"latitude\":\"string\",\"longitude\":\"string\",\"systemInfo\":\"string\"}") public ResultData userLogin(@RequestBody Map map) { - logger.debug(map.toString()); + logger.info("dologin >>>>>>>>>>>>>>>>>"+map.toString()); Map resultMap = new HashMap(); @@ -199,6 +199,11 @@ public class WxUserGrantController extends BaseController { try { WxMaJscode2SessionResult session = wxMaService.jsCode2SessionInfo(code); + logger.info("sessionResult: " + session); + if (null != session) { + logger.info("sessionResultDetail: [openid]" + session.getOpenid()+",[sessionkey]"+session.getSessionKey()+",[unionid]"+session.getUnionid()); + } + //获取会话密钥(session_key) session_key = session.getSessionKey(); openId = session.getOpenid(); diff --git a/mallinkCApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java b/mallinkCApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java index c8c12f652..451e9328b 100644 --- a/mallinkCApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java +++ b/mallinkCApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java @@ -29,6 +29,9 @@ public class AuthorizationInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + System.out.println(" requesturi......"+request.getRequestURL()); + AuthIgnore annotation; if(handler instanceof HandlerMethod) { annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthIgnore.class); diff --git a/mallinkCApi/src/main/java/com/iformall/utils/ImgIdeaUtil.java b/mallinkCApi/src/main/java/com/iformall/utils/ImgIdeaUtil.java new file mode 100644 index 000000000..16ebb8d46 --- /dev/null +++ b/mallinkCApi/src/main/java/com/iformall/utils/ImgIdeaUtil.java @@ -0,0 +1,175 @@ +package com.iformall.utils; + +import net.sourceforge.pinyin4j.PinyinHelper; +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; +import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; +import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.ResourceUtils; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +public class ImgIdeaUtil { + + private static final Logger logger = LoggerFactory.getLogger(ImgIdeaUtil.class); + + //模板图片 + private static final String imgTempPath = "imgTemp/gertificate.jpg"; + //字体路径 + private static final String fontPath = "opt/HWLS.TTF"; + + /** + * 生成图片证书 + * @return + */ + public static byte[] imgGertificate(String name, String englishName, LocalDateTime date){ + if(StringUtils.isBlank(name)){ + logger.error("名字为空,无法生成证书"); + return null; + } + if(name.length() == 2){ + name = name.replaceAll("(\\S)", "$0 "); + } + if(StringUtils.isBlank(englishName)){ + englishName = getUpEname(name); + } + if(date == null){ + date = LocalDateTime.now(); + } + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dMMM yyyy", Locale.UK); + String dateFormat = date.format(formatter); + + try { + + InputStream backImgUrl = ClassLoader.getSystemResourceAsStream(imgTempPath); + //InputStream backImgUrl = ImgIdeaUtil.class.getClassLoader().getResourceAsStream(imgTempPath); + + Font font = Font.createFont(Font.TRUETYPE_FONT, ResourceUtils.getFile("classpath:"+fontPath)); + BufferedImage backImg = ImageIO.read(backImgUrl); + Graphics g = backImg.getGraphics(); + + //图片加中文名 + Font fTxtBottomName = font.deriveFont(Font.PLAIN, 170); + //Font fTxtBottomName = new Font("华文隶书", Font.PLAIN, 170); + FontMetrics metricsName = g.getFontMetrics(fTxtBottomName); + int xName = (backImg.getWidth() - metricsName.stringWidth(name)) / 2; + Color myColorTxtBottomName = Color.BLACK; //颜色 + g.setColor(myColorTxtBottomName); + g.setFont(fTxtBottomName); + g.drawString(name, xName , 1150);//g.drawString(文字, x 位置, y 位置); + + //图片加英文名 + Font fTxtBottomEname = font.deriveFont(Font.PLAIN, 120); + //Font fTxtBottomEname = new Font("华文隶书", Font.PLAIN, 120); + FontMetrics metricsEname = g.getFontMetrics(fTxtBottomEname); + int xEname = (backImg.getWidth() - metricsEname.stringWidth(englishName)) / 2; + Color myColorTxtBottomEname = Color.BLACK; + g.setColor(myColorTxtBottomEname); + g.setFont(fTxtBottomEname); + g.drawString(englishName, xEname, 1300); + + //图片加日期 + Font fTxtBottomDate = font.deriveFont(Font.PLAIN, 90); + //Font fTxtBottomDate = new Font("华文隶书", Font.PLAIN, 90); + Color myColorTxtBottomDate = Color.BLACK; + g.setColor(myColorTxtBottomDate); + g.setFont(fTxtBottomDate); + g.drawString(dateFormat, 440, 2100); + + //调这个方法就是开始这个整合 (可以多张图片,多个文字整合成一张图片,只有把他们放在这方法里面就行) + g.dispose(); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ImageIO.write(backImg, "png", out); + + return out.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("生成证书异常", e.getMessage()); + } + return null; + } + + /** + * //姓、名的第一个字母需要为大写 + * @param name + * @return + */ + public static String getUpEname(String name) { + char[] strs = name.toCharArray(); + String newname = null; + + if (strs.length == 2) { + newname = toUpCase(getEname("" + strs[0])) + " " + toUpCase(getEname("" + strs[1])); + } else if (strs.length == 3){ + newname = toUpCase(getEname("" + strs[0])) + " " + + toUpCase(getEname("" + strs[1] + strs[2])); + }else if (strs.length == 4){ + newname = toUpCase(getEname("" + strs[0] + strs[1])) + " " + + toUpCase(getEname("" + strs[2] + strs[3])); + } else{ + newname = toUpCase(getEname(name)); + } + return newname; + } + + + /** + * //将中文转换为英文 + * @param name + * @return + */ + public static String getEname(String name){ + HanyuPinyinOutputFormat pyFormat = new HanyuPinyinOutputFormat(); + pyFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); + pyFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + pyFormat.setVCharType(HanyuPinyinVCharType.WITH_V); + String s = ""; + try { + s = PinyinHelper.toHanyuPinyinString(name, pyFormat, ""); + } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) { + badHanyuPinyinOutputFormatCombination.printStackTrace(); + } + return s; + } + /** + * 首字母大写 + * @param str + * @return + */ + private static String toUpCase(String str) { + StringBuffer newstr = new StringBuffer(); + newstr.append((str.substring(0, 1)).toUpperCase()).append( + str.substring(1, str.length())); + return newstr.toString(); + } + + +// public static void main(String[] args) { +// String serverUploadImgUrl = "C:/Users/xiaohu/Desktop/img"; // 图片保存路径 +// try { +// byte[] bytes = imgGertificate("郑方元", null, null); +// ByteArrayInputStream bais = new ByteArrayInputStream(bytes); +// BufferedImage bi1 =ImageIO.read(bais); +// +// ImageIO.write(bi1, "png", new File(serverUploadImgUrl+"/0.png")); +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// System.out.println("结束"); +// } +} diff --git a/mallinkCApi/src/main/resources/application-dev.yml b/mallinkCApi/src/main/resources/application-dev.yml index 003918c8c..58dd6618e 100644 --- a/mallinkCApi/src/main/resources/application-dev.yml +++ b/mallinkCApi/src/main/resources/application-dev.yml @@ -1,9 +1,10 @@ spring: profiles: - include: rabbitMQ + include: aliyunRocketMQ + #include: rabbitMQ # JDBC datasource: - url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true + url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4) type: com.alibaba.druid.pool.DruidDataSource @@ -26,7 +27,7 @@ spring: # REDIS redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 @@ -71,6 +72,11 @@ spring: publisher-confirms: true publisher-returns: false virtual-host: / + aliyunRocketmq: + accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" + accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" + groupId: "GID_P_1" + namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" aws: clientRegion: cn-northwest-1 @@ -80,12 +86,12 @@ aws: wechat: open: - componentAppId: "wx897e4673286c915d" - componentSecret: "cdfdfda65c45689beb6766c4c427eed2" + componentAppId: "wxdfc8fb4e62d6b52b" + componentSecret: "98daa62b316dd6feabaad708327ce233" componentToken: "formall2018" componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 diff --git a/mallinkCApi/src/main/resources/application.yml b/mallinkCApi/src/main/resources/application.yml index 075505606..324f91cde 100644 --- a/mallinkCApi/src/main/resources/application.yml +++ b/mallinkCApi/src/main/resources/application.yml @@ -12,15 +12,15 @@ spring: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 default-property-inclusion: non_null - rocketmq: - nameServer: 127.0.0.1:9876 - producer: - retry-times-when-send-async-failed: 0 - send-msg-timeout: 300000 - compress-msg-body-over-howmuch: 4096 - max-message-size: 4194304 - retry-another-broker-when-not-store-ok: false - retry-times-when-send-failed: 2 +# rocketmq: +# nameServer: 127.0.0.1:9876 +# producer: +# retry-times-when-send-async-failed: 0 +# send-msg-timeout: 300000 +# compress-msg-body-over-howmuch: 4096 +# max-message-size: 4194304 +# retry-another-broker-when-not-store-ok: false +# retry-times-when-send-failed: 2 # MybatisPlus mybatis-plus: diff --git a/mallinkCApi/src/main/resources/imgTemp/gertificate.jpg b/mallinkCApi/src/main/resources/imgTemp/gertificate.jpg new file mode 100644 index 000000000..6766d3149 Binary files /dev/null and b/mallinkCApi/src/main/resources/imgTemp/gertificate.jpg differ diff --git a/mallinkCApi/src/main/resources/opt/HWLS.TTF b/mallinkCApi/src/main/resources/opt/HWLS.TTF new file mode 100644 index 000000000..bd038fd18 Binary files /dev/null and b/mallinkCApi/src/main/resources/opt/HWLS.TTF differ diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java index f068814c8..191e05445 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxPayController.java @@ -55,58 +55,64 @@ public class WxPayController extends BaseController { @ResponseBody public String _payNotify(HttpServletRequest request) throws IOException, JDOMException { logger.info("[" +getIpAddr() + "]微信支付回调"); - InputStream inStream = request.getInputStream(); - ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int len = 0; - while ((len = inStream.read(buffer)) != -1) { - outSteam.write(buffer, 0, len); - } - String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); - logger.info(resultxml); - - outSteam.close(); - inStream.close(); - - Map paramMap = null; - - try { - paramMap = WxPayment.xmlToMap(resultxml); - logger.info("微信支付回调, notify, param: " + paramMap.toString() ); - String response = wxPayOrderService.notify(paramMap, EnumPayWay.PAY_WAY_WEAPP); - logger.info("微信支付回调, notify success, req : " + resultxml); - return response; - } catch (BizMessageException e) { - if (paramMap == null) { - logger.error("微信支付回调, order create error, e: " + e.getMessage()); - } else { - logger.error("微信支付回调, order create error, req: " + resultxml + ", e: " + e.getMessage()); - } - SortedMap resultMap = new TreeMap<>(); - resultMap.put("return_code", "FAIL"); - resultMap.put("return_msg", e.getMessage()); - return XmlUtil.getRequestXml(resultMap); - } catch (MallinkException e) { - if (paramMap == null) { - logger.error("微信支付回调, order create error, e: " + e.getMessage()); - } else { - logger.error("微信支付回调, order create error, req: " + resultxml + ", e: " + e.getMessage()); - } - SortedMap resultMap = new TreeMap<>(); - resultMap.put("return_code", "FAIL"); - resultMap.put("return_msg", e.getMessage()); - return XmlUtil.getRequestXml(resultMap); - } catch (Exception e) { - if (paramMap == null) { - logger.error("微信支付回调, order create error, e: " + e.getMessage()); - } else { - logger.error("微信支付回调, order create error, req: " + resultxml + ", e: " + e.getMessage()); - } - SortedMap resultMap = new TreeMap(); - resultMap.put("return_code", "FAIL"); - resultMap.put("return_msg", e.getMessage()); - return XmlUtil.getRequestXml(resultMap); - } + SortedMap resultMap = new TreeMap(); + resultMap.put("return_code", "SUCCESS"); + resultMap.put("return_msg", "OK"); + return XmlUtil.getRequestXml(resultMap); + + +// InputStream inStream = request.getInputStream(); +// ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); +// byte[] buffer = new byte[1024]; +// int len = 0; +// while ((len = inStream.read(buffer)) != -1) { +// outSteam.write(buffer, 0, len); +// } +// String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); +// logger.info(resultxml); +// +// outSteam.close(); +// inStream.close(); +// +// Map paramMap = null; +// +// try { +// paramMap = WxPayment.xmlToMap(resultxml); +// logger.info("微信支付回调, notify, param: " + paramMap.toString() ); +// String response = wxPayOrderService.notify(paramMap, EnumPayWay.PAY_WAY_WEAPP); +// logger.info("微信支付回调, notify success, req : " + resultxml); +// return response; +// } catch (BizMessageException e) { +// if (paramMap == null) { +// logger.error("微信支付回调, order create error, e: " + e.getMessage()); +// } else { +// logger.error("微信支付回调, order create error, req: " + resultxml + ", e: " + e.getMessage()); +// } +// SortedMap resultMap = new TreeMap<>(); +// resultMap.put("return_code", "FAIL"); +// resultMap.put("return_msg", e.getMessage()); +// return XmlUtil.getRequestXml(resultMap); +// } catch (MallinkException e) { +// if (paramMap == null) { +// logger.error("微信支付回调, order create error, e: " + e.getMessage()); +// } else { +// logger.error("微信支付回调, order create error, req: " + resultxml + ", e: " + e.getMessage()); +// } +// SortedMap resultMap = new TreeMap<>(); +// resultMap.put("return_code", "FAIL"); +// resultMap.put("return_msg", e.getMessage()); +// return XmlUtil.getRequestXml(resultMap); +// } catch (Exception e) { +// if (paramMap == null) { +// logger.error("微信支付回调, order create error, e: " + e.getMessage()); +// } else { +// logger.error("微信支付回调, order create error, req: " + resultxml + ", e: " + e.getMessage()); +// } +// SortedMap resultMap = new TreeMap(); +// resultMap.put("return_code", "FAIL"); +// resultMap.put("return_msg", e.getMessage()); +// return XmlUtil.getRequestXml(resultMap); +// } } diff --git a/mallinkCallback/src/main/resources/application-dev.yml b/mallinkCallback/src/main/resources/application-dev.yml index 52edc0080..a1558aa50 100644 --- a/mallinkCallback/src/main/resources/application-dev.yml +++ b/mallinkCallback/src/main/resources/application-dev.yml @@ -1,9 +1,10 @@ spring: profiles: - include: rabbitMQ + include: aliyunRocketMQ + #include: rabbitMQ # JDBC datasource: - url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true + url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4) type: com.alibaba.druid.pool.DruidDataSource @@ -26,7 +27,7 @@ spring: #date-format: yyyy-MM-dd HH:mm:ss # REDIS redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 @@ -73,6 +74,12 @@ spring: publisher-returns: false virtual-host: / + aliyunRocketmq: + accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" + accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" + groupId: "GID_P_1" + namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" + aws: clientRegion: cn-northwest-1 bucketName: iformall-net @@ -90,7 +97,7 @@ wechat: componentToken: "formall2018" componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 diff --git a/mallinkCallback/src/main/resources/application.yml b/mallinkCallback/src/main/resources/application.yml index 0d1863f82..08133c305 100644 --- a/mallinkCallback/src/main/resources/application.yml +++ b/mallinkCallback/src/main/resources/application.yml @@ -21,22 +21,22 @@ spring: cache-names: redis_cache #缓存的名字(可以不指定) redis: time-to-live: 60000ms #很重要,缓存的有效时间,以便缓存的过期(单位为毫秒) - rocketmq: - nameServer: 202.165.179.86:9876 - producer: - retry-times-when-send-async-failed: 0 - send-msg-timeout: 300000 - compress-msg-body-over-howmuch: 4096 - max-message-size: 4194304 - retry-another-broker-when-not-store-ok: false - retry-times-when-send-failed: 2 - rabbitmq: - host: 202.165.179.86 - port: 5672 - username: guest - password: guest - publisher-confirms: true - virtual-host: / +# rocketmq: +# nameServer: 202.165.179.86:9876 +# producer: +# retry-times-when-send-async-failed: 0 +# send-msg-timeout: 300000 +# compress-msg-body-over-howmuch: 4096 +# max-message-size: 4194304 +# retry-another-broker-when-not-store-ok: false +# retry-times-when-send-failed: 2 +# rabbitmq: +# host: 202.165.179.86 +# port: 5672 +# username: guest +# password: guest +# publisher-confirms: true +# virtual-host: / aop: proxy-target-class: true auto: true diff --git a/mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java b/mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java index 8f49733a8..390debf64 100644 --- a/mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java +++ b/mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java @@ -41,7 +41,9 @@ public class MqBaseConsumer { private FmInsideNotifyPaySuccessMsgServiceImpl fmInsideNotifyPaySuccessMsgService; @Autowired private FmInsideNotifyRefundSuccessMsgServiceImpl fmInsideNotifyRefundSuccessMsgService; - + @Autowired + UpdateCouponStockMsgServiceImpl updateCouponStockMsgService; + public void doMessage(String message) { @@ -95,10 +97,15 @@ public class MqBaseConsumer { // 内部消息 - 微信退款通知 FmInsideNotifyRefundSuccessMsg msg = (FmInsideNotifyRefundSuccessMsg)JsonUtil.readValue(message,FmInsideNotifyRefundSuccessMsg.class); fmInsideNotifyRefundSuccessMsgService.send(msg); + } else if (EnumMsgRecordType.COUPON_STOCK.getCode().equals(baseMsg.getMsgType())) { + UpdateCouponStockMsg msg = (UpdateCouponStockMsg)JsonUtil.readValue(message,UpdateCouponStockMsg.class); + updateCouponStockMsgService.send(msg); } - baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_SUCC.getCode()); - wxMsgRecordMapper.updateByBaseMsg(baseMsg); + //baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_SUCC.getCode()); + //wxMsgRecordMapper.updateByBaseMsg(baseMsg); }catch (Throwable e){ + log.error("consum received error: ", e); + /** try { log.error("consum received error: ", e); baseMsg.setStatusMessage(e.getMessage()); @@ -124,7 +131,7 @@ public class MqBaseConsumer { } }catch (Throwable e1){ log.error("更新db状态error: ", e1); - } + }*/ } } diff --git a/mallinkMQConsumer/src/main/java/com/iformall/mq/impl/AliyunRocketMqConsumer.java b/mallinkMQConsumer/src/main/java/com/iformall/mq/impl/AliyunRocketMqConsumer.java new file mode 100644 index 000000000..f74666ca1 --- /dev/null +++ b/mallinkMQConsumer/src/main/java/com/iformall/mq/impl/AliyunRocketMqConsumer.java @@ -0,0 +1,79 @@ +package com.iformall.mq.impl; + +import java.util.Properties; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSON; +import com.aliyun.openservices.ons.api.Action; +import com.aliyun.openservices.ons.api.ConsumeContext; +import com.aliyun.openservices.ons.api.Consumer; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.MessageListener; +import com.aliyun.openservices.ons.api.ONSFactory; +import com.aliyun.openservices.ons.api.PropertyKeyConst; +import com.aliyun.openservices.ons.api.bean.ConsumerBean; +import com.iformall.enums.EnumMsgMqTopic; +import com.iformall.mq.MQConfig; +import com.iformall.mq.MqBaseConsumer; +import com.iformall.utils.JsonUtil; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@Profile(MQConfig.Impl.ALIYUN_ROCKET_MQ) +public class AliyunRocketMqConsumer extends MqBaseConsumer { + + @Value("${spring.aliyunRocketmq.accessKeyId}") + private String accessKeyId; + + @Value("${spring.aliyunRocketmq.accessKeySecret}") + private String accessKeySecret; + + @Value("${spring.aliyunRocketmq.groupId}") + private String groupId; + + @Value("${spring.aliyunRocketmq.namesrvAddr}") + private String namesrvAddr; + + @PostConstruct + public void init() { + for (EnumMsgMqTopic topic: EnumMsgMqTopic.values()) { + Properties properties = new Properties(); + // 您在控制台创建的 Group ID + properties.put(PropertyKeyConst.GROUP_ID, topic.getGroupId()); + // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建 + properties.put(PropertyKeyConst.AccessKey, accessKeyId); + // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建 + properties.put(PropertyKeyConst.SecretKey, accessKeySecret); + // 设置 TCP 接入域名,到控制台的实例基本信息中查看 + properties.put(PropertyKeyConst.NAMESRV_ADDR,namesrvAddr); + // 集群订阅方式(默认) + // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING); + // 广播订阅方式 + // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING); + Consumer consumer = ONSFactory.createConsumer(properties); + consumer.subscribe(topic.getCode(), "*", new MessageListener() { //订阅多个 Tag + public Action consume(Message message, ConsumeContext context) { + try { + System.out.println("Receive: " + message); + doMessage(new String(message.getBody())); + return Action.CommitMessage; + }catch(Exception e) { + log.error("AliyunRocketMqConsumer error:",e); + return Action.ReconsumeLater; + } + } + }); + consumer.start(); + log.info(" aliyunrocketMq consumer start success! "+JSON.toJSONString(consumer)); + } + + } + +} diff --git a/mallinkMQConsumer/src/main/resources/application-dev.yml b/mallinkMQConsumer/src/main/resources/application-dev.yml index f96048d10..b15b0f739 100644 --- a/mallinkMQConsumer/src/main/resources/application-dev.yml +++ b/mallinkMQConsumer/src/main/resources/application-dev.yml @@ -1,9 +1,10 @@ spring: profiles: - include: rabbitMQ + include: aliyunRocketMQ + #include: rabbitMQ # JDBC datasource: - url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true + url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4) type: com.alibaba.druid.pool.DruidDataSource @@ -27,7 +28,7 @@ spring: # REDIS redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 @@ -71,6 +72,11 @@ spring: publisher-confirms: true publisher-returns: false virtual-host: / + aliyunRocketmq: + accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" + accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" + groupId: "GID_P_1" + namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" aws: clientRegion: cn-northwest-1 @@ -85,7 +91,7 @@ wechat: componentToken: "formall2018" componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 diff --git a/mallinkMQConsumer/src/main/resources/application.yml b/mallinkMQConsumer/src/main/resources/application.yml index 2d88312a8..8811981f5 100644 --- a/mallinkMQConsumer/src/main/resources/application.yml +++ b/mallinkMQConsumer/src/main/resources/application.yml @@ -21,22 +21,22 @@ spring: cache-names: redis_cache #缓存的名字(可以不指定) redis: time-to-live: 60000ms #很重要,缓存的有效时间,以便缓存的过期(单位为毫秒) - rocketmq: - nameServer: 127.0.0.1:9876 - producer: - retry-times-when-send-async-failed: 0 - send-msg-timeout: 300000 - compress-msg-body-over-howmuch: 4096 - max-message-size: 4194304 - retry-another-broker-when-not-store-ok: false - retry-times-when-send-failed: 2 - rabbitmq: - host: 202.165.179.86 - port: 5672 - username: guest - password: guest - publisher-confirms: true - virtual-host: / +# rocketmq: +# nameServer: 127.0.0.1:9876 +# producer: +# retry-times-when-send-async-failed: 0 +# send-msg-timeout: 300000 +# compress-msg-body-over-howmuch: 4096 +# max-message-size: 4194304 +# retry-another-broker-when-not-store-ok: false +# retry-times-when-send-failed: 2 +# rabbitmq: +# host: 202.165.179.86 +# port: 5672 +# username: guest +# password: guest +# publisher-confirms: true +# virtual-host: / # MybatisPlus diff --git a/mallinkPosApi/src/main/resources/application-dev.yml b/mallinkPosApi/src/main/resources/application-dev.yml index 9253630e5..ce32834f2 100644 --- a/mallinkPosApi/src/main/resources/application-dev.yml +++ b/mallinkPosApi/src/main/resources/application-dev.yml @@ -1,9 +1,10 @@ spring: profiles: - include: rabbitMQ + include: aliyunRocketMQ + #include: rabbitMQ # JDBC datasource: - url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true + url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4) type: com.alibaba.druid.pool.DruidDataSource @@ -25,7 +26,7 @@ spring: #date-format: yyyy-MM-dd HH:mm:ss # REDIS redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 @@ -71,6 +72,11 @@ spring: publisher-confirms: true publisher-returns: false virtual-host: / + aliyunRocketmq: + accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" + accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" + groupId: "GID_P_1" + namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" aws: clientRegion: cn-northwest-1 @@ -89,7 +95,7 @@ wechat: componentToken: "formall2018" componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 diff --git a/mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java b/mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java index bc52f3a3e..44a96a203 100644 --- a/mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java +++ b/mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java @@ -7,6 +7,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + import springfox.documentation.swagger2.annotations.EnableSwagger2; /** @@ -18,6 +20,7 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; @EnableSwagger2 @EnableRocketMQ @EnableEncryptableProperties +@EnableAspectJAutoProxy(exposeProxy = true) public class ScheduleApplication { @Value("${fm.exception}") diff --git a/mallinkSchedule/src/main/java/com/iformall/controller/HomeController.java b/mallinkSchedule/src/main/java/com/iformall/controller/HomeController.java index 7a401beca..ecfc89b22 100644 --- a/mallinkSchedule/src/main/java/com/iformall/controller/HomeController.java +++ b/mallinkSchedule/src/main/java/com/iformall/controller/HomeController.java @@ -25,9 +25,6 @@ public class HomeController { @Autowired private MqBaseProducer mqBaseProducer; - @Autowired - private RabbitMqMessageProducer rabbitMqMessageProducer; - @ApiOperation("获取后端版本号") @GetMapping("/version") diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java index b412d4e75..1631a01ab 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java @@ -13,6 +13,7 @@ import com.iformall.service.WxRefundOrderService; import com.iformall.utils.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -51,11 +52,13 @@ public class CouponOrderExpiringSchedule { // @Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 public void couponOrderExpiringSchedule() { + CouponOrderExpiringSchedule proxy = (CouponOrderExpiringSchedule) AopContext.currentProxy(); + List list = wxCouponOrderMapper.findExpiredFreeCouponOrderByValidDate(); list.stream().forEach(co -> { // 券过期,更改状态及库存退回 try { - couponOrderExpire(co, true); + proxy.couponOrderExpire(co, true); } catch (Exception e) { logger.error(e.getMessage()); } @@ -64,31 +67,25 @@ public class CouponOrderExpiringSchedule { } - @Scheduled(cron = "0 5 0 * * ?") // 每天凌晨00:05 + @Scheduled(cron = "0 0/2 * * * ?") // 每天凌晨00:05 // @Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 public void couponOrderRefundSchedule() { - List list = wxCouponOrderMapper.findExpiredCouponOrderByValidDate(); - + CouponOrderExpiringSchedule proxy = (CouponOrderExpiringSchedule) AopContext.currentProxy(); list.stream().forEach(co -> { - // 券过期,更改状态及库存退回 - try { - couponOrderExpire(co, false); - } catch (Exception e) { - logger.error(e.getMessage()); - } - - // 退款 - try { - couponOrderExpireRefund(co, true); - } catch (Exception e) { - logger.error(e.getMessage()); - } - + refund(co,proxy); }); } - + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public void refund(WxCouponOrder order,CouponOrderExpiringSchedule proxy) { + // 券过期,更改状态及库存退回 + proxy.couponOrderExpire(order, false); + // 退款 + proxy.couponOrderExpireRefund(order, true); + + } + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public void couponOrderExpire(WxCouponOrder co, boolean bStockBack) { @@ -112,13 +109,14 @@ public class CouponOrderExpiringSchedule { } } - private void couponOrderExpireRefund(WxCouponOrder co, boolean bStockBack) { + public void couponOrderExpireRefund(WxCouponOrder co, boolean bStockBack) { // 非储值卡, 可以退款 if(!co.getCouponType().equals(EnumCouponType.CARD_MULTIMCH.getCode()) && !co.getAutoRefund().equals(EnumCouponAutoRefund.UNSUPPORTED.getCode())) { WxAppinfo appinfo = new WxAppinfo(); appinfo.updateTenantInfo(co); - appinfo.setType(EnumAppType.B.getCode()); + //appinfo.setType(EnumAppType.B.getCode()); + appinfo.setType(EnumAppType.C.getCode()); appinfo = wxAppinfoMapper.findList(appinfo).get(0); Date limitDate = DateUtils.getTimeAfterDays(360, co.getCreateDate()); diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java index 156c2c39e..b92d7edd1 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java @@ -1,33 +1,45 @@ package com.iformall.schedule; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.iformall.common.ErrorCode; import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxCUser; import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxPayOrder; import com.iformall.enums.EnumAppType; import com.iformall.enums.EnumOrderStatus; import com.iformall.enums.EnumOrderType; +import com.iformall.enums.EnumPayStatus; import com.iformall.enums.EnumRefundStatus; import com.iformall.exception.MallinkException; import com.iformall.mapper.WxAppinfoMapper; +import com.iformall.mapper.WxCUserMapper; import com.iformall.mapper.WxCouponMapper; import com.iformall.mapper.WxOrderGroupMapper; import com.iformall.mapper.WxOrderMapper; +import com.iformall.mapper.WxPayAccountMapper; +import com.iformall.mapper.WxPayOrderMapper; +import com.iformall.service.WxAppinfoService; import com.iformall.service.WxOrderService; +import com.iformall.service.WxPayOrderService; import com.iformall.service.WxRefundOrderService; +import com.iformall.service.helper.WxPayOrderServiceHelper; import com.iformall.utils.DateUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; @Component public class OrderExpiringSchedule { @@ -53,8 +65,23 @@ public class OrderExpiringSchedule { @Autowired WxCouponMapper wxCouponMapper; - - @Scheduled(cron = "0 */5 * * * *?") // 每5分钟检查一次 + + @Autowired + WxPayOrderMapper wxPayOrderMapper; + + @Autowired + WxCUserMapper wxCUserMapper; + + @Autowired + WxAppinfoService wxAppinfoService; + + @Autowired + WxPayAccountMapper wxPayAccountMapper; + + @Autowired + WxPayOrderService wxPayOrderService; + + @Scheduled(cron = "0 */2 * * * *?") // 每5分钟检查一次 //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 public void orderExpireSchedule() { @@ -62,13 +89,16 @@ public class OrderExpiringSchedule { Date curDate = new Date(); Date expireDate = new Date(curDate.getTime() - NORMAL_TIME_OUT ); + //直接调用不会触发事务,spring事务基于AOP代理 + OrderExpiringSchedule proxy = (OrderExpiringSchedule) AopContext.currentProxy(); + // 券相关订单, 15分钟未支付, 订单过期 dateMap.put("type", EnumOrderType.COUPON.getCode()); dateMap.put("endDate", expireDate); List orderCoupons = wxOrderMapper.findListOfUnpaidOrderByDate(dateMap); orderCoupons.stream().forEach( o -> { try { - orderExpired(o); + proxy.orderExpired(o,true); } catch (Exception e) { logger.error("券过期失败" + e.getMessage()); } @@ -82,7 +112,7 @@ public class OrderExpiringSchedule { List orderPresss = wxOrderMapper.findListOfCompleteUnPaidPressOrderByDate(dateMap); orderPresss.stream().forEach( o -> { try { - orderPressExpired(o, true); + proxy.orderPressExpired(o, true,true); } catch (Exception e) { logger.error("砍价券支付过期失败" + e.getMessage()); } @@ -93,7 +123,7 @@ public class OrderExpiringSchedule { orderPresss = wxOrderMapper.findListOfUnpaidPressOrderByDate(dateMap); orderPresss.stream().forEach( o -> { try { - orderPressExpired(o, false); + proxy.orderPressExpired(o, false,true); } catch (Exception e) { logger.error("砍价券过期失败" +e.getMessage()); } @@ -105,7 +135,7 @@ public class OrderExpiringSchedule { order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); wxOrderMapper.selectList(new QueryWrapper(order)).stream().forEach(o -> { try { - orderGroupExpired((WxOrder) o); + proxy.orderGroupExpired((WxOrder) o,true); } catch (Exception e) { logger.error("拼团取消失败" + e.getMessage()); } @@ -117,7 +147,7 @@ public class OrderExpiringSchedule { order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()); wxOrderMapper.selectList(new QueryWrapper(order)).stream().forEach(o -> { try { - returnMoney((WxOrder) o); + proxy.expiredAndReturnMoney((WxOrder) o,false); } catch (Exception e) { logger.error("拼团过期退款失败" + e.getMessage()); } @@ -128,7 +158,7 @@ public class OrderExpiringSchedule { order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_CANCEL.getCode()); wxOrderMapper.selectList(new QueryWrapper(order)).stream().forEach(o -> { try { - returnMoney((WxOrder) o); + proxy.returnMoney((WxOrder) o); } catch (Exception e) { logger.error("拼团券下架退款失败" + e.getMessage()); } @@ -138,18 +168,75 @@ public class OrderExpiringSchedule { order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); wxOrderMapper.selectList(new QueryWrapper(order)).stream().forEach(o -> { try { - returnMoney((WxOrder) o); + proxy.expiredAndReturnMoney((WxOrder) o,true); } catch (Exception e) { logger.error("参团失败退款失败" + e.getMessage()); } }); + //无需查询付款状态的订单-退款,回滚库存 + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_SCHEDU_REFUND.getCode()); + wxOrderMapper.selectList(new QueryWrapper(order)).stream().forEach(o -> { + try { + proxy.expiredAndReturnMoney((WxOrder) o,false); + } catch (Exception e) { + logger.error("参团失败退款失败" + e.getMessage()); + } + }); + } - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public void orderExpired(WxOrder order) { - + public void expiredAndReturnMoney(WxOrder wxOrder,boolean checkRealPay) { + orderGroupExpired(wxOrder,checkRealPay); + returnMoney(wxOrder); + } + + + public boolean wxPaySuccess(WxOrder order) { + WxPayOrder payOrderq = new WxPayOrder(); + payOrderq.setOrderId(order.getId()); + List payorderlist = wxPayOrderMapper.findList(payOrderq); + if (null == payorderlist || payorderlist.size() <=0 ) { + return false; + } + WxPayOrder wxpayOrder = payorderlist.get(0); + if (null == wxpayOrder) { + return false; + } + WxCUser user = wxCUserMapper.selectById(wxpayOrder.getCUserId()); + //找不到用户,问题单,不能删 + if (null == user) { + return true; + } + WxAppinfo appInfo = wxAppinfoService.getByAppId(user.getAppId()); + //找不到appInfo,问题单,不能删 + if(appInfo == null) { + return true; + } + WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId()); + //找不到appInfo,问题单,不能删 + if (null == payAccount) { + return true; + } + Map retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(wxpayOrder, order, appInfo, payAccount); + int status = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, wxpayOrder.getPayOrderNo()); + //如果是支付成功,则更新信息 + if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode() == status) { + wxPayOrderService.handleSuccessOrder(wxpayOrder, order, retMap,true); + return true; + } + return false; + } + + + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public void orderExpired(WxOrder order,boolean checkRealPay) { + if (checkRealPay) { + if (wxPaySuccess(order)) { + return; + } + } // 库存退回 wxOrderService.stockBack(order); @@ -167,7 +254,13 @@ public class OrderExpiringSchedule { } @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public void orderPressExpired(WxOrder order, boolean payExpired) { + public void orderPressExpired(WxOrder order, boolean payExpired,boolean checkRealPay) { + if (checkRealPay) { + if (wxPaySuccess(order)) { + return; + } + } + Date curDate = new Date(); WxOrder updateOrder = new WxOrder(); updateOrder.setId(order.getId()); @@ -187,8 +280,14 @@ public class OrderExpiringSchedule { @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public void orderGroupExpired(WxOrder order) { - Date curDate = new Date(); + public void orderGroupExpired(WxOrder order,boolean checkRealPay) { + if (checkRealPay) { + if (wxPaySuccess(order)) { + return; + } + } + + Date curDate = new Date(); WxOrder updateOrder = new WxOrder(); updateOrder.setId(order.getId()); updateOrder.updateTenantInfo(order); @@ -205,7 +304,10 @@ public class OrderExpiringSchedule { @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public void returnMoney(WxOrder order) { - + //支付成功的才退款 + if (!wxPaySuccess(order)) { + return; + } //获取APP信息 WxAppinfo appinfo = new WxAppinfo(); appinfo.updateTenantInfo(order); diff --git a/mallinkSchedule/src/main/resources/application-dev.yml b/mallinkSchedule/src/main/resources/application-dev.yml index 33a5e72f7..d7f7849f7 100644 --- a/mallinkSchedule/src/main/resources/application-dev.yml +++ b/mallinkSchedule/src/main/resources/application-dev.yml @@ -1,9 +1,10 @@ spring: profiles: - include: rabbitMQ + include: aliyunRocketMQ + #include: rabbitMQ # JDBC datasource: - url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true + url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4) type: com.alibaba.druid.pool.DruidDataSource @@ -27,7 +28,7 @@ spring: # REDIS redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 @@ -71,6 +72,11 @@ spring: publisher-confirms: true publisher-returns: false virtual-host: / + aliyunRocketmq: + accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" + accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" + groupId: "GID_P_1" + namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" aws: clientRegion: cn-northwest-1 @@ -85,7 +91,7 @@ wechat: componentToken: "formall2018" componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 diff --git a/mallinkSchedule/src/main/resources/application.yml b/mallinkSchedule/src/main/resources/application.yml index b942491a7..617cb686c 100644 --- a/mallinkSchedule/src/main/resources/application.yml +++ b/mallinkSchedule/src/main/resources/application.yml @@ -21,22 +21,22 @@ spring: cache-names: redis_cache #缓存的名字(可以不指定) redis: time-to-live: 60000ms #很重要,缓存的有效时间,以便缓存的过期(单位为毫秒) - rocketmq: - nameServer: 127.0.0.1:9876 - producer: - retry-times-when-send-async-failed: 0 - send-msg-timeout: 300000 - compress-msg-body-over-howmuch: 4096 - max-message-size: 4194304 - retry-another-broker-when-not-store-ok: false - retry-times-when-send-failed: 2 - rabbitmq: - host: 127.0.0.1 - port: 5672 - username: guest - password: guest - publisher-confirms: true - virtual-host: / +# rocketmq: +# nameServer: 127.0.0.1:9876 +# producer: +# retry-times-when-send-async-failed: 0 +# send-msg-timeout: 300000 +# compress-msg-body-over-howmuch: 4096 +# max-message-size: 4194304 +# retry-another-broker-when-not-store-ok: false +# retry-times-when-send-failed: 2 +# rabbitmq: +# host: 127.0.0.1 +# port: 5672 +# username: guest +# password: guest +# publisher-confirms: true +# virtual-host: / # MybatisPlus diff --git a/mallinkService/pom.xml b/mallinkService/pom.xml index 0ebc4d9a5..e0b95911d 100644 --- a/mallinkService/pom.xml +++ b/mallinkService/pom.xml @@ -25,6 +25,13 @@ dozer 5.5.1 + + com.aliyun.openservices + ons-client + 1.8.4.Final + + + \ No newline at end of file diff --git a/mallinkService/src/main/java/com/iformall/common/IdWorker.java b/mallinkService/src/main/java/com/iformall/common/IdWorker.java index cafe85b1a..324f7da79 100644 --- a/mallinkService/src/main/java/com/iformall/common/IdWorker.java +++ b/mallinkService/src/main/java/com/iformall/common/IdWorker.java @@ -76,7 +76,7 @@ public class IdWorker { } private IdWorker() { - String ipAddr = ""; + String ipAddr = "192.168.1.1"; try { ipAddr = IPUtil.getLocalHostLANAddress().getHostAddress(); } catch (UnknownHostException e) { @@ -121,7 +121,6 @@ public class IdWorker { */ public synchronized long nextId() { long timestamp = timeGen(); - //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 if (timestamp < lastTimestamp) { throw new RuntimeException( @@ -141,7 +140,6 @@ public class IdWorker { else { sequence = 0L; } - //上次生成ID的时间截 lastTimestamp = timestamp; diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java b/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java index 172354dd6..aee728f91 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java @@ -16,6 +16,8 @@ import java.util.Date; @EqualsAndHashCode(callSuper = true) public class WxCardInfo extends TenantEntity { + private static final long serialVersionUID = 2974374593127477999L; + @Excel(name = "卡号", width = 20, orderNum = "1") @io.swagger.annotations.ApiModelProperty(value="主键ID-与coupon_order_id一致",name="id") protected Long id; @@ -58,5 +60,11 @@ public class WxCardInfo extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value = "是否支持转送(0:不支持,1支持)", name = "supportTransfer") private Integer supportTransfer; + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-开始时间",name="startdate") + protected Date startdate; + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-结束时间",name="enddate") + protected Date enddate; } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxMall.java b/mallinkService/src/main/java/com/iformall/domain/po/WxMall.java index 1f05c0a25..37374ea12 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxMall.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxMall.java @@ -1,6 +1,8 @@ package com.iformall.domain.po; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonProperty; import com.iformall.domain.po.base.BaseEntity; @@ -17,6 +19,7 @@ import java.util.List; @EqualsAndHashCode(callSuper = true) public class WxMall extends BaseEntity { + @TableId(type= IdType.AUTO) protected Long id; @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxMallBuilding.java b/mallinkService/src/main/java/com/iformall/domain/po/WxMallBuilding.java index d0cb23952..360951029 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxMallBuilding.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxMallBuilding.java @@ -24,6 +24,8 @@ public class WxMallBuilding extends TenantEntity { private Long mallId; @io.swagger.annotations.ApiModelProperty(value="楼座名",name="name") private String name; + @io.swagger.annotations.ApiModelProperty(value="楼座名",name="buildingName") + private String buildingName; @io.swagger.annotations.ApiModelProperty(value="楼层数",name="floorNumber") private Integer floorNumber; @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxProjectConfig.java b/mallinkService/src/main/java/com/iformall/domain/po/WxProjectConfig.java new file mode 100644 index 000000000..af314829e --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxProjectConfig.java @@ -0,0 +1,113 @@ +package com.iformall.domain.po; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.iformall.domain.po.base.BaseEntity; +import com.iformall.domain.po.base.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@TableName(value = "wx_project_config") +@Data +@EqualsAndHashCode(callSuper = true) +public class WxProjectConfig extends BaseEntity { + + protected Long id; + + @io.swagger.annotations.ApiModelProperty(value="商场名",name="name") + private String name; + @io.swagger.annotations.ApiModelProperty(value="国家",name="country") + private String country; + @io.swagger.annotations.ApiModelProperty(value="省",name="province") + private String province; + @io.swagger.annotations.ApiModelProperty(value="城市",name="city") + private String city; + @io.swagger.annotations.ApiModelProperty(value="地址",name="addr") + private String addr; + @io.swagger.annotations.ApiModelProperty(value="总面积",name="totalArea") + private BigDecimal totalArea; + @io.swagger.annotations.ApiModelProperty(value="营业面积",name="operatingArea") + private BigDecimal operatingArea; + @io.swagger.annotations.ApiModelProperty(value="停车场面积",name="parkArea") + private BigDecimal parkArea; + @io.swagger.annotations.ApiModelProperty(value="车位数",name="parkPlaceNumber") + private Integer parkPlaceNumber; + @io.swagger.annotations.ApiModelProperty(value="电话",name="servicePhone") + private String servicePhone; + @io.swagger.annotations.ApiModelProperty(value="商场图标",name="imgUrl") + private String imgUrl; + @io.swagger.annotations.ApiModelProperty(value="商场图标-H",name="imgUrlH") + private String imgUrlH; + + //1(全能版)、2(营销版,除了合同,账单功能),3.速享版(营销版加3个月限制) + @io.swagger.annotations.ApiModelProperty(value="",name="saleType") + private Integer saleType; + + @io.swagger.annotations.ApiModelProperty(value="商场楼座",name="mallBuilding") + private String mallBuilding; + + @io.swagger.annotations.ApiModelProperty(value="微信商户号/特约服务商号",name="mchId") + private String mchId; + @io.swagger.annotations.ApiModelProperty(value="微信服务商号",name="subMchId") + private String subMchId; + @io.swagger.annotations.ApiModelProperty(value="支付密钥",name="apiKey") + private String apiKey; +// @io.swagger.annotations.ApiModelProperty(value="微信回调,支持3种回调,(1.url/pay 2.url/refund3.url/separate)",name="notifyUrl") +// private String notifyUrl; +// @io.swagger.annotations.ApiModelProperty(value="证书本地存放位置",name="certPath") +// private String certPath; + @io.swagger.annotations.ApiModelProperty(value="手续费(万分之几,默认60)",name="rate") + private Integer rate; + @io.swagger.annotations.ApiModelProperty(value="实际手续费(万分之几,默认60)",name="realRate") + private Integer realRate; + + @io.swagger.annotations.ApiModelProperty(value="小程序ID(B端)",name="appIdB") + private String appIdB; + @io.swagger.annotations.ApiModelProperty(value="小程序ID(C端)",name="appIdC") + private String appIdC; + @io.swagger.annotations.ApiModelProperty(value="公众号ID",name="parentAppId") + private String parentAppId; + @io.swagger.annotations.ApiModelProperty(value="小程序名(B端)",name="appNameB") + private String appNameB; + @io.swagger.annotations.ApiModelProperty(value="小程序名(C端)",name="appNameC") + private String appNameC; + @io.swagger.annotations.ApiModelProperty(value="小程序secret(B端)",name="appSecretB") + private String appSecretB; + @io.swagger.annotations.ApiModelProperty(value="小程序secret(C端)",name="appSecretC") + private String appSecretC; + + @io.swagger.annotations.ApiModelProperty(value="授权方头像(B端)",name="headImgB") + private String headImgB; + @io.swagger.annotations.ApiModelProperty(value="授权方头像(C端)",name="headImgC") + private String headImgC; + @io.swagger.annotations.ApiModelProperty(value="二维码图片的URL(B端)",name="qrcodeUrlB") + private String qrcodeUrlB; + @io.swagger.annotations.ApiModelProperty(value="二维码图片的URL(C端)",name="qrcodeUrlC") + private String qrcodeUrlC; + @io.swagger.annotations.ApiModelProperty(value="微信开放平台appid",name="openAppid") + private String openAppid; + + @io.swagger.annotations.ApiModelProperty(value="B端当前版本号",name="currentVersionB") + private String currentVersionB; + @io.swagger.annotations.ApiModelProperty(value="C端当前版本号",name="currentVersionC") + private String currentVersionC; + + + @io.swagger.annotations.ApiModelProperty(value="A端管理员帐号",name="usernameA") + private String usernameA; + @io.swagger.annotations.ApiModelProperty(value="A端管理员密码",name="password") + private String password; + @io.swagger.annotations.ApiModelProperty(value="A端管理员名称",name="nameA") + private String nameA; + @io.swagger.annotations.ApiModelProperty(value="联系电话",name="phone") + private String phone; + + @io.swagger.annotations.ApiModelProperty(value="销售类型",name="delType") + private Integer delType; + +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/msg/UpdateCouponStockMsg.java b/mallinkService/src/main/java/com/iformall/domain/po/msg/UpdateCouponStockMsg.java new file mode 100644 index 000000000..354273ad6 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/msg/UpdateCouponStockMsg.java @@ -0,0 +1,31 @@ +package com.iformall.domain.po.msg; + +import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; +import java.util.Map; + +/** + * 更新券库存消息 + * @author Stormeye + * @date 2019/4/9 13:55 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class UpdateCouponStockMsg extends BaseMsg { + private static final long serialVersionUID = 223232132183760321L; + + public static final String OPERATE_TYPE_INCREASE = "increase"; + public static final String OPERATE_TYPE_DECREASE = "decrease"; + + @io.swagger.annotations.ApiModelProperty(value="券Id",name="couponId") + private Long couponId; + @io.swagger.annotations.ApiModelProperty(value="更新数量",name="number") + private long number; + @io.swagger.annotations.ApiModelProperty(value="操作类型 1-增加库存 ,2-减少库存",name="operateType") + private String operateType; +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxCardVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxCardVo.java index f344a1cdf..526f82675 100644 --- a/mallinkService/src/main/java/com/iformall/domain/vo/WxCardVo.java +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxCardVo.java @@ -104,12 +104,4 @@ public class WxCardVo extends WxCardInfo { @TableField(exist = false) @io.swagger.annotations.ApiModelProperty(value="卡状态",name="statusStr") protected String statusStr; - - @TableField(exist = false) - @io.swagger.annotations.ApiModelProperty(value="查询-开始时间",name="startdate") - private Date startdate; - - @TableField(exist = false) - @io.swagger.annotations.ApiModelProperty(value="查询-结束时间",name="enddate") - private Date enddate; } diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCacheKey.java b/mallinkService/src/main/java/com/iformall/enums/EnumCacheKey.java index 0f9ac04f6..d6e2d88ac 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumCacheKey.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCacheKey.java @@ -9,7 +9,7 @@ import java.util.Map; public enum EnumCacheKey { C_INDEX_PAGE_LIST(0, "couponChannelList_"), - + COUPON_STOCK(1,"couponStock_") ; private static Map map = new HashMap(); static { diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMsgMqTopic.java b/mallinkService/src/main/java/com/iformall/enums/EnumMsgMqTopic.java index 30525cfdd..55cd95f91 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumMsgMqTopic.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMsgMqTopic.java @@ -4,7 +4,8 @@ package com.iformall.enums; * Created by luozukai */ public enum EnumMsgMqTopic { - DEFAULT("topic-1", "默认"), + DEFAULT("topic-1","GID_P_1", "默认"), + STOCK("stock","GID_P_2","库存"), ; public static EnumMsgMqTopic getEnum(String code) { @@ -18,10 +19,12 @@ public enum EnumMsgMqTopic { private String code; private String message; + private String groupId; - EnumMsgMqTopic(String code, String message) { + EnumMsgMqTopic(String code, String groupId,String message) { this.code = code; this.message = message; + this.groupId = groupId; } public String getCode() { @@ -31,4 +34,12 @@ public enum EnumMsgMqTopic { public String getMessage() { return message; } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } } diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java b/mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java index dcb6cffb9..95b4583da 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java @@ -17,6 +17,7 @@ public enum EnumMsgRecordType { INSIDE_C_LOGIN(102, "C端用户登录"), INSIDE_NOTIFY_PAY_SUCCESS(103, "微信支付回调"), INSIDE_NOTIFY_REFUND_SUCCESS(104, "微信退款回调"), + COUPON_STOCK(105, "券库存更新"), ; public static EnumMsgRecordType getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java index 01776f5b7..d3dce2f12 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java @@ -23,9 +23,9 @@ public enum EnumOrderStatus { ORDER_STATUS_COOPERATING_CANCEL(13, "拼团失败"), ORDER_STATUS_COOPERATING_FAILD(14, "参团失败"), ORDER_STATUS_COOPERATING_UNPAID(15, "拼团待付款"),//占库存 - ORDER_STATUS_COOPERATING_BREAK(16, "拼团取消") + ORDER_STATUS_COOPERATING_BREAK(16, "拼团取消"), + ORDER_STATUS_COOPERATING_SCHEDU_REFUND(99,"订单定时状态-需要返款和回滚库存,无需再次查询真实支付状态") ; - public static EnumOrderStatus getEnum(Integer code) { for (EnumOrderStatus value : values()) { if (value.getCode().equals(code)) { diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCardInfoMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCardInfoMapper.java index 7d4be7a49..ded5eae3d 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCardInfoMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCardInfoMapper.java @@ -11,5 +11,7 @@ public interface WxCardInfoMapper extends CommonMapper { List findVoList(WxCardVo wxCardVo); void updateTransferStatusByCouponId(Long couponId); + + List findList(WxCardInfo wxCardInfo); } diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCouponMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCouponMapper.java index 148b34fb8..46eabed99 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCouponMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCouponMapper.java @@ -20,7 +20,7 @@ public interface WxCouponMapper extends CommonMapper { WxCouponCVo findVoDetail(@Param("id")Long id); WxCouponCVo findVoStatusDetail(@Param("id")Long id); - Integer reduceInventory(@Param("id")Long id,@Param("number")Integer number,@Param("remainInventory")Integer remainInventory); + Integer reduceInventory(@Param("id")Long id,@Param("number")Integer number); Integer backInventory(@Param("id")Long id, @Param("number")Integer number,@Param("remainInventory")Integer remainInventory); diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java index dd945dc8c..1e261b363 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java @@ -39,7 +39,10 @@ public interface WxCouponOrderMapper extends CommonMapper { List findListOfOrderedByDateForBUser(Map dateMap); List findListOfVerifiedByDateForBUser(Map dateMap); - List findListOfCUser(WxCouponOrder wxCouponOrder); + //@Deprecated + //List findListOfCUser(WxCouponOrder wxCouponOrder); + List findListOfCUserOptimize(WxCouponOrder wxCouponOrder); + WxCouponOrderCVo findDetailOfCUser(@Param("id")Long id); WxCouponOrderCVo findSimpleDetailOfCUser(@Param("id")Long id); List findListOfAdmin(WxCouponOrderBVo wxCouponOrder); diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxFlowConfigMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxFlowConfigMapper.java index 3ba014513..5b1780316 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxFlowConfigMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxFlowConfigMapper.java @@ -8,6 +8,9 @@ import java.util.List; * @author luozukai */ public interface WxFlowConfigMapper extends CommonMapper { + + void wxFlowConfigInit(String initSql); + List findList(WxFlowConfig wxFlowConfig); /** diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxMsgValidationcodeModelMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxMsgValidationcodeModelMapper.java index 550b9225c..536711276 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxMsgValidationcodeModelMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxMsgValidationcodeModelMapper.java @@ -6,11 +6,8 @@ import com.iformall.domain.po.WxMsgValidationcodeModel; public interface WxMsgValidationcodeModelMapper extends CommonMapper { - List findList(WxMsgValidationcodeModel wxMsgValidationcodeModel); - - + void wxMsgValidationcodeModelInit(String initSql); - - + List findList(WxMsgValidationcodeModel wxMsgValidationcodeModel); } diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxProjectConfigMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxProjectConfigMapper.java new file mode 100644 index 000000000..ca8b44c76 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxProjectConfigMapper.java @@ -0,0 +1,10 @@ +package com.iformall.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.iformall.domain.po.WxProjectConfig; + +public interface WxProjectConfigMapper extends BaseMapper { + + +} diff --git a/mallinkService/src/main/java/com/iformall/mq/MQConfig.java b/mallinkService/src/main/java/com/iformall/mq/MQConfig.java index ffdc5daf1..4fb90461a 100644 --- a/mallinkService/src/main/java/com/iformall/mq/MQConfig.java +++ b/mallinkService/src/main/java/com/iformall/mq/MQConfig.java @@ -4,5 +4,6 @@ public class MQConfig { public static class Impl { public static final String RABBIT_MQ = "rabbitMQ"; public static final String ROCKET_MQ = "rocketMQ"; + public static final String ALIYUN_ROCKET_MQ = "aliyunRocketMQ"; } } diff --git a/mallinkService/src/main/java/com/iformall/mq/impl/AliyunRocketMqMessageProducer.java b/mallinkService/src/main/java/com/iformall/mq/impl/AliyunRocketMqMessageProducer.java new file mode 100644 index 000000000..e539e831d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mq/impl/AliyunRocketMqMessageProducer.java @@ -0,0 +1,123 @@ +package com.iformall.mq.impl; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import javax.annotation.PostConstruct; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSON; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.ONSFactory; +import com.aliyun.openservices.ons.api.Producer; +import com.aliyun.openservices.ons.api.PropertyKeyConst; +import com.aliyun.openservices.ons.api.SendResult; +import com.iformall.domain.po.msg.BaseMsg; +import com.iformall.enums.EnumMsgMqTopic; +import com.iformall.mq.MQConfig; +import com.iformall.mq.MqBaseProducer; +import com.iformall.utils.JsonUtil; + + +/** + * @Auther: zfy 阿里云rocketmq + * @Date: 2019-01-31 + * @Description: RocketMQ消息生产者 + */ +@Service +@Profile(MQConfig.Impl.ALIYUN_ROCKET_MQ) +public class AliyunRocketMqMessageProducer implements MqBaseProducer { + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + + @Value("${spring.aliyunRocketmq.accessKeyId}") + private String accessKeyId; + + @Value("${spring.aliyunRocketmq.accessKeySecret}") + private String accessKeySecret; + + @Value("${spring.aliyunRocketmq.groupId}") + private String groupId; + + @Value("${spring.aliyunRocketmq.namesrvAddr}") + private String namesrvAddr; + + //@Autowired + //private WxMsgRecordMapper wxMsgRecordMapper; + + //@Autowired + //private WxMsgRecordService wxMsgRecordService; + + private static Map producerMap = null; + + @PostConstruct + public void init() { + producerMap = new HashMap(); + for (EnumMsgMqTopic topic: EnumMsgMqTopic.values()) { + Properties properties = new Properties(); + properties.setProperty(PropertyKeyConst.GROUP_ID, topic.getGroupId()); + // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建 + properties.put(PropertyKeyConst.AccessKey,accessKeyId); + // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建 + properties.put(PropertyKeyConst.SecretKey, accessKeySecret); + //设置发送超时时间,单位毫秒 + properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000"); + // 设置 TCP 接入域名,到控制台的实例基本信息中查看 + properties.put(PropertyKeyConst.NAMESRV_ADDR,namesrvAddr); + Producer producer = ONSFactory.createProducer(properties); + // 在发送消息前,必须调用 start 方法来启动 Producer,只需调用一次即可 + producer.start(); + log.info("aliyunrocketmq producer info :"+JSON.toJSONString(producer)); + producerMap.put(topic.getCode(), producer); + } + } + + @Override + public void sendMessage(BaseMsg data, String topic, String tags, String keys) { + Producer producer = producerMap.get(topic); + if (null == producer) { + log.error("topic :"+topic+" has no AliyunRocketMqMessageProducer."); + return; + } + if (producer.isClosed()) { + producer.start(); + } + //循环发送消息 + Message msg = new Message( // + // Message 所属的 Topic + topic, + // Message Tag 可理解为 Gmail 中的标签,对消息进行再归类,方便 Consumer 指定过滤条件在 MQ 服务器过滤 + tags, + // Message Body 可以是任何二进制形式的数据, MQ 不做任何干预, + // 需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式 + JsonUtil.obj2Json(data).getBytes()); + // 设置代表消息的业务关键属性,请尽可能全局唯一。 + // 以方便您在无法正常收到消息情况下,可通过阿里云服务器管理控制台查询消息并补发 + // 注意:不设置也不会影响消息正常收发 + msg.setKey(keys); + + try { + SendResult sendResult = producer.send(msg); + // 同步发送消息,只要不抛异常就是成功 + if (sendResult != null) { + System.out.println(new Date() + " Send mq message success. Topic is:" + msg.getTopic() + " msgId is: " + sendResult.getMessageId()); + } + } + catch (Exception e) { + // 消息发送失败,需要进行重试处理,可重新发送这条消息或持久化这条数据进行补偿处理 + System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic()); + e.printStackTrace(); + } + + // 在应用退出前,销毁 Producer 对象 + // 注意:如果不销毁也没有问题 + //producer.shutdown(); + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java b/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java index eee36bb43..b3dbb79fc 100644 --- a/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java +++ b/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.github.pagehelper.PageInfo; import com.iformall.common.ResultData; import com.iformall.domain.po.MallUserInfo; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.vo.MallUserInfoVo; @@ -14,6 +15,15 @@ import java.util.Set; public interface MallUserInfoService { + /** + * MallUserInfo初始化 + * 返回id + * @param tenantId + * @param wxProjectConfig + * @return + */ + Long MallUserInfoInit(String tenantId, WxProjectConfig wxProjectConfig); + //// -------------------- Login ----------------------- //// /** * 根据用户名查询用户对象 diff --git a/mallinkService/src/main/java/com/iformall/service/WxAppinfoService.java b/mallinkService/src/main/java/com/iformall/service/WxAppinfoService.java index 4be4fc2ed..ada0d6397 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxAppinfoService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxAppinfoService.java @@ -2,6 +2,7 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.domain.po.base.TenantEntity; import javax.servlet.http.HttpServletRequest; @@ -10,6 +11,17 @@ import java.util.List; public interface WxAppinfoService { + /** + * WxAppinfo初始化 + * --- 小程序开通后,填写此数据,并设置域名及业务域名等 + * @param tenantId + * @param payId + * @param payBillId + * @param wxProjectConfig + * @return + */ + void wxAppinfoInit(String tenantId, Long payId, Long payBillId, WxProjectConfig wxProjectConfig); + /** * 根据实体查询分页列表 * diff --git a/mallinkService/src/main/java/com/iformall/service/WxAuthorizerInfoService.java b/mallinkService/src/main/java/com/iformall/service/WxAuthorizerInfoService.java index d060c54b0..cd84cc4c3 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxAuthorizerInfoService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxAuthorizerInfoService.java @@ -2,12 +2,30 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxAuthorizerInfo; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.domain.vo.WxWeappInfo; import java.util.List; public interface WxAuthorizerInfoService { + /** + * WxAuthorizerInfo初始化 + * + * @param tenantId + * @param wxProjectConfig + * @return + */ + void wxAuthorizerInfoInit(String tenantId, WxProjectConfig wxProjectConfig); + + /** + * wx_weapp_ext_set初始化 + * + * @param wxProjectConfig + * @return + */ + void wxWeappExtSetInit(WxProjectConfig wxProjectConfig); + /** * 根据实体查询分页列表 * diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java index 5abb3da78..04464bc33 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java @@ -109,13 +109,20 @@ public interface WxCouponOrderService { ResultData listOnDateAsPage(Long bUserId, String date, Integer pageIndex, Integer pageSize, boolean isVerified); + /** + * C用户查券list + *@deprecated + * @param record C端用户 + */ + //PageInfo listCUserVoAsPage(WxCouponOrder record, Integer pageIndex, Integer pageSize); + /** * C用户查券list * * @param record C端用户 */ - PageInfo listCUserVoAsPage(WxCouponOrder record, Integer pageIndex, Integer pageSize); + PageInfo listCUserVoAsPageOptimize(WxCouponOrder record, Integer pageIndex, Integer pageSize); /** * C用户查券详情 diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponSendConfigService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponSendConfigService.java index 07e313de4..220221173 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponSendConfigService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponSendConfigService.java @@ -5,6 +5,13 @@ import com.iformall.domain.po.WxCouponSendConfig; public interface WxCouponSendConfigService { + /** + * 初始化WxCouponSendConfig + * @param tenantId + * @return + */ + void wxCouponSendConfigInit(String tenantId); + /** * 根据实体查询分页列表 * diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponService.java index d3534a79e..d8919e61f 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponService.java @@ -214,7 +214,7 @@ public interface WxCouponService { * @param number 减少数量 * @param remainInventory 当前库存 */ - void reduceRemainInventory(Long id, Integer number, Integer remainInventory); + void reduceRemainInventory(Long id, Integer number); /** * 库存退回 diff --git a/mallinkService/src/main/java/com/iformall/service/WxFlowService.java b/mallinkService/src/main/java/com/iformall/service/WxFlowService.java index 4f83c9d32..65cb433e6 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxFlowService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxFlowService.java @@ -16,6 +16,13 @@ import java.util.Map; * 流程审批服务 */ public interface WxFlowService { + + /** + * wx_flow_config初始化 + * @param tenantId + */ + void wxFlowConfigInit(String tenantId); + WxFlowModel getModelByType(int flowType,TenantEntity tenantEntity); /** diff --git a/mallinkService/src/main/java/com/iformall/service/WxMallBuildingService.java b/mallinkService/src/main/java/com/iformall/service/WxMallBuildingService.java index 09914471d..b6594d238 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxMallBuildingService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxMallBuildingService.java @@ -9,6 +9,15 @@ import com.iformall.domain.po.WxMallFloor; public interface WxMallBuildingService { + /** + * WxMallBuilding初始化 + * + * @param tenantId + * @param mallBuildingJSONstr {"A座":"B2层,B1层,1层,2层,3层,4层","B座":"1层,2层,3层"} + * @return + */ + void wxMallBuildingInit(String tenantId,String mallBuildingJSONstr); + /** * 根据实体查询分页列表 * diff --git a/mallinkService/src/main/java/com/iformall/service/WxMallService.java b/mallinkService/src/main/java/com/iformall/service/WxMallService.java index 6c4c786f6..e0f8beb6b 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxMallService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxMallService.java @@ -1,6 +1,7 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.WxMall; @@ -8,6 +9,15 @@ import java.util.List; public interface WxMallService { + /** + * 根据WxProjectConfig初始化WxMall + * 返回TenantId + * + * @param wxProjectConfig + * @return + */ + String wxMallInit(WxProjectConfig wxProjectConfig); + /** * 根据实体查询分页列表 * @@ -62,5 +72,4 @@ public interface WxMallService { @Deprecated WxMall getByTenantIdExt(String id); - } diff --git a/mallinkService/src/main/java/com/iformall/service/WxMsgConfigService.java b/mallinkService/src/main/java/com/iformall/service/WxMsgConfigService.java index 42425a3db..85b95a0eb 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxMsgConfigService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxMsgConfigService.java @@ -2,17 +2,27 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxMsgConfig; +import com.iformall.domain.po.WxProjectConfig; import java.util.List; public interface WxMsgConfigService { + /** + * WxMsgConfig初始化 + * + * @param tenantId + * @param wxProjectConfig + * @return + */ + void WxMsgConfigInit(String tenantId, WxProjectConfig wxProjectConfig); + /** * 根据实体查询分页列表 * * @param record - * @param offset - * @param limit + * @param pageIndex + * @param pageSize * @return */ PageInfo listAsPage(WxMsgConfig record, Integer pageIndex, Integer pageSize); diff --git a/mallinkService/src/main/java/com/iformall/service/WxMsgValidationcodeModelService.java b/mallinkService/src/main/java/com/iformall/service/WxMsgValidationcodeModelService.java index 16e0774be..74bfba03e 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxMsgValidationcodeModelService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxMsgValidationcodeModelService.java @@ -3,15 +3,24 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; import com.iformall.common.ResultData; import com.iformall.domain.po.WxMsgValidationcodeModel; +import com.iformall.domain.po.WxProjectConfig; public interface WxMsgValidationcodeModelService { + /** + * wx_msg_validationcode_model 初始化 + * + * @param tenantId + * @return + */ + void wxMsgValidationcodeModelInit(String tenantId, WxProjectConfig wxProjectConfig); + /** * 根据实体查询分页列表 * * @param record - * @param offset - * @param limit + * @param pageIndex + * @param pageSize * @return */ PageInfo listAsPage(WxMsgValidationcodeModel record, Integer pageIndex, Integer pageSize); diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java index 2672ecd11..ee3314651 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java @@ -15,7 +15,7 @@ import java.util.Map; */ public interface WxOrderGroupService { - void createOrderGroup(WxOrder order, WxCoupon wxCoupon); + void createOrderGroup(WxOrder order, WxCoupon wxCoupon,boolean isScheduleTask); ResultData queryRemainOne(WxOrderGroup wxOrderGroup, Long userId); @@ -32,5 +32,5 @@ public interface WxOrderGroupService { List findList(WxOrderGroup group); PageInfo queryOrderGroupMarketingList(WxOrderGroupMarketing marketing, Integer pageNum, Integer pageSize); - + } diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 28ecccc3c..44488d033 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -226,5 +226,10 @@ public interface WxOrderService { * H5支付后, 券再注入 */ Long saveOuterOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId); + + + int countGroupOrder(Long groupId,boolean ignoreUnPay); + + int countUserCouponGroupOrder(Long cuserId,Long couponId); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxParkService.java b/mallinkService/src/main/java/com/iformall/service/WxParkService.java index 44fa215b1..fa8ecab94 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxParkService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxParkService.java @@ -2,9 +2,18 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxPark; +import com.iformall.domain.po.WxProjectConfig; public interface WxParkService { + /** + * WxPark初始化 + * + * @param tenantId + * @return + */ + void wxParkInit(String tenantId, WxProjectConfig wxProjectConfig); + /** * 根据实体查询分页列表 * diff --git a/mallinkService/src/main/java/com/iformall/service/WxPayAccountBillService.java b/mallinkService/src/main/java/com/iformall/service/WxPayAccountBillService.java index 1b97adf1e..87a0eb753 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxPayAccountBillService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxPayAccountBillService.java @@ -1,11 +1,21 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.WxPayAccountBill; public interface WxPayAccountBillService { + /** + * --- 特殊商户号开通后,填写此数据 + * WxPayAccountBill初始化 + * 返回id + * @param wxPayAccount + * @return + */ + Long wxPayAccountInit(WxPayAccount wxPayAccount); + /** * 根据实体查询分页列表 * diff --git a/mallinkService/src/main/java/com/iformall/service/WxPayAccountService.java b/mallinkService/src/main/java/com/iformall/service/WxPayAccountService.java index ffd49879b..e0ba9d246 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxPayAccountService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxPayAccountService.java @@ -2,9 +2,20 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxProjectConfig; public interface WxPayAccountService { + /** + * --- 特殊商户号开通后,填写此数据 + * WxPayAccount初始化 + * + * @param tenantId + * @param wxProjectConfig + * @return + */ + WxPayAccount wxPayAccountInit(String tenantId, WxProjectConfig wxProjectConfig); + /** * 根据实体查询分页列表 * diff --git a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java index 5c281dcb6..ec51b4910 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java @@ -3,15 +3,23 @@ package com.iformall.service; import java.util.*; import com.github.pagehelper.PageInfo; +import com.iformall.common.IdWorker; import com.iformall.common.ResultData; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxCUser; +import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxMerchantBUser; +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.WxPayOrder; import com.iformall.enums.EnumPayWay; public interface WxPayOrderService { + public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map retMap,boolean isScheduleTask); + + public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay); + /** * 创建支付订单 * @@ -137,6 +145,8 @@ public interface WxPayOrderService { * @param id */ void deleteById(Long id); + + public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxProjectConfigService.java b/mallinkService/src/main/java/com/iformall/service/WxProjectConfigService.java new file mode 100644 index 000000000..f1fa8b340 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxProjectConfigService.java @@ -0,0 +1,13 @@ +package com.iformall.service; + + +public interface WxProjectConfigService { + + /** + * 根据wx_project_config数据生成初始化商户数据 + * + * @param id + */ + void initProjectConfig(Long id); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxQuestionService.java b/mallinkService/src/main/java/com/iformall/service/WxQuestionService.java index 5591c33d9..1ba1d06ad 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxQuestionService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxQuestionService.java @@ -9,12 +9,21 @@ import java.util.List; public interface WxQuestionService { + /** + * wx_question 初始化 + * + * @param tenantId + * @param questionJson + * @return + */ + void wxQuestionInit(String tenantId, String questionJson); + /** * 根据实体查询分页列表 * * @param record - * @param offset - * @param limit + * @param pageIndex + * @param pageSize * @return */ PageInfo listAsPage(WxQuestion record, Integer pageIndex, Integer pageSize); diff --git a/mallinkService/src/main/java/com/iformall/service/WxScoreRulesService.java b/mallinkService/src/main/java/com/iformall/service/WxScoreRulesService.java index 12c1d4684..53ae80bda 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxScoreRulesService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxScoreRulesService.java @@ -9,6 +9,13 @@ import java.util.List; public interface WxScoreRulesService { + /** + * 积分成长值设置wx_score_rules 初始化 + * @param tenantId + * @return + */ + void wxScoreRulesInit(String tenantId); + /** * 获取租户的ScoreRules * @param tenantEntity diff --git a/mallinkService/src/main/java/com/iformall/service/WxTemplateMsgService.java b/mallinkService/src/main/java/com/iformall/service/WxTemplateMsgService.java index d3028376c..ea7ad0dbc 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxTemplateMsgService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxTemplateMsgService.java @@ -5,6 +5,14 @@ import com.iformall.domain.po.WxTemplateMsg; public interface WxTemplateMsgService { + /** + * wx_template_msg 初始化 + * 设置核销成功通知,核销失败通知 + * @param tenantId + * @return + */ + void wxTemplateMsgInit(String tenantId); + /** * 根据实体查询分页列表 * diff --git a/mallinkService/src/main/java/com/iformall/service/helper/WxPayOrderServiceHelper.java b/mallinkService/src/main/java/com/iformall/service/helper/WxPayOrderServiceHelper.java new file mode 100644 index 000000000..9c3d5c908 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/helper/WxPayOrderServiceHelper.java @@ -0,0 +1,160 @@ +package com.iformall.service.helper; + +import java.util.Date; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.iformall.common.ErrorCode; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxMerchantBUser; +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxPayOrder; +import com.iformall.enums.EnumOrderStatus; +import com.iformall.enums.EnumPayEndFrom; +import com.iformall.enums.EnumPayMode; +import com.iformall.enums.EnumPayStatus; +import com.iformall.exception.MallinkException; +import com.iformall.pay.WxPay; +import com.iformall.pay.WxPayOrderQ; +import com.iformall.pay.WxPayOrderSQ; +import com.iformall.pay.WxPayment; +import com.iformall.utils.BeanUtils; +import com.iformall.utils.Utility; + +public class WxPayOrderServiceHelper { + + private static final Logger logger = LoggerFactory.getLogger(WxPayOrderServiceHelper.class); + /** + * 微信订单是否可以支付 + */ + public static Map wxOrderPayStatusMap(WxPayOrder record,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount) { + if (record == null) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "wxPayOrder is null."); + } + if (StringUtils.isBlank(record.getPayOrderNo())) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "payOrderNo not found"); + } + if (order == null) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "Order not found"); + } + + String response = wechatPayOrderQuery(appInfo, record,payAccount); + + logger.info("pay order query, " + record.toString() + ", response: " + response); + try { + Map returnMap = WxPayment.xmlToMap(response); + return returnMap; + }catch(Exception e) { + logger.error("wx payQuery xmlToMap error:response:["+response+"]",e); + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "wx payQuery xmlToMap error"); + } + } + + public static int getPayStatusFromMap(Map returnMap,String payOrderNo) { + String return_code = returnMap.get("return_code"); + if ("SUCCESS".equalsIgnoreCase(return_code)) { + + String result_code = returnMap.get("result_code"); + + if ("SUCCESS".equals(result_code)) { + String trade_state = returnMap.get("trade_state"); + //SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(刷卡支付),USERPAYING--用户支付中,PAYERROR--支付失败(其他原因,如银行返回失败) + if ("SUCCESS".equals(trade_state)) { + return EnumPayStatus.PAY_STATUS_SUCCESS.getCode(); + }else if ("REFUND".equals(trade_state)) { + return EnumPayStatus.PAY_STATUS_REFUND.getCode(); + }else if ("NOTPAY".equals(trade_state)) { + return EnumPayStatus.PAY_STATUS_NOTPAY.getCode(); + }else if ("CLOSED".equals(trade_state)) { + return EnumPayStatus.PAY_STATUS_CLOSE.getCode(); + }else if ("REVOKED".equals(trade_state)) { + return EnumPayStatus.PAY_STATUS_REVERSE.getCode(); + }else if ("USERPAYING".equals(trade_state)) { + return EnumPayStatus.PAY_STATUS_WAIT.getCode(); + }else if ("PAYERROR".equals(trade_state)) { + return EnumPayStatus.PAY_STATUS_FAIL.getCode(); + } + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询微信支付状态非法["+trade_state+"]"+payOrderNo); + }else { + String errCode = returnMap.get("err_code"); + String errCodeDes = returnMap.get("err_code_des"); + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询微信支付状态失败["+errCode+":"+errCodeDes+"]"+payOrderNo); + } + } else { + String return_msg = returnMap.get("return_msg"); + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询微信支付状态失败"+return_msg); + } + } + + public static int wxOrderPayStatus(WxPayOrder record,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount) { + Map returnMap = wxOrderPayStatusMap(record,order,appInfo,payAccount); + return getPayStatusFromMap(returnMap,record.getPayOrderNo()); + } + + + public static String wechatPayOrderQuery(WxAppinfo appInfo, WxPayOrder record ,WxPayAccount payAccount) { + if (payAccount == null) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "WxPayAccount not found"); + } + // get payAccount + if (payAccount.getType() == EnumPayMode.MCH.getCode()) { + // 普通商户号模式 + WxPayOrderQ payOrderQ = new WxPayOrderQ(); + String noncestr = Utility.generate32UUID(); + payOrderQ.setAppid(appInfo.getAppId()); + payOrderQ.setMch_id(payAccount.getMchId()); + payOrderQ.setNonce_str(noncestr); + if (StringUtils.isNotBlank(record.getTransactionId())) { + payOrderQ.setTransaction_id(record.getTransactionId()); + } else { + payOrderQ.setOut_trade_no(record.getPayOrderNo()); + } + + try { + Map map = BeanUtils.toStringMap(payOrderQ); + payOrderQ.setSign(WxPayment.createSign(map, payAccount.getApiKey())); + map = BeanUtils.toStringMap(payOrderQ); + String response = WxPay.orderQuery(map); + return response; + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } else { + // 服务商模式 + WxPayOrderSQ payOrderSQ = new WxPayOrderSQ(); + String noncestr = Utility.generate32UUID(); + payOrderSQ.setAppid(appInfo.getParentAppId()); + payOrderSQ.setSub_appid(appInfo.getAppId()); + payOrderSQ.setMch_id(payAccount.getMchId()); + payOrderSQ.setSub_mch_id(payAccount.getSubMchId()); + payOrderSQ.setNonce_str(noncestr); + if (StringUtils.isNotBlank(record.getTransactionId())) { + payOrderSQ.setTransaction_id(record.getTransactionId()); + } else { + payOrderSQ.setOut_trade_no(record.getPayOrderNo()); + } + payOrderSQ.setSign_type("HMAC-SHA256"); + + try { + Map map = BeanUtils.toStringMap(payOrderSQ); + payOrderSQ.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); + map = BeanUtils.toStringMap(payOrderSQ); + + String response = WxPay.orderQuery(map); + return response; + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java index 06d8cf43a..5deb15900 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java @@ -8,19 +8,15 @@ import com.github.pagehelper.PageInfo; import com.iformall.common.ErrorCode; import com.iformall.common.IdWorker; import com.iformall.common.ResultData; -import com.iformall.domain.po.MallPermission; -import com.iformall.domain.po.MallUserInfo; -import com.iformall.domain.po.MallUserRole; -import com.iformall.domain.po.WxMsgValidationcode; +import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.vo.MallUserInfoVo; import com.iformall.exception.MallinkException; -import com.iformall.mapper.MallPermissionMapper; -import com.iformall.mapper.MallUserInfoMapper; -import com.iformall.mapper.MallUserRoleMapper; -import com.iformall.mapper.WxMsgValidationcodeMapper; +import com.iformall.mapper.*; +import com.iformall.service.MallRoleService; import com.iformall.service.MallUserInfoService; import com.iformall.service.WxMallService; +import com.iformall.utils.PasswordHelper; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -43,9 +39,18 @@ public class MallUserInfoServiceImpl implements MallUserInfoService { @Autowired MallUserRoleMapper userRoleMapper; + @Autowired + MallRoleMapper mallRoleMapper; + + @Autowired + MallUserRoleMapper mallUserRoleMapper; + @Autowired MallPermissionMapper mallPermissionMapper; + @Autowired + MallRolePermissionMapper mallRolePermissionMapper; + @Autowired WxMsgValidationcodeMapper wxMsgValidationcodeMapper; @@ -163,6 +168,45 @@ public class MallUserInfoServiceImpl implements MallUserInfoService { mallUserInfoMapper.deleteById(id); } + @Override + public Long MallUserInfoInit(String tenantId, WxProjectConfig wxProjectConfig) { + //创建帐号 + MallUserInfo mallUserInfo = new MallUserInfo(); + mallUserInfo.setTenantId(tenantId); + mallUserInfo.setUsername(wxProjectConfig.getUsernameA()); + mallUserInfo.setName(wxProjectConfig.getName()); + mallUserInfo.setPassword(wxProjectConfig.getPassword()); + new PasswordHelper().encryptPassword(mallUserInfo); + mallUserInfo.setCreateTime(new Date()); + mallUserInfo.setStatus(1); + mallUserInfo.setIsAdmin(1); + mallUserInfo.setPhone(wxProjectConfig.getPhone()); + mallUserInfoMapper.insert(mallUserInfo); + //创建角色 + MallRole mallRole = new MallRole(); + mallRole.setTenantId(tenantId); + mallRole.setName("系统管理员"); + mallRole.setAvailable("0"); + mallRoleMapper.insert(mallRole); + //给角色赋权限 + MallPermission mallPermission=new MallPermission(); + List list = mallPermissionMapper.findList(mallPermission); + for(MallPermission m : list){ + MallRolePermission mallRolePermission = new MallRolePermission(); + mallRolePermission.setTenantId(tenantId); + mallRolePermission.setRoleId(mallRole.getId()); + mallRolePermission.setPermissionId(m.getId()); + mallRolePermissionMapper.insert(mallRolePermission); + } + //给帐号加角色 + MallUserRole mallUserRole = new MallUserRole(); + //mallUserRole.setId(idWorker.nextId()); + mallUserRole.setUid(mallUserInfo.getId()); + mallUserRole.setRoleId(mallRole.getId()); + mallUserRoleMapper.insert(mallUserRole); + return mallUserInfo.getId(); + } + @Override public MallUserInfo getByUsername(String username) { return mallUserInfoMapper.selectByUserName(username); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxAppinfoServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxAppinfoServiceImpl.java index 639720c9d..1e3608f71 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxAppinfoServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxAppinfoServiceImpl.java @@ -5,6 +5,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.domain.po.base.TenantEntity; import com.iformall.enums.EnumAppType; import com.iformall.mapper.WxAppinfoMapper; @@ -41,6 +42,30 @@ public class WxAppinfoServiceImpl implements WxAppinfoService { return wxAppinfoMapper.findByAppId(appId); } + @Override + public void wxAppinfoInit(String tenantId, Long payId, Long payBillId, WxProjectConfig wxProjectConfig) { + WxAppinfo wxAppinfo = new WxAppinfo(); + wxAppinfo.setTenantId(tenantId); + wxAppinfo.setType(1); + wxAppinfo.setAppId(wxProjectConfig.getAppIdB()); + wxAppinfo.setParentAppId(wxProjectConfig.getParentAppId()); + wxAppinfo.setName(wxProjectConfig.getAppNameB()); + wxAppinfo.setSecret(wxProjectConfig.getAppSecretB()); + wxAppinfo.setPayId(payId); + wxAppinfo.setPayBillId(payBillId); + wxAppinfoMapper.insert(wxAppinfo); + wxAppinfo = new WxAppinfo(); + wxAppinfo.setTenantId(tenantId); + wxAppinfo.setType(2); + wxAppinfo.setAppId(wxProjectConfig.getAppIdC()); + wxAppinfo.setParentAppId(wxProjectConfig.getParentAppId()); + wxAppinfo.setName(wxProjectConfig.getAppNameC()); + wxAppinfo.setSecret(wxProjectConfig.getAppSecretC()); + wxAppinfo.setPayId(payId); + wxAppinfo.setPayBillId(payBillId); + wxAppinfoMapper.insert(wxAppinfo); + } + @Override public PageInfo listAsPage(WxAppinfo record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxAppinfoMapper.findList(record)); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxAuthorizerInfoServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxAuthorizerInfoServiceImpl.java index 76d88add5..0a695d9b5 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxAuthorizerInfoServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxAuthorizerInfoServiceImpl.java @@ -6,6 +6,7 @@ import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxAuthorizerInfo; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.domain.po.WxWeappExtSet; import com.iformall.domain.vo.WxWeappInfo; import com.iformall.enums.EnumAppType; @@ -37,6 +38,81 @@ public class WxAuthorizerInfoServiceImpl implements WxAuthorizerInfoService { WxAppinfoMapper appinfoMapper; + @Override + public void wxAuthorizerInfoInit(String tenantId, WxProjectConfig wxProjectConfig) { + WxAuthorizerInfo wxAuthorizerInfo = new WxAuthorizerInfo(); + wxAuthorizerInfo.setTenantId(tenantId); + wxAuthorizerInfo.setType(1); + wxAuthorizerInfo.setAuthorizerAppid(wxProjectConfig.getAppIdB()); + wxAuthorizerInfo.setHeadImg(wxProjectConfig.getHeadImgB()); + wxAuthorizerInfo.setQrcodeUrl(wxProjectConfig.getQrcodeUrlB()); + wxAuthorizerInfo.setCreateTime(new Date()); + wxAuthorizerInfo.setUpdateTime(new Date()); + wxAuthorizerInfo.setAuthorizationStatus(0);//授权状态,0为已授权,1为已取消授权 + wxAuthorizerInfo.setAuthTime(new Date()); + wxAuthorizerInfo.setBaseStatus(0);//微信基础版本设置状态,0为已设置,1为设置失败 + wxAuthorizerInfo.setBaseTime(new Date()); + wxAuthorizerInfo.setDomainStatus(0);//服务器域名设置状态,0为已设置,1为设置失败 + wxAuthorizerInfo.setDomainTime(new Date()); + wxAuthorizerInfo.setWebdomainStatus(0);//服务器业务域名设置状态,0为已设置,1为设置失败 + wxAuthorizerInfo.setWebdomainTime(new Date()); + wxAuthorizerInfo.setCurrentVersion(wxProjectConfig.getCurrentVersionB()); + wxAuthorizerInfo.setCurrentDesc(wxProjectConfig.getCurrentVersionB()); + wxAuthorizerInfo.setReleaseTime(new Date()); + wxAuthorizerInfo.setOpenAppid(wxProjectConfig.getOpenAppid()); + wxAuthorizerInfo.setBindOpenTime(new Date()); + wxAuthorizerInfo.setRefreshToken(""); + wxAuthorizerInfo.setAccessToken(""); + authorizerInfoMapper.insert(wxAuthorizerInfo); + wxAuthorizerInfo = new WxAuthorizerInfo(); + wxAuthorizerInfo.setTenantId(tenantId); + wxAuthorizerInfo.setType(2); + wxAuthorizerInfo.setAuthorizerAppid(wxProjectConfig.getAppIdC()); + wxAuthorizerInfo.setHeadImg(wxProjectConfig.getHeadImgC()); + wxAuthorizerInfo.setQrcodeUrl(wxProjectConfig.getQrcodeUrlC()); + wxAuthorizerInfo.setCreateTime(new Date()); + wxAuthorizerInfo.setUpdateTime(new Date()); + wxAuthorizerInfo.setAuthorizationStatus(0);//授权状态,0为已授权,1为已取消授权 + wxAuthorizerInfo.setAuthTime(new Date()); + wxAuthorizerInfo.setBaseStatus(0);//微信基础版本设置状态,0为已设置,1为设置失败 + wxAuthorizerInfo.setBaseTime(new Date()); + wxAuthorizerInfo.setDomainStatus(0);//服务器域名设置状态,0为已设置,1为设置失败 + wxAuthorizerInfo.setDomainTime(new Date()); + wxAuthorizerInfo.setWebdomainStatus(0);//服务器业务域名设置状态,0为已设置,1为设置失败 + wxAuthorizerInfo.setWebdomainTime(new Date()); + wxAuthorizerInfo.setTemplateStatus(0);//模板设置状态,0为已设置,1为设置失败 + wxAuthorizerInfo.setTemplateTime(new Date()); + wxAuthorizerInfo.setCurrentVersion(wxProjectConfig.getCurrentVersionC()); + wxAuthorizerInfo.setCurrentDesc(wxProjectConfig.getCurrentVersionC()); + wxAuthorizerInfo.setReleaseTime(new Date()); + wxAuthorizerInfo.setOpenAppid(wxProjectConfig.getOpenAppid()); + wxAuthorizerInfo.setBindOpenTime(new Date()); + wxAuthorizerInfo.setRefreshToken(""); + wxAuthorizerInfo.setAccessToken(""); + authorizerInfoMapper.insert(wxAuthorizerInfo); + } + + @Override + public void wxWeappExtSetInit(WxProjectConfig wxProjectConfig) { + WxWeappExtSet wxWeappExtSet = new WxWeappExtSet(); + wxWeappExtSet.setAppId(wxProjectConfig.getAppIdB()); + wxWeappExtSet.setType(1); + wxWeappExtSet.setExtJson("{}"); + wxWeappExtSet.setReleaseJson("{}"); + wxWeappExtSet.setCreateDate(new Date()); + wxWeappExtSet.setUpdateDate(new Date()); + weappExtSetMapper.insert(wxWeappExtSet); + wxWeappExtSet = new WxWeappExtSet(); + wxWeappExtSet.setAppId(wxProjectConfig.getAppIdC()); + wxWeappExtSet.setType(2); + wxWeappExtSet.setExtJson("{}"); + wxWeappExtSet.setReleaseJson("{}"); + wxWeappExtSet.setCarSupport(0); + wxWeappExtSet.setCreateDate(new Date()); + wxWeappExtSet.setUpdateDate(new Date()); + weappExtSetMapper.insert(wxWeappExtSet); + } + @Override public PageInfo listAsPage(WxAuthorizerInfo record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> authorizerInfoMapper.findList(record)); 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 c76b71725..1e95bd06b 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java @@ -231,10 +231,16 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { return new ResultData(resultMap); } + //@Override + //public PageInfo listCUserVoAsPage(WxCouponOrder record, Integer pageIndex, Integer pageSize) { + // + // return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfCUser(record)); + //} + @Override - public PageInfo listCUserVoAsPage(WxCouponOrder record, Integer pageIndex, Integer pageSize) { + public PageInfo listCUserVoAsPageOptimize(WxCouponOrder record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfCUser(record)); + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfCUserOptimize(record)); } @Override diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendConfigServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendConfigServiceImpl.java index abfad82a9..6ca74cc81 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendConfigServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendConfigServiceImpl.java @@ -4,6 +4,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; import com.iformall.domain.po.WxCouponSendConfig; +import com.iformall.enums.EnumCouponSendSendType; import com.iformall.mapper.WxCouponSendConfigMapper; import com.iformall.service.WxCouponSendConfigService; import org.slf4j.Logger; @@ -22,6 +23,23 @@ public class WxCouponSendConfigServiceImpl implements WxCouponSendConfigService WxCouponSendConfigMapper wxCouponSendConfigMapper; + @Override + public void wxCouponSendConfigInit(String tenantId) { + WxCouponSendConfig wxCouponSendConfig = new WxCouponSendConfig(); + wxCouponSendConfig.setTenantId(tenantId); + wxCouponSendConfig.setValue(0);//默认停用 + wxCouponSendConfig.setCreateTime(new Date()); + wxCouponSendConfig.setUpdateTime(new Date()); + for (EnumCouponSendSendType value : EnumCouponSendSendType.values()) { + wxCouponSendConfig.setId(null); + if (value.getCode() > 1) { + wxCouponSendConfig.setSendType(value.getCode()); + wxCouponSendConfig.setRemark( value.getMessage() + "开关"); + wxCouponSendConfigMapper.insert(wxCouponSendConfig); + } + } + } + @Override public PageInfo listAsPage(WxCouponSendConfig record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponSendConfigMapper.findList(record)); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java index abd1d586d..d9cd6510f 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java @@ -181,7 +181,7 @@ public class WxCouponSendServiceImpl implements WxCouponSendService { } //更新库存 - wxCouponService.reduceRemainInventory(wxCouponOfDb.getId(), merchantLnventory, wxCouponOfDb.getRemainInventory()); + wxCouponService.reduceRemainInventory(wxCouponOfDb.getId(), merchantLnventory); } @Override diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java index a998d6c0c..1c22e2619 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java @@ -726,8 +726,8 @@ public class WxCouponServiceImpl implements WxCouponService { @Override @Transactional(isolation= Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}) - public void reduceRemainInventory(Long id, Integer number, Integer remainInventory) { - int num = wxCouponMapper.reduceInventory(id, number, remainInventory); + public void reduceRemainInventory(Long id, Integer number) { + int num = wxCouponMapper.reduceInventory(id, number); if (num == 0) { throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxFlowServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxFlowServiceImpl.java index 7a250b8de..68727c51f 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxFlowServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxFlowServiceImpl.java @@ -47,6 +47,7 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.Field; +import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; @@ -99,6 +100,38 @@ public class WxFlowServiceImpl implements WxFlowService { @Qualifier("couponChannelRedisTemplate") RedisTemplate> cdRedisTemplate; + @Override + public void wxFlowConfigInit(String tenantId) { + DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String nowTimestr = format.format(new Date()); + final IdWorker idWorker = IdWorker.get(); + Long id1 = idWorker.nextId(); + Long id2 = idWorker.nextId(); + Long id3 = idWorker.nextId(); + String initSql = "insert into `mallink`.`wx_flow_config` ( `id`, `parent_id`, `tenant_id`, `name`, `type`, `model_id`, `create_date`, `update_date`, `sort`) values " + + " ( '" + id1 + "', '0', '" + tenantId + "', '营销审批', '0', '0', '" + nowTimestr + "', '" + nowTimestr + "', '3')," + + " ( '" + id2 + "', '0', '" + tenantId + "', '合同审批', '0', '0', '" + nowTimestr + "', '" + nowTimestr + "', '1')," + + " ( '" + id3 + "', '0', '" + tenantId + "', '账单审批', '0', '0', '" + nowTimestr + "', '" + nowTimestr + "', '2')," + + " ( '" + idWorker.nextId() + "', '" + id1 + "', '" + tenantId + "', '拼团审批', '11', '0', '" + nowTimestr + "', '" + nowTimestr + "', '3')," + + " ( '" + idWorker.nextId() + "', '" + id1 + "', '" + tenantId + "', '有价券审批', '9', '0', '" + nowTimestr + "', '" + nowTimestr + "', '1')," + + " ( '" + idWorker.nextId() + "', '" + id1 + "', '" + tenantId + "', '卡审批', '10', '0', '" + nowTimestr + "', '" + nowTimestr + "', '2')," + + " ( '" + idWorker.nextId() + "', '" + id1 + "', '" + tenantId + "', '砍价审批', '12', '0', '" + nowTimestr + "', '" + nowTimestr + "', '4')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '多经点位租金+物业合同签约', '19', '0', '" + nowTimestr + "', '" + nowTimestr + "', '11')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '商铺租金+物业合同终止', '18', '0', '" + nowTimestr + "', '" + nowTimestr + "', '10')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '商铺物业合同签约', '13', '0', '" + nowTimestr + "', '" + nowTimestr + "', '5')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '商铺租金+物业合同签约', '17', '0', '" + nowTimestr + "', '" + nowTimestr + "', '9')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '多经点位物业合同签约', '15', '0', '" + nowTimestr + "', '" + nowTimestr + "', '7')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '多经点位物业合同终止', '16', '0', '" + nowTimestr + "', '" + nowTimestr + "', '8')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '多经点位租金+物业合同终止', '20', '0', '" + nowTimestr + "', '" + nowTimestr + "', '12')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '商铺物业合同终止', '14', '0', '" + nowTimestr + "', '" + nowTimestr + "', '6')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '商铺租金合同终止', '6', '0', '" + nowTimestr + "', '" + nowTimestr + "', '3')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '多经点位租金合同签约', '5', '0', '" + nowTimestr + "', '" + nowTimestr + "', '2')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '多经点位租金合同终止', '7', '0', '" + nowTimestr + "', '" + nowTimestr + "', '4')," + + " ( '" + idWorker.nextId() + "', '" + id2 + "', '" + tenantId + "', '商铺租金合同签约', '4', '0', '" + nowTimestr + "', '" + nowTimestr + "', '1')," + + " ( '" + idWorker.nextId() + "', '" + id3 + "', '" + tenantId + "', '账单应收金额变更', '8', '0', '" + nowTimestr + "', '" + nowTimestr + "', '1');"; + wxFlowConfigMapper.wxFlowConfigInit(initSql); + } + /** * 获取流程key * @param flowType diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMallBuildingServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMallBuildingServiceImpl.java index 708e7328a..ebfef73f3 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxMallBuildingServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMallBuildingServiceImpl.java @@ -1,35 +1,77 @@ package com.iformall.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; import com.iformall.common.ResultData; import com.iformall.domain.dto.WxMallBuildingFloorDto; +import com.iformall.domain.po.WxMall; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.WxMallBuilding; import com.iformall.domain.po.WxMallFloor; import com.iformall.mapper.WxMallBuildingMapper; import com.iformall.mapper.WxMallFloorMapper; import com.iformall.service.WxMallBuildingService; +import com.iformall.service.WxMallService; import com.iformall.utils.Constant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @Service public class WxMallBuildingServiceImpl implements WxMallBuildingService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); - + + @Autowired + WxMallService wxMallService; + @Autowired WxMallBuildingMapper wxMallBuildingMapper; @Autowired WxMallFloorMapper wxMallFloorMapper; + @Override + public void wxMallBuildingInit(String tenantId, String mallBuildingJSONstr) { + WxMall byTenantId = wxMallService.getByTenantId(tenantId); + JSONObject obj= JSON.parseObject(mallBuildingJSONstr); + Iterator it =obj.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = (Map.Entry) it.next(); + String[] split = entry.getValue().replace(",",",").split(","); + WxMallBuilding wxMallBuilding = new WxMallBuilding(); + wxMallBuilding.setTenantId(tenantId); + wxMallBuilding.setMallId(byTenantId.getId()); + wxMallBuilding.setBuildingName(entry.getKey()); + wxMallBuilding.setFloorNumber(split.length); + wxMallBuilding.setCreateDate(new Date()); + wxMallBuilding.setUpdateDate(new Date()); + wxMallBuildingMapper.insert(wxMallBuilding); + + for (String cha:split) { + WxMallFloor wxMallFloor = new WxMallFloor(); + wxMallFloor.setTenantId(tenantId); + wxMallFloor.setMallId(byTenantId.getId()); + wxMallFloor.setBuildingId(wxMallBuilding.getId()); + wxMallFloor.setFloorName(cha); + //默认图片---------------------------------------------------- + wxMallFloor.setBackgroundImg("https://s3.cn-northwest-1.amazonaws.com.cn/iformall-net/789/9eea8e0e-15ea-4be0-a43d-31e2e9d8db8c.jpg"); + wxMallFloor.setCreateDate(new Date()); + wxMallFloor.setUpdateDate(new Date()); + wxMallFloorMapper.insert(wxMallFloor); + } + } + } + @Override public PageInfo listAsPage(WxMallBuilding record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxMallBuildingMapper.findList(record)); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMallServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMallServiceImpl.java index 876260ee9..1f8e5eec9 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxMallServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMallServiceImpl.java @@ -3,6 +3,7 @@ package com.iformall.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.WxMall; import com.iformall.domain.po.WxMallBuilding; @@ -43,6 +44,43 @@ public class WxMallServiceImpl implements WxMallService { @Qualifier("mallRedisTemplate") RedisTemplate mallRedisTemplate; + @Override + public String wxMallInit(WxProjectConfig wxProjectConfig) { + + WxMall wxMall = new WxMall(); + wxMall.setTenantId("-1"); + wxMall.setName(wxProjectConfig.getName()); + wxMall.setGroup(wxProjectConfig.getName());//无用 + wxMall.setCountry(wxProjectConfig.getCountry()); + wxMall.setProvince(wxProjectConfig.getProvince()); + wxMall.setCity(wxProjectConfig.getCity()); + wxMall.setAddr(wxProjectConfig.getAddr()); + wxMall.setTotalArea(wxProjectConfig.getTotalArea()); + wxMall.setOperatingArea(wxProjectConfig.getTotalArea());//无用 + wxMall.setParkArea(wxProjectConfig.getParkArea()); + wxMall.setParkPlaceNumber(wxProjectConfig.getParkPlaceNumber()); + wxMall.setServicePhone(wxProjectConfig.getServicePhone()); + wxMall.setImgUrl(wxProjectConfig.getImgUrl()); + wxMall.setImgUrlH(wxProjectConfig.getImgUrlH()); + String weapNote = "{\"carpage\": {\"desc\": \"分享个停车小程序,希望你喜欢\", \"title\": \"" + + wxProjectConfig.getName() + + "\"}, \"firstpage\": {\"desc\": \"分享个小程序,希望你喜欢\", \"title\": \"" + + wxProjectConfig.getName() + + "\"}}"; + + wxMall.setWeapNote(weapNote); + + //(1(全能版)、2(营销版,除了合同,账单功能),3.速享版(营销版加3个月限制)分别什么意思) + wxMall.setSaleType(wxProjectConfig.getSaleType()); + wxMall.setBusinessHours("[]"); + wxMall.setIntroduction(""); + wxMall.setImg(""); + wxMallMapper.insert(wxMall); + wxMall.setTenantId(wxMall.getId().toString()); + wxMallMapper.updateById(wxMall); + return wxMall.getTenantId(); + } + @Override public PageInfo listAsPage(WxMall record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxMallMapper.findList(record)); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgConfigServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgConfigServiceImpl.java index 2b8be4db2..d9c0a5c1f 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgConfigServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgConfigServiceImpl.java @@ -5,6 +5,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; import com.iformall.domain.po.WxMsgConfig; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.mapper.WxMsgConfigMapper; import com.iformall.service.WxMsgConfigService; import org.slf4j.Logger; @@ -20,6 +21,36 @@ public class WxMsgConfigServiceImpl implements WxMsgConfigService { WxMsgConfigMapper wxMsgConfigMapper; + @Override + public void WxMsgConfigInit(String tenantId, WxProjectConfig wxProjectConfig) { + WxMsgConfig wxMsgConfig = new WxMsgConfig(); + wxMsgConfig.setTenantId(tenantId); + wxMsgConfig.setSecret("7305150347587283553aa8898e7dbf20"); + wxMsgConfig.setPublickey("MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvh8j/zagfxQdnSh5OIic\\r" + + "\\nMzN+MuRuWQJPjgu4Gza4+gX3j5Ln2xNDBOTjpwyuLBjh/JcBd1cGO3lAaKCwcaix\\r" + + "\\nsmhTq56wVXXUMgDiAChu4ud8FSvRc8G8tdZAirKVAIi3NW+/pYgpWBs/0wnF8hz4\\r" + + "\\n8no4pyJHl9Jc1LH3VNIMz8vqzKUPc4ack4pFUXlcNj6C+sBlaurmI4/vwLqNxBGs\\r" + + "\\n7/zyM7dv6oy3DSU/Y1qBArM1YPjfL2dNun8rmtPgJvlPwXqA7uoHPwQ2Ym3aUn59\\r" + + "\\npkS7QI6IE8uuqNkfSte8BXLd2nIqPLFxLYLDmdll7eoyRblHcHqAYSj8stK6StC7\\r" + + "\\nDNryNKEjTEwbgf9trUI0uvF1pfgTy2gpclnY69FtD/m0+FvLyorMq+nmBqYMjka5\\r" + + "\\nK0txDQJPOa7gsi//uXd/cJW2SAXY9MSO1AfMi8Xq/YKRQzN9FW5iapskXFHca7uX\\r" + + "\\ng5NhH7flr6DW+QInFlpoN6WIEAuDF1aj4O49Ikm3WxwhTqnvEkdSCfivpYQkp9Sh\\r" + + "\\n4kQ/SQdxuT7VX+Nz6k+uMx2z4cySk33bHi0KoHbA9QFGg/54Qd0+eU4qZnd4mrgh\\r" + + "\\nhH7/QQhL7Z9eF1U5UPrsHq2Vq3rEnN+tYQ26AuKeU8vzTxBrC/SxC6C/SMFt3f/Y\\r" + + "\\nnuFh1UnNJZleZwyQt+ZdGO0CAwEAAQ=="); + wxMsgConfig.setBid("465565"); + wxMsgConfig.setRecharge((long) 0); + wxMsgConfig.setRemains((long) 100000); + wxMsgConfig.setTotal((long) 100000); + wxMsgConfig.setAccount("15626593768"); + wxMsgConfig.setReminderstatus(0); + wxMsgConfig.setNotifyurl("https://admin.malls.iformall.com/wxMsgCallback/receivemsg/" + tenantId); + wxMsgConfig.setModelnotifyurl("https://admin.malls.iformall.com/wxMsgCallback/receivemodel/" + tenantId); + wxMsgConfig.setVerifynotifyurl("https://admin.malls.iformall.com/wxMsgCallback/receiveverifymodel/" + tenantId); + wxMsgConfig.setAppid(wxProjectConfig.getAppIdB()); + wxMsgConfigMapper.insert(wxMsgConfig); + } + @Override public PageInfo listAsPage(WxMsgConfig record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxMsgConfigMapper.findList(record)); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgValidationcodeModelServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgValidationcodeModelServiceImpl.java index 094132949..e827726ab 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgValidationcodeModelServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgValidationcodeModelServiceImpl.java @@ -9,6 +9,7 @@ import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.domain.po.WxMsgConfig; import com.iformall.domain.po.WxMsgValidationcodeModel; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.enums.EnumMsgModelStatus; import com.iformall.enums.EnumVerifyCode; import com.iformall.mapper.WxMsgConfigMapper; @@ -20,6 +21,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.*; @Service @@ -32,6 +35,52 @@ public class WxMsgValidationcodeModelServiceImpl implements WxMsgValidationcodeM @Autowired WxMsgConfigMapper wxMsgConfigMapper; + @Override + public void wxMsgValidationcodeModelInit(String tenantId, WxProjectConfig wxProjectConfig) { + DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String nowTimestr = format.format(new Date()); + final IdWorker idWorker = IdWorker.get(); + String initSql = "insert into `mallink`.`wx_msg_validationcode_model` ( `id`, `tenant_id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `model_id`, `email_bg_img`) values " + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '2', '代办通知', '" + wxProjectConfig.getName() + "', '{userName}提交了一个合同待您审批,电脑登陆{page} 查看您的待办。', '" + nowTimestr + "', '1', '0', '226', null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '3', '审批通知', '" + wxProjectConfig.getName() + "', '{userName}同意编号{contract}的合同审批,已呈送至{toUserName},登录{page}查看审批进度。', '" + nowTimestr + "', '1', '0', '227', null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '4', '通过审批通知', '" + wxProjectConfig.getName() + "', '编号{contract}的合同已通过审批,请登录{page} 跟进后续工作。', '" + nowTimestr + "', '1', '0', '228', null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '5', '驳回通知', '" + wxProjectConfig.getName() + "', '编号{contract}的合同审批被驳回,请登录{page} 查看审批明细。', '" + nowTimestr + "', '1', '0', '229', null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '6', '验证码', '" + wxProjectConfig.getName() + "', '{s6}(动态验证码),请在1分钟内填写', '" + nowTimestr + "', '1', '1', '115', null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '7', '账单待缴模板', '" + wxProjectConfig.getName() + "', '您当期的待缴账单为{price}元,截止日期为{date} ,请登录{app}小程序查看账单并交费。', '" + nowTimestr + "', '1', '0', null, null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '8', '账单欠缴模板', '" + wxProjectConfig.getName() + "', '截止今日您的账单共计欠缴{price}元,请登录{app}小程序查看账单并交费。', '" + nowTimestr + "', '1', '0', null, null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '9', '场景投放', '" + wxProjectConfig.getName() + "', '亲爱的vip,悄悄地送您一张{title},请到{app}微信小程序中使用吧!', '" + nowTimestr + "', '1', '0', null, null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '11', '商户分账账户新增通知商户', '" + wxProjectConfig.getName() + "', '您于{time}提交了{merchant}商户的收款账户[{account}]绑定,后续销售分成及营销补贴将存入该账户', '" + nowTimestr + "', '1', '0', null, null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '13', '商户分账账户变更通知商户', '" + wxProjectConfig.getName() + "', '您于{time}将{merchant}商户的收款账户变更为[{account}],后续销售分成及营销补贴将存入该账户', '" + nowTimestr + "', '1', '0', null, null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '14', '商户分账账户不使用回执', '" + wxProjectConfig.getName() + "', '商管已同意[{account}]作为{merchant}商户的收款账户。后续的销售分成及营销补贴将存入此账户', '" + nowTimestr + "', '1', '0', null, null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '15', '商户分账账户使用回执', '" + wxProjectConfig.getName() + "', '商管拒绝将[{account}]作为{merchant}商户的收款账户。如有疑问请联系商管', '" + nowTimestr + "', '1', '0', null, null)," + + " ( '" + idWorker.nextId() + "', '" + tenantId + "', '16', '商户分账账户删除提醒', '" + wxProjectConfig.getName() + "', '{merchant}商户的收款账户[{account}]于{time}取消绑定,营销活动与销售分成将无法正常进行,请尽快绑定新收款账户', '" + nowTimestr + "', '1', '0', null, null);" + + "insert into `mallink`.`wx_msg_validationcode_model` ( `id`, `tenant_id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `model_id`, `email_bg_img`)" + + "values ( '" + idWorker.nextId() + "', '" + tenantId + "', '10', '审批通过通知', '富茂', " + + " '\\n\\n\\n\\n \\n \\n \\n \\n \\n \\n 富茂审批邮件\\n \\n \\n\\n\\n\\n
\\n
\\n \\n
\\n
\\n
审批通过通知
\\n
编号{contract}的{bustype}已经审批通过,请登录{page}跟进后续工作
\\n
\\n
\\n\\n\\n', " + + " '" + nowTimestr + "', '1', null, '500', '" + wxProjectConfig.getImgUrlH() + "');" + + "insert into `mallink`.`wx_msg_validationcode_model` ( `id`, `tenant_id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `model_id`, `email_bg_img`)" + + "values ( '" + idWorker.nextId() + "', '" + tenantId + "', '11', '待缴账单通知', '富茂', " + + " '\\n\\n\\n\\n \\n \\n \\n \\n \\n \\n 富茂审批邮件\\n \\n \\n\\n\\n\\n
\\n
\\n \\n
\\n \\n
\\n
待缴账单通知
\\n
您当前的待缴账单为{price}元,截止日期为{date}请登录您的商户端小程序查看账单并缴费
\\n
\\n
\\n
\\n 租金账单\\n
\\n
账单类型
\\n
账单金额(元)
\\n
缴费时间
\\n
\\n {billList}\\n
\\n
\\n
\\n
遇到问题?
\\n
\\n 请联系商管负责人:\\n {linkName}{linkPhone}\\n
\\n
\\n
\\n
\\n\\n\\n'," + + " '" + nowTimestr + "', '1', null, '500', '" + wxProjectConfig.getImgUrlH() + "');" + + "insert into `mallink`.`wx_msg_validationcode_model` ( `id`, `tenant_id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `model_id`, `email_bg_img`)" + + "values ( '" + idWorker.nextId() + "', '" + tenantId + "', '12', '审批通知', '富茂', " + + "'\\n\\n\\n\\n \\n \\n \\n \\n \\n \\n 富茂审批邮件\\n \\n \\n\\n\\n\\n
\\n
\\n \\n
\\n
\\n
审批通知
\\n
{userName}同意编号{contract}的{bustype}审批,已呈送{toUserName},请登录{page}查看审批进度
\\n
\\n
\\n\\n\\n', " + + "'" + nowTimestr + "', '1', null, '500', '" + wxProjectConfig.getImgUrlH() + "');" + + "insert into `mallink`.`wx_msg_validationcode_model` ( `id`, `tenant_id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `model_id`, `email_bg_img`)" + + "values ( '" + idWorker.nextId() + "', '" + tenantId + "', '13', '欠缴账单通知', '富茂', " + + " '\\n\\n\\n\\n \\n \\n \\n \\n \\n \\n 富茂审批邮件\\n \\n \\n\\n\\n\\n
\\n
\\n \\n
\\n \\n
\\n
欠缴账单通知
\\n
您当前的欠缴账单为{price}元,截止日期为{date}请登录您的商户端小程序查看账单并缴费
\\n
\\n
\\n
\\n 租金账单\\n
\\n
账单类型
\\n
账单金额(元)
\\n
缴费时间
\\n
逾期天数
\\n
\\n {billList}\\n
\\n
\\n
\\n
遇到问题?
\\n
\\n 请联系商管负责人:\\n {linkName}{linkPhone}\\n
\\n
\\n
\\n
\\n\\n\\n'," + + "'" + nowTimestr + "', '1', null, '500', '" + wxProjectConfig.getImgUrlH() + "');" + + "insert into `mallink`.`wx_msg_validationcode_model` ( `id`, `tenant_id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `model_id`, `email_bg_img`)" + + " values ( '" + idWorker.nextId() + "', '" + tenantId + "', '14', '待办通知', '富茂'," + + " '\\n\\n\\n\\n \\n \\n \\n \\n \\n \\n 富茂审批邮件\\n \\n \\n\\n\\n\\n
\\n
\\n \\n
\\n \\n
\\n
待办通知
\\n
{name}提交了一个{bustype}待您审批,电脑登录{page}查看您的待办
\\n
\\n
\\n
\\n
申请时间:
\\n
{applyTime}
\\n
\\n
\\n
申请进度:
\\n
\\n \\n {taskList}\\n
\\n
\\n
\\n
\\n
遇到问题?
\\n
\\n 请联系申请人:\\n {linkName}{linkPhone}\\n
\\n
\\n
\\n
\\n\\n\\n'," + + " '" + nowTimestr + "', '1', null, '500', '" + wxProjectConfig.getImgUrlH() + "');" + + "insert into `mallink`.`wx_msg_validationcode_model` ( `id`, `tenant_id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `model_id`, `email_bg_img`)" + + " values ( '" + idWorker.nextId() + "', '" + tenantId + "', '15', '驳回通知', '富茂', " + + " '\\n\\n\\n\\n \\n \\n \\n \\n \\n \\n 富茂审批邮件\\n \\n \\n\\n\\n\\n
\\n
\\n \\n
\\n \\n
\\n
审批通过通知
\\n
编号{contract}的{bustype}审批被驳回,请登录{page}查看审批明细
\\n
\\n
\\n
\\n 驳回人:\\n {name}\\n
\\n
\\n 驳回原因:\\n {remark}\\n
\\n
\\n
\\n
遇到问题?
\\n
\\n 请联系驳回人:\\n {linkName}{linkPhone}\\n
\\n
\\n
\\n
\\n\\n\\n'," + + " '" + nowTimestr + "', '1', null, '500', '" + wxProjectConfig.getImgUrlH() + "');"; + wxMsgValidationcodeModelMapper.wxMsgValidationcodeModelInit(initSql); + } + @Override public PageInfo listAsPage(WxMsgValidationcodeModel record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxMsgValidationcodeModelMapper.findList(record)); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java index a01aad3c6..a7378ca88 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java @@ -34,8 +34,6 @@ import java.util.stream.Collectors; public class WxOrderGroupServiceImpl implements WxOrderGroupService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final Long notOrderGroupId = 0L; - private final int endPeople = 0; @Autowired WxOrderGroupMapper wxOrderGroupMapper; @@ -67,29 +65,67 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { @Autowired WxCouponChannelMapper wxCouponChannelMapper; + private int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) { + //锁住人数 + long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; + String timeStr = String.valueOf(time); + boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); + if (!grouppeopleLock) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。"); + } + //此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算 + int ordercount = wxOrderService.countGroupOrder(order.getOrderGroupId(),true); + Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount-1; + //Integer remainPeople = wxOrderGroup.getRemainPeople()-1; + wxOrderGroup.setStatus(remainPeople <= 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus()); + wxOrderGroup.setUpdateDate(new Date()); + wxOrderGroup.setRemainPeople(remainPeople); + logger.info("非首次拼团,更新拼团信息, 剩余人数-1"); + int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); + if (row != 1) { + //错误,更新状态,定时任务会发起退款,回滚库存 + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + wxOrderMapper.updateById(order); + redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); + }else { + redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); + } + return remainPeople; + } + @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}) - public void createOrderGroup(WxOrder order, WxCoupon wxCoupon) { + public void createOrderGroup(WxOrder order, WxCoupon wxCoupon,boolean isScheduleTask) { Long orderGroupId = order.getOrderGroupId(); //查看是否首次拼团,orderGroupId不等于0代表不是首次拼团,因为第二个加入的拼团者肯定有团单号 - if (!orderGroupId.equals(notOrderGroupId)) { + if (!orderGroupId.equals(0L)) { // 非首次拼团 // 参与拼团 WxOrderGroup wxOrderGroup = wxOrderGroupMapper.selectById(orderGroupId); - if(wxOrderGroup.getRemainPeople() < endPeople + 1) { - logger.info(">>>>>>>>>>>>参团失败 修改订单状态后定时退款 团单号" + orderGroupId); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD); + if (null == wxOrderGroup) { + //错误,更新状态,定时任务会发起退款,回滚库存 + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + wxOrderMapper.updateById(order); + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxOrderGroup is null."+orderGroupId); } - Integer remainPeople = wxOrderGroup.getRemainPeople()-1; - wxOrderGroup.setStatus(remainPeople == endPeople ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus()); - wxOrderGroup.setUpdateDate(new Date()); - logger.info("非首次拼团,更新拼团信息, 剩余人数-1"); - int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); - if (row != 1) { - logger.info(">>>>>>>>>>>>参团失败 修改订单状态后定时退款 团单号" + orderGroupId); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD); + if(wxOrderGroup.getRemainPeople()<1) { + //如果是定时任务处理订单时候补程序发现拼团已满,则此时发起退款,回滚库存, 不能设置为未付款,回引起死循环 + if(isScheduleTask) { + //错误,更新状态,定时任务会发起退款,回滚库存,到此结束 + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_SCHEDU_REFUND.getCode()); + wxOrderMapper.updateById(order); + //此处不要抛出异常,会导致事务回滚,状态写不上 + return; + }else { + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + wxOrderMapper.updateById(order); + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团人数已满,将稍后退款。"); + } } - + + int remainPeople = updateOrderGroup(wxOrderGroup,order,wxCoupon); + // 更新订单信息 order.setOrderStatus(wxOrderGroup.getStatus()); order.setPressEndDate(wxOrderGroup.getExpiredDate()); @@ -100,7 +136,7 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { logger.error("更新订单信息失败", e); throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD); } - if (remainPeople == endPeople) { + if (remainPeople == 0) { actionAfterOrderGroupSuccess(order, orderGroupId); } } else { @@ -233,7 +269,7 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { if (orderTemp == null) { return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); } - if (orderTemp.getOrderGroupId().equals(notOrderGroupId)) { + if (orderTemp.getOrderGroupId().equals(0L)) { return new ResultData(ErrorCode.ORDER_GROUP_COOPERATING_FAILD); } WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(orderTemp.getCouponChannelId()); @@ -376,4 +412,5 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { } } } + } 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 5b06d9b71..0857a09b0 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -1,7 +1,34 @@ package com.iformall.service.impl; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; +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.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -10,34 +37,99 @@ import com.iformall.common.IdWorker; import com.iformall.common.ResultData; import com.iformall.domain.dto.OrderSaveDto; import com.iformall.domain.dto.WxSharingOrderDto; -import com.iformall.domain.po.*; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxCUser; +import com.iformall.domain.po.WxCardInfo; +import com.iformall.domain.po.WxCoupon; +import com.iformall.domain.po.WxCouponChannel; +import com.iformall.domain.po.WxCouponMerchant; +import com.iformall.domain.po.WxCouponOrder; +import com.iformall.domain.po.WxCouponPassword; +import com.iformall.domain.po.WxCouponSend; +import com.iformall.domain.po.WxCreditHistory; +import com.iformall.domain.po.WxMerchant; +import com.iformall.domain.po.WxMerchantBUser; +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.WxOrderGroup; +import com.iformall.domain.po.WxOrderPress; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxPayOrder; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.msg.FmInsideOrderSuccessMsg; -import com.iformall.domain.vo.*; -import com.iformall.enums.*; +import com.iformall.domain.po.msg.UpdateCouponStockMsg; +import com.iformall.domain.vo.WxCouponSendVo; +import com.iformall.domain.vo.WxMerchantVo; +import com.iformall.domain.vo.WxOrderCouponPressVo; +import com.iformall.domain.vo.WxOrderCouponVo; +import com.iformall.domain.vo.WxOrderPayExpVo; +import com.iformall.domain.vo.WxOrderPayVo; +import com.iformall.domain.vo.WxOrderQueryVo; +import com.iformall.enums.EnumAssignTagsTrigger; +import com.iformall.enums.EnumCacheKey; +import com.iformall.enums.EnumCouponChannelStatus; +import com.iformall.enums.EnumCouponConditionType; +import com.iformall.enums.EnumCouponMerchantStatus; +import com.iformall.enums.EnumCouponOrderStatus; +import com.iformall.enums.EnumCouponPasswordStatus; +import com.iformall.enums.EnumCouponPasswordSupport; +import com.iformall.enums.EnumCouponSendSendType; +import com.iformall.enums.EnumCouponSendType; +import com.iformall.enums.EnumCouponStatus; +import com.iformall.enums.EnumCouponTransfer; +import com.iformall.enums.EnumCouponType; +import com.iformall.enums.EnumMerchantStatus; +import com.iformall.enums.EnumMerchantType; +import com.iformall.enums.EnumMsgMqKey; +import com.iformall.enums.EnumMsgMqTag; +import com.iformall.enums.EnumMsgMqTopic; +import com.iformall.enums.EnumMsgRecordType; +import com.iformall.enums.EnumOrderPressType; +import com.iformall.enums.EnumOrderStatus; +import com.iformall.enums.EnumOrderType; +import com.iformall.enums.EnumPayShare; +import com.iformall.enums.EnumPayStatus; +import com.iformall.enums.EnumPayType; +import com.iformall.enums.EnumProfitSharingOrderType; +import com.iformall.enums.EnumScoreType; +import com.iformall.enums.EnumUserType; +import com.iformall.enums.EnumValidStatus; import com.iformall.exception.MallinkException; -import com.iformall.mapper.*; +import com.iformall.mapper.WxAppinfoMapper; +import com.iformall.mapper.WxCUserBasicInfoMapper; +import com.iformall.mapper.WxCUserMapper; +import com.iformall.mapper.WxCardInfoMapper; +import com.iformall.mapper.WxCouponChannelMapper; +import com.iformall.mapper.WxCouponMapper; +import com.iformall.mapper.WxCouponMerchantMapper; +import com.iformall.mapper.WxCouponOrderMapper; +import com.iformall.mapper.WxCouponPasswordMapper; +import com.iformall.mapper.WxMallMapper; +import com.iformall.mapper.WxMerchantBUserMapper; +import com.iformall.mapper.WxMerchantMapper; +import com.iformall.mapper.WxOrderGroupMapper; +import com.iformall.mapper.WxOrderMapper; +import com.iformall.mapper.WxOrderPressMapper; +import com.iformall.mapper.WxPayAccountMapper; +import com.iformall.mapper.WxPayOrderMapper; import com.iformall.mq.MqBaseProducer; -import com.iformall.service.*; -import com.iformall.utils.*; -import org.apache.commons.lang3.StringUtils; -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.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; +import com.iformall.service.ExcelService; +import com.iformall.service.WxAppinfoService; +import com.iformall.service.WxCUserService; +import com.iformall.service.WxCUserTagsService; +import com.iformall.service.WxCouponActionLogService; +import com.iformall.service.WxCouponSendService; +import com.iformall.service.WxCreditHistoryService; +import com.iformall.service.WxMsgLimitService; +import com.iformall.service.WxOrderService; +import com.iformall.service.WxPayOrderService; +import com.iformall.service.WxProfitSharingOrderService; +import com.iformall.service.WxScoreRulesService; +import com.iformall.utils.Constant; +import com.iformall.utils.DateUtils; +import com.iformall.utils.PayUtils; +import com.iformall.utils.PressUtils; +import com.iformall.utils.RedisLock; +import com.iformall.utils.Utility; @Service public class WxOrderServiceImpl implements WxOrderService { @@ -414,7 +506,7 @@ public class WxOrderServiceImpl implements WxOrderService { * @param wxCouponSendVo */ private void stockMerchantReduce(WxCUser user, WxCoupon coupon, String couponIdStr, WxCouponSendVo wxCouponSendVo) { - long time = System.currentTimeMillis() + RedisLock.TIMEOUT; + long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; String timeStr = String.valueOf(time); // 库存加锁 if (!redisLock.lock(couponIdStr, timeStr)) { @@ -479,94 +571,165 @@ public class WxOrderServiceImpl implements WxOrderService { } } - /** - * 减库存 - * - * @param user - * @param coupon - * @param couponIdStr - */ - private void stockReduce(WxCUser user, WxCoupon coupon, String couponIdStr) { - long time = System.currentTimeMillis() + RedisLock.TIMEOUT; - String timeStr = String.valueOf(time); - // 库存加锁 - if (!redisLock.lock(couponIdStr, timeStr)) { - logger.error("此券被锁定, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); - } - - // 检查 优惠券 库存 - if (coupon.getRemainInventory() <= 0) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券库存为0, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); - } - - int count = 0; - // 有价券 - if (coupon.getSalePrice() > 0) { - // 检查是否未支付订单 - try { - count = getUserOrderCount(user, coupon); - } catch (Exception e) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count > 0) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_UNPAID); - } - } - //检查拼团中的数量 - try { - count = getUserOrderGroupCount(user, coupon); - } catch (Exception e) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count >= coupon.getUseLimitQuantity()) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); - } - - // 检查用户已购买数量 - try { - count = getUserCouponOrderCount(user, coupon); - } catch (Exception e) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count >= coupon.getUseLimitQuantity()) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); - } - - try { - // 减库存 - int num = wxCouponMapper.reduceInventory(coupon.getId(), 1, coupon.getRemainInventory()); - if (num <= 0) { - logger.error("此券减库存失败, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } - } catch (RuntimeException e) { - logger.error("此券减库存失败, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } finally { - // 解锁 - redisLock.unlock(couponIdStr, timeStr); - } - } + * 减库存 + * + * @param user + * @param coupon + * @param couponIdStr + */ + private void stockReduce(WxCUser user, WxCoupon coupon, String couponIdStr) { + + long redisStock = redisLock.getCouponStock(Long.parseLong(couponIdStr)); + if (redisStock<=0) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!"); + } + // 检查 优惠券 库存 + if (coupon.getRemainInventory() <= 0) { + throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); + } + + int count = 0; + // 有价券 + if (coupon.getSalePrice() > 0) { + // 检查是否未支付订单 + try { + count = getUserOrderCount(user, coupon); + } catch (Exception e) { + throw new MallinkException(ErrorCode.DB_FAIL); + } + if (count > 0) { + logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); + throw new MallinkException(ErrorCode.ORDER_UNPAID); + } + } + //检查拼团中的数量 + try { + count = getUserOrderGroupCount(user, coupon); + } catch (Exception e) { + throw new MallinkException(ErrorCode.DB_FAIL); + } + if (count >= coupon.getUseLimitQuantity()) { + logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); + throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); + } + + // 检查用户已购买数量 + try { + count = getUserCouponOrderCount(user, coupon); + } catch (Exception e) { + throw new MallinkException(ErrorCode.DB_FAIL); + } + if (count >= coupon.getUseLimitQuantity()) { + logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); + throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); + } + + try { + //减库存,从redis中取,然后发mq消息同步到数据库 + long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1); + if (stock < 0 ) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!"); + } + UpdateCouponStockMsg msg = new UpdateCouponStockMsg(); + msg.setCouponId(coupon.getId()); + msg.setNumber(1); + msg.setOperateType(UpdateCouponStockMsg.OPERATE_TYPE_DECREASE); + msg.setMsgType(EnumMsgRecordType.COUPON_STOCK.getCode()); + mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.STOCK.getCode(), "*", "decrease_stock_"+coupon.getId()); + } catch (RuntimeException e) { + logger.error("此券减库存失败, couponId: " + couponIdStr,e); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),e.getMessage()); + } + } + +// /** +// * 减库存 +// * +// * @param user +// * @param coupon +// * @param couponIdStr +// */ +// private void stockReduce(WxCUser user, WxCoupon coupon, String couponIdStr) { +// long time = System.currentTimeMillis() + RedisLock.TIMEOUT; +// String timeStr = String.valueOf(time); +// // 库存加锁 +// if (!redisLock.lock(couponIdStr, timeStr)) { +// logger.error("此券被锁定, couponId: " + couponIdStr); +// throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); +// } +// +// // 检查 优惠券 库存 +// if (coupon.getRemainInventory() <= 0) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// logger.error("此券库存为0, couponId: " + couponIdStr); +// throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); +// } +// +// int count = 0; +// // 有价券 +// if (coupon.getSalePrice() > 0) { +// // 检查是否未支付订单 +// try { +// count = getUserOrderCount(user, coupon); +// } catch (Exception e) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// throw new MallinkException(ErrorCode.DB_FAIL); +// } +// if (count > 0) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); +// throw new MallinkException(ErrorCode.ORDER_UNPAID); +// } +// } +// //检查拼团中的数量 +// try { +// count = getUserOrderGroupCount(user, coupon); +// } catch (Exception e) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// throw new MallinkException(ErrorCode.DB_FAIL); +// } +// if (count >= coupon.getUseLimitQuantity()) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); +// throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); +// } +// +// // 检查用户已购买数量 +// try { +// count = getUserCouponOrderCount(user, coupon); +// } catch (Exception e) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// throw new MallinkException(ErrorCode.DB_FAIL); +// } +// if (count >= coupon.getUseLimitQuantity()) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); +// throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); +// } +// +// try { +// // 减库存 +// int num = wxCouponMapper.reduceInventory(coupon.getId(), 1); +// if (num <= 0) { +// logger.error("此券减库存失败, couponId: " + couponIdStr); +// throw new MallinkException(ErrorCode.ORDER_IS_FAIL); +// } +// } catch (RuntimeException e) { +// logger.error("此券减库存失败, couponId: " + couponIdStr); +// throw new MallinkException(ErrorCode.ORDER_IS_FAIL); +// } finally { +// // 解锁 +// redisLock.unlock(couponIdStr, timeStr); +// } +// } @Override public void stockBack(WxOrder updateOrder) { @@ -575,7 +738,7 @@ public class WxOrderServiceImpl implements WxOrderService { Long couponId = updateOrder.getProductId(); String couponIdStr = "" + couponId; //加锁 - long time = System.currentTimeMillis() + RedisLock.TIMEOUT; + long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; String timeStr = String.valueOf(time); if (!redisLock.lock(couponIdStr, timeStr)) { @@ -600,8 +763,9 @@ public class WxOrderServiceImpl implements WxOrderService { int num = wxCouponMapper.backInventory(coupon.getId(), 1, coupon.getRemainInventory()); if (num <= 0) { logger.error("此券加库存失败, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券couponId:["+couponIdStr+"]库存回滚失败,更新记录条数小于等于0."); } + redisLock.increase(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1); } catch (Exception e) { logger.error("数据库更新失败,库存+1失败, e:" + e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "库存恢复失败"); @@ -843,87 +1007,101 @@ public class WxOrderServiceImpl implements WxOrderService { if (coupon.getType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { isCard = true; } - // TODO Stormeye 检查是否已经生成券, 微信回调并发问题 - final IdWorker idWorker = IdWorker.get(); - - WxCouponOrder couponOrder = new WxCouponOrder(); - couponOrder.setId(idWorker.nextId()); - couponOrder.updateTenantInfo(order); - couponOrder.setCouponId(order.getProductId()); - couponOrder.setCouponType(coupon.getType()); - couponOrder.setCUserId(user.getId()); - couponOrder.setOwnerId(user.getId()); - couponOrder.setAutoRefund(coupon.getAutoRefund()); - couponOrder.setOrderId(order.getOrderNumber()); - couponOrder.setExpiredTime(valid_date); - if (!isCard) { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - } else { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); + //TODO 如果orderId已经存在,则不再添加 + WxCouponOrder couponOrderQ = new WxCouponOrder(); + couponOrderQ.setOrderId(order.getId()); + WxCouponOrder couponOrder = null; + List couponorderlist = wxCouponOrderMapper.findList(couponOrderQ); + if (null != couponorderlist && couponorderlist.size() > 0 ) { + couponOrder = couponorderlist.get(0); + }else { + final IdWorker idWorker = IdWorker.get(); + couponOrder = new WxCouponOrder(); + couponOrder.setId(idWorker.nextId()); + couponOrder.updateTenantInfo(order); + couponOrder.setCouponId(order.getProductId()); + couponOrder.setCouponType(coupon.getType()); + couponOrder.setCUserId(user.getId()); + couponOrder.setOwnerId(user.getId()); + couponOrder.setAutoRefund(coupon.getAutoRefund()); + couponOrder.setOrderId(order.getOrderNumber()); + couponOrder.setExpiredTime(valid_date); + if (!isCard) { + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); + } else { + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); + } + couponOrder.setCreateDate(curr); + couponOrder.setUpdateDate(curr); + couponOrder.setCouponPrice(order.getPayment()); + wxCouponOrderMapper.insert(couponOrder); } - couponOrder.setCreateDate(curr); - couponOrder.setUpdateDate(curr); - couponOrder.setCouponPrice(order.getPayment()); - - wxCouponOrderMapper.insert(couponOrder); /// 储值卡信息添加 if (isCard) { - Integer fee = 0; - WxCardInfo cardInfo = new WxCardInfo(); - cardInfo.setId(couponOrder.getId()); - cardInfo.updateTenantInfo(order); - cardInfo.setCouponId(order.getProductId()); - cardInfo.setAmount(coupon.getPrice()); - cardInfo.setSaleAmount(coupon.getSalePrice()); - cardInfo.setRemainingAmount(coupon.getPrice()); - if (!coupon.checkIsFree()) { - // 有价卡 - cardInfo.setTransactionId(payOrder.getTransactionId()); - if (payOrder.getShareAmount() != null) { - // 开启分账 - fee = payOrder.getPayAmount() - payOrder.getShareAmount(); - cardInfo.setShareFeeAmount(payOrder.getShareAmount()); - cardInfo.setRemainingShareFeeAmount(payOrder.getShareAmount()); - cardInfo.setRateAmount(payOrder.getRateAmount()); - } else { - // 未开启分账 - fee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRate(), false); - Integer shareAmount = payOrder.getPayAmount() - fee; - cardInfo.setShareFeeAmount(shareAmount); - cardInfo.setRemainingShareFeeAmount(shareAmount); - if (payAccount.getRealRate() != null) { - int iRealChargeFee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRealRate(), true); - if (fee > iRealChargeFee) { - cardInfo.setRateAmount(fee - iRealChargeFee); - } - } - } - } else { - // 免费卡 - cardInfo.setShareFeeAmount(0); - cardInfo.setRemainingShareFeeAmount(0); - cardInfo.setRateAmount(0); - if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { - WxCouponPassword updateCPwd = new WxCouponPassword(); - updateCPwd.setId(couponPasswordId); - updateCPwd.setCardId(cardInfo.getId()); - updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); - couponPasswordMapper.updateById(updateCPwd); - } - } - - cardInfo.setServiceFeeAmount(fee); - cardInfo.setCreateDate(curr); - cardInfo.setUpdateDate(curr); - cardInfo.setSupportTransfer(coupon.getSupportTransfer()); - - //检查卡是否下架,如果是,不可转赠 - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId()); - if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { - cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); - } - wxCardInfoMapper.insert(cardInfo); + //判断该transctionId是否已经存在,如果存在,则不添加 + WxCardInfo cardInfoq = new WxCardInfo(); + cardInfoq.setTransactionId(payOrder.getTransactionId()); + List cardInfoList = wxCardInfoMapper.findList(cardInfoq); + if (null != cardInfoList && cardInfoList.size() > 0) { + //do nothing + }else { + Integer fee = 0; + WxCardInfo cardInfo = new WxCardInfo(); + cardInfo.setId(couponOrder.getId()); + cardInfo.updateTenantInfo(order); + cardInfo.setCouponId(order.getProductId()); + cardInfo.setAmount(coupon.getPrice()); + cardInfo.setSaleAmount(coupon.getSalePrice()); + cardInfo.setRemainingAmount(coupon.getPrice()); + if (!coupon.checkIsFree()) { + // 有价卡 + cardInfo.setTransactionId(payOrder.getTransactionId()); + if (payOrder.getShareAmount() != null) { + // 开启分账 + fee = payOrder.getPayAmount() - payOrder.getShareAmount(); + cardInfo.setShareFeeAmount(payOrder.getShareAmount()); + cardInfo.setRemainingShareFeeAmount(payOrder.getShareAmount()); + cardInfo.setRateAmount(payOrder.getRateAmount()); + } else { + // 未开启分账 + fee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRate(), false); + Integer shareAmount = payOrder.getPayAmount() - fee; + cardInfo.setShareFeeAmount(shareAmount); + cardInfo.setRemainingShareFeeAmount(shareAmount); + if (payAccount.getRealRate() != null) { + int iRealChargeFee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRealRate(), true); + if (fee > iRealChargeFee) { + cardInfo.setRateAmount(fee - iRealChargeFee); + } + } + } + } else { + // 免费卡 + cardInfo.setShareFeeAmount(0); + cardInfo.setRemainingShareFeeAmount(0); + cardInfo.setRateAmount(0); + if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { + WxCouponPassword updateCPwd = new WxCouponPassword(); + updateCPwd.setId(couponPasswordId); + updateCPwd.setCardId(cardInfo.getId()); + updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); + couponPasswordMapper.updateById(updateCPwd); + } + } + + cardInfo.setServiceFeeAmount(fee); + cardInfo.setCreateDate(curr); + cardInfo.setUpdateDate(curr); + cardInfo.setSupportTransfer(coupon.getSupportTransfer()); + + //检查卡是否下架,如果是,不可转赠 + WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId()); + if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { + cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); + } + wxCardInfoMapper.insert(cardInfo); + } } return couponOrder; } @@ -1151,6 +1329,7 @@ public class WxOrderServiceImpl implements WxOrderService { orderSuccess.setOrderId(updateOrder.getId()); orderSuccess.setCUserId(user.getId()); orderSuccess.setCouponId(coupon.getId()); + logger.info(">>>>>>>>>>>send sendInsideOrderSuccessMsg :"+orderSuccess); mqBaseProducer.sendMessage(orderSuccess, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); } @@ -1179,6 +1358,7 @@ public class WxOrderServiceImpl implements WxOrderService { jo = JSONObject.parseObject(coupon.getConditions()); } catch (Exception e) { logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage()); + e.printStackTrace(); } if (jo != null) { if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()) { @@ -1716,6 +1896,7 @@ public class WxOrderServiceImpl implements WxOrderService { 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. 下订单完成,发送内部消息 @@ -1944,7 +2125,7 @@ public class WxOrderServiceImpl implements WxOrderService { // 2. 拼团检查 if (isOrderGroup(orderGroupId)) { - checkOrderGroup(user, orderGroupId); + checkOrderGroup(user, orderGroupId,coupon); } String couponIdStr = String.valueOf(coupon.getId()); // 3. 减库存操作 @@ -2075,16 +2256,27 @@ public class WxOrderServiceImpl implements WxOrderService { return orderNumber; } - private void checkOrderGroup(WxCUser user, Long orderGroupId) { + private void checkOrderGroup(WxCUser user, Long orderGroupId,WxCoupon coupon) { WxOrderGroup group = wxOrderGroupMapper.selectById(orderGroupId); if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) { logger.error("下订单拼团人数已满>>>" + orderGroupId); throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED); } + + if (group.getRemainPeople()<=0) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数已满"); + } + + //判断拼团人数是否已经超出限制 + int groupCount = countGroupOrder(orderGroupId,true); + if (groupCount>=coupon.getPressLimitNum()) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数超出优惠券人数限制!"); + } + WxOrder order = new WxOrder(); order.setOrderGroupId(group.getId()); order.setCUserId(user.getId()); - order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + //order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); long count = wxOrderMapper.selectCount(new QueryWrapper(order)); if (count > 0) { logger.error("重复的拼团>>>" + orderGroupId); @@ -2096,5 +2288,32 @@ public class WxOrderServiceImpl implements WxOrderService { return orderGroupId != null && !orderGroupId.equals(0L); } + @Override + public int countGroupOrder(Long groupId,boolean ignoreUnPay) { + WxOrder query = new WxOrder(); + query.setOrderGroupId(groupId); + List statusS = new ArrayList(); + statusS.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); + if (!ignoreUnPay) { + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + } + query.setStatusS(statusS); + return wxOrderMapper.countList(query); + } + + @Override + public int countUserCouponGroupOrder(Long cuserId, Long couponId) { + WxOrder query = new WxOrder(); + query.setCUserId(cuserId); + query.setProductId(couponId); + List statusS = new ArrayList(); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); + query.setStatusS(statusS); + return wxOrderMapper.countList(query); + } + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxParkServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxParkServiceImpl.java index 51a9f1095..71b5fe584 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxParkServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxParkServiceImpl.java @@ -3,8 +3,11 @@ package com.iformall.service.impl; import java.util.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxMall; import com.iformall.domain.po.WxPark; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.mapper.WxParkMapper; +import com.iformall.service.WxMallService; import com.iformall.service.WxParkService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,6 +22,25 @@ public class WxParkServiceImpl implements WxParkService { @Autowired WxParkMapper wxParkMapper; + @Autowired + WxMallService wxMallService; + + @Override + public void wxParkInit(String tenantId, WxProjectConfig wxProjectConfig) { + WxMall byTenantId = wxMallService.getByTenantId(tenantId); + WxPark wxPark = new WxPark(); + wxPark.setVendorParams("{}"); + wxPark.setCreateDate(new Date()); + wxPark.setUpdateDate(new Date()); + wxPark.setAddr(wxProjectConfig.getName()); + wxPark.setTenantId(tenantId); + wxPark.setNumber(byTenantId.getParkPlaceNumber()); + wxPark.setVendorType(0); + wxPark.setParkId("0"); + wxPark.setEntryExit(1); + wxPark.setStopFee(""); + wxParkMapper.insert(wxPark); + } @Override public PageInfo listAsPage(WxPark record, Integer pageIndex, Integer pageSize) { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountBillServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountBillServiceImpl.java index 06c51eafc..af3e6a85e 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountBillServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountBillServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; +import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.WxPayAccountBill; import com.iformall.mapper.WxBillPropertyMapper; @@ -28,6 +29,23 @@ public class WxPayAccountBillServiceImpl implements WxPayAccountBillService { @Autowired WxBillPropertyMapper wxBillPropertyMapper; + @Override + public Long wxPayAccountInit(WxPayAccount wxPayAccount) { + WxPayAccountBill wxPayAccountBill = new WxPayAccountBill(); + wxPayAccountBill.setTenantId(wxPayAccount.getTenantId()); + wxPayAccountBill.setMchId(wxPayAccount.getMchId()); + wxPayAccountBill.setSubMchId(wxPayAccount.getSubMchId()); + wxPayAccountBill.setApiKey(wxPayAccount.getApiKey()); + wxPayAccountBill.setNotifyUrl(wxPayAccount.getNotifyUrl()); + wxPayAccountBill.setCertPath(wxPayAccount.getCertPath()); + wxPayAccountBill.setType(wxPayAccount.getType()); + wxPayAccountBill.setShare(!(wxPayAccount.getShare() == 0)); + wxPayAccountBill.setRate(wxPayAccount.getRate()); + wxPayAccountBill.setRealRate(wxPayAccount.getRealRate()); + wxPayAccountBillMapper.insert(wxPayAccountBill); + return wxPayAccountBill.getId(); + } + @Override public PageInfo listAsPage(WxPayAccountBill record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxPayAccountBillMapper.findList(record)); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountServiceImpl.java index dfc86df20..1f4a7d3aa 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayAccountServiceImpl.java @@ -3,6 +3,7 @@ package com.iformall.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxProjectConfig; import com.iformall.mapper.WxPayAccountMapper; import com.iformall.service.WxPayAccountService; import org.slf4j.Logger; @@ -19,6 +20,25 @@ public class WxPayAccountServiceImpl implements WxPayAccountService { WxPayAccountMapper wxPayAccountMapper; + @Override + public WxPayAccount wxPayAccountInit(String tenantId, WxProjectConfig wxProjectConfig) { + WxPayAccount wxPayAccount = new WxPayAccount(); + wxPayAccount.setTenantId(tenantId); + wxPayAccount.setMchId(wxProjectConfig.getMchId()); + wxPayAccount.setSubMchId(wxProjectConfig.getSubMchId()); + wxPayAccount.setApiKey(wxProjectConfig.getApiKey()); + //默认------------------------------------------------------------- + wxPayAccount.setNotifyUrl("https://admin.malls.iformall.com/wxPay/notify"); + wxPayAccount.setCertPath("/opt/iformall/service/apiclient_cert.p12"); + //---------------------------------------------------------------- + wxPayAccount.setType(1);//0:普通商户模式, 1:服务商模式(默认服务商模式) + wxPayAccount.setShare(0);//0: 未分账,1:分账(默认不分账) + wxPayAccount.setRate(wxProjectConfig.getRate()); + wxPayAccount.setRealRate(wxProjectConfig.getRealRate()); + wxPayAccountMapper.insert(wxPayAccount); + return wxPayAccount; + } + @Override public PageInfo listAsPage(WxPayAccount record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxPayAccountMapper.findList(record)); 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 a1a30978f..9af2fdf21 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -17,10 +17,12 @@ import com.iformall.exception.MallinkException; import com.iformall.mapper.*; import com.iformall.pay.*; import com.iformall.service.*; +import com.iformall.service.helper.WxPayOrderServiceHelper; import com.iformall.utils.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -33,6 +35,9 @@ import java.util.*; public class WxPayOrderServiceImpl implements WxPayOrderService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + WxPayOrderServiceImpl wxPayOrderServiceImpl; + @Autowired WxAppinfoMapper wxAppinfoMapper; @@ -113,9 +118,108 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"reason\":\"请检查XML参数格式是否正确\"}}"); + //方法必须为public AopContext.currentProxy() + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + @Override + public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map retMap,boolean isScheduleTask) { + Date curDate = new Date(); + if (oldRecord.getPayOrderStatus() != EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { + //因为此处是处理订单支付成功了但是订单状态为未支付成功的异常状态,库存不应该再扣减 + //更新wxPayOrder + oldRecord.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); + String timEndStr = retMap.get("time_end"); + Date timeEnd = null; + try { + timeEnd = Utility.getDateFromString(timEndStr); + } catch (ParseException e) { + logger.error("解析timeEnd失败"); + timeEnd = new Date(); + } + oldRecord.setPayTimeEnd(timeEnd); + oldRecord.setPayEndFrom(EnumPayEndFrom.QUERY.getCode()); + String transactionId = retMap.get("transaction_id"); + oldRecord.setTransactionId(transactionId); + oldRecord.setUpdateTime(curDate); + wxPayOrderMapper.updateById(oldRecord); + + //处理其他信息 + WxCoupon wxCoupon = wxCouponMapper.selectById(order.getProductId()); + if(wxCoupon != null) { + if (isOrderGroupCoupon(oldRecord, wxCoupon)) { + // 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER + try { + wxOrderGroupService.createOrderGroup(order, wxCoupon,isScheduleTask); + } catch (Exception e) { + logger.error("参团失败" + e.getMessage()); + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); + order.setUpdateDate(new Date()); + wxOrderMapper.updateById(order); + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD); + } + } else { + // 普通券, 修改订单状态 + try { + wxOrderService.couponOrderSuccess(order); + } catch (Exception e) { + logger.error(e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单更新"); + } + // 下订单完成,发送内部消息 + try { + wxOrderService.sendOrderSuccessActionMsg(order); + } catch (Exception e) { + logger.error("内部消息发送失败: " + e.getMessage()); + throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR); + } + } + } + + } + + } + + @Override + public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay) { + Map retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, order, appInfo, payAccount); + int wxpaystatus = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, oldRecord.getPayOrderNo()); + //Map retMap = new HashMap(); + //retMap.put("time_end","2020-6-18 10:48:20"); + //retMap.put("transaction_id","asdasdasdasdasd"); + //int wxpaystatus = EnumPayStatus.PAY_STATUS_SUCCESS.getCode(); + if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { + //直接调用不会触发事务,spring事务基于AOP代理 + WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy(); + proxy.handleSuccessOrder(oldRecord,order,retMap,false); + throw new MallinkException(ErrorCode.PAY_ORDER_EXIST.getCode(),"该订单已经支付,请勿重复支付!"); + }else if (EnumPayStatus.PAY_STATUS_REFUND.getCode()==wxpaystatus) { + throw new MallinkException(ErrorCode.PAY_ORDER_REFUND.getCode(),"该订单已经退款,无法支付!"); + }else if (EnumPayStatus.PAY_STATUS_CLOSE.getCode()==wxpaystatus) { + throw new MallinkException(ErrorCode.PAY_ORDER_CLOSED.getCode(),"该订单已经关闭,无法支付!"); + }else if (EnumPayStatus.PAY_STATUS_REVERSE.getCode()==wxpaystatus) { + throw new MallinkException(ErrorCode.PAY_ORDER_REVERSE.getCode(),"该订单已撤销,无法支付!"); + }else if (EnumPayStatus.PAY_STATUS_WAIT.getCode()==wxpaystatus) { + throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"该订单支付中,请勿重复支付!"); + }else if (EnumPayStatus.PAY_STATUS_NOTPAY.getCode()==wxpaystatus || EnumPayStatus.PAY_STATUS_FAIL.getCode()==wxpaystatus) { + //支付调用,支付遇到问题,可以重复支付 + if (repeatPay) { + if (oldRecord.getPayOrderStatus()!=EnumPayStatus.PAY_STATUS_WAIT.getCode()) { + oldRecord.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); + int sqlRow0 =wxPayOrderMapper.updateById(oldRecord); + if (sqlRow0 != 1) { + logger.error("pay order update error: " + oldRecord.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + } + } + return oldRecord; + } + return null; + } + + @Override public ResultData createPayOrder(WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay) { - final IdWorker idworker = IdWorker.get(); + IdWorker idworker = IdWorker.get(); EnumPayShare isShare = EnumPayShare.NO; @@ -134,11 +238,19 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { WxOrder orderParams = new WxOrder(); orderParams.setOrderGroupId(order.getOrderGroupId()); orderParams.setCUserId(user.getId()); - orderParams.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); - int count = wxOrderMapper.selectCount(new QueryWrapper(orderParams)); - if (count > 0) { - logger.error("重复的拼团>>>" + order); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_ATTEND); + List olist = wxOrderMapper.findList(orderParams); + if (olist == null || olist.size() <=0 ) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"未查询到参团订单[user:"+user.getId()+",groupId:"+order.getOrderGroupId()+"]"); + } + if (olist.size() != 1) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团订单多条[user:"+user.getId()+",groupId:"+order.getOrderGroupId()+"]"); + } + WxOrder orderq = olist.get(0); + if (null == orderq) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"未查询到参团订单[user:"+user.getId()+",groupId:"+order.getOrderGroupId()+"]"); + } + if (orderq.getOrderStatus()==EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_ATTEND.getCode(),"不能重复参团订单[user:"+user.getId()+",groupId:"+order.getOrderGroupId()+"]"); } } @@ -180,82 +292,121 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { isShare = EnumPayShare.YES; } - // 1.5 检查是否有已支付订单 - { - WxPayOrder payOrderParams = new WxPayOrder(); - payOrderParams.setOrderId(order.getId()); - payOrderParams.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.setEntity(payOrderParams); - int count = wxPayOrderMapper.selectCount(queryWrapper); - if (count > 0) { - logger.error("已支付>>>" + order); - throw new MallinkException(ErrorCode.PAY_ORDER_EXIST); - } - } +// // 1.5 检查是否有已支付订单 +// { +// WxPayOrder payOrderParams = new WxPayOrder(); +// payOrderParams.setOrderId(order.getId()); +// payOrderParams.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.setEntity(payOrderParams); +// int count = wxPayOrderMapper.selectCount(queryWrapper); +// if (count > 0) { +// logger.error("已支付>>>" + order); +// throw new MallinkException(ErrorCode.PAY_ORDER_EXIST); +// } +// } +// +// /*设置进入分账,待分账时再判断是否存在对应的分账账户 +// // 1.5 check 分账 receive +// if (isShare == EnumPayShare.YES) { +// WxProfitSharingReceiver receiver = new WxProfitSharingReceiver(); +// receiver.setMerchantId(order.getMerchantId()); +// List merList = wxProfitSharingReceiverMapper.findList(receiver); +// if (merList.size() > 0) { +// isShare = EnumPayShare.YES; +// } else { +// isShare = EnumPayShare.NO; +// } +// } +// */ +// +// //支付中的订单, 都是已经点过支付的订单,要等微信通知更新,不能再操作。 +// record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); +// List list = wxPayOrderMapper.findList(record); +// if (list.size() > 0) { +// logger.error("支付状态等待微信同步中>>>" + order); +// throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"订单支付状态等待微信同步中"); +// // 3.0 已有支付订单,关闭之前的 +// //payOrderClose(appInfo, list.get(0)); +// } - /*设置进入分账,待分账时再判断是否存在对应的分账账户 - // 1.5 check 分账 receive - if (isShare == EnumPayShare.YES) { - WxProfitSharingReceiver receiver = new WxProfitSharingReceiver(); - receiver.setMerchantId(order.getMerchantId()); - List merList = wxProfitSharingReceiverMapper.findList(receiver); - if (merList.size() > 0) { - isShare = EnumPayShare.YES; - } else { - isShare = EnumPayShare.NO; - } - } - */ - - // 2. check 是否有支付中订单 Date currentDate = new Date(); - record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); - List list = wxPayOrderMapper.findList(record); - String payOrderNo = ""; - if (list.size() > 0) { - // 3.0 已有支付订单,关闭之前的 - payOrderClose(appInfo, list.get(0)); + //一个订单只有一条支付记录。 + WxPayOrder orderq = new WxPayOrder(); + orderq.setOrderId(record.getOrderId()); + List list = wxPayOrderMapper.findList(orderq); + WxPayOrder oldRecord = null; + if (null != list && list.size() > 0) { + oldRecord = list.get(0); } - - - { - // 3.1 创建支付订单 - Long id = idworker.nextId(); - payOrderNo = String.valueOf(id); - record.setId(id); - record.updateTenantInfo(order); - record.setCUserId(user.getId()); - record.setCreateTime(currentDate); - record.setUpdateTime(currentDate); - record.setPayTimeStart(currentDate); - record.setPayTimeEnd(currentDate); - // 支付单号 - record.setPayOrderNo(payOrderNo); - record.setPayAmount(order.getPayment()); - record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); - record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); - record.setShare(isShare.getCode()); - if (isShare == EnumPayShare.YES) { - // 分账金额 - int iChargeFee = PayUtils.getPayRate(record.getPayAmount(), payAccount.getRate(), false); - Integer share_amount = record.getPayAmount() - iChargeFee; - record.setShareAmount(share_amount); - if(payAccount.getRealRate() != null) { - int iRealChargeFee = PayUtils.getPayRate(record.getPayAmount(), payAccount.getRealRate(), true); - if(iChargeFee > iRealChargeFee) { - record.setRateAmount(iChargeFee - iRealChargeFee); - } - } - } - - int sqlRow = wxPayOrderMapper.insert(record); - if (sqlRow != 1) { - logger.error("pay order insert error: " + record.toString()); - throw new MallinkException(ErrorCode.DB_FAIL); + + if (null != oldRecord) { + //如果是已经支付成功,则不能再次支付。如果是支付中的,也不能再次支付,等待微信同步结果 + if (oldRecord.getPayOrderStatus()==EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { + logger.error("已支付>>>" + order); + throw new MallinkException(ErrorCode.PAY_ORDER_EXIST); + //如果是支付中的,则调用微信接口查询支付状态 + }else if (oldRecord.getPayOrderStatus()==EnumPayStatus.PAY_STATUS_WAIT.getCode()) { + record = handleWxOrderQuery(oldRecord,order,appInfo,payAccount,idworker,true); + if (null == record) { + throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"订单微信查询支付状态失败!"); + } + //如果是支付错误,可以重新支付 + }else if(oldRecord.getPayOrderStatus()==EnumPayStatus.PAY_STATUS_FAIL.getCode()|| + oldRecord.getPayOrderStatus()==EnumPayStatus.PAY_STATUS_NOTPAY.getCode()) { + oldRecord.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); + int sqlRow0 = wxPayOrderMapper.updateById(oldRecord); + if (sqlRow0 != 1) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + record = oldRecord; + }else { + throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"该订单状态不允许支付!"); } + }else { + { + // 3.1 创建支付订单 + Long id = idworker.nextId(); + if (null == id || id.longValue() <=0) { + throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"订单支付流水号生成失败!new payorder:"+record.getOrderId()+",id:"+id); + } + + record.setId(id); + record.updateTenantInfo(order); + record.setCUserId(user.getId()); + record.setCreateTime(currentDate); + record.setUpdateTime(currentDate); + record.setPayTimeStart(currentDate); + record.setPayTimeEnd(currentDate); + // 支付单号 + record.setPayOrderNo(String.valueOf(id)); + record.setPayAmount(order.getPayment()); + record.setPayFrom(payWay.getCode()); + record.setPayVendor(payWay.getCode()); + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); + record.setShare(isShare.getCode()); + if (isShare == EnumPayShare.YES) { + // 分账金额 + int iChargeFee = PayUtils.getPayRate(record.getPayAmount(), payAccount.getRate(), false); + Integer share_amount = record.getPayAmount() - iChargeFee; + record.setShareAmount(share_amount); + if(payAccount.getRealRate() != null) { + int iRealChargeFee = PayUtils.getPayRate(record.getPayAmount(), payAccount.getRealRate(), true); + if(iChargeFee > iRealChargeFee) { + record.setRateAmount(iChargeFee - iRealChargeFee); + } + } + } + + int sqlRow = wxPayOrderMapper.insert(record); + if (sqlRow != 1) { + logger.error("pay order insert error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + } } - + if (payAccount.getType() == EnumPayMode.MCH.getCode()) { // 统一下单 普通商户模式 String noncestr = Utility.generate32UUID(); @@ -281,7 +432,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); logger.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); Map returnMap = WxPayment.xmlToMap(response); - returnMap.put("payOrderId", payOrderNo); + returnMap.put("payOrderId", String.valueOf(record.getId())); String result_code = returnMap.get("result_code"); if ("SUCCESS".equals(result_code)) { String prepay_id = returnMap.get("prepay_id"); @@ -361,7 +512,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderSP)); logger.info("pay order, wechat pushOrder, " + wxPayOrderSP.toString() + ", response: " + response.toString()); Map returnMap = WxPayment.xmlToMap(response); - returnMap.put("payOrderId", payOrderNo); + returnMap.put("payOrderId", String.valueOf(record.getId())); String result_code = returnMap.get("result_code"); if ("SUCCESS".equals(result_code)) { String prepay_id = returnMap.get("prepay_id"); @@ -411,8 +562,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } } } catch (RuntimeException e) { + logger.error("createwxpayorder error:",e); throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } catch (Exception e) { + logger.error("createwxpayorder error:",e); throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } } @@ -635,65 +788,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } } - - private String wechatPayOrderQuery(WxAppinfo appInfo, WxPayOrder record) { - // get payAccount - WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId()); - if (payAccount.getType() == EnumPayMode.MCH.getCode()) { - // 普通商户号模式 - WxPayOrderQ payOrderQ = new WxPayOrderQ(); - String noncestr = Utility.generate32UUID(); - payOrderQ.setAppid(appInfo.getAppId()); - payOrderQ.setMch_id(payAccount.getMchId()); - payOrderQ.setNonce_str(noncestr); - if (StringUtils.isNotBlank(record.getTransactionId())) { - payOrderQ.setTransaction_id(record.getTransactionId()); - } else { - payOrderQ.setOut_trade_no(record.getPayOrderNo()); - } - - try { - Map map = BeanUtils.toStringMap(payOrderQ); - payOrderQ.setSign(WxPayment.createSign(map, payAccount.getApiKey())); - map = BeanUtils.toStringMap(payOrderQ); - String response = WxPay.orderQuery(map); - return response; - } catch (RuntimeException e) { - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); - } catch (Exception e) { - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); - } - } else { - // 服务商模式 - WxPayOrderSQ payOrderSQ = new WxPayOrderSQ(); - String noncestr = Utility.generate32UUID(); - payOrderSQ.setAppid(appInfo.getParentAppId()); - payOrderSQ.setSub_appid(appInfo.getAppId()); - payOrderSQ.setMch_id(payAccount.getMchId()); - payOrderSQ.setSub_mch_id(payAccount.getSubMchId()); - payOrderSQ.setNonce_str(noncestr); - if (StringUtils.isNotBlank(record.getTransactionId())) { - payOrderSQ.setTransaction_id(record.getTransactionId()); - } else { - payOrderSQ.setOut_trade_no(record.getPayOrderNo()); - } - payOrderSQ.setSign_type("HMAC-SHA256"); - - try { - Map map = BeanUtils.toStringMap(payOrderSQ); - payOrderSQ.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); - map = BeanUtils.toStringMap(payOrderSQ); - - String response = WxPay.orderQuery(map); - return response; - } catch (RuntimeException e) { - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); - } catch (Exception e) { - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); - } - } - } - /** * 微信订单查询 */ @@ -719,7 +813,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { WxAppinfo appInfo = wxAppinfoService.getCAppInfo(record); - String response = wechatPayOrderQuery(appInfo, record); + WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId()); + String response = WxPayOrderServiceHelper.wechatPayOrderQuery(appInfo, record,payAccount); logger.info("pay order query, " + record.toString() + ", response: " + response); Map returnMap = WxPayment.xmlToMap(response); @@ -1289,7 +1384,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if (isOrderGroupCoupon(record, wxCoupon)) { // 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER try { - wxOrderGroupService.createOrderGroup(order, wxCoupon); + wxOrderGroupService.createOrderGroup(order, wxCoupon,false); } catch (Exception e) { logger.error("参团失败" + e.getMessage()); order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); @@ -1316,7 +1411,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } } - private boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon) { + @Override + public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon) { return wxCoupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode()) && wxCoupon.getSalePrice().equals(record.getPayAmount()); } @@ -1617,7 +1713,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { // 回调未返回,主动检查支付订单状态 try { record.setPayOrderNo(String.valueOf(record.getId())); - String response = wechatPayOrderQuery(appInfo, record); + WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId()); + String response = WxPayOrderServiceHelper.wechatPayOrderQuery(appInfo, record,payAccount); logger.info("pay order query, " + record.toString() + ", response: " + response); Map returnMap = WxPayment.xmlToMap(response); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxProjectConfigServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxProjectConfigServiceImpl.java new file mode 100644 index 000000000..e4f9f9b02 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxProjectConfigServiceImpl.java @@ -0,0 +1,133 @@ +package com.iformall.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.iformall.domain.po.*; +import com.iformall.mapper.*; +import com.iformall.service.*; +import com.iformall.utils.PasswordHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service +public class WxProjectConfigServiceImpl implements WxProjectConfigService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxProjectConfigMapper wxProjectConfigMapper; + @Autowired + WxMallService wxMallService; + @Autowired + WxCouponSendConfigService wxCouponSendConfigService; + @Autowired + WxMallBuildingService wxMallBuildingService; + @Autowired + WxPayAccountService wxPayAccountService; + @Autowired + WxPayAccountBillService wxPayAccountBillService; + @Autowired + WxAppinfoService wxAppinfoService; + @Autowired + WxAuthorizerInfoService wxAuthorizerInfoService; + @Autowired + MallUserInfoService mallUserInfoService; + @Autowired + MallRoleService mallRoleService; + @Autowired + WxMsgConfigService wxMsgConfigService; + @Autowired + WxParkService wxParkService; + @Autowired + WxScoreRulesService wxScoreRulesService; + @Autowired + WxTemplateMsgService wxTemplateMsgService; + @Autowired + WxQuestionService wxQuestionService; + @Autowired + WxMsgValidationcodeModelService wxMsgValidationcodeModelService; + @Autowired + WxFlowService wxFlowService; + + @Override + @Transactional + public void initProjectConfig(Long id) { + WxProjectConfig wxProjectConfig = wxProjectConfigMapper.selectById(id); + if(wxProjectConfig!=null && wxProjectConfig.getDelType()<10000){ + // 1. wx_mall 商场 + String tenantId = wxMallService.wxMallInit(wxProjectConfig); + // 2. wx_coupon_send_config + wxCouponSendConfigService.wxCouponSendConfigInit(tenantId); + // 3. wx_mall_building 商场楼座 + wxMallBuildingService.wxMallBuildingInit(tenantId,wxProjectConfig.getMallBuilding()); + //# --- 特殊商户号开通后,填写此数据 + //# 5. wx_pay_account + WxPayAccount wxPayAccount = wxPayAccountService.wxPayAccountInit(tenantId,wxProjectConfig); + //# --- 特殊商户号开通后,填写此数据 + //# 6. wx_pay_account_bill + Long payBillId = wxPayAccountBillService.wxPayAccountInit(wxPayAccount); + //# --- 小程序开通后,填写此数据,并设置域名及业务域名等 + //# 7. wx_appinfo + wxAppinfoService.wxAppinfoInit(tenantId,wxPayAccount.getId(),payBillId,wxProjectConfig); + + wxAuthorizerInfoService.wxAuthorizerInfoInit(tenantId,wxProjectConfig); + + wxAuthorizerInfoService.wxWeappExtSetInit(wxProjectConfig); + // 9. mall_user_info + // 10. mall_role + // 11. mall_role_permission + //# 12. mall_user_role + Long mallUserInfoId = mallUserInfoService.MallUserInfoInit(tenantId, wxProjectConfig); + //# 13. wx_msg_config + wxMsgConfigService.WxMsgConfigInit(tenantId, wxProjectConfig); + //# ETCP 设置完后再填写此数据 + //# 14. wx_park + wxParkService.wxParkInit(tenantId, wxProjectConfig); + //# 积分成长值设置wx_score_rules + wxScoreRulesService.wxScoreRulesInit(tenantId); + //# 17. wx_template_msg + //# 设置核销成功通知,核销失败通知 + wxTemplateMsgService.wxTemplateMsgInit(tenantId); + //# 18. wx_wiwide_info -- 迈外迪 服务商后台设置商户(点击获取商户bid),再找迈外迪初始化,收到激活邮件激活后,再在数据库中插入此数据 + //# 数据格式如下 + //# szld1086@iformall + //# 1391054397 + //# wuguoqiang@iformall.com + + // # 19. wx_question + logger.info("wx_question---------------------init--start"); + String questionJson = "[{\"flag\": \"single\", \"title\": \"请问您的职业是?\", \"answers\": [{\"id\": \"59\", \"name\": \"学生\"}, {\"id\": \"60\", \"name\": \"上班族\"}, {\"id\": \"61\", \"name\": \"企业高管\"}, {\"id\": \"62\", \"name\": \"个体户\"}, {\"id\": \"63\", \"name\": \"自由职业\"}, {\"id\": \"64\", \"name\": \"其他\"}]}," + + "{\"flag\": \"single\", \"title\": \"请问您目前的学历是?\", \"answers\": [{\"id\": \"34\", \"name\": \"高中\"}, {\"id\": \"35\", \"name\": \"大专\"}, {\"id\": \"36\", \"name\": \"本科\"}, {\"id\": \"37\", \"name\": \"硕士及以上\"}, {\"id\": \"38\", \"name\": \"博士及以上\"}]}," + + "{\"flag\": \"single\", \"title\": \"请问您是如何到达商场的?\", \"answers\": [{\"id\": \"127\", \"name\": \"走路\"}, {\"id\": \"128\", \"name\": \"乘车\"}]}," + + "{\"flag\": \"single\", \"title\": \"请问您和父母一起居住吗?\", \"answers\": [{\"id\": \"65\", \"name\": \"不是,我已租房\"}, {\"id\": \"66\", \"name\": \"是,我已购房\"}, {\"id\": \"67\", \"name\": \"不是,我和室友住宿舍\"}]}," + + "{\"flag\": \"multi\", \"title\": \"请问您的孩子愿意与您一起?\", \"answers\": [{\"id\": \"57\", \"name\": \"逛街\"}, {\"id\": \"57\", \"name\": \"玩乐\"}, {\"id\": \"57\", \"name\": \"阅读\"}, {\"id\": \"55\", \"name\": \"我还没有宝宝\"}]}," + + "{\"flag\": \"single\", \"title\": \"主人,您结婚了吗?\", \"answers\": [{\"id\": \"56\", \"name\": \"结婚啦\"}, {\"id\": \"55\", \"name\": \"还没有哦\"}]}," + + "{\"flag\": \"single\", \"title\": \"您是?\", \"answers\": [{\"id\": \"42\", \"name\": \"贫下中农\"}, {\"id\": \"43\", \"name\": \"小康家庭\"}, {\"id\": \"44\", \"name\": \"中产家庭\"}, {\"id\": \"45\", \"name\": \"富裕家庭\"}]}," + + "{\"flag\": \"single\", \"title\": \"请问您是?\", \"answers\": [{\"id\": \"104\", \"name\": \"实惠型消费\"}, {\"id\": \"105\", \"name\": \"享乐型消费\"}, {\"id\": \"106\", \"name\": \"品质型消费\"}]}," + + "{\"flag\": \"multi\", \"title\": \"请问您喜欢哪种口味的食物?\", \"answers\": [{\"id\": \"92\", \"name\": \"轻餐\"}, {\"id\": \"93\", \"name\": \"小吃快餐\"}, {\"id\": \"94\", \"name\": \"西餐\"}, {\"id\": \"95\", \"name\": \"日料中餐甜点\"}, {\"id\": \"96\", \"name\": \"火锅\"}]}," + + "{\"flag\": \"multi\", \"title\": \"请问您的爱好是?\", \"answers\": [{\"id\": \"121\", \"name\": \"时尚\"}, {\"id\": \"122\", \"name\": \"旅游\"}, {\"id\": \"123\", \"name\": \"运动\"}, {\"id\": \"124\", \"name\": \"电玩\"}, {\"id\": \"125\", \"name\": \"看书\"}, {\"id\": \"126\", \"name\": \"其他\"}]}]"; + wxQuestionService.wxQuestionInit(tenantId,questionJson); + + //# 20. wx_msg_validationcode_model, 数据重新一下 + wxMsgValidationcodeModelService.wxMsgValidationcodeModelInit(tenantId, wxProjectConfig); + //wx_flow_config + wxFlowService.wxFlowConfigInit(tenantId); + //初始化成功 删除标记 + wxProjectConfig.setDelType(10000); + wxProjectConfigMapper.updateById(wxProjectConfig); + + }else { + logger.info("------数据已初始化"); + } + + } + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxQuestionServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxQuestionServiceImpl.java index 31127da1a..db803ce5b 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxQuestionServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxQuestionServiceImpl.java @@ -1,5 +1,7 @@ package com.iformall.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; @@ -31,6 +33,18 @@ public class WxQuestionServiceImpl implements WxQuestionService { @Autowired WxQuestionLogMapper wxQuestionLogMapper; + @Override + public void wxQuestionInit(String tenantId, String questionJson) { + WxQuestion wxQuestion = new WxQuestion(); + wxQuestion.setTenantId(tenantId); + JSONArray jsonObject = JSON.parseArray(questionJson); + for (Object object : jsonObject) { + wxQuestion.setId(null); + wxQuestion.setContent(object.toString()); + wxQuestionMapper.insert(wxQuestion); + } + } + @Override public PageInfo listAsPage(WxQuestion record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxQuestionMapper.findList(record)); 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 f196bb745..6f11acde7 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java @@ -19,6 +19,7 @@ import com.iformall.pay.WxRefundOrderP; import com.iformall.pay.WxRefundOrderSP; import com.iformall.service.WxOrderService; import com.iformall.service.WxRefundOrderService; +import com.iformall.service.helper.WxPayOrderServiceHelper; import com.iformall.utils.BeanUtils; import com.iformall.utils.CipherUtil; import com.iformall.utils.Utility; @@ -317,6 +318,36 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { logger.error("已经核销过的券: couponOrder-" + couponOrderId); throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED); } + + //TODO 查询订单状态是否是支付成功的状态,支付成功的状态才能退款。 + // 查找支付订单 + WxPayOrder payOrderQ = new WxPayOrder(); + payOrderQ.updateTenantInfo(wxCouponOrder); + payOrderQ.setCUserId(wxOrder.getCUserId()); + payOrderQ.setOrderId(wxOrder.getId()); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); + + WxPayOrder payOrder = null; + List list = wxPayOrderMapper.findList(payOrderQ); + if (list.size() > 0) { + if (list.size() > 1) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(),"异常:该订单找到多条支付信息wxpayorder!"); + } + payOrder = list.get(0); + } + if (payOrder == null) { + logger.error("支付订单不存在(payOrder不存在)"); + return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND); + } + WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId()); + if (null == payAccount) { + throw new MallinkException(ErrorCode.PAY_ORDER_QUERY_ERROR.getCode(), "payAccount为空[payId:"+appInfo.getPayId()+"]"); + } + int status = WxPayOrderServiceHelper.wxOrderPayStatus(payOrder, wxOrder, appInfo, payAccount); + if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode() != status) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(),"该订单查询微信支付状态为未支付成功,无法退款。"); + } + final IdWorker idWorker = IdWorker.get(); Long refundOrderId = idWorker.nextId(); @@ -377,26 +408,7 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { } } - // 查找支付订单 - WxPayOrder payOrderQ = new WxPayOrder(); - payOrderQ.updateTenantInfo(wxCouponOrder); - payOrderQ.setCUserId(wxOrder.getCUserId()); - payOrderQ.setOrderId(wxOrder.getId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); - WxPayOrder payOrder = null; - List list = wxPayOrderMapper.findList(payOrderQ); - if (list.size() > 0) { - if (list.size() > 1) { - logger.error("TODO: payOrder成功记录应该只有一条????!!!"); - } - logger.warn(""); - payOrder = list.get(0); - } - if (payOrder == null) { - logger.error("支付订单不存在(payOrder不存在)"); - return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND); - } WxRefundOrder record = new WxRefundOrder(); record.setPayOrderNo(String.valueOf(payOrder.getId())); @@ -428,7 +440,7 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { logger.error("退款订单数据库插入出错: " + record.toString()); throw new MallinkException(ErrorCode.DB_FAIL); } - WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId()); + if (StringUtils.isBlank(payAccount.getApiKey())) { logger.error("支付密钥为空"); throw new MallinkException(ErrorCode.API_KEY_NOT_FOUND.getCode(), "支付密钥为空,请联系商城管理员"); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxScoreRulesServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxScoreRulesServiceImpl.java index 43dbbaa8c..e754793a8 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxScoreRulesServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxScoreRulesServiceImpl.java @@ -47,6 +47,61 @@ public class WxScoreRulesServiceImpl implements WxScoreRulesService { @Autowired WxMerchantMapper wxMerchantMapper; + @Override + public void wxScoreRulesInit(String tenantId) { + WxScoreRules wxScoreRules = new WxScoreRules(); + wxScoreRules.setTenantId(tenantId); + wxScoreRules.setRules("[{\"id\": 1, \"desc\": \"每日登陆\", \"step\": 1, \"limit\": 0, \"score\": 0}," + + " {\"id\": 2, \"score\": null, \"childs\": " + + "[{\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"餐饮\", \"businessId\": 1}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"娱乐\", \"businessId\": 2}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服饰\", \"businessId\": 3}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"亲子\", \"businessId\": 4}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"超市\", \"businessId\": 5}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"美妆\", \"businessId\": 7}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"珠宝\", \"businessId\": 8}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服务\", \"businessId\": 9}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"家居\", \"businessId\": 10}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"数码家电\", \"businessId\": 11}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"其他\", \"businessId\": 6}]}," + + " {\"id\": 3, \"desc\": \"绑定车牌1个\", \"step\": 1, \"limit\": 1, \"score\": 0}," + + " {\"id\": 5, \"desc\": \"授权个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}," + + " {\"id\": 6, \"desc\": \"授权手机号\", \"step\": 1, \"limit\": 1, \"score\": 0}," + + " {\"id\": 7, \"desc\": \"编辑个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}," + + " {\"id\": 8, \"desc\": \"编辑个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}]"); + wxScoreRules.setCreateDate(new Date()); + wxScoreRules.setUpdateDate(new Date()); + wxScoreRules.setType(2); + wxScoreRules.setClearYear(1); + wxScoreRules.setScale(10); + wxScoreRules.setCreditLocked(1); + wxScoreRulesMapper.insert(wxScoreRules); + wxScoreRules = new WxScoreRules(); + wxScoreRules.setTenantId(tenantId); + wxScoreRules.setRules("[{\"id\": 1, \"desc\": \"每日登陆\", \"step\": 1, \"limit\": 0, \"score\": 0}," + + " {\"id\": 2, \"score\": 0, \"childs\": " + + "[{\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"餐饮\", \"businessId\": 1}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"娱乐\", \"businessId\": 2}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服饰\", \"businessId\": 3}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"亲子\", \"businessId\": 4}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"超市\", \"businessId\": 5}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"美妆\", \"businessId\": 7}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"珠宝\", \"businessId\": 8}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服务\", \"businessId\": 9}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"家居\", \"businessId\": 10}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"数码家电\", \"businessId\": 11}," + + " {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"其他\", \"businessId\": 6}]}," + + " {\"id\": 3, \"desc\": \"绑定车牌1个\", \"step\": 1, \"limit\": 1, \"score\": 0}," + + " {\"id\": 5, \"desc\": \"授权个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}," + + " {\"id\": 6, \"desc\": \"授权手机号\", \"step\": 1, \"limit\": 1, \"score\": 0}," + + " {\"id\": 7, \"desc\": \"编辑个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}]"); + wxScoreRules.setCreateDate(new Date()); + wxScoreRules.setUpdateDate(new Date()); + wxScoreRules.setType(1); + wxScoreRules.setCreditLocked(0); + wxScoreRulesMapper.insert(wxScoreRules); + } + @Override public WxScoreRules getScoreRules(TenantEntity tenantEntity) { // get pushLime from cache diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxTemplateMsgServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxTemplateMsgServiceImpl.java index 4d96036d7..92a6fe386 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxTemplateMsgServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxTemplateMsgServiceImpl.java @@ -22,6 +22,27 @@ public class WxTemplateMsgServiceImpl implements WxTemplateMsgService { WxTemplateMsgMapper wxTemplateMsgMapper; + @Override + public void wxTemplateMsgInit(String tenantId) { + WxTemplateMsg wxTemplateMsg = new WxTemplateMsg(); + wxTemplateMsg.setTenantId(tenantId); + wxTemplateMsg.setTemplateId(""); + wxTemplateMsg.setType(1); + wxTemplateMsg.setCustomParam("{\"index\":[\"keyword1\",\"keyword2\",\"keyword3\",\"keyword4\",\"keyword5\",\"keyword6\",\"keyword7\"]," + + "\"keyword1\":\"可抵{keyword1}元\",\"keyword2\":\"{keyword2}\",\"keyword3\":\"{keyword3}\",\"keyword4\":\"{keyword4}\"," + + "\"keyword5\":\"{keyword5}元\",\"keyword6\":\"{keyword6}\",\"keyword7\":\"猜也猜不到的优惠,只有幸运的人才能看到,就是你," + + "{keyword7}\\n☟☟☟☟☟☟☟\\n☞ 快看看 ☜\\n☝︎☝︎☝︎☝︎☝︎☝︎☝︎\\n\",\"emphasis\":\"keyword1.DATA\"}"); + wxTemplateMsg.setCreateDate(new Date()); + wxTemplateMsg.setUpdateDate(new Date()); + wxTemplateMsgMapper.insert(wxTemplateMsg); + wxTemplateMsg.setId(null); + wxTemplateMsg.setType(2); + wxTemplateMsg.setCustomParam("{\"index\":[\"keyword1\",\"keyword2\",\"keyword3\",\"keyword4\"],\"keyword1\":\"可抵{keyword1}元\"," + + "\"keyword2\":\"{keyword2}\",\"keyword3\":\"{keyword3}\",\"keyword4\":\"猜也猜不到的优惠,只有幸运的人才能看到,就是你," + + "{keyword4}\\n☟☟☟☟☟☟☟\\n☞ 快看看 ☜\\n☝︎☝︎☝︎☝︎☝︎☝︎☝︎\\n\",\"emphasis\":\"keyword1.DATA\"}"); + wxTemplateMsgMapper.insert(wxTemplateMsg); + } + @Override public PageInfo listAsPage(WxTemplateMsg record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxTemplateMsgMapper.findList(record)); diff --git a/mallinkService/src/main/java/com/iformall/service/msg/impl/UpdateCouponStockMsgServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/msg/impl/UpdateCouponStockMsgServiceImpl.java new file mode 100644 index 000000000..fe46cf65c --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/msg/impl/UpdateCouponStockMsgServiceImpl.java @@ -0,0 +1,35 @@ +package com.iformall.service.msg.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.iformall.domain.po.msg.BaseMsg; +import com.iformall.domain.po.msg.UpdateCouponStockMsg; +import com.iformall.enums.EnumPayWay; +import com.iformall.service.WxCouponService; +import com.iformall.service.msg.MsgSendService; + +/** + * + * @author Stormeye Wu + * @date 2019/5/10 + */ +@Service +public class UpdateCouponStockMsgServiceImpl implements MsgSendService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxCouponService wxCouponService; + + @Override + public void send(BaseMsg baseMsg) throws Exception { + UpdateCouponStockMsg msg = (UpdateCouponStockMsg)baseMsg; + if (null != msg ) { + if (msg.getOperateType().equals(UpdateCouponStockMsg.OPERATE_TYPE_DECREASE)) { + wxCouponService.reduceRemainInventory(msg.getCouponId(), (int)msg.getNumber()); + } + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/utils/HttpUtil.java b/mallinkService/src/main/java/com/iformall/utils/HttpUtil.java index d5d4889ef..7f5ed3a43 100644 --- a/mallinkService/src/main/java/com/iformall/utils/HttpUtil.java +++ b/mallinkService/src/main/java/com/iformall/utils/HttpUtil.java @@ -288,7 +288,7 @@ public class HttpUtil { KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(clientStore, certPass.toCharArray()); KeyManager[] kms = kmf.getKeyManagers(); - SSLContext sslContext = SSLContext.getInstance("TLSv1"); + SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kms, null, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); diff --git a/mallinkService/src/main/java/com/iformall/utils/PasswordHelper.java b/mallinkService/src/main/java/com/iformall/utils/PasswordHelper.java new file mode 100644 index 000000000..030d3113b --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/utils/PasswordHelper.java @@ -0,0 +1,34 @@ +package com.iformall.utils; + + +import com.iformall.domain.po.MallUserInfo; +import org.apache.shiro.crypto.hash.SimpleHash; +import org.apache.shiro.util.ByteSource; + + +public class PasswordHelper { + //private RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator(); + private String algorithmName = "md5"; + private int hashIterations = 2; + + public void encryptPassword(MallUserInfo user) { + //String salt=randomNumberGenerator.nextBytes().toHex(); + String newPassword = new SimpleHash(algorithmName, user.getPassword(), ByteSource.Util.bytes(user.getUsername()), hashIterations).toHex(); + //String newPassword = new SimpleHash(algorithmName, user.getPassword()).toHex(); + user.setPassword(newPassword); + + } + + + public static void main(String[] args) { + MallUserInfo user = new MallUserInfo(); + user.setUsername("mfadmin"); + user.setPassword("m2F@of0"); + PasswordHelper passwordHelper = new PasswordHelper(); + passwordHelper.encryptPassword(user); + System.out.println(user); + System.out.println(user.getPassword()); + } + + +} diff --git a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java index 47b18bc17..de4241e03 100644 --- a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java +++ b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java @@ -8,6 +8,8 @@ import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; +import com.iformall.enums.EnumCacheKey; + import java.util.concurrent.TimeUnit; /** @@ -24,7 +26,9 @@ public class RedisLock { private StringRedisTemplate stringRedisTemplate; public static final int TIMEOUT = 10*1000;//超时时间 10s - + + public static final int LONG_TIMEOUT = 3600*1000;//超长超时时间,关键业务点失败不能再进行下去的时间点 + /** * 加锁 * @param key productId - 商品的唯一标志 @@ -102,5 +106,52 @@ public class RedisLock { logger.error("[Redis分布式锁] 解锁出现异常了,{}",e); } } - + + + /** + * 原子性增加 + */ + public long increase(String key, long delta) { + try { + return stringRedisTemplate.opsForValue().increment(key, delta); + }catch(Exception e) { + logger.error("[Redis分布式锁] increase error,{}",e); + } + return 0; + } + + /** + * 原子性减少 + */ + public long decrease(String key, long delta) { + try { + return stringRedisTemplate.opsForValue().decrement(key, delta); + }catch(Exception e) { + logger.error("[Redis分布式锁] decrease error,{}",e); + } + return 0; + } + + + public long getCouponStock(long couponId) { + try { + String longstr = stringRedisTemplate.opsForValue().get(EnumCacheKey.COUPON_STOCK.getMessage()+String.valueOf(couponId)); + return Long.parseLong(longstr); + }catch (Exception e) { + logger.error("[Redis分布式锁] getCouponStock error,{}",e); + } + return 0; + } + + public void setCouponStock(long couponId,long number) { + try { + stringRedisTemplate.opsForValue().set(EnumCacheKey.COUPON_STOCK.getMessage()+String.valueOf(couponId), String.valueOf(number)); + }catch(Exception e) { + logger.error("[Redis分布式锁] setCouponStock error,{}",e); + } + } + + public boolean hasCouponStockCache(long couponId) { + return stringRedisTemplate.hasKey(EnumCacheKey.COUPON_STOCK.getMessage()+String.valueOf(couponId)); + } } diff --git a/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml b/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml index 06df2ba06..2eeaaf5ba 100644 --- a/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml @@ -25,7 +25,7 @@ `share_fee_amount`,`remaining_share_fee_amount`, `rate_amount`, `create_date`,`update_date`,`support_transfer` - + where 1 = 1 @@ -211,4 +211,10 @@ update wx_card_info set support_transfer=0,update_date=now() where support_transfer=1 and coupon_id=#{couponId} + + diff --git a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml index 7498967d9..75fae0f02 100644 --- a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml @@ -957,9 +957,70 @@ select="com.iformall.mapper.WxCouponMerchantMapper.findMerchantVoList" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - select from wx_coupon c,wx_coupon_order co left join wx_coupon_action_log cal on cal.coupon_order_id = co.id diff --git a/mallinkService/src/main/resources/mapper/WxFlowConfigMapper.xml b/mallinkService/src/main/resources/mapper/WxFlowConfigMapper.xml index 985f78e91..462cdce43 100644 --- a/mallinkService/src/main/resources/mapper/WxFlowConfigMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxFlowConfigMapper.xml @@ -13,7 +13,7 @@ - + @@ -33,7 +33,7 @@ - SELECT * FROM wx_flow_config WHERE parent_id = #{id} ORDER BY sort ASC @@ -41,7 +41,9 @@ update wx_flow_config set update_date = now() where model_id = #{modelId} - + diff --git a/mallinkService/src/main/resources/mapper/WxMsgValidationcodeModelMapper.xml b/mallinkService/src/main/resources/mapper/WxMsgValidationcodeModelMapper.xml index bf4600491..afba7c257 100644 --- a/mallinkService/src/main/resources/mapper/WxMsgValidationcodeModelMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxMsgValidationcodeModelMapper.xml @@ -53,9 +53,8 @@ - - - - + diff --git a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml index 7e0e59b89..2576e5576 100644 --- a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml @@ -133,7 +133,7 @@ diff --git a/mallinkService/src/main/resources/mapper/WxProjectConfigMapper.xml b/mallinkService/src/main/resources/mapper/WxProjectConfigMapper.xml new file mode 100644 index 000000000..b3dcd6315 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxProjectConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/mallinkSysAdmin/src/main/resources/application-dev.yml b/mallinkSysAdmin/src/main/resources/application-dev.yml index 93ff0f5ab..373f379a4 100644 --- a/mallinkSysAdmin/src/main/resources/application-dev.yml +++ b/mallinkSysAdmin/src/main/resources/application-dev.yml @@ -3,7 +3,7 @@ spring: include: rabbitMQ # JDBC datasource: - url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true + url: jdbc:mysql://rm-2zel9i9t555zy7lft.mysql.rds.aliyuncs.com:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4) type: com.alibaba.druid.pool.DruidDataSource diff --git a/mallinkWebSocketServer/src/main/resources/application-dev.yml b/mallinkWebSocketServer/src/main/resources/application-dev.yml index b39cdd2b9..0291f7f72 100644 --- a/mallinkWebSocketServer/src/main/resources/application-dev.yml +++ b/mallinkWebSocketServer/src/main/resources/application-dev.yml @@ -1,9 +1,10 @@ spring: profiles: - include: rabbitMQ + include: aliyunRocketMQ + #include: rabbitMQ # JDBC datasource: - url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true + url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/mallink?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4) type: com.alibaba.druid.pool.DruidDataSource @@ -27,7 +28,7 @@ spring: # REDIS redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 @@ -71,6 +72,11 @@ spring: publisher-confirms: true publisher-returns: false virtual-host: / + aliyunRocketmq: + accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" + accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" + groupId: "GID_P_1" + namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" aws: clientRegion: cn-northwest-1 @@ -85,7 +91,7 @@ wechat: componentToken: "formall2018" componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" redis: - host: 202.165.179.86 + host: 101.201.103.81 port: 6379 password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) timeout: 3600 diff --git a/mallinkWebSocketServer/src/main/resources/application.yml b/mallinkWebSocketServer/src/main/resources/application.yml index d3aacff46..bdfa1b8d2 100644 --- a/mallinkWebSocketServer/src/main/resources/application.yml +++ b/mallinkWebSocketServer/src/main/resources/application.yml @@ -23,22 +23,22 @@ spring: cache-names: redis_cache #缓存的名字(可以不指定) redis: time-to-live: 60000ms #很重要,缓存的有效时间,以便缓存的过期(单位为毫秒) - rocketmq: - nameServer: 127.0.0.1:9876 - producer: - retry-times-when-send-async-failed: 0 - send-msg-timeout: 300000 - compress-msg-body-over-howmuch: 4096 - max-message-size: 4194304 - retry-another-broker-when-not-store-ok: false - retry-times-when-send-failed: 2 - rabbitmq: - host: 202.165.179.86 - port: 5672 - username: guest - password: guest - publisher-confirms: true - virtual-host: / +# rocketmq: +# nameServer: 127.0.0.1:9876 +# producer: +# retry-times-when-send-async-failed: 0 +# send-msg-timeout: 300000 +# compress-msg-body-over-howmuch: 4096 +# max-message-size: 4194304 +# retry-another-broker-when-not-store-ok: false +# retry-times-when-send-failed: 2 +# rabbitmq: +# host: 202.165.179.86 +# port: 5672 +# username: guest +# password: guest +# publisher-confirms: true +# virtual-host: / # MybatisPlus diff --git a/mybatis-multi-tenancy/src/test/java/com/iformall/plugin/test/MybatisTest.java b/mybatis-multi-tenancy/src/test/java/com/iformall/plugin/test/MybatisTest.java index 7ca385438..7aa062426 100644 --- a/mybatis-multi-tenancy/src/test/java/com/iformall/plugin/test/MybatisTest.java +++ b/mybatis-multi-tenancy/src/test/java/com/iformall/plugin/test/MybatisTest.java @@ -14,7 +14,7 @@ import java.util.Map; * Created by Meara on 2016/3/17. */ public class MybatisTest { - @Test + //@Test public void query(){ InputStream is = MybatisTest.class.getClassLoader().getResourceAsStream("mybatisConf.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); diff --git a/pom.xml b/pom.xml index c423a0294..eee3ca238 100644 --- a/pom.xml +++ b/pom.xml @@ -368,6 +368,13 @@ 1.11.423 + + + com.belerweb + pinyin4j + 2.5.0 + +