Просмотр исходного кода

Merge tag 'refs/tags/jenkins-back-end-1060' into release

develop

# Conflicts:
#	mallinkService/src/main/java/com/iformall/common/ErrorCode.java
release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
7ae5d749f5
100 измененных файлов: 3903 добавлений и 613 удалений
  1. +12
    -0
      mallinkAdmin/pom.xml
  2. +2
    -0
      mallinkAdmin/src/main/java/com/iformall/UserApplication.java
  3. +33
    -0
      mallinkAdmin/src/main/java/com/iformall/config/RedisConfig.java
  4. +26
    -12
      mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java
  5. +33
    -0
      mallinkAdmin/src/main/java/com/iformall/config/WechatMpConfig.java
  6. +59
    -0
      mallinkAdmin/src/main/java/com/iformall/config/WechatWebProperties.java
  7. +1
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/BaseController.java
  8. +190
    -75
      mallinkAdmin/src/main/java/com/iformall/controller/HomeController.java
  9. +39
    -21
      mallinkAdmin/src/main/java/com/iformall/controller/MallUserInfoController.java
  10. +338
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WechatLoginController.java
  11. +4
    -4
      mallinkAdmin/src/main/java/com/iformall/controller/WxAppinfoController.java
  12. +8
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxBillAllController.java
  13. +14
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxBillDepositController.java
  14. +13
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxBillOtherDepositController.java
  15. +17
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxBillPropertyController.java
  16. +19
    -3
      mallinkAdmin/src/main/java/com/iformall/controller/WxBillPropertyDepositController.java
  17. +23
    -5
      mallinkAdmin/src/main/java/com/iformall/controller/WxBillRentController.java
  18. +1
    -1
      mallinkAdmin/src/main/java/com/iformall/controller/WxCUserBasicInfoController.java
  19. +1
    -1
      mallinkAdmin/src/main/java/com/iformall/controller/WxCardPayController.java
  20. +42
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxChartDataController.java
  21. +3
    -25
      mallinkAdmin/src/main/java/com/iformall/controller/WxCouponChannelController.java
  22. +88
    -73
      mallinkAdmin/src/main/java/com/iformall/controller/WxCouponController.java
  23. +1
    -7
      mallinkAdmin/src/main/java/com/iformall/controller/WxCouponSendController.java
  24. +97
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxDeviceController.java
  25. +110
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxDeviceScreenAdController.java
  26. +42
    -3
      mallinkAdmin/src/main/java/com/iformall/controller/WxFlowAbleController.java
  27. +40
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxOrderGroupController.java
  28. +12
    -2
      mallinkAdmin/src/main/java/com/iformall/controller/WxPropertyContractController.java
  29. +8
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxRentContractController.java
  30. +109
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxScreenAdController.java
  31. +19
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/WxShopController.java
  32. +1
    -1
      mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java
  33. +21
    -0
      mallinkAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java
  34. +5
    -10
      mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java
  35. +28
    -4
      mallinkAdmin/src/main/resources/application-dev.yml
  36. +17
    -3
      mallinkAdmin/src/main/resources/application-prod.yml
  37. +16
    -3
      mallinkAdmin/src/main/resources/application-test.yml
  38. +20
    -0
      mallinkAdmin/src/main/resources/application.yml
  39. +45
    -0
      mallinkAdmin/src/main/resources/processes/endContractflow.bpmn20.xml
  40. +2
    -0
      mallinkBApi/src/main/java/com/iformall/BApplication.java
  41. +18
    -0
      mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java
  42. +25
    -2
      mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java
  43. +9
    -30
      mallinkBApi/src/main/java/com/iformall/controller/WxInfoController.java
  44. +3
    -3
      mallinkBApi/src/main/java/com/iformall/controller/WxRefundOrderController.java
  45. +1
    -1
      mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java
  46. +3
    -1
      mallinkBApi/src/main/resources/application-dev.yml
  47. +11
    -1
      mallinkBApi/src/main/resources/application-prod.yml
  48. +9
    -1
      mallinkBApi/src/main/resources/application-test.yml
  49. +9
    -0
      mallinkBApi/src/main/resources/application.yml
  50. +2
    -0
      mallinkCApi/src/main/java/com/iformall/CApplication.java
  51. +18
    -0
      mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java
  52. +2
    -2
      mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java
  53. +12
    -2
      mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java
  54. +23
    -12
      mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java
  55. +26
    -3
      mallinkCApi/src/main/java/com/iformall/controller/WxCouponController.java
  56. +101
    -11
      mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java
  57. +10
    -24
      mallinkCApi/src/main/java/com/iformall/controller/WxGameController.java
  58. +15
    -0
      mallinkCApi/src/main/java/com/iformall/controller/WxMerchantController.java
  59. +58
    -9
      mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java
  60. +138
    -0
      mallinkCApi/src/main/java/com/iformall/controller/WxOrderGroupController.java
  61. +14
    -1
      mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java
  62. +26
    -28
      mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java
  63. +7
    -2
      mallinkCApi/src/main/java/com/iformall/interceptor/HttpServletRequestWrapperFilter.java
  64. +7
    -3
      mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java
  65. +72
    -0
      mallinkCApi/src/main/java/com/iformall/interceptor/WebLogAspect.java
  66. +4
    -2
      mallinkCApi/src/main/resources/application-dev.yml
  67. +11
    -1
      mallinkCApi/src/main/resources/application-prod.yml
  68. +9
    -1
      mallinkCApi/src/main/resources/application-test.yml
  69. +9
    -0
      mallinkCApi/src/main/resources/application.yml
  70. +35
    -0
      mallinkMQConsumer/pom.xml
  71. +35
    -0
      mallinkMQConsumer/src/main/java/com/iformall/ConsumerApplication.java
  72. +52
    -0
      mallinkMQConsumer/src/main/java/com/iformall/config/AwsProperty.java
  73. +24
    -0
      mallinkMQConsumer/src/main/java/com/iformall/config/PayProperty.java
  74. +129
    -0
      mallinkMQConsumer/src/main/java/com/iformall/config/RedisConfig.java
  75. +52
    -0
      mallinkMQConsumer/src/main/java/com/iformall/config/RestFilter.java
  76. +24
    -0
      mallinkMQConsumer/src/main/java/com/iformall/config/RestTemplateConfig.java
  77. +79
    -0
      mallinkMQConsumer/src/main/java/com/iformall/config/WebConfig.java
  78. +32
    -0
      mallinkMQConsumer/src/main/java/com/iformall/controller/HomeController.java
  79. +73
    -0
      mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java
  80. +42
    -0
      mallinkMQConsumer/src/main/java/com/iformall/mq/impl/RabbitMqConsumer.java
  81. +19
    -0
      mallinkMQConsumer/src/main/java/com/iformall/mq/impl/RocketMqConsumer.java
  82. +89
    -0
      mallinkMQConsumer/src/main/resources/application-dev.yml
  83. +75
    -0
      mallinkMQConsumer/src/main/resources/application-prod.yml
  84. +71
    -0
      mallinkMQConsumer/src/main/resources/application-test.yml
  85. +73
    -0
      mallinkMQConsumer/src/main/resources/application.yml
  86. +100
    -0
      mallinkMQConsumer/src/main/resources/logback-spring.xml
  87. +2
    -0
      mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java
  88. +18
    -0
      mallinkSchedule/src/main/java/com/iformall/config/RedisConfig.java
  89. +1
    -1
      mallinkSchedule/src/main/java/com/iformall/config/SchedulingConfig.java
  90. +19
    -0
      mallinkSchedule/src/main/java/com/iformall/controller/HomeController.java
  91. +47
    -105
      mallinkSchedule/src/main/java/com/iformall/schedule/BillNotificationSchedule.java
  92. +238
    -0
      mallinkSchedule/src/main/java/com/iformall/schedule/ChartDataSchedule.java
  93. +44
    -1
      mallinkSchedule/src/main/java/com/iformall/schedule/CouponExpiringSchedule.java
  94. +113
    -35
      mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java
  95. +0
    -3
      mallinkSchedule/src/main/java/com/iformall/schedule/CouponSendSchedule.java
  96. +58
    -0
      mallinkSchedule/src/main/java/com/iformall/schedule/DeviceHbCheckSchedule.java
  97. +54
    -54
      mallinkSchedule/src/main/java/com/iformall/schedule/MsgSendingSchedule.java
  98. +89
    -13
      mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java
  99. +0
    -4
      mallinkSchedule/src/main/java/com/iformall/schedule/SharingOrderResultSchedule.java
  100. +5
    -4
      mallinkSchedule/src/main/java/com/iformall/schedule/WeChatAccessTokenSchedule.java

+ 12
- 0
mallinkAdmin/pom.xml Просмотреть файл

@@ -34,6 +34,18 @@
<version>1.3.3</version> <version>1.3.3</version>
</dependency> </dependency>


<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>

<dependency>
<groupId>com.github.axet</groupId>
<artifactId>kaptcha</artifactId>
<version>0.0.9</version>
</dependency>

</dependencies> </dependencies>


<build> <build>


+ 2
- 0
mallinkAdmin/src/main/java/com/iformall/UserApplication.java Просмотреть файл

@@ -1,6 +1,7 @@
package com.iformall; package com.iformall;


import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.rocketmq.starter.annotation.EnableRocketMQ;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -18,6 +19,7 @@ import tk.mybatis.spring.annotation.MapperScan;
@EnableSwagger2 @EnableSwagger2
@EnableEncryptableProperties @EnableEncryptableProperties
@EnableAsync @EnableAsync
@EnableRocketMQ
public class UserApplication { public class UserApplication {


@Value("${fm.exception}") @Value("${fm.exception}")


+ 33
- 0
mallinkAdmin/src/main/java/com/iformall/config/RedisConfig.java Просмотреть файл

@@ -1,6 +1,7 @@
package com.iformall.config; package com.iformall.config;


import com.iformall.domain.po.PushLimit; import com.iformall.domain.po.PushLimit;
import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxScoreRules; import com.iformall.domain.po.WxScoreRules;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -109,4 +110,36 @@ public class RedisConfig extends CachingConfigurerSupport {
return template; return template;
} }


@Bean("openRedisTemplate")
public RedisTemplate<String, String> getWeChatOpen(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<String, String>();

// value值的序列化
template.setValueSerializer(new StringRedisSerializer());

// key的序列化
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());

template.setConnectionFactory(connectionFactory);
return template;
}

@Bean("cuserTokenRedisTemplate")
public RedisTemplate<String, WxCUser> getCUserTokenRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, WxCUser> template = new RedisTemplate<String, WxCUser>();

Jackson2JsonRedisSerializer<WxCUser> j = new Jackson2JsonRedisSerializer<WxCUser>(WxCUser.class);
// value值的序列化
template.setValueSerializer(j);
template.setHashKeySerializer(j);

// key的序列化
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());

template.setConnectionFactory(connectionFactory);
return template;
}

} }

+ 26
- 12
mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java Просмотреть файл

@@ -94,16 +94,32 @@ public class ShiroConfig {
//拦截器. //拦截器.
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();


//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/logout", "anon");
//filterChainDefinitionMap.put("/ue/**", "anon"); //filterChainDefinitionMap.put("/ue/**", "anon");
//filterChainDefinitionMap.put("/config.json", "anon"); //filterChainDefinitionMap.put("/config.json", "anon");
// login
filterChainDefinitionMap.put("/doLogin/**", "anon"); filterChainDefinitionMap.put("/doLogin/**", "anon");
filterChainDefinitionMap.put("/bHidLogin/**", "anon"); filterChainDefinitionMap.put("/bHidLogin/**", "anon");
filterChainDefinitionMap.put("/sendLoginPhoneCode/**", "anon");
filterChainDefinitionMap.put("/doLoginByPhone/**", "anon");
filterChainDefinitionMap.put("/wechat/callback", "anon"); // 微信第三方登录callback
filterChainDefinitionMap.put("/wechat/weChatUserLogin", "anon"); // 微信第三方登录绑定
// callback
filterChainDefinitionMap.put("/wxPay/notify/**", "anon"); // 支付回调
filterChainDefinitionMap.put("/wxPayBill/notify/**", "anon");
filterChainDefinitionMap.put("/wxMsgCallback/**", "anon");
filterChainDefinitionMap.put("/user/sendvalidationcode", "anon");
filterChainDefinitionMap.put("/user/updatepwd", "anon");
filterChainDefinitionMap.put("/carCallback/**", "anon");
filterChainDefinitionMap.put("/wxMallApply/add", "anon");
filterChainDefinitionMap.put("/wxMallApply/sendvalidationcode", "anon");

// static files
filterChainDefinitionMap.put("/css/**", "anon"); filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/img/**", "anon"); filterChainDefinitionMap.put("/img/**", "anon");
filterChainDefinitionMap.put("/font-awesome/**", "anon"); filterChainDefinitionMap.put("/font-awesome/**", "anon");
// 验证码
filterChainDefinitionMap.put("/captcha.jpg", "anon");
//<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了; //<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
//<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问--> //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
//自定义加载权限资源关系 //自定义加载权限资源关系
@@ -116,22 +132,20 @@ public class ShiroConfig {
// filterChainDefinitionMap.put(resources.getUrl(),permission); // filterChainDefinitionMap.put(resources.getUrl(),permission);
// } // }
// } // }
// swagger-ui
filterChainDefinitionMap.put("/swagger-ui.html", "anon"); filterChainDefinitionMap.put("/swagger-ui.html", "anon");
filterChainDefinitionMap.put("/wxPay/notify/**", "anon");
filterChainDefinitionMap.put("/wxOpen/**", "anon");
filterChainDefinitionMap.put("/wxPayBill/notify/**", "anon");
filterChainDefinitionMap.put("/v2/**", "anon"); filterChainDefinitionMap.put("/v2/**", "anon");
filterChainDefinitionMap.put("/swagger-resources/**", "anon"); filterChainDefinitionMap.put("/swagger-resources/**", "anon");
filterChainDefinitionMap.put("/webjars/**", "anon"); filterChainDefinitionMap.put("/webjars/**", "anon");
filterChainDefinitionMap.put("/wxMsgCallback/**", "anon");
filterChainDefinitionMap.put("/user/sendvalidationcode", "anon");
filterChainDefinitionMap.put("/user/updatepwd", "anon");
filterChainDefinitionMap.put("/carCallback/**", "anon");
filterChainDefinitionMap.put("/wxMallApply/add", "anon");
filterChainDefinitionMap.put("/wxMallApply/sendvalidationcode", "anon");
filterChainDefinitionMap.put("/captcha.jpg", "anon");

filterChainDefinitionMap.put("/version", "anon"); filterChainDefinitionMap.put("/version", "anon");
filterChainDefinitionMap.put("/wxDeviceScreenAd/**", "anon");
// filterChainDefinitionMap.put("/role/**", "corsFilter,token"); // filterChainDefinitionMap.put("/role/**", "corsFilter,token");


//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/logout", "authc");

filterChainDefinitionMap.put("/**", "corsFilter,token,authc"); filterChainDefinitionMap.put("/**", "corsFilter,token,authc");
// filterChainDefinitionMap.put("/**", "anon"); // filterChainDefinitionMap.put("/**", "anon");




+ 33
- 0
mallinkAdmin/src/main/java/com/iformall/config/WechatMpConfig.java Просмотреть файл

@@ -0,0 +1,33 @@
package com.iformall.config;

import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class WechatMpConfig {

@Autowired
private WechatWebProperties wechatWebProperties;

@Bean
public WxMpService wxMpService() {
//创建WxMpService实例并设置appid和sectret
WxMpService wxMpService = new WxMpServiceImpl();
//这里的设置方式是跟着这个sdk的文档写的
wxMpService.setWxMpConfigStorage(wxConfigProvider());
return wxMpService;
}

@Bean
public WxMpConfigStorage wxConfigProvider(){
WxMpInMemoryConfigStorage wxConfigProvider = new WxMpInMemoryConfigStorage();
wxConfigProvider.setAppId(wechatWebProperties.getAppId());
wxConfigProvider.setSecret(wechatWebProperties.getSecret());
return wxConfigProvider;
}
}

+ 59
- 0
mallinkAdmin/src/main/java/com/iformall/config/WechatWebProperties.java Просмотреть файл

@@ -0,0 +1,59 @@
package com.iformall.config;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
* Stormeye
*/
@Component
@ConfigurationProperties(prefix = "wechat.web")
public class WechatWebProperties {
/**
* 设置微信第三方平台-微信登录的web应用appid
*/
private String appId;

/**
* 设置微信第三方平台-微信登录的web应用app secret
*/
private String secret;

/**
* 网页URL
* @return
*/
private String url;

public String getAppId() {
return appId;
}

public void setAppId(String appId) {
this.appId = appId;
}

public String getSecret() {
return secret;
}

public void setSecret(String secret) {
this.secret = secret;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

@Override
public String toString() {
return ToStringBuilder.reflectionToString(this,
ToStringStyle.MULTI_LINE_STYLE);
}
}

+ 1
- 0
mallinkAdmin/src/main/java/com/iformall/controller/BaseController.java Просмотреть файл

@@ -19,6 +19,7 @@ import javax.servlet.http.HttpServletRequest;


@RestController @RestController
public class BaseController { public class BaseController {

@InitBinder @InitBinder
public void InitBinder(WebDataBinder dataBinder) { public void InitBinder(WebDataBinder dataBinder) {
dataBinder.registerCustomEditor(Date.class, new PropertyEditorSupport() { dataBinder.registerCustomEditor(Date.class, new PropertyEditorSupport() {


+ 190
- 75
mallinkAdmin/src/main/java/com/iformall/controller/HomeController.java Просмотреть файл

@@ -1,25 +1,28 @@
package com.iformall.controller; package com.iformall.controller;


import com.github.pagehelper.PageInfo;
import com.google.code.kaptcha.Constants; import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer; import com.google.code.kaptcha.Producer;
import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.MallRolePermission;
import com.iformall.domain.po.MallUserInfo;
import com.iformall.domain.po.MallUserRole;
import com.iformall.domain.po.*;
import com.iformall.domain.vo.MallUserInfoVo;
import com.iformall.enums.EnumMallUserStatus;
import com.iformall.enums.EnumMsgModel;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.service.MallRolePermissionService;
import com.iformall.service.MallUserInfoService;
import com.iformall.service.MallUserRoleService;
import com.iformall.service.*;
import com.iformall.shiro.UserSession; import com.iformall.shiro.UserSession;
import com.iformall.shiro.UseriFormallToken; import com.iformall.shiro.UseriFormallToken;
import com.iformall.utils.ShiroUtils; import com.iformall.utils.ShiroUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.DisabledAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -31,9 +34,13 @@ import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;




@RestController @RestController
@@ -54,7 +61,10 @@ public class HomeController extends BaseController {
private MallUserRoleService mallUserRoleService; private MallUserRoleService mallUserRoleService;


@Autowired @Autowired
private MallRolePermissionService mallRolePermissionService;
private WxAppinfoService appinfoService;

@Autowired
private WxMsgValidationcodeService wxMsgValidationcodeService;


@GetMapping("/captcha.jpg") @GetMapping("/captcha.jpg")
public void captcha(HttpServletResponse response)throws ServletException, IOException { public void captcha(HttpServletResponse response)throws ServletException, IOException {
@@ -76,7 +86,7 @@ public class HomeController extends BaseController {


@ApiOperation("登录") @ApiOperation("登录")
@PostMapping("/doLogin") @PostMapping("/doLogin")
public ResultData login(@RequestBody MallUserInfo user) {
public ResultData login(@RequestBody MallUserInfo user, HttpServletResponse response) {
logger.debug("[" + getIpAddr() + "] HomeController::login"); logger.debug("[" + getIpAddr() + "] HomeController::login");
try { try {
String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY); String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
@@ -92,97 +102,101 @@ public class HomeController extends BaseController {
ResultData data = new ResultData(); ResultData data = new ResultData();
if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())) { if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())) {
// throw new SystemException(ErrorCode.LOGIN_USER_OR_PWD_ERROR); // throw new SystemException(ErrorCode.LOGIN_USER_OR_PWD_ERROR);
return new ResultData(ResultData.ERROR, "用户名或者密码错误");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
}
// check user
MallUserInfo userCheck = mallUserInfoService.getByUsername(user.getUsername());
if(userCheck == null) {
logger.error(ErrorCode.USER_IS_EMPTY.getMessage());
return new ResultData(ErrorCode.USER_IS_EMPTY);
} }
if(userCheck.getStatus().equals(EnumMallUserStatus.NOT_VALID.getCode())) {
logger.error(ErrorCode.USER_IS_LOCKED.getMessage());
return new ResultData(ErrorCode.USER_IS_LOCKED);
}
boolean isLogin = false;
try { try {
Subject subject = SecurityUtils.getSubject(); Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword()); UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());
subject.login(token); subject.login(token);
// List<MallRole> roleList = sysRoleService.findRoleByUserId(user.getId());
// if (null != roleList && roleList.size() > 0) {
// List<MallPermission> permissionList = sysPermissionService
// .findPermissionByRoleIds(roleList.stream().map(MallRole::getId).collect(Collectors.toList()));
// user.setRole(roleList);
// user.setPermission(permissionList);
// }
isLogin = true;
} catch (UnknownAccountException e) {
logger.error(e.getMessage());
return new ResultData(ErrorCode.USER_IS_EMPTY);
} catch (DisabledAccountException e) {
logger.error(e.getMessage());
return new ResultData(ErrorCode.USER_IS_LOCKED);
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(ErrorCode.USER_PASSWD_ERR);
}
if(isLogin) {
MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo); MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo);
info.setPassword("保密"); info.setPassword("保密");
// System.out.println("id:"+ SecurityUtils.getSubject().getSession().getId());
String menus = getPermissionsByRole(info);
if(StringUtils.isNotBlank(info.getBopenId()))
info.setBopenId("保密");
if(StringUtils.isNotBlank(info.getWebOpenId())) {
info.setWebOpenId("保密");
}

String menus = mallUserRoleService.getPermissionsByUser(info);
if(menus != null) { if(menus != null) {
info.setMenus(menus); info.setMenus(menus);
} }
data.data = info;
} catch (Exception e) {
return new ResultData(ResultData.ERROR, "用户名或者密码错误");
}
return data;
}


private String getPermissionsByRole(MallUserInfo info) {
MallUserRole ur = new MallUserRole();
ur.setUid(info.getId());
PageInfo<MallUserRole> page = mallUserRoleService.listAsPage(ur, 1, 1);
if (page.getSize() > 0) {
Long roleId = page.getList().get(0).getRoleId();
MallRolePermission p = new MallRolePermission();
p.setRoleId(roleId);
p.setTenantId(info.getTenantId());
PageInfo<MallRolePermission> listAsPage = mallRolePermissionService.listAsPage(p, 1, 100);
String menus = "";
for (MallRolePermission rp : listAsPage.getList()) {
menus += rp.getPermissionId() + ",";
}
if (menus.length() > 0) {
menus = menus.substring(0, menus.length() - 1);
try {
String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
} }
return menus;

data.data = info;
} }
return null;
return data;
} }


private boolean isInMobileAdmin(MallUserInfo user) { private boolean isInMobileAdmin(MallUserInfo user) {
// 检查用户是否有 移动端数据塔台 权限 // 检查用户是否有 移动端数据塔台 权限
boolean isInMobile = false; boolean isInMobile = false;
MallUserRole ur = new MallUserRole();
ur.setUid(user.getId());
PageInfo<MallUserRole> page = mallUserRoleService.listAsPage(ur, 1, 1);
if (page.getSize() > 0) {
Long roleId = page.getList().get(0).getRoleId();
MallRolePermission p = new MallRolePermission();
p.setRoleId(roleId);
p.setTenantId(user.getTenantId());
PageInfo<MallRolePermission> listAsPage = mallRolePermissionService.listAsPage(p, 1, 100);
for (MallRolePermission rp : listAsPage.getList()) {
if (rp.getPermissionId().equals(8L)) { /// 移动端数据塔台
isInMobile = true;
}
}
}
isInMobile = mallUserRoleService.checkIsMobileAdmin(user);
return isInMobile; return isInMobile;
} }


@ApiOperation("B端登录") @ApiOperation("B端登录")
@PostMapping("/bHidLogin") @PostMapping("/bHidLogin")
public ResultData bLogin(@RequestBody MallUserInfo user) {
public ResultData bLogin(@RequestBody MallUserInfo user, HttpServletResponse response) {
logger.debug("[" + getIpAddr() + "] HomeController::bHidLogin"); logger.debug("[" + getIpAddr() + "] HomeController::bHidLogin");
ResultData data = new ResultData(); ResultData data = new ResultData();
// tenantId is appId
if(StringUtils.isBlank(user.getTenantId())) {
logger.error("appid信息未提供");
return new ResultData(ErrorCode.MALL_INFO_NOT_FOUND);
}
WxAppinfo appinfo = appinfoService.getByAppId(user.getTenantId());
if(appinfo == null) {
logger.error("appid未找到");
return new ResultData(ErrorCode.MALL_INFO_NOT_FOUND);
}
if(StringUtils.isNotBlank(user.getPhone())) { if(StringUtils.isNotBlank(user.getPhone())) {
// 领导登录 // 领导登录
user = mallUserInfoService.getByPhone(user.getPhone());
user = mallUserInfoService.getByPhone(user.getPhone(), appinfo.getTenantId());
if(user == null || !isInMobileAdmin(user)) { if(user == null || !isInMobileAdmin(user)) {
return new ResultData(ErrorCode.USER_NOT_ADMIN);
return new ResultData(ErrorCode.USER_NO_PERMISSION);
} }
} else if(StringUtils.isNotBlank(user.getOpenId())) {
} else if(StringUtils.isNotBlank(user.getBopenId())) {
// 领导登录 // 领导登录
user = mallUserInfoService.getByOpenId(user.getOpenId());
user = mallUserInfoService.getByBOpenId(user.getBopenId(), appinfo.getTenantId());
if(user == null || !isInMobileAdmin(user)) { if(user == null || !isInMobileAdmin(user)) {
return new ResultData(ErrorCode.USER_NOT_ADMIN);
return new ResultData(ErrorCode.USER_NO_PERMISSION);
} }
} else { } else {
if (StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword())) { if (StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword())) {
// throw new SystemException(ErrorCode.LOGIN_USER_OR_PWD_ERROR); // throw new SystemException(ErrorCode.LOGIN_USER_OR_PWD_ERROR);
return new ResultData(ResultData.ERROR, "用户名或者密码错误");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
} }
} }


@@ -190,27 +204,128 @@ public class HomeController extends BaseController {
Subject subject = SecurityUtils.getSubject(); Subject subject = SecurityUtils.getSubject();
UseriFormallToken token = new UseriFormallToken(user.getUsername()); UseriFormallToken token = new UseriFormallToken(user.getUsername());
subject.login(token); subject.login(token);
// List<MallRole> roleList = sysRoleService.findRoleByUserId(user.getId());
// if (null != roleList && roleList.size() > 0) {
// List<MallPermission> permissionList = sysPermissionService
// .findPermissionByRoleIds(roleList.stream().map(MallRole::getId).collect(Collectors.toList()));
// user.setRole(roleList);
// user.setPermission(permissionList);
// }
MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo); MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo);
info.setPassword("保密"); info.setPassword("保密");
// System.out.println("id:"+ SecurityUtils.getSubject().getSession().getId());
String menus = getPermissionsByRole(info);
if(StringUtils.isNotBlank(info.getBopenId()))
info.setBopenId("保密");
if(StringUtils.isNotBlank(info.getWebOpenId())) {
info.setWebOpenId("保密");
}
String menus = mallUserRoleService.getPermissionsByUser(info);
if(menus != null) { if(menus != null) {
info.setMenus(menus); info.setMenus(menus);
} }
String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);

data.data = info; data.data = info;
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) { } catch (Exception e) {
return new ResultData(ResultData.ERROR, "用户名或者密码错误");
logger.error(e.getMessage());
return new ResultData(ErrorCode.USER_PASSWD_ERR);
} }
return data; return data;
} }


@GetMapping("sendLoginPhoneCode")
@ApiImplicitParams({
@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true)})
public ResultData sendLoginPhoneCode(String phone) {
logger.debug("[" + getIpAddr() + "] HomeController::sendlogincode");
// 1. 检查手机号是否在用户列表里, 是否只有一个
// 2. 发送手机验证码, 直接发
List<MallUserInfoVo> users = mallUserInfoService.getUserByPhone(phone);
if(users.size() <= 0) {
logger.error(ErrorCode.USER_IS_EMPTY.getMessage());
return new ResultData(ErrorCode.USER_IS_EMPTY);
}
if(users.size() > 1) {
logger.error(ErrorCode.USER_IS_MULTI.getMessage());
return new ResultData(ErrorCode.USER_IS_MULTI);
}
MallUserInfoVo user = users.get(0);
if (user==null) {
logger.error("用户不存在, userName: " + user.getUsername());
return new ResultData(ErrorCode.USER_IS_EMPTY);
}
if(user.getStatus() == EnumMallUserStatus.NOT_VALID.getCode()){
logger.error("用户已停用, userName: " + user.getUsername());
return new ResultData(ErrorCode.USER_IS_LOCKED);
}
WxMsgValidationcode wxMsgValidationcode = new WxMsgValidationcode();
wxMsgValidationcode.setPhone(phone);
wxMsgValidationcode.setTenantId(user.getTenantId());
wxMsgValidationcode.setType(EnumMsgModel.VALIDATION_CODE.getCode());
return wxMsgValidationcodeService.sendvalidationcode(wxMsgValidationcode);
}

@ApiOperation(value = "手机验证码登录", notes = "{\"phone\",\"string\",\"code\",\"string\"}")
@PostMapping("/doLoginByPhone")
public ResultData doLoginByPhone(@RequestBody Map<String, String> params, HttpServletResponse response) {
logger.debug("[" + getIpAddr() + "] HomeController::doLoginByPhone");
// String phone,String code,String pwd
String phone = params.get("phone");
String code = params.get("code");

if (StringUtils.isBlank(phone)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "userName不能为空");
}
if (StringUtils.isBlank(code)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "验证码不能为空");
}

// 获取用户信息列表
List<MallUserInfoVo> userList = mallUserInfoService.getUserByPhone(phone);
if(userList.size() == 1) {
MallUserInfoVo user = userList.get(0);
// check 验证码正确
boolean isValidCode = false;
try {
isValidCode = mallUserInfoService.checkCodeValid(user, code);
} catch (Exception e) {
return new ResultData(Result.ERROR, e.getMessage());
}
if(isValidCode) {
// 验证码正确,直接登录
try {
Subject subject = SecurityUtils.getSubject();
UseriFormallToken token = new UseriFormallToken(user.getUsername());
subject.login(token);
MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo);
info.setPassword("保密");
if(StringUtils.isNotBlank(info.getBopenId()))
info.setBopenId("保密");
if(StringUtils.isNotBlank(info.getWebOpenId())) {
info.setWebOpenId("保密");
}
String menus = mallUserRoleService.getPermissionsByUser(info);
if(menus != null) {
info.setMenus(menus);
}

String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);

return new ResultData(info);
} catch (MallinkException e) {
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return new ResultData(ErrorCode.USER_PASSWD_ERR);
}
} else {
return new ResultData(ErrorCode.MSG_VERIFY_CODE_NOT_FOUND);
}
} else {
return new ResultData(ErrorCode.USER_IS_EMPTY);
}
}

@ApiOperation("登出") @ApiOperation("登出")
@GetMapping("/logout") @GetMapping("/logout")
public ResultData logout() { public ResultData logout() {


+ 39
- 21
mallinkAdmin/src/main/java/com/iformall/controller/MallUserInfoController.java Просмотреть файл

@@ -5,9 +5,11 @@ import com.iformall.common.ErrorCode;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.*; import com.iformall.domain.po.*;
import com.iformall.domain.vo.MallUserInfoVo;
import com.iformall.enums.EnumMallUserStatus; import com.iformall.enums.EnumMallUserStatus;
import com.iformall.enums.EnumUserAdmin; import com.iformall.enums.EnumUserAdmin;
import com.iformall.enums.EnumFlowPermissionType; import com.iformall.enums.EnumFlowPermissionType;
import com.iformall.enums.EnumUserWechat;
import com.iformall.service.*; import com.iformall.service.*;
import com.iformall.shiro.PasswordHelper; import com.iformall.shiro.PasswordHelper;
import com.iformall.shiro.UserSession; import com.iformall.shiro.UserSession;
@@ -24,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;


import javax.print.DocFlavor;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -81,7 +84,12 @@ public class MallUserInfoController extends BaseController {
u.setRoleId(role.getId()); u.setRoleId(role.getId());
} }
} }
u.setPassword(null);//不返回密码
// 保密
u.setPassword(null);
u.setBopenId(null);
if(StringUtils.isNotBlank(u.getWebOpenId())) {
u.setWebOpenId("保密");
}
} }
return new ResultData(page); return new ResultData(page);
} }
@@ -91,6 +99,12 @@ public class MallUserInfoController extends BaseController {
public ResultData detail(Long id) { public ResultData detail(Long id) {
logger.debug("[" + getIpAddr() + "] MallUserInfoController::detail"); logger.debug("[" + getIpAddr() + "] MallUserInfoController::detail");
final MallUserInfo user = userInfoService.getById(id); final MallUserInfo user = userInfoService.getById(id);
user.setPassword(null);
user.setBopenId(null);
if(StringUtils.isNotBlank(user.getWebOpenId())) {
user.setWebOpenId("保密");
}

return new ResultData(user); return new ResultData(user);
} }


@@ -103,10 +117,10 @@ public class MallUserInfoController extends BaseController {
return new ResultData(ErrorCode.USER_NOT_ADMIN.getCode(), "只有超级管理员才能添加用户"); return new ResultData(ErrorCode.USER_NOT_ADMIN.getCode(), "只有超级管理员才能添加用户");
} }


if(checkUniqueName(userInfo.getUsername(), currentUser.getTenantId()) > 0){
if(checkUniqueName(userInfo.getUsername()) > 0){
return new ResultData(ErrorCode.USER_NAME_IS_FOUND.getCode(),"用户名已存在"); return new ResultData(ErrorCode.USER_NAME_IS_FOUND.getCode(),"用户名已存在");
} }
if(checkUniquePhone(userInfo.getPhone(), currentUser.getTenantId()) > 0){
if(checkUniquePhone(userInfo.getPhone()) > 0){
return new ResultData(ErrorCode.USER_PHONE_IS_FOUND.getCode(),"手机号已存在"); return new ResultData(ErrorCode.USER_PHONE_IS_FOUND.getCode(),"手机号已存在");
} }
Assert.notNull(userInfo.getPassword(), "密码不能为空"); Assert.notNull(userInfo.getPassword(), "密码不能为空");
@@ -137,12 +151,12 @@ public class MallUserInfoController extends BaseController {
} }
MallUserInfo oldUser = userInfoService.getById(userInfo.getId()); MallUserInfo oldUser = userInfoService.getById(userInfo.getId());
if (!oldUser.getUsername().equals(userInfo.getUsername())) { if (!oldUser.getUsername().equals(userInfo.getUsername())) {
if(checkUniqueName(userInfo.getUsername(), currentUser.getTenantId()) > 0){
if(checkUniqueName(userInfo.getUsername()) > 0){
return new ResultData(ErrorCode.USER_NAME_IS_FOUND.getCode(),"用户名已存在"); return new ResultData(ErrorCode.USER_NAME_IS_FOUND.getCode(),"用户名已存在");
} }
} }
if (!oldUser.getPhone().equals(userInfo.getPhone())) { if (!oldUser.getPhone().equals(userInfo.getPhone())) {
if(checkUniquePhone(userInfo.getPhone(), currentUser.getTenantId()) > 0){
if(checkUniquePhone(userInfo.getPhone()) > 0){
return new ResultData(ErrorCode.USER_PHONE_IS_FOUND.getCode(),"手机号已存在"); return new ResultData(ErrorCode.USER_PHONE_IS_FOUND.getCode(),"手机号已存在");
} }
} }
@@ -211,36 +225,39 @@ public class MallUserInfoController extends BaseController {
/** /**
* 启用,停用用户 * 启用,停用用户
* *
* @param userId
* @param status
* @return * @return
*/ */
@ApiOperation(value = "起停用户接口", response = String.class)
@GetMapping("status")
public ResultData modifyStatus(Long userId, Integer status) {
@ApiOperation(value = "起停用户接口")
@PostMapping("updateStatus")
public ResultData modifyStatus(@RequestBody MallUserInfo userInfo) {
logger.debug("[" + getIpAddr() + "] MallUserInfoController::modifyStatus"); logger.debug("[" + getIpAddr() + "] MallUserInfoController::modifyStatus");
MallUserInfo currentUser = getUser(); MallUserInfo currentUser = getUser();
if (currentUser.getIsAdmin().equals(EnumUserAdmin.Normal.getCode())) {
return new ResultData(ErrorCode.USER_NOT_ADMIN.getCode(), "只有超级管理员才能删除用户");
if (currentUser.getIsAdmin().equals(EnumUserAdmin.ADMIN.getCode())) {
MallUserInfo userInfo1 = userInfoService.getById(userInfo.getId());
if(userInfo1 == null) {
logger.error(ErrorCode.USER_IS_EMPTY.getMessage());
return new ResultData(ErrorCode.USER_IS_EMPTY);
}
MallUserInfo updateUserInfo = new MallUserInfo();
updateUserInfo.setId(userInfo.getId());
updateUserInfo.setTenantId(getTenantId());
updateUserInfo.setStatus(userInfo.getStatus());
userInfoService.saveOrUpdate(userInfo);
return new ResultData();
} else {
return new ResultData(ErrorCode.USER_NO_PERMISSION);
} }
MallUserInfo userInfo = userInfoService.getById(userId);
userInfo.setStatus(status);
userInfo.setTenantId(getTenantId());
userInfoService.saveOrUpdate(userInfo);
return new ResultData(userInfo);
} }


private int checkUniqueName(String userName, String tenantId) {
private int checkUniqueName(String userName) {
MallUserInfo userQ = new MallUserInfo(); MallUserInfo userQ = new MallUserInfo();
userQ.setUsername(userName); userQ.setUsername(userName);
userQ.setTenantId(tenantId);
return userInfoService.cntUserList(userQ); return userInfoService.cntUserList(userQ);
} }


private int checkUniquePhone(String phone, String tenantId) {
private int checkUniquePhone(String phone) {
MallUserInfo userQ = new MallUserInfo(); MallUserInfo userQ = new MallUserInfo();
userQ.setPhone(phone); userQ.setPhone(phone);
userQ.setTenantId(tenantId);
return userInfoService.cntUserList(userQ); return userInfoService.cntUserList(userQ);
} }


@@ -392,4 +409,5 @@ public class MallUserInfoController extends BaseController {
resultMap.put("billUserList",billUserList); resultMap.put("billUserList",billUserList);
return new ResultData(resultMap); return new ResultData(resultMap);
} }

} }

+ 338
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WechatLoginController.java Просмотреть файл

@@ -0,0 +1,338 @@
package com.iformall.controller;

import com.alibaba.fastjson.JSON;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.MallUserInfo;
import com.iformall.domain.vo.MallUserInfoVo;
import com.iformall.enums.EnumUserAdmin;
import com.iformall.exception.MallinkException;
import com.iformall.service.MallUserInfoService;
import com.iformall.service.MallUserRoleService;
import com.iformall.shiro.UserSession;
import com.iformall.shiro.UseriFormallToken;
import com.iformall.utils.TOTP;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.DisabledAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.subject.Subject;
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.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;


@Controller
@RequestMapping("/wechat")
@Slf4j
public class WechatLoginController extends BaseController {
private String WECHAT_PREV = "OPEN-";

@Autowired
private WxMpService wxMpService;

@Autowired
private MallUserInfoService mallUserInfoService;

@Autowired
private MallUserRoleService mallUserRoleService;

@Autowired
@Qualifier("openRedisTemplate")
RedisTemplate<String, String> openRedisTemplate;

@Data
private class DisplayUserInfo {
String mallName;
String userName;
String userRole;
}

@ApiOperation(value = "微信网页登录回调", notes = "请配置此callback到网页redirect_uri")
@GetMapping("callback")
@ResponseBody
public void getAccessToken(String code, String state, HttpServletRequest request, HttpServletResponse response) {
log.debug("[" + getIpAddr() + "] WechatLoginController::getAccessToken");
String host = request.getHeader("host");
log.debug("host: " + host);
log.debug("code: " + code);
try {
WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);
log.debug("accessToken: " + accessToken.getAccessToken() + ", openId: " + accessToken.getOpenId() + ", unionId: " + accessToken.getUnionId());

// 获取 用户信息
WxMpUser mpUser = wxMpService.oauth2getUserInfo(accessToken, null);
if(mpUser != null) {
log.debug(mpUser.toString());
}

// check user openid 是否是已授权用户
List<MallUserInfoVo> userList = mallUserInfoService.getUsersByWebOpenId(accessToken.getOpenId());
log.info("login user list count " + userList.size());
if(userList.size() > 0) {
if(userList.size() == 1) {
Map<String, Object> ret = new HashMap<>();
// 唯一用户
MallUserInfo user = userList.get(0);
boolean isLogin = false;
try {
Subject subject = SecurityUtils.getSubject();
UseriFormallToken token = new UseriFormallToken(user.getUsername());
subject.login(token);
isLogin = true;
} catch (UnknownAccountException e) {
log.error(e.getMessage());
ret.put("code", ErrorCode.USER_IS_EMPTY.getCode());
ret.put("message", e.getMessage());
} catch (DisabledAccountException e) {
log.error(e.getMessage());
ret.put("code", ErrorCode.USER_IS_LOCKED.getCode());
ret.put("message", e.getMessage());
} catch (Exception e) {
log.error(e.getMessage());
ret.put("code", Result.ERROR);
ret.put("message", e.getMessage());
}
if(isLogin) {
MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo);
info.setPassword("保密");
info.setBopenId("保密");
if(StringUtils.isNotBlank(info.getWebOpenId())) {
info.setWebOpenId("保密");
}
String menus = mallUserRoleService.getPermissionsByUser(info);
if(menus != null) {
info.setMenus(menus);
}
try {
String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);
} catch (Exception e) {
log.error(e.getMessage());
ret.put("code", Result.ERROR);
ret.put("message", e.getMessage());
}
Object codeObj = ret.get("code");
if(codeObj == null) {
try {
response.sendRedirect("https://" + host + "/#/layout");
} catch (Exception e) {
log.error(e.getMessage());
}
} else {
try {
String errCode = URLEncoder.encode(JSON.toJSONString(ret), "utf-8");
response.sendRedirect("https://" + host + "/#/login?errcode=" + errCode);
} catch (Exception e) {
log.error(e.getMessage());
}
}
} else {
try {
String errCode = URLEncoder.encode(JSON.toJSONString(ret), "utf-8");
response.sendRedirect("https://" + host + "/#/login?errcode="+errCode);
} catch (Exception e) {
log.error(e.getMessage());
}
}
} else {
// 跳转登录选择页面
String key = TOTP.generateWechatOpen(accessToken.getOpenId());
if (openRedisTemplate.opsForValue().setIfAbsent(WECHAT_PREV + key, accessToken.getOpenId())){
openRedisTemplate.expire(key, 30, TimeUnit.SECONDS);
}
List<DisplayUserInfo> users = new ArrayList<DisplayUserInfo>();
for(MallUserInfoVo user: userList) {
DisplayUserInfo disUser = new DisplayUserInfo();
disUser.setMallName(user.getMallName());
disUser.setUserName(user.getUsername());
disUser.setUserRole(user.getRoleName());
users.add(disUser);
}
String usersStr = JSON.toJSONString(users);
log.info(usersStr);
try {
usersStr = URLEncoder.encode(usersStr, "utf-8");
response.sendRedirect("https://" + host + "/#/loginselect?key=" + key + "&list=" + usersStr);
} catch (Exception e) {
log.error(e.getMessage());
}
}
} else {
// 跳转登录页面
Map<String, Object> ret = new HashMap<>();
ret.put("code", ErrorCode.WECHAT_LOGIN_NOT_BIND.getCode());
ret.put("message", ErrorCode.WECHAT_LOGIN_NOT_BIND.getMessage());
try {
String errCode = URLEncoder.encode(JSON.toJSONString(ret), "utf-8");
response.sendRedirect("https://" + host + "/#/login?errcode="+errCode);
} catch (Exception e) {
log.error(e.getMessage());
}
}
//return r;
} catch (WxErrorException e) {
log.error(e.getMessage());
}
}

@ApiOperation(value = "微信用户登录")
@GetMapping("weChatUserLogin")
@ApiImplicitParams({
@ApiImplicitParam(name = "key", value = "key", dataType = "String", paramType = "query", required = true),
@ApiImplicitParam(name = "userName", value = "userName", dataType = "String", paramType = "query", required = true)})
public ResultData weChatUserLogin(String key, String userName, HttpServletRequest request, HttpServletResponse response) {
log.debug("[" + getIpAddr() + "] MallUserInfoController::weChatUserLogin");
String host = request.getHeader("host");
log.debug("Host: " + host);
if(StringUtils.isBlank(userName)) {
log.error("请选择要登录的用户");
return new ResultData(ErrorCode.WECHAT_LOGIN_USER_SELECT);
}

String openKey = WECHAT_PREV + key;
// 限时时间内查找到此用户openId
if (openRedisTemplate.hasKey(WECHAT_PREV + key)){
String openId = openRedisTemplate.opsForValue().get(openKey);
// 删除缓存
openRedisTemplate.delete(openKey);

MallUserInfo userInfo = mallUserInfoService.getByUsername(userName);
if(userInfo.getWebOpenId().equals(openId)) {
boolean isLogin = false;
try {
Subject subject = SecurityUtils.getSubject();
UseriFormallToken token = new UseriFormallToken(userInfo.getUsername());
subject.login(token);
MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo);
info.setPassword("保密");
info.setBopenId("保密");
if(StringUtils.isNotBlank(info.getWebOpenId())) {
info.setWebOpenId("保密");
}
String menus = mallUserRoleService.getPermissionsByUser(info);
if(menus != null) {
info.setMenus(menus);
}
// 登录cookie
String cookieName = URLEncoder.encode(info.getUsername(), "utf-8");
Cookie unameCookie = new Cookie("uname", cookieName);
unameCookie.setMaxAge(3600);
response.addCookie(unameCookie);

return new ResultData();
} catch (UnknownAccountException e) {
log.error(e.getMessage());
return new ResultData(ErrorCode.USER_IS_EMPTY.getCode(), e.getMessage());
} catch (DisabledAccountException e) {
log.error(e.getMessage());
return new ResultData(ErrorCode.USER_IS_LOCKED.getCode(), e.getMessage());
} catch (Exception e) {
log.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
} else {
// 登录失败
log.error("微信登录失败,未找到对应的openId");
return new ResultData(ErrorCode.WECHAT_LOGIN_KEY_OVERTIME);
}
}
return new ResultData(ErrorCode.WECHAT_LOGIN_KEY_OVERTIME);
}

@ApiOperation(value = "微信第三方登录绑定", notes = "请配置此callback到网页redirect_uri")
@GetMapping("bindWebOpenId")
public void userBindWebOpenId(String code, String state, HttpServletRequest request, HttpServletResponse response) {
log.debug("[" + getIpAddr() + "] WechatLoginController::bindWebOpenId");
String host = request.getHeader("host");
String errCode = null;
try {
WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);
log.debug("accessToken: " + accessToken.getAccessToken() + ", openId: " + accessToken.getOpenId() + ", unionId: " + accessToken.getUnionId());

// 获取 用户信息
WxMpUser mpUser = wxMpService.oauth2getUserInfo(accessToken, null);
if(mpUser != null) {
log.debug(mpUser.toString());
}

String uname = state;
MallUserInfo user = mallUserInfoService.getByUsername(uname);
if(user != null) {
user.setWebOpenId(accessToken.getOpenId());
mallUserInfoService.updateWebOpenId(user);
log.debug("https://" + host + "/#/layout");
response.sendRedirect("https://" + host + "/#/layout");
} else {
log.debug("https://" + host + "/#/layout?errcode=绑定失败");
errCode = URLEncoder.encode("绑定失败", "utf-8");
response.sendRedirect("https://" + host + "/#/layout?errcode="+errCode);
}
} catch (WxErrorException e) {
log.error(e.getMessage());
errCode = e.getMessage();
} catch (IOException e) {
log.error(e.getMessage());
errCode = e.getMessage();
}

if(StringUtils.isNotBlank(errCode)) {
try {
errCode = URLEncoder.encode(errCode, "utf-8");
response.sendRedirect("https://" + host + "/#/layout?errcode="+errCode);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}

@ApiOperation(value = "微信第三方登录解绑", notes = "请配置此callback到网页redirect_uri")
@GetMapping("cleanWebOpenId")
public ResultData cleanWebOpenId(@ModelAttribute MallUserInfo userInfo) {
log.debug("[" + getIpAddr() + "] WechatLoginController::cleanWebOpenId");
MallUserInfo user = getUser();
if(userInfo == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
}
if(StringUtils.isBlank(userInfo.getTenantId())) {
userInfo.setTenantId(user.getTenantId());
}
if(userInfo.getId() == null && userInfo.getUsername() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
}
// 只有本人及超级管理员可以解绑微信
if(userInfo.getId().equals(user.getId())
|| user.getIsAdmin().equals(EnumUserAdmin.ADMIN.getCode())) {
mallUserInfoService.cleanWebOpenId(userInfo);
return new ResultData();
} else {
return new ResultData(ErrorCode.USER_NO_PERMISSION);
}

}
}

+ 4
- 4
mallinkAdmin/src/main/java/com/iformall/controller/WxAppinfoController.java Просмотреть файл

@@ -75,12 +75,12 @@ public class WxAppinfoController extends BaseController {
} }




@ApiOperation("更新AccessToken, 无限制二维码生成需要更新token")
@ApiOperation("C端更新AccessToken, 无限制二维码生成需要更新token")
@GetMapping("/accessTokenUpdate") @GetMapping("/accessTokenUpdate")
public ResultData tokenUpdate() {
logger.debug("[" + getIpAddr() + "] WxAppinfoController::tokenUpdate");
public ResultData ctokenUpdate() {
logger.debug("[" + getIpAddr() + "] WxAppinfoController::ctokenUpdate");
try { try {
wxAppinfoService.tokenUpdate(getTenantId());
wxAppinfoService.ctokenUpdate(getTenantId());
} catch (Exception e) { } catch (Exception e) {
logger.error(e.getMessage()); logger.error(e.getMessage());
} }


+ 8
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxBillAllController.java Просмотреть файл

@@ -49,5 +49,13 @@ public class WxBillAllController extends BaseController
wxBillAllService.exportBill(request,response,wxBillAll); wxBillAllService.exportBill(request,response,wxBillAll);
} }


@GetMapping("getBillInfo")
public ResultData getBillInfo(@ModelAttribute WxBillAll wxBillAll) {
wxBillAll.setTenantId(getTenantId());
Object billInfo = wxBillAllService.getBillInfo(wxBillAll);
return new ResultData(billInfo);
}




} }

+ 14
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxBillDepositController.java Просмотреть файл

@@ -76,5 +76,19 @@ public class WxBillDepositController extends BaseController {
return wxBillDepositService.updatePaid(id); return wxBillDepositService.updatePaid(id);
} }


@PostMapping("returnDeposit")
public ResultData returnDeposit(@RequestBody WxBillDeposit wxBillDeposit) {
logger.debug("[" + getIpAddr() + "] WxBillDepositController::returnDeposit");
return wxBillDepositService.returnDeposit(wxBillDeposit);

}

@PostMapping("adjustDeposit")
public ResultData adjustDeposit(@RequestBody WxBillDeposit wxBillDeposit) {
logger.debug("[" + getIpAddr() + "] WxBillDepositController::adjustDeposit");
return wxBillDepositService.adjustDeposit(wxBillDeposit);

}



} }

+ 13
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxBillOtherDepositController.java Просмотреть файл

@@ -76,5 +76,18 @@ public class WxBillOtherDepositController extends BaseController {
return wxBillOtherDepositService.updatePaid(id); return wxBillOtherDepositService.updatePaid(id);
} }


@PostMapping("returnDeposit")
public ResultData returnDeposit(@RequestBody WxBillOtherDeposit wxBillDeposit) {
logger.debug("[" + getIpAddr() + "] WxBillOtherDepositController::returnDeposit");
return wxBillOtherDepositService.returnDeposit(wxBillDeposit);

}

@PostMapping("adjustDeposit")
public ResultData adjustDeposit(@RequestBody WxBillOtherDeposit wxBillDeposit) {
logger.debug("[" + getIpAddr() + "] WxBillOtherDepositController::adjustDeposit");
return wxBillOtherDepositService.adjustDeposit(wxBillDeposit);

}


} }

+ 17
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxBillPropertyController.java Просмотреть файл

@@ -35,6 +35,7 @@ public class WxBillPropertyController extends BaseController {
wxBillProperty = new WxBillProperty(); wxBillProperty = new WxBillProperty();
} }
wxBillProperty.setTenantId(getTenantId()); wxBillProperty.setTenantId(getTenantId());
wxBillProperty.setSortColumns(WxBillProperty.Field.Id_DESC);
PageInfo<Map<String, Object>> result = wxBillPropertyService.listAsPage(wxBillProperty, pageNum, pageSize); PageInfo<Map<String, Object>> result = wxBillPropertyService.listAsPage(wxBillProperty, pageNum, pageSize);
return new ResultData(result); return new ResultData(result);
} }
@@ -76,5 +77,21 @@ public class WxBillPropertyController extends BaseController {
return wxBillPropertyService.updatePaid(id); return wxBillPropertyService.updatePaid(id);
} }


@GetMapping("/detail")
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
public ResultData detail(Long id) {
logger.debug("[" + getIpAddr() + "] WxBillPropertyController::detail");
return new ResultData(Result.SUCCESS, "查询成功", wxBillPropertyService.detail(id));
}


@GetMapping("/findByPropertyContractId")
@ApiImplicitParams({
@ApiImplicitParam(name = "propertyContractId", value = "merchantId", dataType = "Long", paramType = "query", required = true),
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData findByPropertyContractId(Long propertyContractId, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxBillPropertyController::findByPropertyContractId");
final PageInfo<Map<String, Object>> page = wxBillPropertyService.findByPropertyContractId(propertyContractId, getTenantId(), pageNum, pageSize);
return new ResultData(page);
}
} }

+ 19
- 3
mallinkAdmin/src/main/java/com/iformall/controller/WxBillPropertyDepositController.java Просмотреть файл

@@ -3,6 +3,7 @@ package com.iformall.controller;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxBillOtherDeposit;
import com.iformall.domain.po.WxBillPropertyDeposit; import com.iformall.domain.po.WxBillPropertyDeposit;
import com.iformall.service.WxBillPropertyDepositService; import com.iformall.service.WxBillPropertyDepositService;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
@@ -51,8 +52,7 @@ public class WxBillPropertyDepositController extends BaseController
@PostMapping("update") @PostMapping("update")
public ResultData update(@RequestBody WxBillPropertyDeposit wxBillPropertyDeposit) { public ResultData update(@RequestBody WxBillPropertyDeposit wxBillPropertyDeposit) {
logger.debug("[" + getIpAddr() + "] WxBillPropertyDepositController::update"); logger.debug("[" + getIpAddr() + "] WxBillPropertyDepositController::update");
wxBillPropertyDepositService.saveOrUpdate(wxBillPropertyDeposit);
return new ResultData();
return wxBillPropertyDepositService.saveOrUpdate(wxBillPropertyDeposit);
} }


@GetMapping("/del") @GetMapping("/del")
@@ -76,6 +76,22 @@ public class WxBillPropertyDepositController extends BaseController
logger.debug("[" + getIpAddr() + "] WxBillPropertyDepositController::updatePaid"); logger.debug("[" + getIpAddr() + "] WxBillPropertyDepositController::updatePaid");
return wxBillPropertyDepositService.updatePaid(id); return wxBillPropertyDepositService.updatePaid(id);
} }

@PostMapping("returnDeposit")
public ResultData returnDeposit(@RequestBody WxBillPropertyDeposit wxBillPropertyDeposit) {
logger.debug("[" + getIpAddr() + "] WxBillPropertyDepositController::returnDeposit");
return wxBillPropertyDepositService.returnDeposit(wxBillPropertyDeposit);

}


@PostMapping("adjustDeposit")
public ResultData adjustDeposit(@RequestBody WxBillPropertyDeposit wxBillPropertyDeposit) {
logger.debug("[" + getIpAddr() + "] WxBillPropertyDepositController::adjustDeposit");
return wxBillPropertyDepositService.adjustDeposit(wxBillPropertyDeposit);

}


} }

+ 23
- 5
mallinkAdmin/src/main/java/com/iformall/controller/WxBillRentController.java Просмотреть файл

@@ -68,11 +68,15 @@ public class WxBillRentController extends BaseController {
return new ResultData(Result.SUCCESS, "查询成功", wxBillRentService.getById(id)); return new ResultData(Result.SUCCESS, "查询成功", wxBillRentService.getById(id));
} }


@GetMapping("/findByMerchantId")
@ApiImplicitParam(name = "merchantId", value = "merchantId", dataType = "Long", paramType = "query", required = true)
public ResultData findByMerchantId(Long merchantId) {
logger.debug("[" + getIpAddr() + "] WxBillRentController::findByMerchantId");
return new ResultData(Result.SUCCESS, "查询成功", wxBillRentService.findByMerchantId(merchantId));
@GetMapping("/findByRentContractId")
@ApiImplicitParams({
@ApiImplicitParam(name = "rentContractId", value = "merchantId", dataType = "Long", paramType = "query", required = true),
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData findByRentContractId(Long rentContractId, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxBillRentController::findByRentContractId");
final PageInfo<Map<String, Object>> page = wxBillRentService.findByRentContractId(rentContractId, getTenantId(), pageNum, pageSize);
return new ResultData(page);
} }


@GetMapping("/updatePaid") @GetMapping("/updatePaid")
@@ -82,4 +86,18 @@ public class WxBillRentController extends BaseController {
return wxBillRentService.updatePaid(id); return wxBillRentService.updatePaid(id);
} }


@GetMapping("/detail")
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
public ResultData detail(Long id) {
logger.debug("[" + getIpAddr() + "] WxBillRentController::detail");
return new ResultData(Result.SUCCESS, "查询成功", wxBillRentService.detail(id));
}


@PostMapping("updateRevenue")
public ResultData updateRevenue(@RequestBody WxBillRent wxBillRent) {
logger.debug("[" + getIpAddr() + "] WxBillRentController::updateRevenue");
return wxBillRentService.updateRevenue(wxBillRent);
}

} }

+ 1
- 1
mallinkAdmin/src/main/java/com/iformall/controller/WxCUserBasicInfoController.java Просмотреть файл

@@ -218,7 +218,7 @@ public class WxCUserBasicInfoController extends BaseController {
public ResultData findOrderCouponByUserId(Long userId, Integer pageNum, Integer pageSize) { public ResultData findOrderCouponByUserId(Long userId, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxCUserBasicInfoController::findOrderCouponByUserId"); logger.debug("[" + getIpAddr() + "] WxCUserBasicInfoController::findOrderCouponByUserId");
WxCouponOrder corder = new WxCouponOrder(); WxCouponOrder corder = new WxCouponOrder();
corder.setCUserId(userId);
corder.setcUserId(userId);
corder.setTenantId(getTenantId()); corder.setTenantId(getTenantId());
corder.setSortColumns(CreateDate_DESC); corder.setSortColumns(CreateDate_DESC);
PageInfo<WxCouponOrder> page = wxCouponOrderService.listAsPage(corder, pageNum, pageSize); PageInfo<WxCouponOrder> page = wxCouponOrderService.listAsPage(corder, pageNum, pageSize);


+ 1
- 1
mallinkAdmin/src/main/java/com/iformall/controller/WxCardPayController.java Просмотреть файл

@@ -51,7 +51,7 @@ public class WxCardPayController extends BaseController {
@Autowired @Autowired
WxCardSpendService wxCardSpendService; WxCardSpendService wxCardSpendService;


@ApiOperation("售卡记录列表接口")
@ApiOperation("售卡记录列表分页接口")
@GetMapping("list") @GetMapping("list")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),


+ 42
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxChartDataController.java Просмотреть файл

@@ -0,0 +1,42 @@
package com.iformall.controller;

import com.iformall.common.ResultData;
import com.iformall.service.WxChartDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@Api(description = "图表")
@RestController
@RequestMapping("chart")
public class WxChartDataController extends BaseController {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private WxChartDataService wxChartDataService;

@ApiOperation("queryData")
@GetMapping("/queryData")
@ApiImplicitParams({
@ApiImplicitParam(name = "chart", value = "chart", dataType = "String", paramType = "query", required = true),
@ApiImplicitParam(name = "startdate", value = "startdate", dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "enddate", value = "enddate", dataType = "String", paramType = "query")
})
public ResultData queryData(@RequestParam Map<String, String> params) {
logger.debug("[" + getIpAddr() + "] WxChartDataController::queryData");
params.put("tenantId",super.getTenantId());
return wxChartDataService.queryData(params);
}

}

+ 3
- 25
mallinkAdmin/src/main/java/com/iformall/controller/WxCouponChannelController.java Просмотреть файл

@@ -39,6 +39,7 @@ public class WxCouponChannelController extends BaseController {
@Autowired @Autowired
private WxCouponService wxCouponService; private WxCouponService wxCouponService;



@ApiOperation("分页列表接口") @ApiOperation("分页列表接口")
@GetMapping("list") @GetMapping("list")
@ApiImplicitParams({ @ApiImplicitParams({
@@ -62,31 +63,8 @@ public class WxCouponChannelController extends BaseController {
public ResultData update(@RequestBody WxCouponChannel wxCouponChannel) { public ResultData update(@RequestBody WxCouponChannel wxCouponChannel) {
logger.debug("[" + getIpAddr() + "] WxCouponChannelController::update"); logger.debug("[" + getIpAddr() + "] WxCouponChannelController::update");
wxCouponChannel.setTenantId(getUser().getTenantId()); wxCouponChannel.setTenantId(getUser().getTenantId());
if (wxCouponChannel.getCouponId() != null && wxCouponChannel.getStatus() != null) {
WxCouponChannel orignal = wxCouponChannelService.getById(wxCouponChannel.getId());
if (orignal.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())
&& wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_THROW_IN.getCode())) {

WxCoupon wxCoupon = wxCouponService.getById(orignal.getCouponId());
if (wxCoupon == null)
return new ResultData(ErrorCode.COUPON_IS_EMPTY);
if (wxCoupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF))
return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF);

//查找是否该券 在该频道有其他上架
WxCouponChannel query = new WxCouponChannel();
query.setTenantId(orignal.getTenantId());
query.setCouponId(orignal.getCouponId());
query.setStatus(EnumCouponChannelStatus.STATUS_THROW_IN.getCode());//已上架
query.setTargetAd(orignal.getTargetAd());
List<WxCouponChannel> list = wxCouponChannelService.listAsPage(query, 1, 1).getList();
if (list != null && list.size() > 0) {
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_EXISTED);
}
}
}
wxCouponChannelService.saveOrUpdate(wxCouponChannel);
return new ResultData();

return wxCouponChannelService.saveOrUpdate(wxCouponChannel);
} }


@ApiOperation("根据id删除接口") @ApiOperation("根据id删除接口")


+ 88
- 73
mallinkAdmin/src/main/java/com/iformall/controller/WxCouponController.java Просмотреть файл

@@ -1,34 +1,22 @@
package com.iformall.controller; package com.iformall.controller;


import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxCouponChannel;
import com.iformall.domain.po.WxMerchant;
import com.iformall.enums.EnumCouponStatus;
import com.iformall.enums.EnumCouponType;
import com.iformall.enums.EnumCouponValidType;
import com.iformall.enums.EnumMerchantStatus;
import com.iformall.service.WxCouponChannelService;
import com.iformall.enums.*;
import com.iformall.service.WxCouponService; import com.iformall.service.WxCouponService;
import com.iformall.service.WxMerchantService;
import com.iformall.utils.DateUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.collections.map.HashedMap;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.text.SimpleDateFormat;
import java.util.*;


@RestController @RestController
@RequestMapping("wxCoupon") @RequestMapping("wxCoupon")
@@ -39,58 +27,6 @@ public class WxCouponController extends BaseController {
@Autowired @Autowired
private WxCouponService wxCouponService; private WxCouponService wxCouponService;


@Autowired
private WxCouponChannelService wxCouponChannelService;

private ResultData listType(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize, Integer type) {
if (null == wxCoupon) wxCoupon = new WxCoupon();
wxCoupon.setTenantId(getTenantId());
wxCoupon.setSortColumns(WxCoupon.Field.Id_DESC);
PageInfo<WxCoupon> page = null;
if (wxCoupon.getStatus() != null && wxCoupon.getStatus() == -1)
wxCoupon.setStatus(null);
page = wxCouponService.listAsPage(wxCoupon, pageNum, pageSize, type);

List<WxCoupon> wxCouponList = page.getList();

if (wxCouponList.isEmpty()) {
return new ResultData(page);
}

List<Long> ids = wxCouponList.stream().map(p -> p.getId()).collect(Collectors.toList());
WxCouponChannel wxCouponChannel = new WxCouponChannel();
wxCouponChannel.setTenantId(getTenantId());
wxCouponChannel.setCouponIds(ids);
wxCouponChannel.setStatus(0);
//上架状态
List<WxCouponChannel> list = wxCouponChannelService.listAsPage(wxCouponChannel, 1, 10000).getList();
if (!list.isEmpty()) {
Map<Long, List<WxCouponChannel>> groupBy = list.stream().collect(Collectors.groupingBy(WxCouponChannel::getCouponId));
for (WxCoupon temp : wxCouponList) {

if (groupBy.get(temp.getId()) != null) {
List<Integer> channels = new ArrayList<>();
for (WxCouponChannel tempchannel : groupBy.get(temp.getId())) {
if (!channels.contains(tempchannel.getTargetAd())) {
channels.add(tempchannel.getTargetAd());
}
}
String sss = JSON.toJSONString(channels);
temp.setChannels(sss);
} else {
temp.setChannels("");
}

}
} else {
for (WxCoupon temp : wxCouponList) {
temp.setChannels("");
}

}
return new ResultData(page);
}



@ApiOperation("分页列表接口") @ApiOperation("分页列表接口")
@GetMapping("listCoupon") @GetMapping("listCoupon")
@@ -99,7 +35,9 @@ public class WxCouponController extends BaseController {
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData listCoupon(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) { public ResultData listCoupon(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxCouponController::listCoupon"); logger.debug("[" + getIpAddr() + "] WxCouponController::listCoupon");
return listType(wxCoupon, pageNum, pageSize, 0); //券列表
if (wxCoupon == null) wxCoupon = new WxCoupon();
wxCoupon.setTenantId(getTenantId());
return wxCouponService.listType(wxCoupon, pageNum, pageSize, 0); //券列表
} }


@ApiOperation("卡分页列表接口") @ApiOperation("卡分页列表接口")
@@ -109,7 +47,9 @@ public class WxCouponController extends BaseController {
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData listCard(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) { public ResultData listCard(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxCouponController::listCard"); logger.debug("[" + getIpAddr() + "] WxCouponController::listCard");
return listType(wxCoupon, pageNum, pageSize, EnumCouponType.CARD_MULTIMCH.getCode()); //卡列表
if (wxCoupon == null) wxCoupon = new WxCoupon();
wxCoupon.setTenantId(getTenantId());
return wxCouponService.listType(wxCoupon, pageNum, pageSize, EnumCouponType.CARD_MULTIMCH.getCode()); //卡列表
} }


@ApiOperation("砍价分页列表接口") @ApiOperation("砍价分页列表接口")
@@ -119,7 +59,9 @@ public class WxCouponController extends BaseController {
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData listPress(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) { public ResultData listPress(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxCouponController::listPress"); logger.debug("[" + getIpAddr() + "] WxCouponController::listPress");
return listType(wxCoupon, pageNum, pageSize, EnumCouponType.COUPON_PRESS.getCode()); //砍价列表
if (wxCoupon == null) wxCoupon = new WxCoupon();
wxCoupon.setTenantId(getTenantId());
return wxCouponService.listType(wxCoupon, pageNum, pageSize, EnumCouponType.COUPON_PRESS.getCode()); //砍价列表
} }


@ApiOperation("分页列表接口") @ApiOperation("分页列表接口")
@@ -129,7 +71,9 @@ public class WxCouponController extends BaseController {
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData list(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) { public ResultData list(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxCouponController::list"); logger.debug("[" + getIpAddr() + "] WxCouponController::list");
return listType(wxCoupon, pageNum, pageSize, null); //全列表
if (wxCoupon == null) wxCoupon = new WxCoupon();
wxCoupon.setTenantId(getTenantId());
return wxCouponService.listType(wxCoupon, pageNum, pageSize, null); //全列表
} }


@ApiOperation("新增接口") @ApiOperation("新增接口")
@@ -166,4 +110,75 @@ public class WxCouponController extends BaseController {
logger.debug("[" + getIpAddr() + "] WxCouponController::findById");; logger.debug("[" + getIpAddr() + "] WxCouponController::findById");;
return new ResultData(wxCouponService.getVoById(id)); return new ResultData(wxCouponService.getVoById(id));
} }

@ApiOperation("卡类列表接口")
@GetMapping("findList")
public ResultData findList(@ModelAttribute WxCoupon wxCoupon) {
return new ResultData(wxCouponService.list(wxCoupon));
}

@ApiOperation("卡营销列表接口")
@GetMapping("findCardCountList")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData findCardCountList(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) {
//默认时间本月第一天,截止到当天
Map<String,Object> result = new HashedMap();
if(wxCoupon.getStartdate() == null){
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, 0);
c.set(Calendar.DAY_OF_MONTH,1);
wxCoupon.setStartdate(c.getTime());
}
if(wxCoupon.getEnddate() == null){
wxCoupon.setEnddate(DateUtils.stringToDate(DateUtils.getSystemTime("yyyy-MM-dd") + " 23:59:59"));
}
result.put("list",wxCouponService.findCountData(wxCoupon,pageNum,pageSize));
return new ResultData(result);
}

@ApiOperation("卷营销列表接口")
@GetMapping("findCouponCountList")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData findCouponCountList(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) {
//默认时间本月第一天,截止到当天
Map<String,Object> result = new HashedMap();
if(wxCoupon.getStartdate() == null){
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, 0);
c.set(Calendar.DAY_OF_MONTH,1);
wxCoupon.setStartdate(c.getTime());
}
if(wxCoupon.getEnddate() == null){
wxCoupon.setEnddate(DateUtils.stringToDate(DateUtils.getSystemTime("yyyy-MM-dd") + " 23:59:59"));
}
return new ResultData(wxCouponService.findCouponData(wxCoupon,pageNum,pageSize));
}

@ApiOperation("砍价营销列表接口")
@GetMapping("findPressCountList")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData findPressCountList(@ModelAttribute WxCoupon wxCoupon, Integer pageNum, Integer pageSize) {
//默认时间本月第一天,截止到当天
Map<String,Object> result = new HashedMap();
if(wxCoupon.getStartdate() == null){
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, 0);
c.set(Calendar.DAY_OF_MONTH,1);
wxCoupon.setStartdate(c.getTime());
}
if(wxCoupon.getEnddate() == null){
wxCoupon.setEnddate(DateUtils.stringToDate(DateUtils.getSystemTime("yyyy-MM-dd") + " 23:59:59"));
}
return new ResultData(wxCouponService.findPressData(wxCoupon,pageNum,pageSize));
}




} }

+ 1
- 7
mallinkAdmin/src/main/java/com/iformall/controller/WxCouponSendController.java Просмотреть файл

@@ -62,13 +62,7 @@ public class WxCouponSendController extends BaseController {
if (null == wxCouponSend) { if (null == wxCouponSend) {
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
} }
wxCouponSend.setTenantId(getTenantId());
wxCouponSend.setStatus(EnumCouponSendStatus.VALID.getCode());
List<WxCouponSendVo> wxCouponSendList = wxCouponSendService.listAsPage(wxCouponSend, 1, 1).getList();
if (wxCouponSendList != null && wxCouponSendList.size() > 0) {
return new ResultData(ErrorCode.COUPON_SEND_IS_EXISTED);
}

WxCoupon wxCoupon = wxCouponService.getById(wxCouponSend.getCouponId()); WxCoupon wxCoupon = wxCouponService.getById(wxCouponSend.getCouponId());
if (!wxCoupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_THROW_IN.getCode()) ){ if (!wxCoupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_THROW_IN.getCode()) ){
return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF);


+ 97
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxDeviceController.java Просмотреть файл

@@ -0,0 +1,97 @@
package com.iformall.controller;

import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;

import com.iformall.domain.po.WxDevice;
import com.iformall.enums.EnumDeviceOnlineStatus;
import com.iformall.enums.EnumDeviceStatus;
import com.iformall.service.WxDeviceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
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.*;

import java.util.List;

@RestController
@RequestMapping("wxDevice")
@Api(description="IOT设备")
public class WxDeviceController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private WxDeviceService wxDeviceService;


@ApiOperation("设备列表")
@GetMapping("list")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public Result list(@ModelAttribute WxDevice wxDevice, Integer pageNum, Integer pageSize) {
wxDevice.setTenantId(getTenantId());
wxDevice.setStatus(EnumDeviceStatus.VALID.getCode());
return new ResultData(wxDeviceService.listAsPage(wxDevice, pageNum,pageSize));
}

@ApiOperation("添加设备")
@PostMapping("add")
public Result add(@RequestBody WxDevice wxDevice) {

WxDevice record = new WxDevice();
record.setDeviceId(wxDevice.getDeviceId());
record.setStatus(EnumDeviceStatus.VALID.getCode());
List<WxDevice> list = wxDeviceService.findList(record);
if (list.size() > 0)
return new ResultData(ErrorCode.DEVICE_ALREADY_EXIST);
wxDevice.setStatus(EnumDeviceStatus.VALID.getCode());
wxDevice.setOnlineStatus(EnumDeviceOnlineStatus.OFFLINE.getCode());
wxDevice.setTenantId(getTenantId());
wxDeviceService.saveOrUpdate(wxDevice);
return new ResultData();
}

@ApiOperation("更新设备")
@PostMapping("update")
public Result update(@RequestBody WxDevice wxDevice) {
if (wxDevice == null)
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
if (wxDevice.getId() == null)
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
wxDevice.setTenantId(getTenantId());
wxDeviceService.saveOrUpdate(wxDevice);
return new ResultData();
}

@ApiOperation("设备详情")
@GetMapping("detail")
public Result detail(@RequestParam Long id) {
if (id == null)
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
WxDevice wxDevice = wxDeviceService.getById(id);
if (wxDevice == null)
return new ResultData(ErrorCode.SCREENAD_NOT_FOUND);

return new ResultData(wxDevice);
}

@ApiOperation("删除设备")
@PostMapping("delete")
public Result delete(@RequestParam Long id) {
if (id == null)
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
WxDevice wxDevice = new WxDevice();
wxDevice.setId(id);
wxDevice.setTenantId(getTenantId());
wxDevice.setStatus(EnumDeviceStatus.INVALID.getCode());
wxDeviceService.saveOrUpdate(wxDevice);
return new ResultData();
}

}

+ 110
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxDeviceScreenAdController.java Просмотреть файл

@@ -0,0 +1,110 @@
package com.iformall.controller;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxDevice;
import com.iformall.domain.po.WxMall;
import com.iformall.domain.po.WxScreenAd;
import com.iformall.enums.EnumScreenAdStatus;
import com.iformall.enums.EnumScreenAdType;
import com.iformall.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
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.*;

import java.util.Date;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("wxDeviceScreenAd")
@Api(description="广告屏")
public class WxDeviceScreenAdController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private WxScreenAdService wxScreenAdService;

@Autowired
private WxMallService wxMallService;

@Autowired
private WxDeviceService wxDeviceService;

@Autowired
private WxCampaignService wxCampaignService;

@Autowired
private WxCouponChannelService wxCouponChannelService;


private WxDevice findDevice(String deviceId)
{
WxDevice wxDevice = new WxDevice();
wxDevice.setDeviceId(deviceId);
wxDevice.setStatus(EnumScreenAdStatus.VALID.getCode());
List<WxDevice> list = wxDeviceService.findList(wxDevice);
if (list.size() <= 0)
return null;
else
return list.get(0);
}


@ApiOperation("广告列表")
@GetMapping("list")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public Result list(@RequestParam String deviceId, Integer pageNum, Integer pageSize) {

WxDevice wxDevice = findDevice(deviceId);
if (wxDevice == null)
return new ResultData(ErrorCode.DEVICE_NOT_FOUND);
WxScreenAd wxScreenAd = new WxScreenAd();
wxScreenAd.setTenantId(wxDevice.getTenantId());
wxScreenAd.setStatus(EnumScreenAdStatus.VALID.getCode());
PageInfo<WxScreenAd> page = wxScreenAdService.listAsPage(wxScreenAd,pageNum,pageSize);
page.getList().stream().forEach(s->{
Object target = null;
if (s.getType().equals(EnumScreenAdType.COUPON.getCode()))
target = wxCouponChannelService.findDetailVo(s.getTargetId());
else if (s.getType().equals(EnumScreenAdType.CAMPAIGN.getCode()))
target = wxCampaignService.getById(s.getTargetId());
s.setTarget(target);
});
return new ResultData(page);
}

@ApiOperation("心跳")
@PostMapping("heartbeat")
public Result heartbeat(@RequestParam String deviceId,@RequestBody Map<String,String> paramMap) {
WxDevice wxDevice = findDevice(deviceId);
if (wxDevice == null)
return new ResultData(ErrorCode.DEVICE_NOT_FOUND);
if (wxDevice.getFirstHbTime() == null)
wxDevice.setFirstHbTime(new Date());
wxDevice.setLastHbTime(new Date());
wxDevice.setVersion(paramMap.get("version"));
wxDeviceService.saveOrUpdate(wxDevice);
return new ResultData(wxDevice);
}

@ApiOperation("基础信息")
@GetMapping("info")
public Result info(@RequestParam String deviceId) {
WxDevice wxDevice = findDevice(deviceId);
if (wxDevice == null)
return new ResultData(ErrorCode.DEVICE_NOT_FOUND);
return new ResultData(wxMallService.getByTenantId(wxDevice.getTenantId()));
}

}

+ 42
- 3
mallinkAdmin/src/main/java/com/iformall/controller/WxFlowAbleController.java Просмотреть файл

@@ -1,11 +1,15 @@
package com.iformall.controller; package com.iformall.controller;


import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUserTags;
import com.iformall.domain.po.WxFlowRecord;
import com.iformall.enums.EnumFlowRecordStatus;
import com.iformall.service.WxFlowService; import com.iformall.service.WxFlowService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.flowable.engine.RuntimeService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -21,6 +25,8 @@ public class WxFlowAbleController extends BaseController {


@Autowired @Autowired
private WxFlowService wxFlowService; private WxFlowService wxFlowService;
@Autowired
RuntimeService runtimeService;


@ApiOperation(value = "启动流程",notes = "{\"businessId\":\"221178539888607232\",\"businessType\":1,\"remark\":\"意见意见。\",\"taskAssignee\":[{\"taskKey\":\"firstTaskUser\",\"assignee\":\"243650055783841792\"},{\"taskKey\":\"secondTaskUser\",\"assignee\":\"\"}],\"variables\":[{\"key\":\"contractType\",\"value\":\"1\"},{\"key\":\"contractNumber\",\"value\":\"1111\"}]}") @ApiOperation(value = "启动流程",notes = "{\"businessId\":\"221178539888607232\",\"businessType\":1,\"remark\":\"意见意见。\",\"taskAssignee\":[{\"taskKey\":\"firstTaskUser\",\"assignee\":\"243650055783841792\"},{\"taskKey\":\"secondTaskUser\",\"assignee\":\"\"}],\"variables\":[{\"key\":\"contractType\",\"value\":\"1\"},{\"key\":\"contractNumber\",\"value\":\"1111\"}]}")
@PostMapping("/start") @PostMapping("/start")
@@ -29,6 +35,12 @@ public class WxFlowAbleController extends BaseController {
return wxFlowService.start(params,super.getUser().getId(),super.getUser().getName(),super.getTenantId()); return wxFlowService.start(params,super.getUser().getId(),super.getUser().getName(),super.getTenantId());
} }


@GetMapping(value = "/del")
public ResultData list(String id) {
runtimeService.deleteProcessInstance(id, "驳回");
return new ResultData();
}

/** /**
* 用户代办列表 * 用户代办列表
*/ */
@@ -37,13 +49,30 @@ public class WxFlowAbleController extends BaseController {
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true), @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "flowType", value = "流程类型,1合同流程 2账单流程", dataType = "int", paramType = "query", required = true)
@ApiImplicitParam(name = "flowType", value = "流程类型,1合同流程 2账单流程", dataType = "string", paramType = "query", required = true)
}) })
public ResultData list(Integer flowType,Integer pageNum, Integer pageSize) {
public ResultData list(String flowType,Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] FlowAbleController::list"); logger.debug("[" + getIpAddr() + "] FlowAbleController::list");
return wxFlowService.list(flowType,pageNum,pageSize,super.getUser().getId()); return wxFlowService.list(flowType,pageNum,pageSize,super.getUser().getId());
} }


/**
* 我的申请列表
*/
@ApiOperation("我的申请列表")
@GetMapping(value = "/myApplyList")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true),
})
public ResultData myApplyList(@ModelAttribute WxFlowRecord record, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] FlowAbleController::myApplyList");
record.setUserId(super.getUser().getId());
record.setStatus(EnumFlowRecordStatus.NEW.getCode());
return new ResultData(wxFlowService.listAsPage(record,pageNum,pageSize));
}


/** /**
* 审批历史 * 审批历史
*/ */
@@ -84,10 +113,20 @@ public class WxFlowAbleController extends BaseController {
*/ */
@ApiOperation(value = "驳回",notes = "{\"taskId\":\"\",\"processInstanceId\":\"\",\"remark\":\"\"}") @ApiOperation(value = "驳回",notes = "{\"taskId\":\"\",\"processInstanceId\":\"\",\"remark\":\"\"}")
@PostMapping(value = "reject") @PostMapping(value = "reject")
public ResultData reject(@RequestBody Map<String, String> params) {
public ResultData reject(@RequestBody Map<String, Object> params) {
return wxFlowService.reject(params,super.getUser().getId(),super.getUser().getName(),super.getTenantId()); return wxFlowService.reject(params,super.getUser().getId(),super.getUser().getName(),super.getTenantId());
} }



/**
* 撤回
*/
@ApiOperation(value = "撤回",notes = "{\"taskId\":\"\",\"processInstanceId\":\"\",\"remark\":\"\"}")
@PostMapping(value = "setBack")
public ResultData setBack(@RequestBody Map<String, Object> params) {
return wxFlowService.setBack(params,super.getUser().getId(),super.getUser().getName());
}

/** /**
* 生成流程图 * 生成流程图
* *


+ 40
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxOrderGroupController.java Просмотреть файл

@@ -0,0 +1,40 @@
package com.iformall.controller;

import com.github.pagehelper.PageInfo;
import com.iformall.common.ResultData;
import com.iformall.domain.vo.WxOrderGroupMarketing;
import com.iformall.service.WxOrderGroupService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
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.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/orderGroup")
@Api(description = "拼团接口")
public class WxOrderGroupController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
WxOrderGroupService wxOrderGroupService;

@ApiOperation(value = "拼团营销分析")
@GetMapping("queryOrderGroupMarketingList")
@ApiImplicitParams({
@ApiImplicitParam(name = "couponId", value = "couponId", dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true),
})
public ResultData queryOrderGroupMarketingList(@ModelAttribute WxOrderGroupMarketing wxOrderGroupMarketing, Integer pageNum, Integer pageSize) {
final PageInfo<WxOrderGroupMarketing> page = wxOrderGroupService.queryOrderGroupMarketingList(wxOrderGroupMarketing, pageNum, pageSize);
return new ResultData(page);
}

}

+ 12
- 2
mallinkAdmin/src/main/java/com/iformall/controller/WxPropertyContractController.java Просмотреть файл

@@ -2,10 +2,16 @@ package com.iformall.controller;


import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxBillProperty;
import com.iformall.domain.po.WxFlowRecord;
import com.iformall.domain.po.WxPropertyContract; import com.iformall.domain.po.WxPropertyContract;
import com.iformall.domain.po.WxRentContract;
import com.iformall.enums.EnumFlowRecordStatus;
import com.iformall.service.WxBillPropertyService;
import com.iformall.service.WxPropertyContractService; import com.iformall.service.WxPropertyContractService;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -20,10 +26,11 @@ import java.util.Map;
*/ */
@RestController @RestController
@RequestMapping("wxPropertyContract") @RequestMapping("wxPropertyContract")
public class WxPropertyContractController extends BaseController
{
public class WxPropertyContractController extends BaseController {
@Autowired @Autowired
private WxPropertyContractService wxPropertyContractService; private WxPropertyContractService wxPropertyContractService;
@Autowired
private WxBillPropertyService wxBillPropertyService;


private Logger logger = LoggerFactory.getLogger(WxPropertyContractController.class); private Logger logger = LoggerFactory.getLogger(WxPropertyContractController.class);


@@ -67,6 +74,9 @@ public class WxPropertyContractController extends BaseController
@ApiImplicitParam(name="id",value="id",dataType="Long", paramType = "query",required=true) @ApiImplicitParam(name="id",value="id",dataType="Long", paramType = "query",required=true)
public ResultData findById(Long id) { public ResultData findById(Long id) {
logger.debug("[" + getIpAddr() + "] WxPropertyContractController::findById"); logger.debug("[" + getIpAddr() + "] WxPropertyContractController::findById");
WxBillProperty wxBillProperty = new WxBillProperty();
wxBillProperty.setTenantId(super.getTenantId());
wxBillPropertyService.updateBillStatus(wxBillProperty);
return wxPropertyContractService.getById(id); return wxPropertyContractService.getById(id);
} }




+ 8
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxRentContractController.java Просмотреть файл

@@ -2,7 +2,9 @@ package com.iformall.controller;


import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxBillRent;
import com.iformall.domain.po.WxRentContract; import com.iformall.domain.po.WxRentContract;
import com.iformall.service.WxBillRentService;
import com.iformall.service.WxRentContractService; import com.iformall.service.WxRentContractService;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
@@ -25,6 +27,8 @@ public class WxRentContractController extends BaseController {


@Autowired @Autowired
private WxRentContractService wxRentContractService; private WxRentContractService wxRentContractService;
@Autowired
private WxBillRentService wxBillRentService;


@GetMapping("list") @GetMapping("list")
@ApiImplicitParams({ @ApiImplicitParams({
@@ -79,6 +83,10 @@ public class WxRentContractController extends BaseController {
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
public ResultData findById(Long id) { public ResultData findById(Long id) {
logger.debug("[" + getIpAddr() + "] WxRentContractController::findById"); logger.debug("[" + getIpAddr() + "] WxRentContractController::findById");
// 同步欠缴状态
WxBillRent wxBillRent = new WxBillRent();
wxBillRent.setTenantId(super.getTenantId());
wxBillRentService.updateBillStatus(wxBillRent);
return wxRentContractService.getById(id); return wxRentContractService.getById(id);
} }




+ 109
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxScreenAdController.java Просмотреть файл

@@ -0,0 +1,109 @@
package com.iformall.controller;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCampaign;
import com.iformall.domain.po.WxScreenAd;
import com.iformall.enums.EnumScoreType;
import com.iformall.enums.EnumScreenAdStatus;
import com.iformall.enums.EnumScreenAdType;
import com.iformall.service.WxCampaignService;
import com.iformall.service.WxCouponChannelService;
import com.iformall.service.WxScreenAdService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
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.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("wxScreenAd")
@Api(description="广告屏")
public class WxScreenAdController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private WxScreenAdService wxScreenAdService;

@Autowired
private WxCampaignService wxCampaignService;

@Autowired
private WxCouponChannelService wxCouponChannelService;


@ApiOperation("广告列表")
@GetMapping("list")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public Result list(@ModelAttribute WxScreenAd wxScreenAd, Integer pageNum, Integer pageSize) {
if (wxScreenAd == null) wxScreenAd = new WxScreenAd();
wxScreenAd.setTenantId(getTenantId());
wxScreenAd.setStatus(EnumScreenAdStatus.VALID.getCode());
return new ResultData(wxScreenAdService.listAsPage(wxScreenAd,pageNum,pageSize));
}

@ApiOperation("添加广告")
@PostMapping("add")
public Result add(@RequestBody WxScreenAd wxScreenAd) {
if (wxScreenAd == null) wxScreenAd = new WxScreenAd();
wxScreenAd.setStatus(EnumScreenAdStatus.VALID.getCode());
wxScreenAd.setTenantId(getTenantId());
return wxScreenAdService.saveOrUpdate(wxScreenAd);
}

@ApiOperation("更新广告")
@PostMapping("update")
public Result update(@RequestBody WxScreenAd wxScreenAd) {
if (wxScreenAd == null)
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
if (wxScreenAd.getId() == null)
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
wxScreenAd.setTenantId(getTenantId());
wxScreenAdService.saveOrUpdate(wxScreenAd);
return new ResultData();
}

@ApiOperation("广告详情")
@GetMapping("detail")
public Result detail(@RequestParam Long id) {
if (id == null)
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
WxScreenAd wxScreenAd = wxScreenAdService.getById(id);
if (wxScreenAd == null)
return new ResultData(ErrorCode.SCREENAD_NOT_FOUND);

Object target = null;
if (wxScreenAd.getType().equals(EnumScreenAdType.COUPON.getCode()))
target = wxCouponChannelService.findDetailVo(wxScreenAd.getTargetId());
if (wxScreenAd.getType().equals(EnumScreenAdType.COUPON.getCode()))
target = wxCampaignService.getById(wxScreenAd.getTargetId());

wxScreenAd.setTarget(target);
return new ResultData(wxScreenAd);
}

@ApiOperation("删除广告")
@PostMapping("delete")
public Result delete(@RequestParam Long id) {
if (id == null)
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
WxScreenAd wxScreenAd = new WxScreenAd();
wxScreenAd.setId(id);
wxScreenAd.setTenantId(getTenantId());
wxScreenAd.setStatus(EnumScreenAdStatus.INVALID.getCode());
wxScreenAdService.saveOrUpdate(wxScreenAd);
return new ResultData();
}

}

+ 19
- 0
mallinkAdmin/src/main/java/com/iformall/controller/WxShopController.java Просмотреть файл

@@ -3,16 +3,20 @@ package com.iformall.controller;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUserBasicInfo;
import com.iformall.domain.po.WxShop; import com.iformall.domain.po.WxShop;
import com.iformall.service.WxShopService; import com.iformall.service.WxShopService;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map; import java.util.Map;


/** /**
@@ -119,4 +123,19 @@ public class WxShopController extends BaseController {
return new ResultData(page); return new ResultData(page);
} }


@ApiOperation("导出店铺")
@GetMapping("/exportShop")
public void exportShop(@ModelAttribute WxShop wxShop, HttpServletRequest request, HttpServletResponse response) {
logger.debug("[" + getIpAddr() + "] WxShopController::exportShop");
if (null == wxShop){
wxShop = new WxShop();
}
wxShop.setTenantId(getTenantId());
wxShop.setSortColumns(WxShop.Field.Id_DESC);
wxShopService.exportShop(wxShop, request, response);
}




} }

+ 1
- 1
mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java Просмотреть файл

@@ -77,7 +77,7 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {


sb.append(resultBody); sb.append(resultBody);


String key = "request: " + HashUtil.md5(sb.toString());
String key = "request-" + HashUtil.md5(sb.toString());
if (redisTemplate.opsForValue().setIfAbsent(key, key)) { if (redisTemplate.opsForValue().setIfAbsent(key, key)) {
redisTemplate.expire(key, 3, TimeUnit.SECONDS); redisTemplate.expire(key, 3, TimeUnit.SECONDS);
logger.info(key + ": 第一次提交"); logger.info(key + ": 第一次提交");


+ 21
- 0
mallinkAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java Просмотреть файл

@@ -1,18 +1,39 @@
package com.iformall.shiro; package com.iformall.shiro;


import com.iformall.common.ErrorCode;
import com.iformall.domain.po.MallUserInfo;
import com.iformall.enums.EnumLoginType; import com.iformall.enums.EnumLoginType;
import com.iformall.enums.EnumMallUserStatus;
import com.iformall.service.MallUserInfoService;
import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.DisabledAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;


import javax.annotation.Resource;

@Configuration @Configuration
public class MyRetryLimitCredentialsMatcher extends HashedCredentialsMatcher { public class MyRetryLimitCredentialsMatcher extends HashedCredentialsMatcher {
@Resource
private MallUserInfoService userService;

@Override @Override
public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) { public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) {
if(authcToken instanceof UseriFormallToken) { if(authcToken instanceof UseriFormallToken) {
UseriFormallToken tk = (UseriFormallToken) authcToken; UseriFormallToken tk = (UseriFormallToken) authcToken;
if(tk.getType().equals(EnumLoginType.NOPASSWD)){ if(tk.getType().equals(EnumLoginType.NOPASSWD)){
// 获取用户的输入的账号.
String username = (String)tk.getPrincipal();
MallUserInfo user = userService.getByUsername(username);
if(user == null) {
throw new UnknownAccountException(ErrorCode.USER_IS_EMPTY.getMessage());
}
// 用户被禁用
if(user.getStatus()==null ||!EnumMallUserStatus.VALID.getCode().equals(user.getStatus())) {
throw new DisabledAccountException(ErrorCode.USER_IS_LOCKED.getMessage());
}
return true; return true;
} }
boolean matches = super.doCredentialsMatch(authcToken, info); boolean matches = super.doCredentialsMatch(authcToken, info);


+ 5
- 10
mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java Просмотреть файл

@@ -2,14 +2,12 @@ package com.iformall.shiro;


import javax.annotation.Resource; import javax.annotation.Resource;


import com.iformall.common.ErrorCode;
import com.iformall.enums.EnumMallUserStatus; import com.iformall.enums.EnumMallUserStatus;
import com.iformall.exception.MallinkException;
import com.iformall.service.MallUserInfoService; import com.iformall.service.MallUserInfoService;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.realm.AuthorizingRealm;
@@ -53,14 +51,11 @@ public class MyShiroRealm extends AuthorizingRealm {
String username = (String)token.getPrincipal(); String username = (String)token.getPrincipal();
MallUserInfo user = userService.getByUsername(username); MallUserInfo user = userService.getByUsername(username);
if(user == null) { if(user == null) {
throw new UnknownAccountException("用户名不存在");
throw new UnknownAccountException(ErrorCode.USER_IS_EMPTY.getMessage());
} }
// if (0==user.getEnable()) {
// throw new LockedAccountException(); // 帐号锁定
// }
if(user.getStatus()==null || if(user.getStatus()==null ||
!EnumMallUserStatus.VALID.getCode().equals(user.getStatus())) {//用户被禁用 !EnumMallUserStatus.VALID.getCode().equals(user.getStatus())) {//用户被禁用
throw new UnknownAccountException("用户被禁用");
throw new DisabledAccountException(ErrorCode.USER_IS_LOCKED.getMessage());
} }
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
user, //用户 user, //用户


+ 28
- 4
mallinkAdmin/src/main/resources/application-dev.yml Просмотреть файл

@@ -1,7 +1,9 @@
spring: spring:
profiles:
include: rabbitMQ
# JDBC # JDBC
datasource: datasource:
url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false
url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true
username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) username: ENC(dZ8fmrtuBMQYaRytKQgTqg==)
password: ENC(WGu0+1DPIHrqorDhrbq1+7wr7xNG53mN) password: ENC(WGu0+1DPIHrqorDhrbq1+7wr7xNG53mN)
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
@@ -22,9 +24,6 @@ spring:
connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000" connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000"
#jackson: #jackson:
#date-format: yyyy-MM-dd HH:mm:ss #date-format: yyyy-MM-dd HH:mm:ss
flowable:
async-executor-activate: false

# REDIS # REDIS
redis: redis:
host: 202.165.179.86 host: 202.165.179.86
@@ -51,12 +50,37 @@ spring:
auth: true auth: true
starttls: starttls:
enable: true enable: true
# ROCKETMQ
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
rabbitmq:
host: 202.165.179.86
port: 5672
username: fumao
password: f8l89&*%%u7f1t22
publisher-confirms: true
virtual-host: /

aws: aws:
clientRegion: cn-northwest-1 clientRegion: cn-northwest-1
bucketName: iformall-net bucketName: iformall-net
access: ENC(3gx5ghDFBqGrEhO3Wf8aYmXsnwHO7Cj3HNKJGOeUj0o=) access: ENC(3gx5ghDFBqGrEhO3Wf8aYmXsnwHO7Cj3HNKJGOeUj0o=)
secret: ENC(HVKIJwCJKVXLlUpGlQPwNqJOlnpxn4xYuy91SH0seTSm2uAttIQHvA49fXWWax90v5wloIk0QuU=) secret: ENC(HVKIJwCJKVXLlUpGlQPwNqJOlnpxn4xYuy91SH0seTSm2uAttIQHvA49fXWWax90v5wloIk0QuU=)


wechat:
web:
appId: "wxe31beafbfd8295ba"
secret: "c689fabf3c4c9f5b6424ff2a36a26727"
url: "https://mall.youlane.cn"

jasypt: jasypt:
encryptor: encryptor:
password: oRqdnDbK5pj3eMmB password: oRqdnDbK5pj3eMmB


+ 17
- 3
mallinkAdmin/src/main/resources/application-prod.yml Просмотреть файл

@@ -1,7 +1,9 @@
spring: spring:
profiles:
include: rocketMQ
# JDBC # JDBC
datasource: datasource:
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallink?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallink?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true
username: ENC(NUzgQOdJnCbVLKT6BaX0aw==) username: ENC(NUzgQOdJnCbVLKT6BaX0aw==)
password: ENC(mvuoDRiu0jqYaKNRwwTuXZ6U7aoIaqsjdiPqTLgi/nY=) password: ENC(mvuoDRiu0jqYaKNRwwTuXZ6U7aoIaqsjdiPqTLgi/nY=)
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
@@ -46,8 +48,14 @@ spring:
auth: true auth: true
starttls: starttls:
enable: true enable: true
flowable:
async-executor-activate: false
# RABBITMQ
rabbitmq:
host: localhost
port: 5672
username: ENC(lRmLd6EzgeY1RT5ktcHv9g==)
password: ENC(gBI8mCjr3OC0v57jcnSb660Ux7mW03K2oePgvohhg7w=)
publisher-confirms: true
virtual-host: /


aws: aws:
clientRegion: cn-northwest-1 clientRegion: cn-northwest-1
@@ -55,6 +63,12 @@ aws:
access: ENC(a6SN1sZ1enNL49ypiOXkg/pPPAnZD8H4buQFTTKN08s=) access: ENC(a6SN1sZ1enNL49ypiOXkg/pPPAnZD8H4buQFTTKN08s=)
secret: ENC(5P5ff4bTMJUbXVR4ZsM03UHzOKZ4+Zg5Iutcdkyp/Quny/oXg+A4KpfwEyGarlLu3vQMJahGP5M=) secret: ENC(5P5ff4bTMJUbXVR4ZsM03UHzOKZ4+Zg5Iutcdkyp/Quny/oXg+A4KpfwEyGarlLu3vQMJahGP5M=)


wechat:
web:
appId: "wx9cc4ca09eb20fe03"
secret: "af1d7f7a1268022a73cb4ce0b9cf0985"
url: "https://admin.malls.iformall.com"

fm: fm:
exception: true exception: true




+ 16
- 3
mallinkAdmin/src/main/resources/application-test.yml Просмотреть файл

@@ -1,7 +1,9 @@
spring: spring:
profiles:
include: rocketMQ
# JDBC # JDBC
datasource: datasource:
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallinkTest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallinkTest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true
username: ENC(Uc0AjgkytxHHCwZrmDASWg==) username: ENC(Uc0AjgkytxHHCwZrmDASWg==)
password: ENC(nV4Mi3bEbBx0Fj7uUyYH55eTaqsFMjKvmNzagicH4pc=) password: ENC(nV4Mi3bEbBx0Fj7uUyYH55eTaqsFMjKvmNzagicH4pc=)
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
@@ -46,8 +48,14 @@ spring:
auth: true auth: true
starttls: starttls:
enable: true enable: true
flowable:
async-executor-activate: false
# RABBITMQ
rabbitmq:
host: 127.0.0.1
port: 5672
username: ENC(aSRr6mnSryEqzHHz1hJf1g==)
password: ENC(GnjF/mdqKdvmDYC0tIIso7+20/jBALPw39tiWCYJ4iw=)
publisher-confirms: true
virtual-host: /


aws: aws:
clientRegion: cn-northwest-1 clientRegion: cn-northwest-1
@@ -55,6 +63,11 @@ aws:
access: ENC(NCLcmjwKpAWdn/abD17OKIY7yKepVLWzEpqRYUlURCw=) access: ENC(NCLcmjwKpAWdn/abD17OKIY7yKepVLWzEpqRYUlURCw=)
secret: ENC(TRcZqql0Rq5PExlMeH/4WiZ/i02b8FXKmLTBChJmbluTa1uoLS9LrHyNEMrqe1DK+QgOAdvqGBo=) secret: ENC(TRcZqql0Rq5PExlMeH/4WiZ/i02b8FXKmLTBChJmbluTa1uoLS9LrHyNEMrqe1DK+QgOAdvqGBo=)


wechat:
web:
appId: "wx091907dd0bfd3f6b"
secret: "2a2ca10738998b9ef92c1fe8a4d366a6"
url: "https://admintest.malls.iformall.com"


fm: fm:
exception: true exception: true


+ 20
- 0
mallinkAdmin/src/main/resources/application.yml Просмотреть файл

@@ -21,6 +21,26 @@ spring:
cache-names: redis_cache #缓存的名字(可以不指定) cache-names: redis_cache #缓存的名字(可以不指定)
redis: redis:
time-to-live: 60000ms #很重要,缓存的有效时间,以便缓存的过期(单位为毫秒) 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: /
# FLOWABLE
flowable:
async-executor-activate: false



# @{link} https://github.com/abel533 # @{link} https://github.com/abel533
#Mybatis #Mybatis


+ 45
- 0
mallinkAdmin/src/main/resources/processes/endContractflow.bpmn20.xml Просмотреть файл

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
<process id="end_contract_flow" name="endContractflow" isExecutable="true">
<documentation>终止合同审批流程</documentation>
<startEvent id="startEvent1"></startEvent>
<userTask id="firstTaskUser" name="初审" flowable:candidateUsers="${firstTaskUser}">
<documentation>初审</documentation>
</userTask>
<endEvent id="sid-9692A856-E39A-4B8C-95C2-7C04A3646D6F"></endEvent>
<sequenceFlow id="sid-AA24EF6A-4416-4FAF-9FF5-E15E46D87BD9" sourceRef="startEvent1" targetRef="firstTaskUser"></sequenceFlow>
<sequenceFlow id="sid-C4925653-8894-42FF-81F4-412B3D11A3C9" sourceRef="firstTaskUser" targetRef="secondTaskUser"></sequenceFlow>
<sequenceFlow id="sid-9FCAF465-99E7-4EFE-BEEA-7D59481E684C" sourceRef="secondTaskUser" targetRef="sid-9692A856-E39A-4B8C-95C2-7C04A3646D6F"></sequenceFlow>
<userTask id="secondTaskUser" name="复审" flowable:candidateUsers="${secondTaskUser}">
<documentation>复审</documentation>
</userTask>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_end_contract_flow">
<bpmndi:BPMNPlane bpmnElement="end_contract_flow" id="BPMNPlane_end_contract_flow">
<bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
<omgdc:Bounds height="30.0" width="30.0" x="100.0" y="157.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="firstTaskUser" id="BPMNShape_firstTask">
<omgdc:Bounds height="80.0" width="100.0" x="285.0" y="132.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-9692A856-E39A-4B8C-95C2-7C04A3646D6F" id="BPMNShape_sid-9692A856-E39A-4B8C-95C2-7C04A3646D6F">
<omgdc:Bounds height="28.0" width="28.0" x="835.0" y="158.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="secondTaskUser" id="BPMNShape_secondTask">
<omgdc:Bounds height="80.0" width="100.0" x="554.0" y="132.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-C4925653-8894-42FF-81F4-412B3D11A3C9" id="BPMNEdge_sid-C4925653-8894-42FF-81F4-412B3D11A3C9">
<omgdi:waypoint x="384.94999999987203" y="172.0"></omgdi:waypoint>
<omgdi:waypoint x="553.9999999998877" y="172.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-9FCAF465-99E7-4EFE-BEEA-7D59481E684C" id="BPMNEdge_sid-9FCAF465-99E7-4EFE-BEEA-7D59481E684C">
<omgdi:waypoint x="653.9499999999999" y="172.0"></omgdi:waypoint>
<omgdi:waypoint x="835.0" y="172.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-AA24EF6A-4416-4FAF-9FF5-E15E46D87BD9" id="BPMNEdge_sid-AA24EF6A-4416-4FAF-9FF5-E15E46D87BD9">
<omgdi:waypoint x="129.9499996223143" y="172.0"></omgdi:waypoint>
<omgdi:waypoint x="284.9999999998994" y="172.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

+ 2
- 0
mallinkBApi/src/main/java/com/iformall/BApplication.java Просмотреть файл

@@ -1,6 +1,7 @@
package com.iformall; package com.iformall;


import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.rocketmq.starter.annotation.EnableRocketMQ;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -14,6 +15,7 @@ import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication @SpringBootApplication
@MapperScan(basePackages = {"com.iformall.mapper"}) @MapperScan(basePackages = {"com.iformall.mapper"})
@EnableEncryptableProperties @EnableEncryptableProperties
@EnableRocketMQ
public class BApplication { public class BApplication {


@Value("${fm.exception}") @Value("${fm.exception}")


+ 18
- 0
mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java Просмотреть файл

@@ -1,6 +1,7 @@
package com.iformall.config; package com.iformall.config;


import com.iformall.domain.po.PushLimit; import com.iformall.domain.po.PushLimit;
import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxScoreRules; import com.iformall.domain.po.WxScoreRules;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -86,4 +87,21 @@ public class RedisConfig extends CachingConfigurerSupport {
return template; return template;
} }


@Bean("cuserTokenRedisTemplate")
public RedisTemplate<String, WxCUser> getCUserTokenRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, WxCUser> template = new RedisTemplate<String, WxCUser>();

Jackson2JsonRedisSerializer<WxCUser> j = new Jackson2JsonRedisSerializer<WxCUser>(WxCUser.class);
// value值的序列化
template.setValueSerializer(j);
template.setHashKeySerializer(j);

// key的序列化
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());

template.setConnectionFactory(connectionFactory);
return template;
}

} }

+ 25
- 2
mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java Просмотреть файл

@@ -5,6 +5,9 @@ import com.iformall.common.ErrorCode;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCouponOrder; import com.iformall.domain.po.WxCouponOrder;
import com.iformall.domain.vo.WxCouponOrderCVo;
import com.iformall.enums.EnumCouponChannelActivityStatus;
import com.iformall.enums.EnumCouponOrderValidStatus;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.service.WxCouponOrderService; import com.iformall.service.WxCouponOrderService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@@ -17,6 +20,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;


import java.util.Date;
import java.util.Map; import java.util.Map;


@RestController @RestController
@@ -99,7 +103,7 @@ public class WxCouponOrderController extends BaseController {
@ApiOperation(value = "核销接口", notes = "{\"couponOrderId\":\"string\"}") @ApiOperation(value = "核销接口", notes = "{\"couponOrderId\":\"string\"}")
@PostMapping("verify") @PostMapping("verify")
public ResultData verify(@RequestBody Map<String, String> paramMap) { public ResultData verify(@RequestBody Map<String, String> paramMap) {
logger.info(paramMap.toString());
logger.info("couponOrderController.verify:"+paramMap.toString());
String couponOrderIdStr = paramMap.get("couponOrderId"); String couponOrderIdStr = paramMap.get("couponOrderId");
if (StringUtils.isBlank(couponOrderIdStr)) { if (StringUtils.isBlank(couponOrderIdStr)) {
logger.error("couponOrderId不能为空: " + paramMap.toString()); logger.error("couponOrderId不能为空: " + paramMap.toString());
@@ -113,6 +117,25 @@ public class WxCouponOrderController extends BaseController {
logger.error("couponOrderId参数不正确: " + paramMap.toString()); logger.error("couponOrderId参数不正确: " + paramMap.toString());
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
} }

WxCouponOrderCVo wxCouponOrderCVo = wxCouponOrderService.detailCUserVo(couponOrderIdStr);

if (wxCouponOrderCVo == null)
return new ResultData(ErrorCode.COUPON_ORDER_IS_NULL);


if (wxCouponOrderCVo.getValidStartDate() != null && wxCouponOrderCVo.getValidEndDate() != null ) {
Date now = new Date();
if (wxCouponOrderCVo.getValidStartDate().getTime() > now.getTime()) {
logger.error("此券有效期未开始:" + couponOrderIdStr);
return new ResultData(ErrorCode.COUPON_ORDER_IS_EARLIER_THAN_VALIDDATE);
}
if (wxCouponOrderCVo.getValidEndDate().getTime() < now.getTime()) {
logger.error("此券有效期已结束:" + couponOrderIdStr);
return new ResultData(ErrorCode.COUPON_ORDER_IS_LATER_THAN_VALIDDATE);
}
}

WxCouponOrder couponOrder = null; WxCouponOrder couponOrder = null;
try { try {
couponOrder = wxCouponOrderService.verify(couponOrderId, getUser().getId()); couponOrder = wxCouponOrderService.verify(couponOrderId, getUser().getId());
@@ -152,7 +175,7 @@ public class WxCouponOrderController extends BaseController {
try { try {
wxCouponOrderService.sendVerifyMsg(couponOrder, getUser(), bSentCoupon); wxCouponOrderService.sendVerifyMsg(couponOrder, getUser(), bSentCoupon);
} catch (Exception e) { } catch (Exception e) {
logger.error(e.getMessage());
logger.error("核销发送消息发生错误:"+e.getMessage());
} }
} }




+ 9
- 30
mallinkBApi/src/main/java/com/iformall/controller/WxInfoController.java Просмотреть файл

@@ -86,15 +86,17 @@ public class WxInfoController extends BaseController {
if (StringUtils.isBlank(code)) { if (StringUtils.isBlank(code)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "code不能为空"); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "code不能为空");
} }

WxAppinfo wxAppinfo = getAppInfo(appId);
try { try {
Map<String, String> retMap = getOpenIdInfo(appId, code); Map<String, String> retMap = getOpenIdInfo(appId, code);
String openId = retMap.get("openId"); String openId = retMap.get("openId");
MallUserInfo user = mallUserInfoService.getByOpenId(openId);
MallUserInfo user = mallUserInfoService.getByBOpenId(openId, wxAppinfo.getTenantId());
if(user == null) { if(user == null) {
return new ResultData(ErrorCode.USER_NO_PERMISSION, retMap); return new ResultData(ErrorCode.USER_NO_PERMISSION, retMap);
} }


if(!isInMobileAdmin(user)) {
if(!mallUserRoleService.checkIsMobileAdmin(user)) {
return new ResultData(ErrorCode.USER_NO_PERMISSION, retMap); return new ResultData(ErrorCode.USER_NO_PERMISSION, retMap);
} }


@@ -107,31 +109,6 @@ public class WxInfoController extends BaseController {
} }
} }


private boolean isInMobileAdmin(MallUserInfo user) {
// 检查用户是否有 移动端数据塔台 权限
boolean isInMobile = false;
if(EnumUserAdmin.ADMIN.getCode().equals(user.getIsAdmin())) { // 超管
isInMobile = true;
return isInMobile;
}
MallUserRole ur = new MallUserRole();
ur.setUid(user.getId());
PageInfo<MallUserRole> page = mallUserRoleService.listAsPage(ur, 1, 1);
if (page.getSize() > 0) {
Long roleId = page.getList().get(0).getRoleId();
MallRolePermission p = new MallRolePermission();
p.setRoleId(roleId);
p.setTenantId(user.getTenantId());
PageInfo<MallRolePermission> listAsPage = mallRolePermissionService.listAsPage(p, 1, 100);
for (MallRolePermission rp : listAsPage.getList()) {
if (rp.getPermissionId().equals(8L)) { /// 移动端数据塔台
isInMobile = true;
}
}
}
return isInMobile;
}

private Map<String,String> getOpenIdInfo(String appId, String code) { private Map<String,String> getOpenIdInfo(String appId, String code) {
WxAppinfo wxAppinfo = getAppInfo(appId); WxAppinfo wxAppinfo = getAppInfo(appId);
WxMaService wxMaService = getWeappServiceByAppInfo(wxAppinfo); WxMaService wxMaService = getWeappServiceByAppInfo(wxAppinfo);
@@ -218,6 +195,8 @@ public class WxInfoController extends BaseController {
} }


WxMaService wxMaService = getWeappService(appId); WxMaService wxMaService = getWeappService(appId);

WxAppinfo wxAppinfo = getAppInfo(appId);
try { try {
// 解密 // 解密
WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(session_key, encryptedData, iv); WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(session_key, encryptedData, iv);
@@ -226,15 +205,15 @@ public class WxInfoController extends BaseController {
String phone = phoneNoInfo.getPhoneNumber(); String phone = phoneNoInfo.getPhoneNumber();
resultMap.put("phone", phone); resultMap.put("phone", phone);


MallUserInfo user = mallUserInfoService.getByPhone(phone);
MallUserInfo user = mallUserInfoService.getByPhone(phone, wxAppinfo.getTenantId());
if(user == null) { if(user == null) {
return new ResultData(ErrorCode.USER_NO_PERMISSION, resultMap); return new ResultData(ErrorCode.USER_NO_PERMISSION, resultMap);
} }
if (isInMobileAdmin(user)) {
if (mallUserRoleService.checkIsMobileAdmin(user)) {
resultMap.put("phone", user.getPhone()); resultMap.put("phone", user.getPhone());
resultMap.put("admin", "1"); resultMap.put("admin", "1");


user.setOpenId(openId);
user.setBopenId(openId);
mallUserInfoService.saveOrUpdate(user); mallUserInfoService.saveOrUpdate(user);


return new ResultData(resultMap); return new ResultData(resultMap);


+ 3
- 3
mallinkBApi/src/main/java/com/iformall/controller/WxRefundOrderController.java Просмотреть файл

@@ -5,11 +5,11 @@ import com.iformall.common.ErrorCode;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.config.PayProperty; import com.iformall.config.PayProperty;
import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxMerchantBUser;
import com.iformall.domain.po.WxRefundOrder;
import com.iformall.domain.po.*;
import com.iformall.enums.EnumPayType; import com.iformall.enums.EnumPayType;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.service.WxCouponOrderService;
import com.iformall.service.WxOrderService;
import com.iformall.service.WxRefundOrderService; import com.iformall.service.WxRefundOrderService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;


+ 1
- 1
mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java Просмотреть файл

@@ -69,7 +69,7 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {


sb.append(resultBody); sb.append(resultBody);


String key = "request: " + HashUtil.md5(sb.toString());
String key = "request-" + HashUtil.md5(sb.toString());
if (redisTemplate.opsForValue().setIfAbsent(key, key)) { if (redisTemplate.opsForValue().setIfAbsent(key, key)) {
redisTemplate.expire(key, 3, TimeUnit.SECONDS); redisTemplate.expire(key, 3, TimeUnit.SECONDS);
logger.info(key + ": 第一次提交"); logger.info(key + ": 第一次提交");


+ 3
- 1
mallinkBApi/src/main/resources/application-dev.yml Просмотреть файл

@@ -1,7 +1,9 @@
spring: spring:
profiles:
include: rabbitMQ
# JDBC # JDBC
datasource: datasource:
url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false
url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true
username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) username: ENC(dZ8fmrtuBMQYaRytKQgTqg==)
password: ENC(WGu0+1DPIHrqorDhrbq1+7wr7xNG53mN) password: ENC(WGu0+1DPIHrqorDhrbq1+7wr7xNG53mN)
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource


+ 11
- 1
mallinkBApi/src/main/resources/application-prod.yml Просмотреть файл

@@ -1,7 +1,9 @@
spring: spring:
profiles:
include: rocketMQ
# JDBC # JDBC
datasource: datasource:
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallink?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallink?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true
username: ENC(NUzgQOdJnCbVLKT6BaX0aw==) username: ENC(NUzgQOdJnCbVLKT6BaX0aw==)
password: ENC(mvuoDRiu0jqYaKNRwwTuXZ6U7aoIaqsjdiPqTLgi/nY=) password: ENC(mvuoDRiu0jqYaKNRwwTuXZ6U7aoIaqsjdiPqTLgi/nY=)
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
@@ -45,6 +47,14 @@ spring:
auth: true auth: true
starttls: starttls:
enable: true enable: true
# RABBITMQ
rabbitmq:
host: localhost
port: 5672
username: ENC(lRmLd6EzgeY1RT5ktcHv9g==)
password: ENC(gBI8mCjr3OC0v57jcnSb660Ux7mW03K2oePgvohhg7w=)
publisher-confirms: true
virtual-host: /


aws: aws:
clientRegion: cn-northwest-1 clientRegion: cn-northwest-1


+ 9
- 1
mallinkBApi/src/main/resources/application-test.yml Просмотреть файл

@@ -1,7 +1,7 @@
spring: spring:
# JDBC # JDBC
datasource: datasource:
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallinkTest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallinkTest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true
username: ENC(Uc0AjgkytxHHCwZrmDASWg==) username: ENC(Uc0AjgkytxHHCwZrmDASWg==)
password: ENC(nV4Mi3bEbBx0Fj7uUyYH55eTaqsFMjKvmNzagicH4pc=) password: ENC(nV4Mi3bEbBx0Fj7uUyYH55eTaqsFMjKvmNzagicH4pc=)
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
@@ -45,6 +45,14 @@ spring:
auth: true auth: true
starttls: starttls:
enable: true enable: true
# RABBITMQ
rabbitmq:
host: 127.0.0.1
port: 5672
username: ENC(aSRr6mnSryEqzHHz1hJf1g==)
password: ENC(GnjF/mdqKdvmDYC0tIIso7+20/jBALPw39tiWCYJ4iw=)
publisher-confirms: true
virtual-host: /


aws: aws:
clientRegion: cn-northwest-1 clientRegion: cn-northwest-1


+ 9
- 0
mallinkBApi/src/main/resources/application.yml Просмотреть файл

@@ -12,6 +12,15 @@ spring:
date-format: yyyy-MM-dd HH:mm:ss date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8 time-zone: GMT+8
default-property-inclusion: non_null 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


# @{link} https://github.com/abel533 # @{link} https://github.com/abel533
#Mybatis #Mybatis


+ 2
- 0
mallinkCApi/src/main/java/com/iformall/CApplication.java Просмотреть файл

@@ -1,6 +1,7 @@
package com.iformall; package com.iformall;


import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.rocketmq.starter.annotation.EnableRocketMQ;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -14,6 +15,7 @@ import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication @SpringBootApplication
@MapperScan(basePackages = {"com.iformall.mapper"}) @MapperScan(basePackages = {"com.iformall.mapper"})
@EnableEncryptableProperties @EnableEncryptableProperties
@EnableRocketMQ
public class CApplication { public class CApplication {


@Value("${fm.exception}") @Value("${fm.exception}")


+ 18
- 0
mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java Просмотреть файл

@@ -1,6 +1,7 @@
package com.iformall.config; package com.iformall.config;


import com.iformall.domain.po.PushLimit; import com.iformall.domain.po.PushLimit;
import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxScoreRules; import com.iformall.domain.po.WxScoreRules;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -86,4 +87,21 @@ public class RedisConfig extends CachingConfigurerSupport {
return template; return template;
} }


@Bean("cuserTokenRedisTemplate")
public RedisTemplate<String, WxCUser> getCUserTokenRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, WxCUser> template = new RedisTemplate<String, WxCUser>();

Jackson2JsonRedisSerializer<WxCUser> j = new Jackson2JsonRedisSerializer<WxCUser>(WxCUser.class);
// value值的序列化
template.setValueSerializer(j);
template.setHashKeySerializer(j);

// key的序列化
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());

template.setConnectionFactory(connectionFactory);
return template;
}

} }

+ 2
- 2
mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java Просмотреть файл

@@ -645,7 +645,7 @@ public class WxCarController extends BaseController {
WxCouponOrderCarCVo userCar = null; WxCouponOrderCarCVo userCar = null;
WxCouponOrder userCarQ = new WxCouponOrder(); WxCouponOrder userCarQ = new WxCouponOrder();
userCarQ.setTenantId(user.getTenantId()); userCarQ.setTenantId(user.getTenantId());
userCarQ.setCUserId(user.getId());
userCarQ.setcUserId(user.getId());
userCarQ.setId(couponOrderId); userCarQ.setId(couponOrderId);
userCarQ.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); userCarQ.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode());
List<WxCouponOrderCarCVo> list = wxCouponOrderService.carListCUserVo(userCarQ); List<WxCouponOrderCarCVo> list = wxCouponOrderService.carListCUserVo(userCarQ);
@@ -712,7 +712,7 @@ public class WxCarController extends BaseController {
if (wxCouponOrder == null) wxCouponOrder = new WxCouponOrderCarCVo(); if (wxCouponOrder == null) wxCouponOrder = new WxCouponOrderCarCVo();
WxCUser user = getUser(); WxCUser user = getUser();
wxCouponOrder.setTenantId(user.getTenantId()); wxCouponOrder.setTenantId(user.getTenantId());
wxCouponOrder.setCUserId(user.getId());
wxCouponOrder.setcUserId(user.getId());
if (wxCouponOrder.getCouponOrderStatus() == null) if (wxCouponOrder.getCouponOrderStatus() == null)
wxCouponOrder.setSortColumns(WxCouponOrder.Field.CreateDate_DESC); wxCouponOrder.setSortColumns(WxCouponOrder.Field.CreateDate_DESC);
else if (wxCouponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()) else if (wxCouponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode())


+ 12
- 2
mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java Просмотреть файл

@@ -45,6 +45,9 @@ public class WxCardPayController extends BaseController {
@Autowired @Autowired
WxCardSpendService wxCardSpendService; WxCardSpendService wxCardSpendService;


@Autowired
WxCouponOrderService wxCouponOrderService;

@ApiOperation(value = "C端扫B端储值卡支付订单", notes = "params:{\"cardId\":\"String\",\"merchantId\":\"String\",\"totalFee\":\"String(元)\"}") @ApiOperation(value = "C端扫B端储值卡支付订单", notes = "params:{\"cardId\":\"String\",\"merchantId\":\"String\",\"totalFee\":\"String(元)\"}")
@PostMapping("order_create") @PostMapping("order_create")
public ResultData saveCardPayOrder(@RequestBody Map<String, String> paramMap, HttpServletRequest request) { public ResultData saveCardPayOrder(@RequestBody Map<String, String> paramMap, HttpServletRequest request) {
@@ -87,6 +90,8 @@ public class WxCardPayController extends BaseController {


Integer payment = totalFee.multiply(new BigDecimal(100)).intValue(); Integer payment = totalFee.multiply(new BigDecimal(100)).intValue();


WxCUser user = getUser();

WxCardInfo cardInfo = wxCardInfoService.getById(cardId); WxCardInfo cardInfo = wxCardInfoService.getById(cardId);
if(cardInfo == null) { if(cardInfo == null) {
logger.error("卡不存在: " + cardIdStr); logger.error("卡不存在: " + cardIdStr);
@@ -98,14 +103,19 @@ public class WxCardPayController extends BaseController {
return new ResultData(ErrorCode.CARD_REMAIN_AMOUNT_IS_NOT_ENOUGH); return new ResultData(ErrorCode.CARD_REMAIN_AMOUNT_IS_NOT_ENOUGH);
} }


//查看所有者与扫码者是否为一致
WxCouponOrder couponOrder = wxCouponOrderService.getById(cardId);
if (!couponOrder.getOwnerId().equals(user.getId())) {
logger.error("卡已被领取: " + cardIdStr);
return new ResultData(ErrorCode.CARD_TRANSFERED);
}

WxCouponMerchant couponMerchant = wxCardSpendService.checkMerchantInCoupon(cardInfo, merchantId); WxCouponMerchant couponMerchant = wxCardSpendService.checkMerchantInCoupon(cardInfo, merchantId);
if(couponMerchant == null) { if(couponMerchant == null) {
logger.error("商户不支持此卡 " + cardIdStr); logger.error("商户不支持此卡 " + cardIdStr);
return new ResultData(ErrorCode.COUPON_ORDER_MERANT_IS_NULL.getCode(), "商户不支持此卡"); return new ResultData(ErrorCode.COUPON_ORDER_MERANT_IS_NULL.getCode(), "商户不支持此卡");
} }


WxCUser user = getUser();

WxMerchant merchant = wxMerchantService.getById(merchantId); WxMerchant merchant = wxMerchantService.getById(merchantId);
if (merchant.getStatus() == EnumMerchantStatus.NOT_VALID.getCode()) { if (merchant.getStatus() == EnumMerchantStatus.NOT_VALID.getCode()) {
logger.error("商户已禁用, merchantId: " + merchant.getId()); logger.error("商户已禁用, merchantId: " + merchant.getId());


+ 23
- 12
mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java Просмотреть файл

@@ -1,6 +1,10 @@
package com.iformall.controller; package com.iformall.controller;


import com.github.pagehelper.PageInfo;
import com.iformall.domain.vo.WxCouponChannelVo;
import com.iformall.enums.EnumCouponChannelActivityStatus;
import com.iformall.enums.EnumCouponChannelStatus; import com.iformall.enums.EnumCouponChannelStatus;
import com.iformall.enums.EnumCouponChannelType;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -15,6 +19,8 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;


import java.util.Date;

@RestController @RestController
@RequestMapping("/api/wxCouponChannel") @RequestMapping("/api/wxCouponChannel")
@Api(description = "发券渠道相关接口") @Api(description = "发券渠道相关接口")
@@ -34,20 +40,25 @@ public class WxCouponChannelController extends BaseController {
wxCouponChannel.setTenantId(getTenantId()); wxCouponChannel.setTenantId(getTenantId());
wxCouponChannel.setStatus(EnumCouponChannelStatus.STATUS_THROW_IN.getCode()); wxCouponChannel.setStatus(EnumCouponChannelStatus.STATUS_THROW_IN.getCode());
wxCouponChannel.setSortColumns(WxCouponChannel.Field.CreateDate_DESC); wxCouponChannel.setSortColumns(WxCouponChannel.Field.CreateDate_DESC);
wxCouponChannel.setIsCRequest(0);//标记为C端调用
return new ResultData(wxCouponChannelService.listPageCVo(wxCouponChannel, pageNum, pageSize));
}


@ApiOperation("分页列表接口")
@GetMapping("getCouponChannel")
public ResultData getCouponChannel(@ModelAttribute WxCouponChannel wxCouponChannel) {
if (null == wxCouponChannel) wxCouponChannel = new WxCouponChannel();
wxCouponChannel.setTenantId(getTenantId());
wxCouponChannel.setStatus(EnumCouponChannelStatus.STATUS_THROW_IN.getCode());
wxCouponChannel.setIsCRequest(0);//标记为C端调用
return new ResultData(wxCouponChannelService.findCouponChannelVo(wxCouponChannel));
}


PageInfo<WxCouponChannelVo> page = wxCouponChannelService.listPageCVo(wxCouponChannel, pageNum, pageSize);

if (wxCouponChannel.getTargetAd()!= null &&
wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) {
Date now = new Date();
page.getList().stream().forEach(cc->{
if (cc.getBeginTime().getTime() > now.getTime()) {
cc.setActivityStatus(EnumCouponChannelActivityStatus.PREPARED.getCode());
} else if (cc.getEndTime().getTime() < now.getTime()) {
cc.setActivityStatus(EnumCouponChannelActivityStatus.ENDED.getCode());
} else {
cc.setActivityStatus(EnumCouponChannelActivityStatus.STARTED.getCode());
}
});
}


return new ResultData(page);
}


} }

+ 26
- 3
mallinkCApi/src/main/java/com/iformall/controller/WxCouponController.java Просмотреть файл

@@ -2,22 +2,31 @@ package com.iformall.controller;


import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCouponChannel;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.vo.MarkingSceneDataReportVo;
import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxCouponCVo;
import com.iformall.enums.EnumCouponChannelActivityStatus;
import com.iformall.enums.EnumCouponChannelType;
import com.iformall.service.WxCouponChannelService; import com.iformall.service.WxCouponChannelService;

import com.iformall.service.WxCouponService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;


import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

@RestController @RestController
@RequestMapping("/api/wxCoupon") @RequestMapping("/api/wxCoupon")
@Api(description = "券类型相关接口") @Api(description = "券类型相关接口")
@@ -26,6 +35,8 @@ public class WxCouponController extends BaseController {


@Autowired @Autowired
private WxCouponChannelService wxCouponChannelService; private WxCouponChannelService wxCouponChannelService;
@Autowired
private WxCouponService wxCouponService;




@ApiOperation("根据id(couponChannel)查询接口") @ApiOperation("根据id(couponChannel)查询接口")
@@ -48,7 +59,19 @@ public class WxCouponController extends BaseController {
if (wxCouponCVo == null) if (wxCouponCVo == null)
return new ResultData(ErrorCode.COUPON_IS_EMPTY); return new ResultData(ErrorCode.COUPON_IS_EMPTY);


return new ResultData(wxCouponCVo);
if (wxCouponCVo.getTargetAd()!= null &&
wxCouponCVo.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) {
Date now = new Date();


if (wxCouponCVo.getBeginTime().getTime() > now.getTime()) {
wxCouponCVo.setActivityStatus(EnumCouponChannelActivityStatus.PREPARED.getCode());
} else if (wxCouponCVo.getEndTime().getTime() < now.getTime()) {
wxCouponCVo.setActivityStatus(EnumCouponChannelActivityStatus.ENDED.getCode());
} else {
wxCouponCVo.setActivityStatus(EnumCouponChannelActivityStatus.STARTED.getCode());
}
}

return new ResultData(wxCouponCVo);
} }
} }

+ 101
- 11
mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java Просмотреть файл

@@ -1,12 +1,16 @@
package com.iformall.controller; package com.iformall.controller;


import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUser; import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxCouponOrder; import com.iformall.domain.po.WxCouponOrder;
import com.iformall.domain.vo.WxCardCVo; import com.iformall.domain.vo.WxCardCVo;
import com.iformall.domain.vo.WxCouponOrderCVo; import com.iformall.domain.vo.WxCouponOrderCVo;
import com.iformall.enums.EnumCouponChannelActivityStatus;
import com.iformall.enums.EnumCouponOrderStatus; import com.iformall.enums.EnumCouponOrderStatus;
import com.iformall.enums.EnumCouponOrderValidStatus;
import com.iformall.exception.MallinkException;
import com.iformall.service.WxCouponOrderService; import com.iformall.service.WxCouponOrderService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
@@ -16,15 +20,10 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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 org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;


@RestController @RestController
@RequestMapping("/api/couponOrder") @RequestMapping("/api/couponOrder")
@@ -35,6 +34,9 @@ public class WxCouponOrderController extends BaseController {
@Autowired @Autowired
private WxCouponOrderService wxCouponOrderService; private WxCouponOrderService wxCouponOrderService;


@Autowired
StringRedisTemplate stringRedisTemplate;

@ApiOperation("券包分页列表接口") @ApiOperation("券包分页列表接口")
@GetMapping("list") @GetMapping("list")
@ApiImplicitParams({ @ApiImplicitParams({
@@ -47,14 +49,30 @@ public class WxCouponOrderController extends BaseController {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
} }
if (wxCouponOrder == null) wxCouponOrder = new WxCouponOrderCVo(); if (wxCouponOrder == null) wxCouponOrder = new WxCouponOrderCVo();
wxCouponOrder.setCUserId(getUser().getId());
wxCouponOrder.setcUserId(getUser().getId());
if (wxCouponOrder.getCouponOrderStatus() == null) if (wxCouponOrder.getCouponOrderStatus() == null)
wxCouponOrder.setSortColumns(WxCouponOrder.Field.CreateDate_DESC); wxCouponOrder.setSortColumns(WxCouponOrder.Field.CreateDate_DESC);
else if (wxCouponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()) else if (wxCouponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode())
wxCouponOrder.setSortColumns(WxCouponOrder.Field.CreateDate_DESC); wxCouponOrder.setSortColumns(WxCouponOrder.Field.CreateDate_DESC);
else else
wxCouponOrder.setSortColumns(WxCouponOrder.Field.UpdateDate_DESC); wxCouponOrder.setSortColumns(WxCouponOrder.Field.UpdateDate_DESC);
return wxCouponOrderService.listCUserVoAsPage(wxCouponOrder, pageNum, pageSize);

PageInfo<WxCouponOrderCVo> page = wxCouponOrderService.listCUserVoAsPage(wxCouponOrder, pageNum, pageSize);

Date now = new Date();
page.getList().stream().forEach(co->{
if (co.getValidStartDate() != null && co.getValidEndDate() != null ) {
if (co.getValidStartDate().getTime() > now.getTime()) {
co.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode());
} else if (co.getValidEndDate().getTime() < now.getTime()) {
co.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode());
} else {
co.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode());
}
}
});

return new ResultData(page);
} }


@ApiOperation(value = "券详情接口") @ApiOperation(value = "券详情接口")
@@ -67,8 +85,27 @@ public class WxCouponOrderController extends BaseController {
if (couponOrderId == null) { if (couponOrderId == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
} }
WxCouponOrderCVo wxCouponOrderCVo = wxCouponOrderService.detailCUserVo(couponOrderId);

if (wxCouponOrderCVo == null) {
return new ResultData(ErrorCode.COUPON_ORDER_IS_NULL);
}


return wxCouponOrderService.detailCUserVo(getUser().getId(), couponOrderId);
if (!wxCouponOrderCVo.getcUserId().equals(getUserId())) {
return new ResultData(ErrorCode.COUPON_ORDER_IS_NULL);
}
Date now = new Date();
if (wxCouponOrderCVo.getValidStartDate() != null && wxCouponOrderCVo.getValidEndDate() != null ) {
if (wxCouponOrderCVo.getValidStartDate().getTime() > now.getTime()) {
wxCouponOrderCVo.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode());
} else if (wxCouponOrderCVo.getValidEndDate().getTime() < now.getTime()) {
wxCouponOrderCVo.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode());
} else {
wxCouponOrderCVo.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode());
}
}

return new ResultData(wxCouponOrderCVo);
} }


@ApiOperation(value = "卡券状态接口") @ApiOperation(value = "卡券状态接口")
@@ -137,4 +174,57 @@ public class WxCouponOrderController extends BaseController {


return wxCouponOrderService.cardDetailCUserVo(getUserId(), couponOrderId); return wxCouponOrderService.cardDetailCUserVo(getUserId(), couponOrderId);
} }

@ApiOperation(value = "卡转赠领取")
@PostMapping("cardAccept")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "coupon_order_id", dataType = "Long", paramType = "query", required = true),
@ApiImplicitParam(name = "cUserId", value = "转赠者", dataType = "Long", paramType = "query", required = true),
})
public ResultData cardAccept(@RequestBody WxCouponOrder wxCouponOrder) {
//coupon_order_id判断
Long id = wxCouponOrder.getId();
if (id == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "id不能为空");
}
//转赠人判断
Long cUserId = wxCouponOrder.getcUserId();
if (cUserId == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "cUserId不能为空");
}
//当前领取人
wxCouponOrder.setOwnerId(getUserId());
//转赠者与当前领取人是否为同一个
if (cUserId.equals(wxCouponOrder.getOwnerId())) {
logger.info("转赠人与卡所有者相同");
return new ResultData(ErrorCode.CARD_TRANSFER_INVALID.getCode(), "转赠人与卡所有者相同");
}

return wxCouponOrderService.cardAccept(wxCouponOrder);

}

@ApiOperation(value = "查询转赠卡状态")
@GetMapping("queryCardStatus")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "coupon_order_id", dataType = "Long", paramType = "query", required = true),
@ApiImplicitParam(name = "cUserId", value = "转赠者", dataType = "Long", paramType = "query", required = true),
})
public ResultData queryCardStatus(@ModelAttribute WxCouponOrder wxCouponOrder) {

//coupon_order_id判断
Long id = wxCouponOrder.getId();
if (id == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "id不能为空");
}
//转赠人判断
Long cUserId = wxCouponOrder.getcUserId();
if (cUserId == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "cUserId不能为空");
}
//当前领取人
wxCouponOrder.setOwnerId(getUserId());
return wxCouponOrderService.queryCardStatus(wxCouponOrder);
}

} }

+ 10
- 24
mallinkCApi/src/main/java/com/iformall/controller/WxGameController.java Просмотреть файл

@@ -55,40 +55,26 @@ public class WxGameController extends BaseController {
@PostMapping("addActionLog") @PostMapping("addActionLog")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "gameId", value = "游戏ID", dataType = "String", paramType = "query", required = true), @ApiImplicitParam(name = "gameId", value = "游戏ID", dataType = "String", paramType = "query", required = true),
@ApiImplicitParam(name = "couponOrderId", value = "券ID", dataType = "String", paramType = "query", required = true)})
public ResultData addActionLog(String gameId, String orderId) {
@ApiImplicitParam(name = "orderId", value = "券订单ID", dataType = "String", paramType = "query", required = true)})
public ResultData addActionLog(@RequestBody Map<String,String> paramMap) {
Long gameIdL = null; Long gameIdL = null;
Long orderIdL = null; Long orderIdL = null;
Long couponOrderIdL = null;
try { try {
gameIdL = Long.valueOf(gameId);
if (orderId != null) {
orderIdL = Long.valueOf(orderId);
WxCouponOrder wxCouponOrder = new WxCouponOrder();
wxCouponOrder.setCUserId(getUserId());
wxCouponOrder.setOrderId(orderIdL);
PageInfo<WxCouponOrder> page = wxCouponOrderService.listAsPage(wxCouponOrder,1,1);
if (page.getList().size()>0) {
couponOrderIdL = page.getList().get(0).getId();
}
}
gameIdL = Long.valueOf(paramMap.get("gameId"));
orderIdL = Long.valueOf(paramMap.get("orderId"));
} catch (Exception e){ } catch (Exception e){
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
} }
WxGameActionLog wxGameActionLog = new WxGameActionLog();
wxGameActionLog.setUserId(getUserId());
wxGameActionLog.setTenantId(getTenantId());
wxGameActionLog.setGameId(gameIdL);
wxGameActionLog.setCouponOrderId(couponOrderIdL);
wxGameService.addActionLog(wxGameActionLog);
return new ResultData();

return wxGameService.addActionLog(getUserId(), gameIdL, orderIdL);
} }


@ApiOperation("添加游戏参与记录") @ApiOperation("添加游戏参与记录")
@PostMapping("checkLimit")
@GetMapping("getCount")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "gameId", value = "游戏ID", dataType = "String", paramType = "query", required = true)}) @ApiImplicitParam(name = "gameId", value = "游戏ID", dataType = "String", paramType = "query", required = true)})
public ResultData checkLimit(String gameId) {
public ResultData getCount(String gameId) {
Long gameIdL = null; Long gameIdL = null;
try { try {
gameIdL = Long.valueOf(gameId); gameIdL = Long.valueOf(gameId);
@@ -96,6 +82,6 @@ public class WxGameController extends BaseController {
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
} }


return wxGameService.checkLimit(gameIdL,getUserId());
return wxGameService.getCount(gameIdL,getUserId());
} }
} }

+ 15
- 0
mallinkCApi/src/main/java/com/iformall/controller/WxMerchantController.java Просмотреть файл

@@ -1,11 +1,15 @@
package com.iformall.controller; package com.iformall.controller;


import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxMerchant;
import com.iformall.domain.vo.WxMerchantVo; import com.iformall.domain.vo.WxMerchantVo;
import com.iformall.enums.EnumMerchantStatus;
import com.iformall.service.WxMerchantService; import com.iformall.service.WxMerchantService;
import com.iformall.utils.HashUtil; import com.iformall.utils.HashUtil;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -26,6 +30,17 @@ public class WxMerchantController extends BaseController {
@Autowired @Autowired
private WxMerchantService wxMerchantService; private WxMerchantService wxMerchantService;


@ApiOperation("分页列表接口")
@GetMapping("list")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData list(@ModelAttribute WxMerchantVo wxMerchant, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxMerchantController::list");
if (null == wxMerchant) wxMerchant = new WxMerchantVo();
wxMerchant.setMerchantStatus(EnumMerchantStatus.VALID.getCode());
return new ResultData(wxMerchantService.listAsPageCVo(wxMerchant, pageNum, pageSize));
}


@ApiOperation("根据code查询接口") @ApiOperation("根据code查询接口")
@GetMapping("/findByCode") @GetMapping("/findByCode")


+ 58
- 9
mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java Просмотреть файл

@@ -9,11 +9,11 @@ import com.iformall.domain.po.WxCouponChannel;
import com.iformall.domain.po.WxOrder; import com.iformall.domain.po.WxOrder;
import com.iformall.domain.vo.WxOrderCouponPressVo; import com.iformall.domain.vo.WxOrderCouponPressVo;
import com.iformall.domain.vo.WxOrderCouponVo; import com.iformall.domain.vo.WxOrderCouponVo;
import com.iformall.enums.EnumCouponChannelStatus;
import com.iformall.enums.EnumOrderStatus;
import com.iformall.enums.*;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.service.WxCouponChannelService; import com.iformall.service.WxCouponChannelService;
import com.iformall.service.WxOrderService; import com.iformall.service.WxOrderService;
import com.iformall.utils.DateUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
@@ -24,7 +24,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;


import java.util.List;
import java.util.Date;
import java.util.Map; import java.util.Map;


@RestController @RestController
@@ -85,7 +85,7 @@ public class WxOrderController extends BaseController {
} }
} }


@ApiOperation(value = "下订单", notes = "{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\"}")
@ApiOperation(value = "下订单", notes = "{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\"}")
@PostMapping("save") @PostMapping("save")
public ResultData saveOrder(@RequestBody Map<String, String> paramMap) { public ResultData saveOrder(@RequestBody Map<String, String> paramMap) {
logger.info("OrderSave: " + paramMap.toString()); logger.info("OrderSave: " + paramMap.toString());
@@ -94,11 +94,12 @@ public class WxOrderController extends BaseController {
String couponChannelIdStr = paramMap.get("couponChannelId"); String couponChannelIdStr = paramMap.get("couponChannelId");
String couponIdStr = paramMap.get("couponId"); String couponIdStr = paramMap.get("couponId");
String pressStr = paramMap.get("press"); String pressStr = paramMap.get("press");
String orderGroupIdStr = paramMap.get("orderGroupId");


if (StringUtils.isBlank(couponChannelIdStr)) { if (StringUtils.isBlank(couponChannelIdStr)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId不能为空"); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId不能为空");
} }
Long couponChannelId = 0L, couponId = 0L;
Long couponChannelId = 0L, couponId = 0L, orderGroupId = null;
boolean isPress = false; boolean isPress = false;


if (StringUtils.isNotBlank(couponChannelIdStr)) { if (StringUtils.isNotBlank(couponChannelIdStr)) {
@@ -111,11 +112,24 @@ public class WxOrderController extends BaseController {
WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(couponChannelId); WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(couponChannelId);
if (wxCouponChannel == null) { if (wxCouponChannel == null) {
logger.error("couponChannelId convert error, " + couponChannelIdStr); logger.error("couponChannelId convert error, " + couponChannelIdStr);
return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), "找不到发布的频道");
return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR);
}

if (wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) {
Date now = new Date();
if (wxCouponChannel.getBeginTime().getTime() > now.getTime()) {
logger.error("此券活动未开始:" + couponChannelIdStr);
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_NOT_STARTED);
}
if (wxCouponChannel.getEndTime().getTime() < now.getTime()) {
logger.error("此券活动已结束:" + couponChannelIdStr);
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_END);
}
} }

if (wxCouponChannel.getStatus() == EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode()) { if (wxCouponChannel.getStatus() == EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode()) {
logger.error("此券已下架:" + couponChannelIdStr); logger.error("此券已下架:" + couponChannelIdStr);
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF.getCode(), "此券已下架");
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF);
} }
if (StringUtils.isBlank(couponIdStr)) { if (StringUtils.isBlank(couponIdStr)) {
couponId = wxCouponChannel.getCouponId(); couponId = wxCouponChannel.getCouponId();
@@ -143,10 +157,17 @@ public class WxOrderController extends BaseController {
} }
} }


WxCUser user = getUser();
if (orderGroupIdStr != null) {
try {
orderGroupId = Long.valueOf(orderGroupIdStr);
} catch (Exception e) {
logger.error("orderGroupId转换失败");
}
}


WxCUser user = getUser();
try { try {
WxOrder order = wxOrderService.saveCouponOrder(user, couponChannelId, couponId, isPress);
WxOrder order = wxOrderService.saveCouponOrder(user, couponChannelId, couponId, isPress, orderGroupId);
return new ResultData(order); return new ResultData(order);
} catch (MallinkException e) { } catch (MallinkException e) {
logger.error(e.getMessage()); logger.error(e.getMessage());
@@ -228,6 +249,21 @@ public class WxOrderController extends BaseController {
wxOrder.setcUserId(getUser().getId()); wxOrder.setcUserId(getUser().getId());
wxOrder.setSortColumns(WxOrder.Field.UpdateDate_DESC); wxOrder.setSortColumns(WxOrder.Field.UpdateDate_DESC);
final PageInfo<WxOrderCouponVo> page = wxOrderService.listCUserVoAsPage(wxOrder, pageNum, pageSize); final PageInfo<WxOrderCouponVo> page = wxOrderService.listCUserVoAsPage(wxOrder, pageNum, pageSize);

Date now = new Date();
page.getList().stream().forEach(oc->{
if (oc.getValidStartDate() != null && oc.getValidEndDate() != null ) {
if (oc.getValidStartDate().getTime() > now.getTime()) {
oc.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode());
} else if (oc.getValidEndDate().getTime() < now.getTime()) {
oc.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode());
} else {
oc.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode());
}
}
});


return new ResultData(page); return new ResultData(page);
} }


@@ -251,6 +287,19 @@ public class WxOrderController extends BaseController {
WxOrderCouponVo wxOrderCVo = wxOrderService.detailCUserVo(wxOrder); WxOrderCouponVo wxOrderCVo = wxOrderService.detailCUserVo(wxOrder);
if (wxOrderCVo == null) if (wxOrderCVo == null)
return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); return new ResultData(ErrorCode.ORDER_IS_NOT_FIND);

Date now = new Date();

if (wxOrderCVo.getValidStartDate() != null && wxOrderCVo.getValidEndDate() != null ) {
if (wxOrderCVo.getValidStartDate().getTime() > now.getTime()) {
wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode());
} else if (wxOrderCVo.getValidEndDate().getTime() < now.getTime()) {
wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode());
} else {
wxOrderCVo.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode());
}
}

return new ResultData(wxOrderCVo); return new ResultData(wxOrderCVo);
} }




+ 138
- 0
mallinkCApi/src/main/java/com/iformall/controller/WxOrderGroupController.java Просмотреть файл

@@ -0,0 +1,138 @@
package com.iformall.controller;

import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxOrder;
import com.iformall.domain.po.WxOrderGroup;
import com.iformall.domain.vo.WxOrderGroupMarketing;
import com.iformall.enums.EnumOrderStatus;
import com.iformall.service.WxCouponService;
import com.iformall.service.WxOrderGroupService;
import com.iformall.service.WxOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
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.*;

import java.util.Map;

@RestController
@RequestMapping("/api/orderGroup")
@Api(description = "拼团接口")
public class WxOrderGroupController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
WxOrderService wxOrderService;

@Autowired
WxCouponService wxCouponService;

@Autowired
WxOrderGroupService wxOrderGroupService;


@ApiOperation(value = "查询差1个的团购信息")
@GetMapping("queryRemainOne")
@ApiImplicitParams({
@ApiImplicitParam(name = "couponId", value = "券ID", dataType = "Long", paramType = "query", required = true)
})
public ResultData queryRemainOne(@ModelAttribute WxOrderGroup wxOrderGroup) {
if (wxOrderGroup.getCouponId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponId不能为空");
}
wxOrderGroup.setRemainPeople(1);
wxOrderGroup.setStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode());
wxOrderGroup.setTenantId(getTenantId());
return wxOrderGroupService.queryRemainOne(wxOrderGroup, getUserId());
}


@ApiOperation(value = "我的拼团")
@GetMapping("queryOrderGroup")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true),
})
public ResultData queryOrderGroup(Integer pageNum, Integer pageSize) {
WxOrder wxOrder = new WxOrder();
wxOrder.setCUserId(getUserId());
wxOrder.setTenantId(getTenantId());
final PageInfo<Map<String, Object>> page = wxOrderGroupService.queryOrderGroup(wxOrder, pageNum, pageSize);
return new ResultData(page);
}

@ApiOperation(value = "去拼团")
@PostMapping("toOrderGroup")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderId", value = "orderId", dataType = "Long", paramType = "query", required = true),
@ApiImplicitParam(name = "couponId", value = "couponId", dataType = "Long", paramType = "query", required = true),
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true),
})
public ResultData toOrderGroup(@RequestBody WxOrderGroup wxOrderGroup) {
if (wxOrderGroup.getId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "id不能为空");
}
if (wxOrderGroup.getCouponId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponId不能为空");
}
if (wxOrderGroup.getOrderId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空");
}
wxOrderGroup.setTenantId(getTenantId());
return wxOrderGroupService.toOrderGroup(wxOrderGroup);
}

@ApiOperation(value = "查询拼团状态")
@GetMapping("queryOrderGroupStatus")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderId", value = "orderId", dataType = "Long", paramType = "query", required = true),
@ApiImplicitParam(name = "couponId", value = "couponId", dataType = "Long", paramType = "query", required = true),
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true),
})
public ResultData queryOrderGroupStatus(@ModelAttribute WxOrderGroup wxOrderGroup) {
if (wxOrderGroup.getId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "id不能为空");
}
if (wxOrderGroup.getCouponId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponId不能为空");
}
if (wxOrderGroup.getOrderId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空");
}
wxOrderGroup.setTenantId(getTenantId());
return wxOrderGroupService.queryOrderGroupStatus(wxOrderGroup);
}

@ApiOperation(value = "查询是否已参团")
@GetMapping("queryAttendStatus")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true),
})
public ResultData queryAttendStatus(@ModelAttribute WxOrderGroup wxOrderGroup) {
if (wxOrderGroup.getId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "id不能为空");
}
wxOrderGroup.setUserId(getUserId());
wxOrderGroup.setTenantId(getTenantId());
return wxOrderGroupService.queryAttendStatus(wxOrderGroup);
}

@ApiOperation(value = "拼团营销分析")
@GetMapping("queryOrderGroupMarketingList")
@ApiImplicitParams({
@ApiImplicitParam(name = "couponId", value = "couponId", dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true),
})
public ResultData queryOrderGroupMarketingList(@ModelAttribute WxOrderGroupMarketing wxOrderGroupMarketing, Integer pageNum, Integer pageSize) {
final PageInfo<WxOrderGroupMarketing> page = wxOrderGroupService.queryOrderGroupMarketingList(wxOrderGroupMarketing, pageNum, pageSize);
return new ResultData(page);
}

}

+ 14
- 1
mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java Просмотреть файл

@@ -7,10 +7,13 @@ import com.iformall.common.ResultData;
import com.iformall.config.PayProperty; import com.iformall.config.PayProperty;
import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxCUser; import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxOrder;
import com.iformall.domain.po.WxPayOrder; import com.iformall.domain.po.WxPayOrder;
import com.iformall.enums.EnumPayStatus; import com.iformall.enums.EnumPayStatus;
import com.iformall.enums.EnumPayWay; import com.iformall.enums.EnumPayWay;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.service.WxCouponService;
import com.iformall.service.WxOrderService;
import com.iformall.service.WxPayOrderService; import com.iformall.service.WxPayOrderService;
import com.iformall.utils.IPUtil; import com.iformall.utils.IPUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@@ -38,6 +41,12 @@ public class WxPayOrderController extends BaseController {
@Autowired @Autowired
private WxPayOrderService wxPayOrderService; private WxPayOrderService wxPayOrderService;


@Autowired
private WxOrderService wxOrderService;

@Autowired
private WxCouponService wxCouponService;

@ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}") @ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}")
@RequestMapping(value = "/create", method = RequestMethod.POST) @RequestMapping(value = "/create", method = RequestMethod.POST)
public ResultData _create(@RequestBody Map<String, String> paramMap, HttpServletRequest request) throws Exception { public ResultData _create(@RequestBody Map<String, String> paramMap, HttpServletRequest request) throws Exception {
@@ -108,13 +117,17 @@ public class WxPayOrderController extends BaseController {
payOrder.setOrderId(orderId); payOrder.setOrderId(orderId);
payOrder.setPayOrderStatus(status); payOrder.setPayOrderStatus(status);
payOrder.setFailReason(reasonStr); payOrder.setFailReason(reasonStr);

WxOrder order = null;

try { try {
if(status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) && !payOrderIdStr.equals("0")) { if(status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) && !payOrderIdStr.equals("0")) {
// 前端提示支付成功, 不作为支付成功标志,只检查支付订单状态 // 前端提示支付成功, 不作为支付成功标志,只检查支付订单状态
// 有价券不走update, callback更新 // 有价券不走update, callback更新
payOrder = wxPayOrderService.getById(payOrderId); payOrder = wxPayOrderService.getById(payOrderId);
if(payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { if(payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) {
return new ResultData(Result.SUCCESS, "支付状态更新成功");
order = wxOrderService.getById(orderId);
return new ResultData(Result.SUCCESS, "支付状态更新成功", order);
} else { } else {
return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付未状态,请等待!!"); return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付未状态,请等待!!");
} }


+ 26
- 28
mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java Просмотреть файл

@@ -110,35 +110,14 @@ public class WxUserGrantController extends BaseController {


if(StringUtils.isBlank(wxAppinfo.getAccessToken())) { if(StringUtils.isBlank(wxAppinfo.getAccessToken())) {
// 如果没有accessToken,主动获取保存到数据库中,下次访问可以拿来使用 // 如果没有accessToken,主动获取保存到数据库中,下次访问可以拿来使用
try {
String accessToken = wxMaService.getAccessToken(true);
wxAppinfo.setAccessToken(accessToken);
wxAppinfo.setLastTokenTime(new Date());
wxAppinfo.setExpiresIn(7200);
wxAppinfoService.saveOrUpdate(wxAppinfo);
} catch (WxErrorException e) {
logger.error(e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
}

updateAppAccessToken(wxAppinfo, wxMaService);
wxMaService = getWeappServiceByAppInfo(wxAppinfo); wxMaService = getWeappServiceByAppInfo(wxAppinfo);


} else { } else {
// 检查token是否已过期, 小时就重新获取
// 检查token是否已过期, 1小时就重新获取
Date curDate = new Date(); Date curDate = new Date();
if(curDate.getTime() > wxAppinfo.getLastTokenTime().getTime() + 3600000) { if(curDate.getTime() > wxAppinfo.getLastTokenTime().getTime() + 3600000) {
try {
String accessToken = wxMaService.getAccessToken(true);
wxAppinfo.setAccessToken(accessToken);
wxAppinfo.setLastTokenTime(new Date());
wxAppinfo.setExpiresIn(7200);
wxAppinfoService.saveOrUpdate(wxAppinfo);
} catch (WxErrorException e) {
logger.error(e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
}
updateAppAccessToken(wxAppinfo, wxMaService);
wxMaService = getWeappServiceByAppInfo(wxAppinfo); wxMaService = getWeappServiceByAppInfo(wxAppinfo);
} }
} }
@@ -170,8 +149,7 @@ public class WxUserGrantController extends BaseController {
try { try {
WxCUser user1 = wxCUserService.getByOpenId(user); WxCUser user1 = wxCUserService.getByOpenId(user);
if (user1 != null) { if (user1 != null) {
user1.createToken(new Date());
token = user1.getToken();
token = user1.createToken(new Date());


resultMap.put("token", token); resultMap.put("token", token);
request.setAttribute(AuthorizationInterceptor.LOGIN_USER_KEY, user1.getId()); request.setAttribute(AuthorizationInterceptor.LOGIN_USER_KEY, user1.getId());
@@ -192,6 +170,7 @@ public class WxUserGrantController extends BaseController {
extraInfo.put("systemInfo",JSONObject.parseObject(systemInfo)); extraInfo.put("systemInfo",JSONObject.parseObject(systemInfo));
user1.setExtraInfo(extraInfo.toJSONString()); user1.setExtraInfo(extraInfo.toJSONString());


user1.setLoginCount(user1.getLoginCount()+1);
wxCUserService.saveOrUpdate(user1); wxCUserService.saveOrUpdate(user1);
// 成长值 // 成长值
try { try {
@@ -202,8 +181,7 @@ public class WxUserGrantController extends BaseController {
wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_LOGIN,user1); wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_LOGIN,user1);
} else { } else {
user.setTenantId(wxAppinfo.getTenantId()); user.setTenantId(wxAppinfo.getTenantId());
user.createToken(new Date());
token = user.getToken();
token = user.createToken(new Date());


user.setRegisterIp(ipaddress); user.setRegisterIp(ipaddress);
if (user.getSceneAddress() == null || user.getSceneAddress().equals("undefined")) if (user.getSceneAddress() == null || user.getSceneAddress().equals("undefined"))
@@ -219,6 +197,7 @@ public class WxUserGrantController extends BaseController {
JSONObject extraInfo = new JSONObject(); JSONObject extraInfo = new JSONObject();
extraInfo.put("systemInfo",JSONObject.parseObject(systemInfo)); extraInfo.put("systemInfo",JSONObject.parseObject(systemInfo));
user.setExtraInfo(extraInfo.toJSONString()); user.setExtraInfo(extraInfo.toJSONString());
user.setLoginCount(0);


wxCUserService.saveOrUpdate(user); wxCUserService.saveOrUpdate(user);


@@ -244,6 +223,25 @@ public class WxUserGrantController extends BaseController {
return new ResultData(resultMap); return new ResultData(resultMap);
} }


/**
* WxAppInfo更新accessToken
* @param wxAppinfo
* @param wxMaService
*/
private void updateAppAccessToken(WxAppinfo wxAppinfo, WxMaService wxMaService) {
try {
String accessToken = wxMaService.getAccessToken(true);
wxAppinfo.setAccessToken(accessToken);
wxAppinfo.setLastTokenTime(new Date());
wxAppinfo.setExpiresIn(7200);
wxAppinfoService.saveOrUpdate(wxAppinfo);
} catch (WxErrorException e) {
logger.error(e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
}
}

/** /**
* 获取用户的昵称等信息 * 获取用户的昵称等信息
* @param map * @param map


+ 7
- 2
mallinkCApi/src/main/java/com/iformall/interceptor/HttpServletRequestWrapperFilter.java Просмотреть файл

@@ -1,10 +1,14 @@
package com.iformall.interceptor; package com.iformall.interceptor;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*; import javax.servlet.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.IOException; import java.io.IOException;


public class HttpServletRequestWrapperFilter implements Filter { public class HttpServletRequestWrapperFilter implements Filter {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override @Override
public void init(FilterConfig filterConfig) throws ServletException { public void init(FilterConfig filterConfig) throws ServletException {


@@ -13,7 +17,8 @@ public class HttpServletRequestWrapperFilter implements Filter {
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { throws IOException, ServletException {

logger.debug("doFilter start");
long start = System.currentTimeMillis();
ServletRequest requestWrapper = null; ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest) { if (request instanceof HttpServletRequest) {
requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request); requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
@@ -23,7 +28,7 @@ public class HttpServletRequestWrapperFilter implements Filter {
} else { } else {
chain.doFilter(requestWrapper, response); chain.doFilter(requestWrapper, response);
} }
logger.debug("doFilter end: " + (System.currentTimeMillis()- start) + "ms");
} }


@Override @Override


+ 7
- 3
mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java Просмотреть файл

@@ -34,8 +34,10 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {


@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug("preHandle start");
if ("GET".equalsIgnoreCase(request.getMethod())) { if ("GET".equalsIgnoreCase(request.getMethod())) {
// 获取不检查幂等 // 获取不检查幂等
logger.debug("preHandle start 1");
return true; return true;
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@@ -69,23 +71,25 @@ public class RequestInterceptor extends HandlerInterceptorAdapter {


sb.append(resultBody); sb.append(resultBody);


String key = "request: " + HashUtil.md5(sb.toString());
String key = "request-" + HashUtil.md5(sb.toString());
if (redisTemplate.opsForValue().setIfAbsent(key, key)) { if (redisTemplate.opsForValue().setIfAbsent(key, key)) {
redisTemplate.expire(key, 3, TimeUnit.SECONDS); redisTemplate.expire(key, 3, TimeUnit.SECONDS);
logger.info(key + ": 第一次提交"); logger.info(key + ": 第一次提交");
logger.debug("preHandle start 2");
return true; return true;
} }
logger.info(key + ": 第二次提交"); logger.info(key + ": 第二次提交");
logger.debug("preHandle start 3");
return false; return false;
} }


@Override @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.debug("postHandle");
} }


@Override @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.debug("afterCompletion");
} }
} }

+ 72
- 0
mallinkCApi/src/main/java/com/iformall/interceptor/WebLogAspect.java Просмотреть файл

@@ -0,0 +1,72 @@
package com.iformall.interceptor;

import com.iformall.utils.IPUtil;
import lombok.Data;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

@Aspect
@Component
public class WebLogAspect {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Data
private class MethodInfo {
Long startTime;
String url;
String ip;
String method;
String classMethod;
}

ThreadLocal<MethodInfo> startInfo = new ThreadLocal<>();


@Pointcut("execution(public * com.iformall.controller..*.*(..))")
public void webLog() {}

@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
logger.debug("aspect start");
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();

MethodInfo info = new MethodInfo();
info.setUrl(request.getRequestURL().toString());
info.setStartTime(System.currentTimeMillis());
info.setIp(IPUtil.getIpAddr(request));
info.setMethod(request.getMethod());
info.setClassMethod(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
startInfo.set(info);
logger.debug("aspect start ...");
}

@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
logger.debug("aspect after");
// 处理完请求,返回内容
MethodInfo info = startInfo.get();
StringBuilder sb = new StringBuilder();
sb.append("URL: ").append(info.getUrl())
.append(", METHOD: ").append(info.getMethod())
.append(", DO: ").append(info.getClassMethod())
.append(", IP: ").append(info.getIp())
.append(", SPEND TIME: ").append(System.currentTimeMillis() -info.getStartTime()).append("ms");
logger.info(sb.toString());
logger.debug("aspect after ..");
}


}

+ 4
- 2
mallinkCApi/src/main/resources/application-dev.yml Просмотреть файл

@@ -1,7 +1,9 @@
spring: spring:
profiles:
include: rabbitMQ
# JDBC # JDBC
datasource: datasource:
url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false
url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true
username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) username: ENC(dZ8fmrtuBMQYaRytKQgTqg==)
password: ENC(WGu0+1DPIHrqorDhrbq1+7wr7xNG53mN) password: ENC(WGu0+1DPIHrqorDhrbq1+7wr7xNG53mN)
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
@@ -64,5 +66,5 @@ fm:
logging: logging:
level: level:
tk.mybatis: debug tk.mybatis: debug
com.iformall.mapper: debug
com.iformall: debug
path: ./logs/c path: ./logs/c

+ 11
- 1
mallinkCApi/src/main/resources/application-prod.yml Просмотреть файл

@@ -1,7 +1,9 @@
spring: spring:
profiles:
include: rocketMQ
# JDBC # JDBC
datasource: datasource:
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallink?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallink?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true
username: ENC(NUzgQOdJnCbVLKT6BaX0aw==) username: ENC(NUzgQOdJnCbVLKT6BaX0aw==)
password: ENC(mvuoDRiu0jqYaKNRwwTuXZ6U7aoIaqsjdiPqTLgi/nY=) password: ENC(mvuoDRiu0jqYaKNRwwTuXZ6U7aoIaqsjdiPqTLgi/nY=)
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
@@ -45,6 +47,14 @@ spring:
auth: true auth: true
starttls: starttls:
enable: true enable: true
# RABBITMQ
rabbitmq:
host: localhost
port: 5672
username: ENC(lRmLd6EzgeY1RT5ktcHv9g==)
password: ENC(gBI8mCjr3OC0v57jcnSb660Ux7mW03K2oePgvohhg7w=)
publisher-confirms: true
virtual-host: /


aws: aws:
clientRegion: cn-northwest-1 clientRegion: cn-northwest-1


+ 9
- 1
mallinkCApi/src/main/resources/application-test.yml Просмотреть файл

@@ -1,7 +1,7 @@
spring: spring:
# JDBC # JDBC
datasource: datasource:
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallinkTest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallinkTest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true
username: ENC(Uc0AjgkytxHHCwZrmDASWg==) username: ENC(Uc0AjgkytxHHCwZrmDASWg==)
password: ENC(nV4Mi3bEbBx0Fj7uUyYH55eTaqsFMjKvmNzagicH4pc=) password: ENC(nV4Mi3bEbBx0Fj7uUyYH55eTaqsFMjKvmNzagicH4pc=)
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
@@ -45,6 +45,14 @@ spring:
auth: true auth: true
starttls: starttls:
enable: true enable: true
# RABBITMQ
rabbitmq:
host: 127.0.0.1
port: 5672
username: ENC(aSRr6mnSryEqzHHz1hJf1g==)
password: ENC(GnjF/mdqKdvmDYC0tIIso7+20/jBALPw39tiWCYJ4iw=)
publisher-confirms: true
virtual-host: /


aws: aws:
clientRegion: cn-northwest-1 clientRegion: cn-northwest-1


+ 9
- 0
mallinkCApi/src/main/resources/application.yml Просмотреть файл

@@ -12,6 +12,15 @@ spring:
date-format: yyyy-MM-dd HH:mm:ss date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8 time-zone: GMT+8
default-property-inclusion: non_null 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


# @{link} https://github.com/abel533 # @{link} https://github.com/abel533
#Mybatis #Mybatis


+ 35
- 0
mallinkMQConsumer/pom.xml Просмотреть файл

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<artifactId>mallink</artifactId>
<groupId>com.iformall</groupId>
<version>1.0</version>
</parent>

<artifactId>mallinkMQConsumer</artifactId>

<dependencies>
<dependency>
<groupId>com.iformall</groupId>
<artifactId>mallinkService</artifactId>
<version>1.0</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>

</project>

+ 35
- 0
mallinkMQConsumer/src/main/java/com/iformall/ConsumerApplication.java Просмотреть файл

@@ -0,0 +1,35 @@
package com.iformall;

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
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 springfox.documentation.swagger2.annotations.EnableSwagger2;
import tk.mybatis.spring.annotation.MapperScan;

/**
* @author chenkx
* @date 2017-12-26
*/
@SpringBootApplication
@MapperScan(basePackages = {"com.iformall.mapper"})
@EnableSwagger2
@EnableRocketMQ
@EnableEncryptableProperties
public class ConsumerApplication {

@Value("${fm.exception}")
private boolean fmException;

@Bean
public boolean isFmException() {
return fmException;
}


public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}

+ 52
- 0
mallinkMQConsumer/src/main/java/com/iformall/config/AwsProperty.java Просмотреть файл

@@ -0,0 +1,52 @@
package com.iformall.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
* @author Stormeye
*/
@Component
@ConfigurationProperties(prefix = "aws")
public class AwsProperty {
// AWS ACCESS KEY
private String access;

private String secret;

private String clientRegion;

private String bucketName;

public String getAccess() {
return access;
}

public void setAccess(String access) {
this.access = access;
}

public String getSecret() {
return secret;
}

public void setSecret(String secret) {
this.secret = secret;
}

public String getClientRegion() {
return clientRegion;
}

public void setClientRegion(String clientRegion) {
this.clientRegion = clientRegion;
}

public String getBucketName() {
return bucketName;
}

public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
}

+ 24
- 0
mallinkMQConsumer/src/main/java/com/iformall/config/PayProperty.java Просмотреть файл

@@ -0,0 +1,24 @@
package com.iformall.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
* @author Stormeye
*/
@Component
@ConfigurationProperties(prefix = "pay")
public class PayProperty {
/**
* 真实支付
*/
private boolean real;

public boolean isReal() {
return real;
}

public void setReal(boolean real) {
this.real = real;
}
}

+ 129
- 0
mallinkMQConsumer/src/main/java/com/iformall/config/RedisConfig.java Просмотреть файл

@@ -0,0 +1,129 @@
package com.iformall.config;

import com.iformall.domain.po.PushLimit;
import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxScoreRules;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
* Created by Stormeye on 2018/10/1.
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

//缓存管理器
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
/*
//user信息缓存配置
RedisCacheConfiguration userCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(10)).disableCachingNullValues().prefixKeysWith("user");
Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
redisCacheConfigurationMap.put("user", userCacheConfiguration);
//初始化一个RedisCacheWriter
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
// 设置CacheManager的值序列化方式为JdkSerializationRedisSerializer,但其实RedisCacheConfiguration默认就是使用StringRedisSerializer序列化key,JdkSerializationRedisSerializer序列化value,所以以下注释代码为默认实现
// ClassLoader loader = this.getClass().getClassLoader();
// JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer(loader);
// RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(jdkSerializer);
// RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();
//设置默认超过期时间是30秒
defaultCacheConfig.entryTtl(Duration.ofSeconds(30));
//初始化RedisCacheManager
RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, defaultCacheConfig, redisCacheConfigurationMap);
return cacheManager;
*/
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); // 生成一个默认配置,通过config对象即可对缓存进行自定义配置
config = config.entryTtl(Duration.ofMinutes(1)) // 设置缓存的默认过期时间,也是使用Duration设置
.disableCachingNullValues(); // 不缓存空值

// 设置一个初始化的缓存空间set集合
Set<String> cacheNames = new HashSet<>();
cacheNames.add("my-redis-cache1");
cacheNames.add("my-redis-cache2");

// 对每个缓存空间应用不同的配置
Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
configMap.put("my-redis-cache1", config);
configMap.put("my-redis-cache2", config.entryTtl(Duration.ofSeconds(120)));

RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory) // 使用自定义的缓存配置初始化一个cacheManager
.initialCacheNames(cacheNames) // 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
.withInitialCacheConfigurations(configMap)
.build();
return cacheManager;
}

@Bean("pushLimitRedisTemplate")
public RedisTemplate<String, PushLimit> getPushLimitRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, PushLimit> template = new RedisTemplate<String, PushLimit>();

Jackson2JsonRedisSerializer<PushLimit> j = new Jackson2JsonRedisSerializer<PushLimit>(PushLimit.class);
// value值的序列化
template.setValueSerializer(j);
template.setHashKeySerializer(j);

// key的序列化
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());

template.setConnectionFactory(connectionFactory);
return template;
}

@Bean("scoreRuleRedisTemplate")
public RedisTemplate<String, WxScoreRules> getScoreRuleRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, WxScoreRules> template = new RedisTemplate<String, WxScoreRules>();

Jackson2JsonRedisSerializer<WxScoreRules> j = new Jackson2JsonRedisSerializer<WxScoreRules>(WxScoreRules.class);
// value值的序列化
template.setValueSerializer(j);
template.setHashKeySerializer(j);

// key的序列化
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());

template.setConnectionFactory(connectionFactory);
return template;
}

@Bean("cuserTokenRedisTemplate")
public RedisTemplate<String, WxCUser> getCUserTokenRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, WxCUser> template = new RedisTemplate<String, WxCUser>();

Jackson2JsonRedisSerializer<WxCUser> j = new Jackson2JsonRedisSerializer<WxCUser>(WxCUser.class);
// value值的序列化
template.setValueSerializer(j);
template.setHashKeySerializer(j);

// key的序列化
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());

template.setConnectionFactory(connectionFactory);
return template;
}

}

+ 52
- 0
mallinkMQConsumer/src/main/java/com/iformall/config/RestFilter.java Просмотреть файл

@@ -0,0 +1,52 @@
package com.iformall.config;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Optional;

/**
* 前后端分离RESTful接口过滤器
*
* @author xuguoqin
*
*/
public class RestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = null;
if (request instanceof HttpServletRequest) {
req = (HttpServletRequest) request;
}
HttpServletResponse res = null;
if (response instanceof HttpServletResponse) {
res = (HttpServletResponse) response;
}
if (req != null && res != null) {
//设置允许传递的参数
res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
//设置允许带上cookie
res.setHeader("Access-Control-Allow-Credentials", "true");
String origin = Optional.ofNullable(req.getHeader("Origin")).orElse(req.getHeader("Referer"));
//设置允许的请求来源
res.setHeader("Access-Control-Allow-Origin", origin);
//设置允许的请求方法
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}

+ 24
- 0
mallinkMQConsumer/src/main/java/com/iformall/config/RestTemplateConfig.java Просмотреть файл

@@ -0,0 +1,24 @@
package com.iformall.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//ms
factory.setConnectTimeout(10000);//ms
return factory;
}
}

+ 79
- 0
mallinkMQConsumer/src/main/java/com/iformall/config/WebConfig.java Просмотреть файл

@@ -0,0 +1,79 @@
package com.iformall.config;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.List;

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
//registry.addResourceHandler("/app/**").addResourceLocations("classpath:/app/");

}

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
//ObjectMapper 是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();

//不显示为null的字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

DeserializationConfig dc = objectMapper.getDeserializationConfig();
// 设置反序列化日期格式、忽略不存在get、set的属性
objectMapper.setConfig(
dc.with(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))
.without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
);

//序列化将Long转String类型
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
SimpleModule bigIntegerModule = new SimpleModule();
//序列化将BigInteger转String类型
bigIntegerModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
SimpleModule bigDecimalModule = new SimpleModule();
//序列化将BigDecimal转String类型
bigDecimalModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
objectMapper.registerModule(bigDecimalModule);
objectMapper.registerModule(bigIntegerModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter);
}


}

+ 32
- 0
mallinkMQConsumer/src/main/java/com/iformall/controller/HomeController.java Просмотреть файл

@@ -0,0 +1,32 @@
package com.iformall.controller;

import com.iformall.common.ResultData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;



@RestController
@Api(description = "登录相关接口")
public class HomeController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Value("${version}")
private String version;

@Value("${spring.mail.username}")
private String from;

@ApiOperation("获取后端版本号")
@GetMapping("/version")
public ResultData version() {
return new ResultData(version);
}


}

+ 73
- 0
mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java Просмотреть файл

@@ -0,0 +1,73 @@
package com.iformall.mq;

import com.iformall.domain.po.*;
import com.iformall.enums.*;
import com.iformall.mapper.WxMsgRecordMapper;
import com.iformall.service.impl.SendCallBackSmsServiceImpl;
import com.iformall.service.impl.SendEmailServiceImpl;
import com.iformall.service.impl.SendSmartAppMsgServiceImpl;
import com.iformall.service.impl.SendSmsServiceImpl;
import com.iformall.utils.JsonUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
* 消息消费入口
*/
@Service
public class MqBaseConsumer {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
private WxMsgRecordMapper wxMsgRecordMapper;
@Autowired
private SendSmsServiceImpl sendSmsService;
@Autowired
private SendCallBackSmsServiceImpl sendCallBackSmsService;
@Autowired
private SendEmailServiceImpl sendEmailService;
@Autowired
private SendSmartAppMsgServiceImpl sendSmartAppMsgService;
@Autowired
private MqBaseProducer mqBaseProducer;

public void doMessage(String message) {
log.info("received message: {}", message);
BaseMsg baseMsg = null;

try {
baseMsg = (BaseMsg)JsonUtil.readValue(message,BaseMsg.class);

if(EnumMsgRecordType.SMS.getCode().equals(baseMsg.getMsgType())){
//短信
sendSmsService.send((WxMsgRecord)JsonUtil.readValue(message,WxMsgRecord.class));
}else if(EnumMsgRecordType.SMS_CALLBACK.getCode().equals(baseMsg.getMsgType())){
//业务短信
sendCallBackSmsService.send((WxMsg)JsonUtil.readValue(message,WxMsg.class));
}else if(EnumMsgRecordType.EMAIL.getCode().equals(baseMsg.getMsgType())){
//邮件
sendEmailService.send((MailMsg)JsonUtil.readValue(message,MailMsg.class));
}else if(EnumMsgRecordType.SMART_APP.getCode().equals(baseMsg.getMsgType())){
//微信小程序
sendSmartAppMsgService.send((SmartAppMsg)JsonUtil.readValue(message,SmartAppMsg.class));
}

baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_SUCC.getCode());
wxMsgRecordMapper.update(baseMsg);
}catch (Exception e){
//todo:测试下
if(null != baseMsg){
if(baseMsg.getDelayTimeLevel() < 3){
baseMsg.setDelayTimeLevel(3); //10s后重试
mqBaseProducer.sendMessage(baseMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode());
}else{
baseMsg.setStatusMessage(e.getMessage());
baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_FAIL.getCode());
wxMsgRecordMapper.update(baseMsg);
}
}
}

}
}

+ 42
- 0
mallinkMQConsumer/src/main/java/com/iformall/mq/impl/RabbitMqConsumer.java Просмотреть файл

@@ -0,0 +1,42 @@
package com.iformall.mq.impl;

import com.iformall.mq.MqBaseConsumer;
import com.iformall.mq.MQConfig;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
@Profile(MQConfig.Impl.RABBIT_MQ)
public class RabbitMqConsumer extends MqBaseConsumer {
String queueName = "topic-1";

@Autowired
private AmqpAdmin amqpAdmin;

@PostConstruct
public void init() {
DirectExchange exchange = new DirectExchange(queueName);
Queue queue = new Queue(queueName);
Binding binding = BindingBuilder.bind(queue).to(exchange).withQueueName();
amqpAdmin.declareExchange(exchange);
amqpAdmin.declareQueue(queue);
amqpAdmin.declareBinding(binding);
}

@Autowired
private AmqpTemplate rabbitTemplate;

public void send(String msg) {
rabbitTemplate.convertAndSend(queueName, msg);
}

@RabbitListener(queues = "topic-1")
public void onMessage(String message) {
doMessage(message);
}
}

+ 19
- 0
mallinkMQConsumer/src/main/java/com/iformall/mq/impl/RocketMqConsumer.java Просмотреть файл

@@ -0,0 +1,19 @@
package com.iformall.mq.impl;

import com.iformall.mq.MqBaseConsumer;
import com.iformall.mq.MQConfig;
import lombok.extern.slf4j.Slf4j;
import org.rocketmq.starter.annotation.RocketMQListener;
import org.rocketmq.starter.annotation.RocketMQMessage;
import org.springframework.context.annotation.Profile;

@Slf4j
@Profile(MQConfig.Impl.ROCKET_MQ)
@RocketMQListener(topic = "topic-1",consumeThreadMax=100,consumeThreadMin = 20)
public class RocketMqConsumer extends MqBaseConsumer {

@RocketMQMessage(messageClass = String.class, tag = "tag-1")
public void onMessage(String message) {
doMessage(message);
}
}

+ 89
- 0
mallinkMQConsumer/src/main/resources/application-dev.yml Просмотреть файл

@@ -0,0 +1,89 @@
spring:
profiles:
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
username: ENC(dZ8fmrtuBMQYaRytKQgTqg==)
password: ENC(WGu0+1DPIHrqorDhrbq1+7wr7xNG53mN)
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 28000
minEvictableIdleTimeMillis: 28000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000"
#jackson:
#date-format: yyyy-MM-dd HH:mm:ss

# REDIS
redis:
host: 202.165.179.86
port: 6379
password: ENC(aYJ3Wr2UWtkORRQjjrWWpz2ZeTISsHOA)
timeout: 3600
expire: 1800 #30分钟
database: 1
defaultExpiration: 2592000 # 默认生命周期30天
jedis:
pool:
max-active: 50
max-idle: 50
max-wait: -1
min-idle: 10
# EMAIL
mail:
host: smtp.exmail.qq.com
username: ENC(R0bER9E9OB9/YQcpNXMyYDwofNVb8/pFl4nrApS8mi0=)
password: ENC(50YqJd0iK/2r2YnmEd5RKaki3ktU73UDapBJrVYfqmc=) # 授权密码
properties:
mail:
smtp:
auth: true
starttls:
enable: true
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: fumao
password: f8l89&*%%u7f1t22
publisher-confirms: true
virtual-host: /

aws:
clientRegion: cn-northwest-1
bucketName: iformall-net
access: ENC(3gx5ghDFBqGrEhO3Wf8aYmXsnwHO7Cj3HNKJGOeUj0o=)
secret: ENC(HVKIJwCJKVXLlUpGlQPwNqJOlnpxn4xYuy91SH0seTSm2uAttIQHvA49fXWWax90v5wloIk0QuU=)


jasypt:
encryptor:
password: oRqdnDbK5pj3eMmB

fm:
exception: false

logging:
level:
tk.mybatis: debug
com.iformall.mapper: debug
path: ./logs/s

+ 75
- 0
mallinkMQConsumer/src/main/resources/application-prod.yml Просмотреть файл

@@ -0,0 +1,75 @@
spring:
profiles:
include: rocketMQ
# JDBC
datasource:
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallink?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true
username: ENC(NUzgQOdJnCbVLKT6BaX0aw==)
password: ENC(mvuoDRiu0jqYaKNRwwTuXZ6U7aoIaqsjdiPqTLgi/nY=)
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 28000
minEvictableIdleTimeMillis: 28000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000"
# REDIS
redis:
host: 127.0.0.1
port: 6379
password: ENC(8gYU47Fu93NUJPhwPCiPbAT+6VFA1YDx1egK4Z0Nl6w=)
timeout: 3600
expire: 1800 #30分钟
database: 1
defaultExpiration: 2592000 # 默认生命周期30天
jedis:
pool:
max-active: 8
max-idle: 8
max-wait: -1
min-idle: 0
# EMAIL
mail:
host: smtp.exmail.qq.com
username: ENC(I2YKxnRVPY7J1r/bwzwHOhQCjj3nVqCWEbVTJvBq7y0=)
password: ENC(APQMO9XQRzMKd0eap+oSSOYH9MQe/r5K0YFF9A9mizU=) # 授权密码
properties:
mail:
smtp:
auth: true
starttls:
enable: true
# RABBITMQ
rabbitmq:
host: localhost
port: 5672
username: ENC(lRmLd6EzgeY1RT5ktcHv9g==)
password: ENC(gBI8mCjr3OC0v57jcnSb660Ux7mW03K2oePgvohhg7w=)
publisher-confirms: true
virtual-host: /

aws:
clientRegion: cn-northwest-1
bucketName: iformall-net
access: ENC(a6SN1sZ1enNL49ypiOXkg/pPPAnZD8H4buQFTTKN08s=)
secret: ENC(5P5ff4bTMJUbXVR4ZsM03UHzOKZ4+Zg5Iutcdkyp/Quny/oXg+A4KpfwEyGarlLu3vQMJahGP5M=)



fm:
exception: true

logging:
level:
tk.mybatis: debug
com.iformall: debug
path: ./logs/s

+ 71
- 0
mallinkMQConsumer/src/main/resources/application-test.yml Просмотреть файл

@@ -0,0 +1,71 @@
spring:
# JDBC
datasource:
url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallinkTest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true
username: ENC(Uc0AjgkytxHHCwZrmDASWg==)
password: ENC(nV4Mi3bEbBx0Fj7uUyYH55eTaqsFMjKvmNzagicH4pc=)
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 28000
minEvictableIdleTimeMillis: 28000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000"
# REDIS
redis:
host: 127.0.0.1
port: 6379
password: ENC(QFwqv3NshvvGhFPiP8rwhvbnxk+rFSqhJi8Pw6TogSg=)
timeout: 3600
expire: 1800 #30分钟
database: 1
defaultExpiration: 2592000 # 默认生命周期30天
jedis:
pool:
max-active: 8
max-idle: 8
max-wait: -1
min-idle: 0
# EMAIL
mail:
host: smtp.exmail.qq.com
username: ENC(HFbRXtAFVxU36Hk0yT3reyvRuLrw3RhMlbxFj9Ev/VY=)
password: ENC(pk4+/3C5n2hMYmgi+VTqI4P1m77DllW8y4KElMXXmIo=) # 授权密码
properties:
mail:
smtp:
auth: true
starttls:
enable: true
# RABBITMQ
rabbitmq:
host: 127.0.0.1
port: 5672
username: ENC(aSRr6mnSryEqzHHz1hJf1g==)
password: ENC(GnjF/mdqKdvmDYC0tIIso7+20/jBALPw39tiWCYJ4iw=)
publisher-confirms: true
virtual-host: /

aws:
clientRegion: cn-northwest-1
bucketName: iformall-net
access: ENC(NCLcmjwKpAWdn/abD17OKIY7yKepVLWzEpqRYUlURCw=)
secret: ENC(TRcZqql0Rq5PExlMeH/4WiZ/i02b8FXKmLTBChJmbluTa1uoLS9LrHyNEMrqe1DK+QgOAdvqGBo=)

fm:
exception: true

logging:
level:
tk.mybatis: debug
com.iformall: debug
path: ./logs/s

+ 73
- 0
mallinkMQConsumer/src/main/resources/application.yml Просмотреть файл

@@ -0,0 +1,73 @@
server:
port: 5001
servlet:
context-path: /mq

spring:
application:
name: mallink
profiles:
active: dev
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: non_null
servlet:
multipart:
max-file-size: 2MB
max-request-size: 2MB
cache:
type: REDIS
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: /


# @{link} https://github.com/abel533
#Mybatis
mybatis:
type-aliases-package: com.iformall.domain.po
mapper-locations: classpath:mapper/*Mapper.xml
configuration:
map-underscore-to-camel-case: true
cache-enabled: true
lazy-loading-enabled: true
use-generated-keys: true
default-fetch-size: 100
default-statement-timeout: 10

#PageHelper
pagehelper:
helperDialect: mysql
reasonable: false
supportMethodsArguments: true
params: count=countSql
offset-as-page-num: true
page-size-zero: true
row-bounds-with-count: true

mapper:
mappers:
- com.iformall.common.CommonMapper

pay:
real: true


version: @project.version@

+ 100
- 0
mallinkMQConsumer/src/main/resources/logback-spring.xml Просмотреть файл

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
<!-- 外部指定路径 -->
<springProperty scop="context" name="logPath" source="logging.path" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] --%mdc{client}%msg%n</Pattern>
</encoder>
</appender>

<appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/trace.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logPath}/daily/trace.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
</appender>

<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logPath}/daily/info.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logPath}/daily/debug.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>


<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logPath}/daily/warn.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>



<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logPath}/daily/error.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<root level="TRACE">
<appender-ref ref="TRACE_FILE" />
<appender-ref ref="INFO_FILE" />
<!-- <appender-ref ref="DEBUG_FILE" /> -->
<!-- <appender-ref ref="WARN_FILE" /> -->
<appender-ref ref="ERROR_FILE" />
</root>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>

+ 2
- 0
mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java Просмотреть файл

@@ -1,6 +1,7 @@
package com.iformall; package com.iformall;


import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.rocketmq.starter.annotation.EnableRocketMQ;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -15,6 +16,7 @@ import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication @SpringBootApplication
@MapperScan(basePackages = {"com.iformall.mapper"}) @MapperScan(basePackages = {"com.iformall.mapper"})
@EnableSwagger2 @EnableSwagger2
@EnableRocketMQ
@EnableEncryptableProperties @EnableEncryptableProperties
public class ScheduleApplication { public class ScheduleApplication {




+ 18
- 0
mallinkSchedule/src/main/java/com/iformall/config/RedisConfig.java Просмотреть файл

@@ -1,6 +1,7 @@
package com.iformall.config; package com.iformall.config;


import com.iformall.domain.po.PushLimit; import com.iformall.domain.po.PushLimit;
import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxScoreRules; import com.iformall.domain.po.WxScoreRules;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -109,4 +110,21 @@ public class RedisConfig extends CachingConfigurerSupport {
return template; return template;
} }


@Bean("cuserTokenRedisTemplate")
public RedisTemplate<String, WxCUser> getCUserTokenRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, WxCUser> template = new RedisTemplate<String, WxCUser>();

Jackson2JsonRedisSerializer<WxCUser> j = new Jackson2JsonRedisSerializer<WxCUser>(WxCUser.class);
// value值的序列化
template.setValueSerializer(j);
template.setHashKeySerializer(j);

// key的序列化
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());

template.setConnectionFactory(connectionFactory);
return template;
}

} }

mallinkSchedule/src/main/java/com/iformall/schedule/SchedulingConfig.java → mallinkSchedule/src/main/java/com/iformall/config/SchedulingConfig.java Просмотреть файл

@@ -1,4 +1,4 @@
package com.iformall.schedule;
package com.iformall.config;


import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;

+ 19
- 0
mallinkSchedule/src/main/java/com/iformall/controller/HomeController.java Просмотреть файл

@@ -1,11 +1,18 @@
package com.iformall.controller; package com.iformall.controller;


import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxMsgRecord;
import com.iformall.mq.MQConfig;
import com.iformall.mq.MqBaseProducer;
import com.iformall.mq.impl.RabbitMqMessageProducer;
import com.iformall.mq.impl.RocketMqMessageProducer;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;


@@ -18,10 +25,22 @@ public class HomeController {
@Value("${version}") @Value("${version}")
private String version; private String version;


@Autowired
private MqBaseProducer mqBaseProducer;

@Autowired
private RabbitMqMessageProducer rabbitMqMessageProducer;



@ApiOperation("获取后端版本号") @ApiOperation("获取后端版本号")
@GetMapping("/version") @GetMapping("/version")
public ResultData version() { public ResultData version() {
return new ResultData(version); return new ResultData(version);
} }

@GetMapping("/mqtest")
public ResultData mqtest() {
mqBaseProducer.sendMessage(new WxMsgRecord(), "topic-1", "tag-1", "key-1");
return new ResultData();
}
} }

+ 47
- 105
mallinkSchedule/src/main/java/com/iformall/schedule/BillNotificationSchedule.java Просмотреть файл

@@ -1,25 +1,18 @@
package com.iformall.schedule; package com.iformall.schedule;


import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.iformall.common.IdWorker;
import com.iformall.domain.po.WxMsgCallback;
import com.iformall.domain.po.WxMsgConfig;
import com.iformall.domain.po.WxMsgValidationcode;
import com.iformall.domain.po.WxMsgValidationcodeModel;
import com.iformall.enums.EnumMsgModel;
import com.iformall.enums.EnumMsgSendStatus;
import com.iformall.enums.EnumVerifyCode;
import com.iformall.domain.po.*;
import com.iformall.enums.*;
import com.iformall.mapper.*; import com.iformall.mapper.*;
import com.iformall.utils.WiwideUtil;
import com.iformall.mq.MqBaseProducer;
import org.apache.commons.collections.map.HashedMap;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;

import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;


@@ -46,6 +39,9 @@ public class BillNotificationSchedule {
@Autowired @Autowired
private WxMsgCallbackMapper wxMsgCallbackMapper; private WxMsgCallbackMapper wxMsgCallbackMapper;


@Autowired
private MqBaseProducer mqBaseProducer;



/** /**
* 每天9点执行 * 每天9点执行
@@ -69,22 +65,17 @@ public class BillNotificationSchedule {
String phone = bill.get("linkPhone").toString(); String phone = bill.get("linkPhone").toString();
String appname = bill.get("appname").toString(); String appname = bill.get("appname").toString();
logger.info("欠缴账单检验短信配置信息"); logger.info("欠缴账单检验短信配置信息");
WxMsgConfig wxMsgConfig = checkMsgConfig(tenantId);
if (wxMsgConfig != null) {
logger.info("欠缴账单获取模板内容");
WxMsgValidationcodeModel wxMsgValidationcodeModel = getMsgModel(tenantId, EnumMsgModel.BILL_OWE.getCode());
if (wxMsgValidationcodeModel != null) {
String signature = wxMsgValidationcodeModel.getSignature();
String msg = wxMsgValidationcodeModel.getContent().
replace("{price}", price.toString()).
replace("{app}", appname);
String notifyUrl = wxMsgConfig.getNotifyurl();
String secret = wxMsgConfig.getSecret();
String bid = wxMsgConfig.getBid();
String publickey = wxMsgConfig.getPublickey();
sendWaitPayBillMsg(phone, signature, msg, notifyUrl, secret, bid, publickey);
}
}

WxMsgRecord wxMsgRecord = new WxMsgRecord();
wxMsgRecord.setMsgType(EnumMsgRecordType.SMS.getCode());
wxMsgRecord.setModelType(EnumMsgModel.BILL_OWE.getCode());
wxMsgRecord.setReceiver(phone);
wxMsgRecord.setTenantId(tenantId);
Map<String,String> map = new HashedMap();
map.put("price",price.toString());
map.put("app",appname);
wxMsgRecord.setDynamicContentMap(map);
mqBaseProducer.sendMessage(wxMsgRecord, EnumMsgMqTopic.DEFAULT.getCode(),EnumMsgMqTag.DEFAULT.getCode(),EnumMsgMqKey.DEFAULT.getCode());
} }
} }


@@ -100,87 +91,38 @@ public class BillNotificationSchedule {
String phone = bill.get("linkPhone").toString(); String phone = bill.get("linkPhone").toString();
String appname = bill.get("appname").toString(); String appname = bill.get("appname").toString();
logger.info("待缴账单检验短信配置信息"); logger.info("待缴账单检验短信配置信息");
WxMsgConfig wxMsgConfig = checkMsgConfig(tenantId);
if (wxMsgConfig != null) {
logger.info("待缴账单获取模板内容");
WxMsgValidationcodeModel wxMsgValidationcodeModel = getMsgModel(tenantId, EnumMsgModel.BILL_WAIT_PAY.getCode());
if (wxMsgValidationcodeModel != null) {
String signature = wxMsgValidationcodeModel.getSignature();
String msg = wxMsgValidationcodeModel.getContent().
replace("{price}", price.toString()).
replace("{date}", receiveDate).
replace("{app}", appname);
String notifyUrl = wxMsgConfig.getNotifyurl();
String secret = wxMsgConfig.getSecret();
String bid = wxMsgConfig.getBid();
String publickey = wxMsgConfig.getPublickey();
sendWaitPayBillMsg(phone, signature, msg, notifyUrl, secret, bid, publickey);
}
}
}

}

private WxMsgConfig checkMsgConfig(String tenantId) {
WxMsgConfig wxMsgConfig = new WxMsgConfig();
wxMsgConfig.setTenantId(tenantId);
List<WxMsgConfig> wxMsgConfigs = wxMsgConfigMapper.findList(wxMsgConfig);
if (wxMsgConfigs.size() == 0) {
logger.info("缺少系统短信配置");
return null;
}
wxMsgConfig = wxMsgConfigs.get(0);
if (wxMsgConfig.getRemains() == 0) {
logger.info("短信数量为0");
return null;
}
return wxMsgConfigs.get(0);
}

private WxMsgValidationcodeModel getMsgModel(String tenantId, Integer type) {
logger.info("获取通知模板-租户:" + tenantId + ",类型:" + type);
WxMsgValidationcodeModel wxMsgValidationcodeModel = new WxMsgValidationcodeModel();
wxMsgValidationcodeModel.setTenantId(tenantId);
wxMsgValidationcodeModel.setType(type);
List<WxMsgValidationcodeModel> list = wxMsgValidationcodelModelMapper.findList(wxMsgValidationcodeModel);
if (!list.isEmpty()) {
return wxMsgValidationcodelModelMapper.findList(wxMsgValidationcodeModel).get(0);
}
return null;
}


private void sendWaitPayBillMsg(String phone, String signature, String msg, String notifyUrl, String secret, String bid, String publickey) {
logger.info("开始调用迈外迪短信接口");
String result = WiwideUtil.sendMsg(secret, bid, publickey, phone, signature, msg, notifyUrl, EnumVerifyCode.YES.getCode().toString(), null);
logger.info("迈外迪短信接口返回值:" + result);
JSONObject jsonObjectResult = JSONObject.parseObject(result);
String ret = jsonObjectResult.get("ret").toString();
String batchNo = jsonObjectResult.get("data").toString();
if (ret.equals(EnumMsgSendStatus.MSG_SEND_SUCCESS.getCode())) {
final IdWorker idWorker = IdWorker.get();
WxMsgValidationcode wxMsgValidationcode = new WxMsgValidationcode();
wxMsgValidationcode.setId(idWorker.nextId());
wxMsgValidationcode.setCreatetime(new Date());
wxMsgValidationcodeMapper.insertSelective(wxMsgValidationcode);
addMsgCallback(wxMsgValidationcode, batchNo);
// WxMsgConfig wxMsgConfig = checkMsgConfig(tenantId);
// if (wxMsgConfig != null) {
// logger.info("待缴账单获取模板内容");
// WxMsgValidationcodeModel wxMsgValidationcodeModel = getMsgModel(tenantId, EnumMsgModel.BILL_WAIT_PAY.getCode());
// if (wxMsgValidationcodeModel != null) {
// String signature = wxMsgValidationcodeModel.getSignature();
// String msg = wxMsgValidationcodeModel.getContent().
// replace("{price}", price.toString()).
// replace("{date}", receiveDate).
// replace("{app}", appname);
// String notifyUrl = wxMsgConfig.getNotifyurl();
// String secret = wxMsgConfig.getSecret();
// String bid = wxMsgConfig.getBid();
// String publickey = wxMsgConfig.getPublickey();
// sendWaitPayBillMsg(phone, signature, msg, notifyUrl, secret, bid, publickey);
// }
// }

WxMsgRecord wxMsgRecord = new WxMsgRecord();
wxMsgRecord.setMsgType(EnumMsgRecordType.SMS.getCode());
wxMsgRecord.setModelType(EnumMsgModel.BILL_OWE.getCode());
wxMsgRecord.setReceiver(phone);
wxMsgRecord.setTenantId(tenantId);
Map<String,String> map = new HashedMap();
map.put("price",price.toString());
map.put("app",appname);
map.put("date",receiveDate);
wxMsgRecord.setDynamicContentMap(map);
mqBaseProducer.sendMessage(wxMsgRecord, EnumMsgMqTopic.DEFAULT.getCode(),EnumMsgMqTag.DEFAULT.getCode(),EnumMsgMqKey.DEFAULT.getCode());
} }
}


public void addMsgCallback(WxMsgValidationcode wxmsg, String batchNo) {
logger.info("验证码发送时主动添加回调记录开始...");
String phone = wxmsg.getPhone();
final IdWorker idWorker = IdWorker.get();
WxMsgCallback wxMsgCallback = new WxMsgCallback();
wxMsgCallback.setId(idWorker.nextId());
wxMsgCallback.setPhone(phone);
wxMsgCallback.setTenantId(wxmsg.getTenantId());
wxMsgCallback.setBatchNo(batchNo);
wxMsgCallback.setMsgId(wxmsg.getId());
wxMsgCallback.setStatus(EnumMsgSendStatus.MSG_SENDING.getCode());
wxMsgCallback.setCreatetime(new Date());
wxMsgCallbackMapper.insertSelective(wxMsgCallback);
logger.info("验证码发送时主动添加回调记录结束...");
} }



} }

+ 238
- 0
mallinkSchedule/src/main/java/com/iformall/schedule/ChartDataSchedule.java Просмотреть файл

@@ -0,0 +1,238 @@
package com.iformall.schedule;

import com.iformall.common.IdWorker;
import com.iformall.domain.dto.WxCUserBasicInfoDto;
import com.iformall.domain.po.WxChartDataEntity;
import com.iformall.domain.po.WxMall;
import com.iformall.domain.po.WxMerchantTradeDaily;
import com.iformall.enums.EnumCarCmd;
import com.iformall.enums.EnumChartType;
import com.iformall.mapper.*;
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 java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author gongbiao
*/
@Component
public class ChartDataSchedule {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
WxCarCmdLogMapper wxCarCmdLogMapper;

@Autowired
WxMallMapper wxMallMapper;

@Autowired
WxCUserCarMapper wxCUserCarMapper;

@Autowired
WxChartDataMapper wxChartDataMapper;

@Autowired
WxCouponOrderMapper wxCouponOrderMapper;

@Autowired
WxMerchantTradeDailyMapper wxMerchantTradeDailyMapper;


/**
* 每天7点执行
*/
@Scheduled(cron = "0 0 7 * * ?")
public void createData() {
createCarData();
createSaleData();
createMerchantTradeData();
}

/**
* 出场车辆、缴费车辆、缴费金额、新增会员、新增停车会员、已绑车辆
*/
public void createCarData() {
HashMap<String, Object> params = new HashMap<>();
params.put("cmdType", EnumCarCmd.CAR_ETCP_CALLBACK_PARK_OUT.getCode());
Date createtime = new Date();
String startdate = DateUtils.getTimeBefore(1, createtime);
Date date = DateUtils.stringToDate(startdate);
params.put("startdate", startdate + " 00:00:00");
params.put("enddate", startdate + " 23:59:59");

WxChartDataEntity wxChartDataEntity = new WxChartDataEntity();
wxChartDataEntity.setQuerytime(date);

List<WxMall> wxMalls = wxMallMapper.findList(null);
for (WxMall wxMall : wxMalls) {
String tenantId = wxMall.getTenantId();
params.put("tenantId", tenantId);
wxChartDataEntity.setTenantId(tenantId);
wxChartDataEntity.setType(EnumChartType.CAR_OUT.getCode());
int count = wxChartDataMapper.selectCount(wxChartDataEntity);
if (count == 0) {
logger.info("出场车数>>>>>>>>>>>>>>>>>>>>>>>>>>");
carOutData(params, createtime, date, tenantId);
}
wxChartDataEntity.setType(EnumChartType.CAR_PAID.getCode());
count = wxChartDataMapper.selectCount(wxChartDataEntity);
if (count == 0) {
params.put("cmdType", EnumCarCmd.CAR_ETCP_CALLBACK_PAY_MANUAL.getCode());
logger.info("缴费车辆>>>>>>>>>>>>>>>>>>>>>>>>>>");
carPaidData(params, createtime, date, tenantId);
}
wxChartDataEntity.setType(EnumChartType.CAR_PAY_FEE.getCode());
count = wxChartDataMapper.selectCount(wxChartDataEntity);
if (count == 0) {
logger.info("缴费金额>>>>>>>>>>>>>>>>>>>>>>>>>>");
carPayFeeData(params, createtime, date, tenantId);
}
wxChartDataEntity.setType(EnumChartType.CAR_MEMBER.getCode());
count = wxChartDataMapper.selectCount(wxChartDataEntity);
if (count == 0) {
logger.info("新增会员>>>>>>>>>>>>>>>>>>>>>>>>>>");
carMemberData(params, createtime, date, tenantId);
}
wxChartDataEntity.setType(EnumChartType.CAR_NEW_MEMBER.getCode());
count = wxChartDataMapper.selectCount(wxChartDataEntity);
if (count == 0) {
logger.info("新增停车会员>>>>>>>>>>>>>>>>>>>>>>>>>>");
carNewMemberData(createtime, date, tenantId);
}
wxChartDataEntity.setType(EnumChartType.CAR_BIND.getCode());
count = wxChartDataMapper.selectCount(wxChartDataEntity);
if (count == 0) {
logger.info("已绑车辆>>>>>>>>>>>>>>>>>>>>>>>>>>");
carBindData(params, createtime, date, tenantId);
}
}
}

/**
* 销售总交易额
*/
public void createSaleData() {
HashMap<String, Object> params = new HashMap<>();
Date createtime = new Date();
String yesterday = DateUtils.getTimeBefore(1, createtime);
String today = DateUtils.getSystemTime("yyyy-MM-dd");
Date startdate = DateUtils.stringToDate(yesterday);
Date enddate = DateUtils.stringToDate(today);

WxChartDataEntity wxChartDataEntity = new WxChartDataEntity();
wxChartDataEntity.setQuerytime(startdate);

List<WxMall> wxMalls = wxMallMapper.findList(null);
for (WxMall wxMall : wxMalls) {
String tenantId = wxMall.getTenantId();
params.put("tenantId", tenantId);
wxChartDataEntity.setTenantId(tenantId);
wxChartDataEntity.setType(EnumChartType.SALE_COUPON_PRICE.getCode());
int count = wxChartDataMapper.selectCount(wxChartDataEntity);
if (count == 0) {
logger.info("销售总交易额>>>>>>>>>>>>>>>>>>>>>>>>>>");
Integer price = wxCouponOrderMapper.queryPriceTotal(tenantId, startdate, enddate);
addChartData(tenantId, price.toString(), EnumChartType.SALE_COUPON_PRICE.getCode(), startdate, createtime);
}
}
}

/**
* 解单金额
*/
public void createMerchantTradeData() {
HashMap<String, Object> params = new HashMap<>();
Date createtime = new Date();
String yesterday = DateUtils.getTimeBefore(1, createtime);
Date querytime = DateUtils.stringToDate(yesterday);

WxChartDataEntity wxChartDataEntity = new WxChartDataEntity();
wxChartDataEntity.setQuerytime(querytime);

List<WxMall> wxMalls = wxMallMapper.findList(null);
for (WxMall wxMall : wxMalls) {
String tenantId = wxMall.getTenantId();
params.put("tenantId", tenantId);

wxChartDataEntity.setTenantId(tenantId);
wxChartDataEntity.setType(EnumChartType.MERCHANT_TRADE.getCode());
int count = wxChartDataMapper.selectCount(wxChartDataEntity);
if (count == 0) {
logger.info("解单金额>>>>>>>>>>>>>>>>>>>>>>>>>>");
WxMerchantTradeDaily wxMerchantTradeDaily = new WxMerchantTradeDaily();
wxMerchantTradeDaily.setTenantId(tenantId);
wxMerchantTradeDaily.setReportDate(yesterday);
List<WxMerchantTradeDaily> recordList = wxMerchantTradeDailyMapper.findTotalListOfMonth(wxMerchantTradeDaily);
Integer price = 0;
if (!recordList.isEmpty()) {
price = recordList.get(0).getTradeAmt();
}
addChartData(tenantId, price.toString(), EnumChartType.MERCHANT_TRADE.getCode(), querytime, createtime);
}
}
}


public void carBindData(HashMap<String, Object> params, Date createtime, Date date, String tenantId) {
Long todaybindcar = wxCUserCarMapper.queryCarCount(params);
addChartData(tenantId, todaybindcar.toString(), EnumChartType.CAR_BIND.getCode(), date, createtime);
}

public void carNewMemberData(Date createtime, Date date, String tenantId) {
WxCUserBasicInfoDto wxCUserBasicInfoDto = new WxCUserBasicInfoDto();
wxCUserBasicInfoDto.setTenantId(tenantId);
wxCUserBasicInfoDto.setStartTime(date);
wxCUserBasicInfoDto.setEndTime(date);
Integer carUserCount = wxCUserCarMapper.countUser(wxCUserBasicInfoDto);
addChartData(tenantId, carUserCount.toString(), EnumChartType.CAR_NEW_MEMBER.getCode(), date, createtime);
}

public void carMemberData(HashMap<String, Object> params, Date createtime, Date date, String tenantId) {
List<Map<String, Object>> carCountHistory = wxCUserCarMapper.queryCarCountHistory(params);
Long userCount = carCountHistory.isEmpty() ? 0L : (Long) carCountHistory.get(0).get("count");
addChartData(tenantId, userCount.toString(), EnumChartType.CAR_MEMBER.getCode(), date, createtime);
}

public void carPayFeeData(HashMap<String, Object> params, Date createtime, Date date, String tenantId) {
List<Map<String, Object>> weekCarPayHistoryList = wxCarCmdLogMapper.queryWeekCarPay(params);
BigDecimal fee = weekCarPayHistoryList.isEmpty() ? new BigDecimal(0) : (BigDecimal) weekCarPayHistoryList.get(0).get("fee");
addChartData(tenantId, fee.toString(), EnumChartType.CAR_PAY_FEE.getCode(), date, createtime);
}

public void carPaidData(HashMap<String, Object> params, Date createtime, Date date, String tenantId) {
Long carPayFeeCount = wxCarCmdLogMapper.queryWeekCarPayCount(params);
addChartData(tenantId, carPayFeeCount.toString(), EnumChartType.CAR_PAID.getCode(), date, createtime);
}

public void carOutData(HashMap<String, Object> params, Date createtime, Date date, String tenantId) {
List<Map<String, Object>> historylist = wxCarCmdLogMapper.queryHistory(params);
Long carOutCount = historylist.isEmpty() ? 0L : (Long) historylist.get(0).get("carcount");
addChartData(tenantId, carOutCount.toString(), EnumChartType.CAR_OUT.getCode(), date, createtime);
}

private void addChartData(String tenantId, String result, Integer type, Date querytime, Date createtime) {
logger.info("即将插入数据>>>>>>>>>>>>>>>>>>>>>>>");
final IdWorker idWorker = IdWorker.get();
long id = idWorker.nextId();
WxChartDataEntity wxChartDataEntity = new WxChartDataEntity();
wxChartDataEntity.setId(id);
wxChartDataEntity.setTenantId(tenantId);
wxChartDataEntity.setResult(result);
wxChartDataEntity.setType(type);
wxChartDataEntity.setQuerytime(querytime);
wxChartDataEntity.setCreatetime(createtime);
logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>" + wxChartDataEntity.toString());
wxChartDataMapper.insertSelective(wxChartDataEntity);
}

}

+ 44
- 1
mallinkSchedule/src/main/java/com/iformall/schedule/CouponExpiringSchedule.java Просмотреть файл

@@ -1,5 +1,10 @@
package com.iformall.schedule; package com.iformall.schedule;


import com.iformall.domain.po.WxCouponChannel;
import com.iformall.domain.po.WxGame;
import com.iformall.enums.EnumCouponChannelStatus;
import com.iformall.enums.EnumCouponChannelType;
import com.iformall.enums.EnumGameStatus;
import com.iformall.mapper.*; import com.iformall.mapper.*;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -9,6 +14,8 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;


import java.util.List;

@Component @Component
public class CouponExpiringSchedule { public class CouponExpiringSchedule {


@@ -23,6 +30,12 @@ public class CouponExpiringSchedule {
@Autowired @Autowired
private WxCouponSendMapper wxCouponSendMapper; private WxCouponSendMapper wxCouponSendMapper;


@Autowired
private WxScreenAdMapper wxScreenAdMapper;

@Autowired
private WxGameMapper wxGameMapper;



@Scheduled(cron = "0 5 0 * * ?") // 每天凌晨00:05 作废过期券,商户禁用券 @Scheduled(cron = "0 5 0 * * ?") // 每天凌晨00:05 作废过期券,商户禁用券
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
@@ -41,7 +54,6 @@ public class CouponExpiringSchedule {
wxCouponSendMapper.offExpiriedCouponSendByCouponStatus(); wxCouponSendMapper.offExpiriedCouponSendByCouponStatus();
} }



@Scheduled(cron = "0 10 0 * * ?") // 每天凌晨00:10 下架主动领取 @Scheduled(cron = "0 10 0 * * ?") // 每天凌晨00:10 下架主动领取
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
public void couponChannelExpiringSchedule() { public void couponChannelExpiringSchedule() {
@@ -51,9 +63,40 @@ public class CouponExpiringSchedule {
wxCouponChannelMapper.offExpiriedCouponChannelByCouponStatus(); wxCouponChannelMapper.offExpiriedCouponChannelByCouponStatus();
} }


@Scheduled(cron = "0 15 0 * * ?") // 每天凌晨00:15 下架券广告
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
public void screenAdExpiringSchedule() {
wxScreenAdMapper.offScreeAdByCouponChannelStatus();
}

@Scheduled(cron = "0 0,1,2,3 0/1 * * ?") // 每小时 0, 1 ,2 ,3 分钟(整点)执行//限时抢购 @Scheduled(cron = "0 0,1,2,3 0/1 * * ?") // 每小时 0, 1 ,2 ,3 分钟(整点)执行//限时抢购
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
public void couponChannel2ExpiringSchedule() { public void couponChannel2ExpiringSchedule() {
wxCouponChannelMapper.offExpiriedCouponChannel2ByEndTime(); wxCouponChannelMapper.offExpiriedCouponChannel2ByEndTime();
} }

@Scheduled(cron = "0 20 0 * * ?") // 每天凌晨00:20 下架游戏
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
public void gameExpiringSchedule() {
WxGame wxGame = new WxGame();
wxGame.setStatus(EnumGameStatus.STATUS_THROW_IN.getCode());

List<WxGame> list = wxGameMapper.findList(wxGame);
list.stream().forEach(g->{
WxCouponChannel couponChannel = new WxCouponChannel();
couponChannel.setTenantId(g.getTenantId());
couponChannel.setTargetAd(EnumCouponChannelType.COUPON_CHANNEL_ID_GAME.getCode());
couponChannel.setSubTargetId(g.getId());
couponChannel.setStatus(EnumCouponChannelStatus.STATUS_THROW_IN.getCode());
int count = wxCouponChannelMapper.countCouponChannel(couponChannel);
if (count == 0) {
WxGame record = new WxGame();
record.setId(g.getId());
record.setStatus(EnumGameStatus.STATUS_TAKE_OFFF.getCode());
wxGameMapper.updateByPrimaryKeySelective(record);
}
});
}


} }

+ 113
- 35
mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderExpiringSchedule.java Просмотреть файл

@@ -3,14 +3,14 @@ package com.iformall.schedule;
import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.config.PayProperty; import com.iformall.config.PayProperty;
import com.iformall.domain.dto.WxSharingOrderDto;
import com.iformall.domain.po.*; import com.iformall.domain.po.*;
import com.iformall.enums.EnumAppType;
import com.iformall.enums.EnumCouponOrderStatus;
import com.iformall.enums.EnumCouponType;
import com.iformall.enums.EnumPayType;
import com.iformall.enums.*;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.mapper.*; import com.iformall.mapper.*;
import com.iformall.service.WxOrderService;
import com.iformall.service.WxPayOrderService; import com.iformall.service.WxPayOrderService;
import com.iformall.service.WxProfitSharingOrderService;
import com.iformall.service.WxRefundOrderService; import com.iformall.service.WxRefundOrderService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -38,59 +38,137 @@ public class CouponOrderExpiringSchedule {
private WxRefundOrderService wxRefundOrderService; private WxRefundOrderService wxRefundOrderService;


@Autowired @Autowired
private WxPayOrderService wxPayOrderService;
private WxProfitSharingOrderService wxProfitSharingOrderService;


@Autowired @Autowired
private WxAppinfoMapper wxAppinfoMapper; private WxAppinfoMapper wxAppinfoMapper;


@Autowired
private WxPayOrderMapper wxPayOrderMapper;

@Autowired
private WxOrderMapper wxOrderMapper;

@Autowired
private WxOrderService wxOrderService;

@Scheduled(cron = "0 5 0 * * ?") // 每天凌晨00:05 @Scheduled(cron = "0 5 0 * * ?") // 每天凌晨00:05
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
// @Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
public void couponOrderExpiringSchedule() { public void couponOrderExpiringSchedule() {
wxCouponOrderMapper.offExpiredCouponOrderByValidDate();

List<WxCouponOrder> list = wxCouponOrderMapper.findExpiredFreeCouponOrderByValidDate();
list.stream().forEach(co -> {
// 券过期,更改状态及库存退回
try {
couponOrderExpire(co, true);
} catch (Exception e) {
logger.error(e.getMessage());
}

});

} }


@Scheduled(cron = "0 5 0 * * ?") // 每天凌晨00:05 @Scheduled(cron = "0 5 0 * * ?") // 每天凌晨00:05
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
// @Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
public void couponOrderRefundSchedule() { public void couponOrderRefundSchedule() {


List<WxCouponOrder> list = wxCouponOrderMapper.findExpiredCouponOrderByValidDate(); List<WxCouponOrder> list = wxCouponOrderMapper.findExpiredCouponOrderByValidDate();


list.parallelStream().forEach(co -> {
// 券过期与退款分离
couponOrderExpire(co);

if(!co.getCouponType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) {
// 非储值卡, 可以退款
WxAppinfo appinfo = new WxAppinfo();
appinfo.setTenantId(co.getTenantId());
appinfo.setType(EnumAppType.B.getCode());
appinfo = wxAppinfoMapper.findList(appinfo).get(0);

try {
wxRefundOrderService.createRefundOrder(payProperty.isReal(), appinfo, co.getId(), EnumPayType.PAY_AUTO_REFUND, null);
} catch (Exception e) {
logger.error("退款失败:"+e.getMessage()+"couponOrderId="+co.getId());
}
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());
} }


}); });
} }


private void couponOrderExpire(WxCouponOrder co) {


@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void couponOrderExpire(WxCouponOrder co, boolean bStockBack) {
// 标记 couponOrder过期 // 标记 couponOrder过期
WxCouponOrder wxCouponOrder = new WxCouponOrder();
wxCouponOrder.setId(co.getId());
WxCouponOrder updateRecord = new WxCouponOrder();
updateRecord.setId(co.getId());
if(co.getCouponType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { if(co.getCouponType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) {
wxCouponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_OVER_TIME.getCode()); // 卡线下退款
updateRecord.setCouponOrderStatus(EnumCouponOrderStatus.CARD_OVER_TIME.getCode()); // 卡线下退款
} else { } else {
wxCouponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode()); //券已过期
updateRecord.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode()); //券已过期
}
updateRecord.setUpdateDate(new Date());
wxCouponOrderMapper.updateByPrimaryKeySelective(updateRecord);

// 库存退回
if(bStockBack) {
WxOrder order = wxOrderMapper.selectByPrimaryKey(co.getOrderId());
if(order != null) {
wxOrderService.stockBack(order);
}
}
}

private 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.setTenantId(co.getTenantId());
appinfo.setType(EnumAppType.B.getCode());
appinfo = wxAppinfoMapper.findList(appinfo).get(0);

try {
wxRefundOrderService.createRefundOrder(payProperty.isReal(), appinfo, co.getId(), EnumPayType.PAY_AUTO_REFUND, null);
} catch (MallinkException e) {
logger.error("退款失败:"+e.getMessage()+"couponOrderId="+co.getId());
throw new MallinkException(e.getErrorCode(), e.getMessage());
}
} }
wxCouponOrder.setUpdateDate(new Date());
try {
wxCouponOrderMapper.updateByPrimaryKeySelective(wxCouponOrder);
} catch (Exception e) {
logger.error("db failed: couponOrder-" + wxCouponOrder.getId() + ", e:" + e.getMessage());

if (co.getAutoRefund().equals(EnumCouponAutoRefund.UNSUPPORTED.getCode())){
// 微信分账
try {
WxPayOrder wxPayOrder = new WxPayOrder();
wxPayOrder.setTenantId(co.getTenantId());
wxPayOrder.setOrderId(co.getOrderId());
wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());
wxPayOrder = wxPayOrderMapper.selectOne(wxPayOrder);
if (wxPayOrder != null && wxPayOrder.getShare().equals(EnumPayShare.YES.getCode())) {
WxSharingOrderDto wxSharingOrderDto = new WxSharingOrderDto();
wxSharingOrderDto.setcUserId(wxPayOrder.getcUserId());
wxSharingOrderDto.setMerchantId(0L);
wxSharingOrderDto.setType(EnumProfitSharingOrderType.PROFIT_SHARING_FINISH.getCode());
wxSharingOrderDto.setPayAmount(wxPayOrder.getPayAmount());
wxSharingOrderDto.setOrderId(wxPayOrder.getId());
wxSharingOrderDto.setPayTimeStart(wxPayOrder.getPayTimeStart());
wxSharingOrderDto.setPayTimeEnd(wxPayOrder.getPayTimeEnd());
wxSharingOrderDto.setTenantId(wxPayOrder.getTenantId());
wxSharingOrderDto.setTransactionId(wxPayOrder.getTransactionId());
wxSharingOrderDto.setShareAmount(wxPayOrder.getShareAmount());
wxProfitSharingOrderService.finishSharingOrder(wxSharingOrderDto);
}

} catch (MallinkException e) {
logger.error("券过期不退款: " + co.getId() + " ERROR:" + e.getMessage());
throw new MallinkException(e.getErrorCode(), e.getMessage());
}

if(bStockBack) {
// 库存退回
WxOrder order = wxOrderMapper.selectByPrimaryKey(co.getOrderId());
if(order != null) {
wxOrderService.stockBack(order);
}
}
} }
} }
} }

+ 0
- 3
mallinkSchedule/src/main/java/com/iformall/schedule/CouponSendSchedule.java Просмотреть файл

@@ -44,9 +44,6 @@ public class CouponSendSchedule {
@Autowired @Autowired
private WxCUserBasicInfoMapper wxCUserBasicInfoMapper; private WxCUserBasicInfoMapper wxCUserBasicInfoMapper;


@Autowired
private WxCUserMapper wxCUserMapper;

@Autowired @Autowired
private WxCouponSendMapper wxCouponSendMapper; private WxCouponSendMapper wxCouponSendMapper;




+ 58
- 0
mallinkSchedule/src/main/java/com/iformall/schedule/DeviceHbCheckSchedule.java Просмотреть файл

@@ -0,0 +1,58 @@
package com.iformall.schedule;

import com.iformall.domain.po.WxDevice;

import com.iformall.enums.EnumDeviceOnlineStatus;
import com.iformall.enums.EnumDeviceStatus;
import com.iformall.mapper.WxDeviceMapper;

import com.iformall.service.WxDeviceService;

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 java.util.Date;
import java.util.List;


@Component
public class DeviceHbCheckSchedule {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

private final int TIME_OUT_VALUE = 15 * 60 * 1000; //15分钟


@Autowired
WxDeviceMapper wxDeviceMapper;

@Scheduled(cron = "0 */5 * * * *?") // 每5分钟检查一次
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
public void deviceHbCheckSchedule() {

WxDevice wxDevice = new WxDevice();
wxDevice.setStatus(EnumDeviceStatus.VALID.getCode());
List<WxDevice> list = wxDeviceMapper.findList(wxDevice);

list.stream().forEach(d->{
WxDevice record = new WxDevice();
record.setId(d.getId());

if (d.getLastHbTime() == null) {
record.setOnlineStatus(EnumDeviceOnlineStatus.OFFLINE.getCode());
} else {
if (new Date().getTime() - d.getLastHbTime().getTime() > TIME_OUT_VALUE) {
record.setOnlineStatus(EnumDeviceOnlineStatus.OFFLINE.getCode());
} else {
record.setOnlineStatus(EnumDeviceOnlineStatus.ONLINE.getCode());
}
}
if (!d.getOnlineStatus().equals(record.getOnlineStatus())) {
wxDeviceMapper.updateByPrimaryKeySelective(record);
}
});
}

}

+ 54
- 54
mallinkSchedule/src/main/java/com/iformall/schedule/MsgSendingSchedule.java Просмотреть файл

@@ -1,24 +1,18 @@
package com.iformall.schedule; package com.iformall.schedule;


import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iformall.domain.po.WxMsg; import com.iformall.domain.po.WxMsg;
import com.iformall.domain.po.WxMsgConfig;
import com.iformall.domain.po.WxMsgModel;
import com.iformall.enums.EnumMsgSendStatus;
import com.iformall.enums.EnumMsgStatus;
import com.iformall.enums.EnumVerifyCode;
import com.iformall.enums.*;
import com.iformall.mapper.WxMsgConfigMapper; import com.iformall.mapper.WxMsgConfigMapper;
import com.iformall.mapper.WxMsgMapper; import com.iformall.mapper.WxMsgMapper;
import com.iformall.mapper.WxMsgModelMapper; import com.iformall.mapper.WxMsgModelMapper;
import com.iformall.mq.MqBaseProducer;
import com.iformall.utils.DateUtils; import com.iformall.utils.DateUtils;
import com.iformall.utils.WiwideUtil;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;

import java.util.List; import java.util.List;


/** /**
@@ -38,6 +32,9 @@ public class MsgSendingSchedule {
@Autowired @Autowired
private WxMsgModelMapper wxMsgModelMapper; private WxMsgModelMapper wxMsgModelMapper;


@Autowired
private MqBaseProducer mqBaseProducer;

/** /**
* 每小时第一分钟执行 * 每小时第一分钟执行
*/ */
@@ -46,60 +43,63 @@ public class MsgSendingSchedule {
logger.info("sendmsg定时任务启动"); logger.info("sendmsg定时任务启动");
String systemTime = DateUtils.getSystemTime("yyyy-MM-dd HH:00:00"); String systemTime = DateUtils.getSystemTime("yyyy-MM-dd HH:00:00");
WxMsg wxMsg = new WxMsg(); WxMsg wxMsg = new WxMsg();
wxMsg.setMsgType(EnumMsgRecordType.SMS_CALLBACK.getCode());
wxMsg.setIsright(0); wxMsg.setIsright(0);
wxMsg.setSendtime(systemTime); wxMsg.setSendtime(systemTime);
List<WxMsg> list = wxMsgMapper.findList(wxMsg); List<WxMsg> list = wxMsgMapper.findList(wxMsg);
logger.info("将要发送的短信列表:" + JSONArray.toJSONString(list)); logger.info("将要发送的短信列表:" + JSONArray.toJSONString(list));
for (WxMsg msg : list) { for (WxMsg msg : list) {
sendmsg(msg);
//sendmsg(msg);
mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(),null);
} }
logger.info("sendmsg定时任务结束"); logger.info("sendmsg定时任务结束");
} }


public void sendmsg(WxMsg wxMsg) {
logger.info("发送短信开始----------");
//从短信配置中查询密钥 bid 等信息
WxMsgConfig wxMsgConfig = new WxMsgConfig();
wxMsgConfig.setTenantId(wxMsg.getTenantId());
List<WxMsgConfig> wxMsgConfigs = wxMsgConfigMapper.findList(wxMsgConfig);
if (wxMsgConfigs.size() == 0) {
logger.info("短信相关配置不存在");
return;
}
wxMsgConfig = wxMsgConfigs.get(0);
if (wxMsgConfig.getRemains() == 0) {
logger.info("短信数量为0");
return;
}
if (wxMsgConfig.getRemains() < wxMsg.getExpectSendNumber()) {
logger.info("短信数量不足");
return;
}
String secret = wxMsgConfig.getSecret();
String bid = wxMsgConfig.getBid();
String publickey = wxMsgConfig.getPublickey();
String phone = wxMsg.getPhones();
String signature = wxMsg.getSignature();
String msg = wxMsg.getMsg();
String notifyUrl = wxMsgConfig.getNotifyurl();
Integer modelId = null;
Long modelIdParam = wxMsg.getModelId();
if (modelIdParam != null) {
WxMsgModel wxMsgModel = wxMsgModelMapper.selectByPrimaryKey(modelIdParam);
modelId = wxMsgModel.getModelId();
}
String result = WiwideUtil.sendMsg(secret, bid, publickey, phone, signature, msg, notifyUrl, EnumVerifyCode.NO.getCode().toString(), modelId);
logger.info("短信返回结果:" + result);
JSONObject jsonObjectResult = JSONObject.parseObject(result);
String ret = jsonObjectResult.get("ret").toString();
if (ret.equals("1")) {
wxMsg.setSendstatus(EnumMsgSendStatus.MSG_SEND_SUCCESS.getCode());
} else {
wxMsg.setSendstatus(EnumMsgSendStatus.MSG_SEND_FAIL.getCode());
}
wxMsg.setStatus(EnumMsgStatus.MSG_STATUS_SENDED.getCode());
wxMsgMapper.updateByPrimaryKeySelective(wxMsg);
logger.info("短信发送结束:" + jsonObjectResult.toJSONString());
}
// @Deprecated
// public void sendmsg(WxMsg wxMsg) {
// logger.info("发送短信开始----------");
// //从短信配置中查询密钥 bid 等信息
// WxMsgConfig wxMsgConfig = new WxMsgConfig();
// wxMsgConfig.setTenantId(wxMsg.getTenantId());
// List<WxMsgConfig> wxMsgConfigs = wxMsgConfigMapper.findList(wxMsgConfig);
// if (wxMsgConfigs.size() == 0) {
// logger.info("短信相关配置不存在");
// return;
// }
// wxMsgConfig = wxMsgConfigs.get(0);
// if (wxMsgConfig.getRemains() == 0) {
// logger.info("短信数量为0");
// return;
// }
// if (wxMsgConfig.getRemains() < wxMsg.getExpectSendNumber()) {
// logger.info("短信数量不足");
// return;
// }
// String secret = wxMsgConfig.getSecret();
// String bid = wxMsgConfig.getBid();
// String publickey = wxMsgConfig.getPublickey();
// String phone = wxMsg.getPhones();
// String signature = wxMsg.getSignature();
// String msg = wxMsg.getMsg();
// String notifyUrl = wxMsgConfig.getNotifyurl();
// Integer modelId = null;
// Long modelIdParam = wxMsg.getModelId();
// if (modelIdParam != null) {
// WxMsgModel wxMsgModel = wxMsgModelMapper.selectByPrimaryKey(modelIdParam);
// modelId = wxMsgModel.getModelId();
// }
// String result = WiwideUtil.sendMsg(secret, bid, publickey, phone, signature, msg, notifyUrl, EnumVerifyCode.NO.getCode().toString(), modelId);
// logger.info("短信返回结果:" + result);
// JSONObject jsonObjectResult = JSONObject.parseObject(result);
// String ret = jsonObjectResult.get("ret").toString();
// if (ret.equals("1")) {
// wxMsg.setSendstatus(EnumMsgSendStatus.MSG_SEND_SUCCESS.getCode());
// } else {
// wxMsg.setSendstatus(EnumMsgSendStatus.MSG_SEND_FAIL.getCode());
// }
// wxMsg.setStatus(EnumMsgStatus.MSG_STATUS_SENDED.getCode());
// wxMsgMapper.updateByPrimaryKeySelective(wxMsg);
// logger.info("短信发送结束:" + jsonObjectResult.toJSONString());
// }


} }

+ 89
- 13
mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java Просмотреть файл

@@ -1,10 +1,18 @@
package com.iformall.schedule; package com.iformall.schedule;


import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxOrder; import com.iformall.domain.po.WxOrder;
import com.iformall.domain.po.WxOrderGroup;
import com.iformall.enums.EnumAppType;
import com.iformall.enums.EnumOrderStatus; import com.iformall.enums.EnumOrderStatus;
import com.iformall.enums.EnumOrderType; import com.iformall.enums.EnumOrderType;
import com.iformall.enums.EnumRefundStatus;
import com.iformall.mapper.WxAppinfoMapper;
import com.iformall.mapper.WxOrderGroupMapper;
import com.iformall.mapper.WxOrderMapper; import com.iformall.mapper.WxOrderMapper;
import com.iformall.service.WxOrderGroupService;
import com.iformall.service.WxOrderService; import com.iformall.service.WxOrderService;
import com.iformall.service.WxRefundOrderService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +38,17 @@ public class OrderExpiringSchedule {
@Autowired @Autowired
WxOrderService wxOrderService; WxOrderService wxOrderService;


@Autowired
WxOrderGroupMapper wxOrderGroupMapper;

@Autowired
WxOrderGroupService wxOrderGroupService;

@Autowired
WxAppinfoMapper wxAppinfoMapper;

@Autowired
WxRefundOrderService wxRefundOrderService;


@Scheduled(cron = "0 */5 * * * *?") // 每5分钟检查一次 @Scheduled(cron = "0 */5 * * * *?") // 每5分钟检查一次
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
@@ -39,31 +58,67 @@ public class OrderExpiringSchedule {
Date curDate = new Date(); Date curDate = new Date();
Date expireDate = new Date(curDate.getTime() - TIME_OUT_VALUE ); Date expireDate = new Date(curDate.getTime() - TIME_OUT_VALUE );


// 券相关订单
// 券相关订单, 15分钟未支付, 订单过期
dateMap.put("type", EnumOrderType.COUPON.getCode()); dateMap.put("type", EnumOrderType.COUPON.getCode());
dateMap.put("endDate", expireDate); dateMap.put("endDate", expireDate);
List<WxOrder> orderCoupons = wxOrderMapper.findListOfUnpaidOrderByDate(dateMap); List<WxOrder> orderCoupons = wxOrderMapper.findListOfUnpaidOrderByDate(dateMap);
orderCoupons.parallelStream().forEach( o -> {
orderExpired(o);
orderCoupons.stream().forEach( o -> {
try {
orderExpired(o);
} catch (Exception e) {
logger.error(e.getMessage());
}
}); });


// 砍价相关订单
// 砍价相关订单, 已超过砍价结束时间, 订单过期
dateMap.put("type", EnumOrderType.COUPON.getCode()); dateMap.put("type", EnumOrderType.COUPON.getCode());
dateMap.put("endDate", curDate); dateMap.put("endDate", curDate);
List<WxOrder> orderPresss = wxOrderMapper.findListOfUnpaidPressOrderByDate(dateMap); List<WxOrder> orderPresss = wxOrderMapper.findListOfUnpaidPressOrderByDate(dateMap);
orderPresss.parallelStream().forEach( o -> {
orderPressExpired(o);
orderPresss.stream().forEach( o -> {
try {
orderPressExpired(o);
} catch (Exception e) {
logger.error(e.getMessage());
}
});

//拼团 过期与失败
List<WxOrderGroup> orderGroups = wxOrderGroupService.findList(null);
orderGroups.stream().forEach(g -> {
try {
wxOrderGroupService.updateGroupStatus(g);
} catch (Exception e) {
logger.error(e.getMessage());
}
}); });

//参团失败
WxOrder order = new WxOrder();
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode());
wxOrderMapper.select(order).parallelStream().forEach(o -> {
try {
returnMoney(o);
} catch (Exception e) {
logger.error("拼团订单退款失败" + e.getMessage());
}
});


} }


@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void orderExpired(WxOrder order) { public void orderExpired(WxOrder order) {
order.setUpdateDate(new Date());
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode());
wxOrderMapper.updateByPrimaryKeySelective(order);
WxOrder updateOrder = new WxOrder();
updateOrder.setId(order.getId());
updateOrder.setUpdateDate(new Date());
updateOrder.setOrderStatus(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode());
wxOrderMapper.updateByPrimaryKeySelective(updateOrder);

// 库存退回
wxOrderService.stockBack(order);


// 微信 关单 // 微信 关单
wxOrderService.orderClose(order);
wxOrderService.orderClose(updateOrder);


logger.info("\nFound " + order.getId() + "\n" logger.info("\nFound " + order.getId() + "\n"
+ " create at " + order.getCreateDate() +"\n" + " create at " + order.getCreateDate() +"\n"
@@ -73,10 +128,31 @@ public class OrderExpiringSchedule {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void orderPressExpired(WxOrder order) { public void orderPressExpired(WxOrder order) {
Date curDate = new Date(); Date curDate = new Date();
order.setUpdateDate(curDate);
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PRESS_OVERTIME.getCode());
wxOrderMapper.updateByPrimaryKeySelective(order);
WxOrder updateOrder = new WxOrder();
updateOrder.setId(order.getId());
updateOrder.setTenantId(order.getTenantId());
updateOrder.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PRESS_OVERTIME.getCode());
updateOrder.setUpdateDate(curDate);
wxOrderMapper.updateByPrimaryKeySelective(updateOrder);
// 库存退回
wxOrderService.stockBack(order);


logger.info("\n砍价订单: " + order.getId() + " create at " + order.getCreateDate() + " expired at " + curDate); logger.info("\n砍价订单: " + order.getId() + " create at " + order.getCreateDate() + " expired at " + curDate);
} }

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void returnMoney(WxOrder order) {

//获取APP信息
WxAppinfo appinfo = new WxAppinfo();
appinfo.setTenantId(order.getTenantId());
appinfo.setType(EnumAppType.C.getCode());
appinfo = wxAppinfoMapper.findList(appinfo).get(0);
//退款流程
boolean has = wxRefundOrderService.hasRefundOrder(order.getId(), EnumRefundStatus.REFUND_SUCCESS.getCode());
if (!has) {
wxRefundOrderService.returnMoney(appinfo, order.getId());
}
}

} }

+ 0
- 4
mallinkSchedule/src/main/java/com/iformall/schedule/SharingOrderResultSchedule.java Просмотреть файл

@@ -1,6 +1,5 @@
package com.iformall.schedule; package com.iformall.schedule;


import com.iformall.domain.po.WxPayOrder;
import com.iformall.domain.po.WxProfitSharingOrder; import com.iformall.domain.po.WxProfitSharingOrder;
import com.iformall.enums.EnumProfitSharingOrderStatus; import com.iformall.enums.EnumProfitSharingOrderStatus;
import com.iformall.mapper.*; import com.iformall.mapper.*;
@@ -24,9 +23,6 @@ public class SharingOrderResultSchedule {
@Autowired @Autowired
private WxProfitSharingOrderMapper wxProfitSharingOrderMapper; private WxProfitSharingOrderMapper wxProfitSharingOrderMapper;


@Autowired
private WxPayOrderMapper wxPayOrderMapper;

@Scheduled(cron = "0 15 0 * * ?") // 每天凌晨00:15更新分账结果 @Scheduled(cron = "0 15 0 * * ?") // 每天凌晨00:15更新分账结果
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
public void sharingOrderResultSchedule() { public void sharingOrderResultSchedule() {


+ 5
- 4
mallinkSchedule/src/main/java/com/iformall/schedule/WeChatAccessTokenSchedule.java Просмотреть файл

@@ -42,10 +42,11 @@ public class WeChatAccessTokenSchedule {
WxMaService wxMaService = MaUtil.getWeappService(appinfo); WxMaService wxMaService = MaUtil.getWeappService(appinfo);
try { try {
String accessToken = wxMaService.getAccessToken(true); String accessToken = wxMaService.getAccessToken(true);
appinfo.setAccessToken(accessToken);
appinfo.setLastTokenTime(new Date());
appinfo.setExpiresIn(7200);
wxAppinfoMapper.updateByPrimaryKey(appinfo);
WxAppinfo updateAppInfo = new WxAppinfo();
updateAppInfo.setAccessToken(accessToken);
updateAppInfo.setLastTokenTime(new Date());
updateAppInfo.setExpiresIn(7200);
wxAppinfoMapper.updateByPrimaryKeySelective(updateAppInfo);
} catch (WxErrorException e) { } catch (WxErrorException e) {
logger.error(e.getMessage()); logger.error(e.getMessage());
} catch (Exception e) { } catch (Exception e) {


Некоторые файлы не были показаны из-за большого количества измененных файлов

Загрузка…
Отмена
Сохранить