diff --git a/Jenkinsfile b/Jenkinsfile
deleted file mode 100644
index ed62484ad..000000000
--- a/Jenkinsfile
+++ /dev/null
@@ -1,42 +0,0 @@
-pipeline {
- agent any
- stages {
- stage('检出') {
- steps {
- checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
- userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])
- }
- }
- stage('构建') {
- steps {
- sh 'mvn -version'
- echo '构建中...'
- sh 'mvn -U clean package -Dmaven.test.skip=true'
- echo '构建完成.'
- archiveArtifacts(artifacts: '**/target/*.jar', fingerprint: true)
- }
- }
- stage('测试') {
- steps {
- echo '单元测试中...'
- echo '单元测试完成.'
- writeFile(file: 'TEST-demo.junit4.AppTest.xml', text: '''
-
-
-
-
-
-
-
- ''')
- junit '*.xml'
- }
- }
- stage('部署') {
- steps {
- echo '部署中...'
- echo '部署完成'
- }
- }
- }
-}
\ No newline at end of file
diff --git a/mallinkAdmin/pom.xml b/mallinkAdmin/pom.xml
index 23ad528c2..781777ca8 100644
--- a/mallinkAdmin/pom.xml
+++ b/mallinkAdmin/pom.xml
@@ -13,8 +13,8 @@
mallinkAdmin
- 3.3.0
- 3.3.0
+ 3.6.0
+ 3.6.0
@@ -49,7 +49,7 @@
org.flywaydb
flyway-core
- 5.1.4
+ 5.2.4
diff --git a/mallinkAdmin/src/main/java/com/iformall/advice/JsonpAdvice.java b/mallinkAdmin/src/main/java/com/iformall/advice/JsonpAdvice.java
deleted file mode 100644
index c07e0005c..000000000
--- a/mallinkAdmin/src/main/java/com/iformall/advice/JsonpAdvice.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.iformall.advice;
-
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice;
-
-@ControllerAdvice
-public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
- public JsonpAdvice() {
- super("callback");
- }
-}
diff --git a/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java b/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java
index 112d749b2..5252e3a6e 100644
--- a/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java
+++ b/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java
@@ -167,10 +167,10 @@ public class ShiroConfig {
}
@Bean
- public SecurityManager securityManager(@Qualifier("myRetryLimitCredentialsMatcher") MyRetryLimitCredentialsMatcher matcher) {
+ public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//设置realm.
- securityManager.setRealm(myShiroRealm(matcher));
+ securityManager.setRealm(myShiroRealm());
// 自定义缓存实现 使用redis
//securityManager.setCacheManager(cacheManager());
// 自定义session管理 使用redis
@@ -179,9 +179,9 @@ public class ShiroConfig {
}
@Bean
- public MyShiroRealm myShiroRealm(MyRetryLimitCredentialsMatcher matcher) {
+ public MyShiroRealm myShiroRealm() {
MyShiroRealm myShiroRealm = new MyShiroRealm();
- myShiroRealm.setCredentialsMatcher(matcher);
+ myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return myShiroRealm;
}
@@ -194,7 +194,6 @@ public class ShiroConfig {
*
* @return
*/
- @Bean(name = "myRetryLimitCredentialsMatcher")
public MyRetryLimitCredentialsMatcher hashedCredentialsMatcher() {
MyRetryLimitCredentialsMatcher hashedCredentialsMatcher = new MyRetryLimitCredentialsMatcher();
diff --git a/mallinkAdmin/src/main/java/com/iformall/config/WebConfig.java b/mallinkAdmin/src/main/java/com/iformall/config/WebConfig.java
index 0ee86ff05..0c0299e73 100644
--- a/mallinkAdmin/src/main/java/com/iformall/config/WebConfig.java
+++ b/mallinkAdmin/src/main/java/com/iformall/config/WebConfig.java
@@ -76,7 +76,7 @@ public class WebConfig implements WebMvcConfigurer {
*
* @return
*/
- @Bean
+ @Bean("myCharacterEncodingFilter")
public Filter characterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
diff --git a/mallinkAdmin/src/main/java/com/iformall/config/WechatMpConfig.java b/mallinkAdmin/src/main/java/com/iformall/config/WechatMpConfig.java
index 4dff6c762..4433386c9 100644
--- a/mallinkAdmin/src/main/java/com/iformall/config/WechatMpConfig.java
+++ b/mallinkAdmin/src/main/java/com/iformall/config/WechatMpConfig.java
@@ -1,9 +1,9 @@
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 me.chanjar.weixin.mp.config.WxMpConfigStorage;
+import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@@ -23,9 +23,8 @@ public class WechatMpConfig {
return wxMpService;
}
- @Bean
public WxMpConfigStorage wxConfigProvider(){
- WxMpInMemoryConfigStorage wxConfigProvider = new WxMpInMemoryConfigStorage();
+ WxMpDefaultConfigImpl wxConfigProvider = new WxMpDefaultConfigImpl();
wxConfigProvider.setAppId(wechatWebProperties.getAppId());
wxConfigProvider.setSecret(wechatWebProperties.getSecret());
return wxConfigProvider;
diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/mem/MemCouponController.java b/mallinkAdmin/src/main/java/com/iformall/controller/mem/MemCouponController.java
new file mode 100644
index 000000000..9a5d1f970
--- /dev/null
+++ b/mallinkAdmin/src/main/java/com/iformall/controller/mem/MemCouponController.java
@@ -0,0 +1,188 @@
+package com.iformall.controller.mem;
+
+import com.github.pagehelper.PageInfo;
+import com.iformall.annotation.SystemControllerLog;
+import com.iformall.common.ErrorCode;
+import com.iformall.common.ResultData;
+import com.iformall.controller.base.BaseController;
+import com.iformall.domain.po.*;
+import com.iformall.domain.po.base.BaseEntity;
+import com.iformall.domain.vo.WxCouponChannelVo;
+import com.iformall.enums.EnumCouponChannelStatus;
+import com.iformall.enums.EnumCouponChannelType;
+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.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("memCoupon")
+@Api(description = "会员券相关接口")
+public class MemCouponController extends BaseController {
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ @Autowired
+ private WxCouponChannelService couponChannelService;
+
+ @Autowired
+ private MemCouponFromDspService memCouponFromDspService;
+
+ @Autowired
+ private WxCouponService couponService;
+
+ @ApiOperation("已投放券列表接口")
+ @GetMapping("couponChannelList")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ @SystemControllerLog(description = "会员券管理-已投放列表")
+ public ResultData couponChannelList(Integer pageNum, Integer pageSize) {
+ logger.debug("[" + getIpAddr() + "] MemCouponController::list");
+ WxCouponChannel wxCouponChannel = new WxCouponChannel();
+ if (null == wxCouponChannel) {
+ wxCouponChannel = new WxCouponChannel();
+ }
+ wxCouponChannel.updateTenantInfo(getTenantInfo());
+ wxCouponChannel.setTargetAd(EnumCouponChannelType.COUPON_CHANNEL_ID_H5.getCode());
+ wxCouponChannel.setStatus(EnumCouponChannelStatus.STATUS_THROW_IN.getCode());
+ wxCouponChannel.setSortColumns(BaseEntity.SortField.UpdateDate_DESC);
+ final PageInfo page = couponChannelService.listPageCVo(wxCouponChannel, pageNum, pageSize);
+ return new ResultData(page);
+ }
+
+ @ApiOperation("已发放券列表接口")
+ @GetMapping("list")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ @SystemControllerLog(description = "会员券管理-列表")
+ public ResultData list(@ModelAttribute MemCouponFromDsp memCouponFromDsp, Integer pageNum, Integer pageSize) {
+ logger.debug("[" + getIpAddr() + "] MemCouponController::list");
+ if (null == memCouponFromDsp) {
+ memCouponFromDsp = new MemCouponFromDsp();
+ } else {
+ if (StringUtils.isBlank(memCouponFromDsp.getPhone())) {
+ memCouponFromDsp.setPhone(null);
+ }
+ }
+ memCouponFromDsp.updateTenantInfo(getTenantInfo());
+ memCouponFromDsp.setSortColumns(BaseEntity.SortField.CreateDate_DESC);
+ PageInfo page = memCouponFromDspService.listAsPage(memCouponFromDsp, pageNum, pageSize);
+ return new ResultData(page);
+ }
+
+ @ApiOperation("检查用户购买券是否可用")
+ @PostMapping("checkMemCoupon")
+ @SystemControllerLog(description = "会员券管理-检查")
+ public ResultData checkMemCoupon(@RequestBody MemCouponFromDsp memCouponFromDsp) {
+ logger.debug("[" + getIpAddr() + "] MemCouponController::add");
+ if (StringUtils.isBlank(memCouponFromDsp.getPhone())) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "phone必填");
+ }
+ if (memCouponFromDsp.getCouponChannelId() == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId必填");
+ }
+ memCouponFromDsp.updateTenantInfo(getTenantInfo());
+ WxCouponChannel couponChannel = couponChannelService.getById(memCouponFromDsp.getCouponChannelId());
+ if (memCouponFromDsp.getCouponId() == null) {
+ memCouponFromDsp.setCouponId(couponChannel.getCouponId());
+ }
+ // 1. 检查券是否已超限, 无剩余库存
+ WxCoupon coupon = couponService.getById(memCouponFromDsp.getCouponId());
+ if (coupon == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "券不存在:" + memCouponFromDsp.getCouponId());
+ }
+ MemCouponFromDsp couponQ = new MemCouponFromDsp() {{
+ updateTenantInfo(memCouponFromDsp);
+ setCouponId(memCouponFromDsp.getCouponId());
+ setStatus(0);
+ }};
+ Integer couponCount = memCouponFromDspService.countByInfo(couponQ);
+ if (coupon.getRemainInventory() <= couponCount) {
+ return new ResultData(ErrorCode.REMAIN_IS_EMPTY);
+ }
+ // 2. 检查此会员是否已超限, 达到券购买限制
+ couponQ = new MemCouponFromDsp() {{
+ updateTenantInfo(memCouponFromDsp);
+ setPhone(memCouponFromDsp.getPhone());
+ setCouponId(memCouponFromDsp.getCouponId());
+ }};
+ couponCount = memCouponFromDspService.countByInfo(couponQ);
+ if (coupon.getUseLimitQuantity() <= couponCount) {
+ return new ResultData(ErrorCode.ORDER_IS_LIMITED);
+ }
+ return new ResultData();
+ }
+
+ @ApiOperation("根据id更新接口")
+ @PostMapping("add")
+ @SystemControllerLog(description = "会员券管理-添加")
+ public ResultData add(@RequestBody MemCouponFromDsp memCouponFromDsp) {
+ logger.debug("[" + getIpAddr() + "] MemCouponController::add");
+ if (StringUtils.isBlank(memCouponFromDsp.getPhone())) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "phone必填");
+ }
+ if (memCouponFromDsp.getCouponChannelId() == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId必填");
+ }
+ memCouponFromDsp.updateTenantInfo(getTenantInfo());
+ WxCouponChannel couponChannel = couponChannelService.getById(memCouponFromDsp.getCouponChannelId());
+ if (memCouponFromDsp.getCouponId() == null) {
+ memCouponFromDsp.setCouponId(couponChannel.getCouponId());
+ }
+ // 1. 检查券是否已超限, 无剩余库存
+ WxCoupon coupon = couponService.getById(memCouponFromDsp.getCouponId());
+ if (coupon == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "券不存在:" + memCouponFromDsp.getCouponId());
+ }
+ MemCouponFromDsp couponQ = new MemCouponFromDsp() {{
+ updateTenantInfo(memCouponFromDsp);
+ setCouponId(memCouponFromDsp.getCouponId());
+ setStatus(0);
+ }};
+ Integer couponCount = memCouponFromDspService.countByInfo(couponQ);
+ if (coupon.getRemainInventory() <= couponCount) {
+ return new ResultData(ErrorCode.REMAIN_IS_EMPTY);
+ }
+ // 2. 检查此会员是否已超限, 达到券购买限制
+ couponQ = new MemCouponFromDsp() {{
+ updateTenantInfo(memCouponFromDsp);
+ setPhone(memCouponFromDsp.getPhone());
+ setCouponId(memCouponFromDsp.getCouponId());
+ }};
+ couponCount = memCouponFromDspService.countByInfo(couponQ);
+ if (coupon.getUseLimitQuantity() <= couponCount) {
+ return new ResultData(ErrorCode.ORDER_IS_LIMITED);
+ }
+ // 3. 保存
+ memCouponFromDsp.setStatus(0);
+ memCouponFromDspService.saveOrUpdate(memCouponFromDsp);
+ return new ResultData();
+ }
+
+ @ApiOperation("根据手机号查询接口")
+ @GetMapping("/findByPhone")
+ @ApiImplicitParam(name = "phone", value = "phone", dataType = "String", paramType = "query", required = true)
+ @SystemControllerLog(description = "会员券管理-根据手机号查询接口")
+ public ResultData findByPhone(String phone) {
+ logger.debug("[" + getIpAddr() + "] MemCouponController::findByPhone");
+ if (StringUtils.isEmpty(phone)) {
+ return new ResultData(new ArrayList());
+ }
+ MemCouponFromDsp memQ = new MemCouponFromDsp() {{
+ updateTenantInfo(getTenantInfo());
+ setPhone(phone);
+ }};
+ List memCouponFromDsps = memCouponFromDspService.getList(memQ);
+ return new ResultData(memCouponFromDsps);
+ }
+}
\ No newline at end of file
diff --git a/mallinkAdmin/src/main/resources/application-dev.yml b/mallinkAdmin/src/main/resources/application-dev.yml
index 74fcc21dd..80e467d64 100644
--- a/mallinkAdmin/src/main/resources/application-dev.yml
+++ b/mallinkAdmin/src/main/resources/application-dev.yml
@@ -4,8 +4,8 @@ spring:
# JDBC
datasource:
url: jdbc:mysql://127.0.0.1:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true&allowMultiQueries=true
- username: ENC(dZ8fmrtuBMQYaRytKQgTqg==)
- password: ENC(IKH7HxMZwIqMttMc9+QsqWa1KMsJvTs4)
+ username: root
+ password: root
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat
@@ -26,9 +26,9 @@ spring:
#date-format: yyyy-MM-dd HH:mm:ss
# REDIS
redis:
- host: 202.165.179.86
+ host: 127.0.0.1
port: 6379
- password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk)
+ password: test123
timeout: 3600
expire: 1800 #30分钟
database: 1
@@ -73,7 +73,7 @@ spring:
publisher-returns: false
virtual-host: /
flyway:
- enabled: true
+ enabled: false
aws:
clientRegion: cn-northwest-1
@@ -92,9 +92,9 @@ wechat:
componentToken: "formall2018"
componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN"
redis:
- host: 202.165.179.86
+ host: 127.0.0.1
port: 6379
- password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk)
+ password:
timeout: 3600
expire: 1800 #30分钟
database: 2
diff --git a/mallinkAdmin/src/main/resources/db/migration/V201912142010__MENU_CHANGED.sql b/mallinkAdmin/src/main/resources/db/migration/V201912142010__MENU_CHANGED.sql
new file mode 100644
index 000000000..797ed6b1b
--- /dev/null
+++ b/mallinkAdmin/src/main/resources/db/migration/V201912142010__MENU_CHANGED.sql
@@ -0,0 +1,29 @@
+
+INSERT INTO `mall_permission` (`id`, `name`, `parent_id`, `available`, `permission`, `resource_type`, `module_color`, `module_color_num`, `url`, `icon`, `version_type`, `sort`)
+VALUES
+ (686, 'h5投放', 606, 'Y', NULL, 1, NULL, NULL, 'sendweb', null, 0, 686);
+
+DROP TABLE IF EXISTS `mall_sale_type` ;
+CREATE TABLE `mall_sale_type` (
+ `id` bigint(64) NOT NULL,
+ `name` varchar(32) DEFAULT NULL COMMENT '销售类型',
+ `type` tinyint(2) DEFAULT NULL COMMENT '资源类型1:尊享全能版 2:尊享营销版 3.速享版',
+ `period` tinyint(2) DEFAULT NULL COMMENT '有效期(单位月)',
+ `menus` json DEFAULT NULL COMMENT '菜单列表',
+ PRIMARY KEY (`id`),
+ UNIQUE `id_UNIQUE` USING BTREE (`id`) comment ''
+) ENGINE=`InnoDB` ROW_FORMAT=DYNAMIC COMMENT='系统销售表' CHECKSUM=0 DELAY_KEY_WRITE=0;
+
+INSERT INTO `mall_sale_type`
+ (`id`,`name`, `type`, `period`, `menus`)
+VALUES
+ (1, '尊享全能版', 1, 12,
+ '[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 50, 101, 102, 103, 104, 105, 106, 107, 108, 201, 202, 203, 204, 205, 206, 211, 212, 221, 222, 251, 299, 300, 301, 302, 303, 304, 305, 306, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513, 521, 522, 523, 531, 532, 533, 591, 592, 595, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 621, 622, 623, 624, 625, 626, 627, 641, 642, 643, 644, 645, 651, 661, 662, 663, 671, 672, 673,674, 675, 681, 682, 683, 684, 685, 686, 691, 692, 693, 694, 695, 701, 702, 703, 711, 712, 713, 901, 902, 903, 931, 932, 951, 952, 961, 962,963, 965, 966, 967, 968, 1001, 1002, 1003, 1004]'
+ ),
+ (2, '尊享营销版', 2, 12,
+ '[1, 2, 4, 5, 6, 7, 8, 9, 10, 50, 101, 102, 103, 104, 105, 106, 107, 201, 202, 203, 204, 205, 211, 212, 221, 222, 251, 409, 410, 411, 416, 501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513, 521, 522, 523, 531, 532, 533, 591, 592, 595, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 621, 622, 623, 624, 625, 626, 627, 641, 642, 643, 644, 645, 651, 661, 662, 663, 671, 672, 673, 674, 675, 681, 682, 683, 684, 685, 686, 691, 692, 693, 694, 695, 701, 702, 703, 711, 712, 713, 901, 902, 903, 931, 932, 951, 961]'
+ ),
+ (3, '速享版', 3, 1,
+ '[2, 4, 5, 6, 7, 10, 50, 201, 202, 205, 211, 212, 221, 222, 251, 409, 410, 411, 416, 501, 502, 503, 504, 505, 506, 507, 508, 511, 512, 513, 521, 522, 523, 531, 532, 533, 591, 592, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 621, 622, 623, 624, 625, 626, 641, 642, 643, 644, 645, 651, 661, 662, 663, 671, 672, 673, 674, 675, 681, 682, 683, 684, 685, 686, 691, 692, 693, 694, 695, 701, 702, 703, 711, 712, 713, 901, 902, 903, 931, 932]'
+ )
+ ;
diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java
index e7f88e6bd..14be16e0f 100644
--- a/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java
+++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java
@@ -14,10 +14,7 @@ import com.iformall.domain.vo.WxMerchantVo;
import com.iformall.enums.*;
import com.iformall.exception.MallinkException;
import com.iformall.service.*;
-import com.iformall.utils.car.DaHuaUtil;
-import com.iformall.utils.car.ETCPUtil;
-import com.iformall.utils.car.ShangAnUtil;
-import com.iformall.utils.car.TJDUtil;
+import com.iformall.utils.car.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -598,6 +595,8 @@ public class WxCarController extends BaseController {
return tjdCarStopFee(paramMap, park);
} else if (park.getVendorType().equals(EnumCarVendor.CAR_DAHUA.getCode())) {
return dahuaCarStopFee(paramMap, park);
+ } else if (park.getVendorType().equals(EnumCarVendor.CAR_BOLINK.getCode())) {
+ return bolinkCarStopFee(paramMap, park);
}
return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "停车费获取失败");
}
@@ -696,6 +695,27 @@ public class WxCarController extends BaseController {
return businessId;
}
+ private ResultData bolinkCarStopFee(@RequestBody Map paramMap, WxPark park) {
+ String carNumber = paramMap.get("carNumber");
+ if (StringUtils.isBlank(carNumber)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
+ }
+ String params = park.getVendorParams();
+ JSONObject objParams = JSON.parseObject(params);
+ String url = objParams.getString(BoLinkUtil.BOLINK_URL);
+ String comid = objParams.getString(BoLinkUtil.BOLINK_COMID);
+ String unionId = objParams.getString(BoLinkUtil.BOLINK_UNION_ID);
+ String key = objParams.getString(BoLinkUtil.BOLINK_KEY);
+ String ret = BoLinkUtil.getStopFee(url, comid, unionId, key, carNumber);
+ JSONObject retObj = JSON.parseObject(ret);
+ JSONObject dataObj = retObj.getJSONObject(BoLinkUtil.BOLINK_DATA);
+ if (dataObj.getIntValue(BoLinkUtil.BOLINK_STATE) == BoLinkUtil.BOLINK_SUCCESS) {
+ return new ResultData(dataObj);
+ } else {
+ return new ResultData(ErrorCode.BOLINK_STOP_FEE_FAIL);
+ }
+ }
+
/**
* 优免券领取
* 优免券不可退
diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java
index bf52be1c0..c89fe5e25 100644
--- a/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java
+++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java
@@ -56,15 +56,16 @@ public class WxCardPayController extends BaseController {
@ApiOperation(value = "C端扫B端储值卡支付订单", notes = "params:{\"cardId\":\"String\",\"merchantId\":\"String\",\"totalFee\":\"String(元)\"}")
@PostMapping("order_create")
public ResultData saveCardPayOrder(@RequestBody Map paramMap, HttpServletRequest request) {
+ String ipStr = getIpAddr();
+ logger.info("saveCardPayOrder: " + ipStr + " :" + paramMap.toString());
WxCUser user = getUser();
WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(user.getId());
if (null != wxCUserBasicInfo && EnumCreditLockedStatus.CLOSE.getCode().equals(wxCUserBasicInfo.getStatus())) {
+ logger.error(ErrorCode.MEMBER_IS_LOCKED.getMessage());
return new ResultData(ErrorCode.MEMBER_IS_LOCKED);
}
- String ipStr = getIpAddr();
- logger.info("saveCardPayOrder: " + ipStr + " :" + paramMap.toString());
String cardIdStr = paramMap.get("cardId");
String merchantStr = paramMap.get("merchantId");
String totalFeeStr = paramMap.get("totalFee");
@@ -169,7 +170,7 @@ public class WxCardPayController extends BaseController {
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData cardSpendList(@ModelAttribute WxCardSpendVo wxCardSpend, Integer pageNum, Integer pageSize) {
String ipStr = getIpAddr();
- logger.info("saveCardPayOrder: " + ipStr + " :" + wxCardSpend.toString());
+ logger.info("list: " + ipStr + " :" + wxCardSpend.toString());
if (wxCardSpend == null) wxCardSpend = new WxCardSpendVo();
wxCardSpend.updateTenantInfo(getTenantInfo());
wxCardSpend.setOwnerId(getUserId());
diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java
index 6a981fa09..11b419bdb 100644
--- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java
+++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponOrderController.java
@@ -3,13 +3,16 @@ package com.iformall.controller;
import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData;
+import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.base.BaseEntity;
import com.iformall.domain.po.WxCouponOrder;
+import com.iformall.domain.po.base.TenantEntity;
import com.iformall.domain.vo.WxCardCVo;
import com.iformall.domain.vo.WxCouponOrderCVo;
import com.iformall.enums.EnumCouponChannelActivityStatus;
import com.iformall.enums.EnumCouponOrderStatus;
import com.iformall.enums.EnumCouponOrderValidStatus;
+import com.iformall.service.MemCouponFromDspService;
import com.iformall.service.WxCouponOrderService;
import com.iformall.utils.Constant;
import io.swagger.annotations.Api;
@@ -34,6 +37,9 @@ public class WxCouponOrderController extends BaseController {
@Autowired
private WxCouponOrderService wxCouponOrderService;
+ @Autowired
+ private MemCouponFromDspService memCouponFromDspService;
+
@Autowired
StringRedisTemplate stringRedisTemplate;
@@ -231,4 +237,13 @@ public class WxCouponOrderController extends BaseController {
return wxCouponOrderService.queryCardStatus(wxCouponOrder);
}
+ @ApiOperation(value = "检查H5券码是否都已注入")
+ @GetMapping("checkH5CouponOrder")
+ public ResultData checkH5CouponOrder() {
+ TenantEntity tenantEntity = getTenantInfo();
+ WxCUser user = getUser();
+ memCouponFromDspService.couponOrderFromDsp(tenantEntity, user.getPhone());
+ return new ResultData();
+ }
+
}
diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java
index b2806096c..980d59aab 100755
--- a/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java
+++ b/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java
@@ -92,6 +92,9 @@ public class WxUserGrantController extends BaseController {
@Autowired
WxCreditHistoryService wxCreditHistoryService;
+ @Autowired
+ private MemCouponFromDspService memCouponFromDspService;
+
/**
* 微信消息服务验证
*
@@ -530,8 +533,10 @@ public class WxUserGrantController extends BaseController {
// 首次授权, 增加成长值及积分
// 成长值
user.setScore(user.getScore() + wxScoreRulesService.addScore(EnumScoreType.WECHAT_PHONE, user));
- //增加积分
+ // 增加积分
wxCUserService.addCredit(user, EnumScoreType.WECHAT_PHONE);
+ // 外部注券
+ memCouponFromDspService.couponOrderFromDsp(tenantEntity, phoneNoInfo.getPhoneNumber());
}
resultMap.put("msg", "授权手机成功!");
diff --git a/mallinkCallback/pom.xml b/mallinkCallback/pom.xml
index 2a4dba723..1feccd436 100644
--- a/mallinkCallback/pom.xml
+++ b/mallinkCallback/pom.xml
@@ -13,8 +13,8 @@
mallinkCallback
- 3.3.0
- 3.3.0
+ 3.6.0
+ 3.6.0
diff --git a/mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java b/mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java
index 8fe04734d..71ad373c3 100644
--- a/mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java
+++ b/mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java
@@ -160,10 +160,10 @@ public class ShiroConfig {
}
@Bean
- public SecurityManager securityManager(@Qualifier("myRetryLimitCredentialsMatcher") MyRetryLimitCredentialsMatcher matcher) {
+ public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//设置realm.
- securityManager.setRealm(myShiroRealm(matcher));
+ securityManager.setRealm(myShiroRealm());
// 自定义缓存实现 使用redis
//securityManager.setCacheManager(cacheManager());
// 自定义session管理 使用redis
@@ -172,9 +172,9 @@ public class ShiroConfig {
}
@Bean
- public MyShiroRealm myShiroRealm(MyRetryLimitCredentialsMatcher matcher) {
+ public MyShiroRealm myShiroRealm() {
MyShiroRealm myShiroRealm = new MyShiroRealm();
- myShiroRealm.setCredentialsMatcher(matcher);
+ myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return myShiroRealm;
}
@@ -187,7 +187,6 @@ public class ShiroConfig {
*
* @return
*/
- @Bean(name = "myRetryLimitCredentialsMatcher")
public MyRetryLimitCredentialsMatcher hashedCredentialsMatcher() {
MyRetryLimitCredentialsMatcher hashedCredentialsMatcher = new MyRetryLimitCredentialsMatcher();
diff --git a/mallinkCallback/src/main/java/com/iformall/config/WebConfig.java b/mallinkCallback/src/main/java/com/iformall/config/WebConfig.java
index c736af6d3..69232a7cf 100644
--- a/mallinkCallback/src/main/java/com/iformall/config/WebConfig.java
+++ b/mallinkCallback/src/main/java/com/iformall/config/WebConfig.java
@@ -39,7 +39,7 @@ public class WebConfig implements WebMvcConfigurer {
@Autowired
private RequestInterceptor requestInterceptor;
- @Bean
+ @Bean("myRequestMappingHandlerAdapter")
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();
@@ -114,7 +114,7 @@ public class WebConfig implements WebMvcConfigurer {
*
* @return
*/
- @Bean
+ @Bean("myCharacterEncodingFilter")
public Filter characterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
diff --git a/mallinkCallback/src/main/java/com/iformall/config/WechatMpConfig.java b/mallinkCallback/src/main/java/com/iformall/config/WechatMpConfig.java
deleted file mode 100644
index 4dff6c762..000000000
--- a/mallinkCallback/src/main/java/com/iformall/config/WechatMpConfig.java
+++ /dev/null
@@ -1,33 +0,0 @@
-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;
- }
-}
diff --git a/mallinkCallback/src/main/java/com/iformall/config/WechatWebProperties.java b/mallinkCallback/src/main/java/com/iformall/config/WechatWebProperties.java
deleted file mode 100644
index 0b9047399..000000000
--- a/mallinkCallback/src/main/java/com/iformall/config/WechatWebProperties.java
+++ /dev/null
@@ -1,59 +0,0 @@
-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);
- }
-}
diff --git a/mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java b/mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java
index 122217524..497cb5623 100644
--- a/mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java
+++ b/mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java
@@ -13,9 +13,7 @@ import com.iformall.enums.EnumBoxRegisterStatus;
import com.iformall.service.kw.KwBoxCmdHistoryService;
import com.iformall.service.kw.KwBoxService;
-import com.iformall.utils.HashUtil;
import com.iformall.utils.Utility;
-import com.sun.crypto.provider.HmacSHA1;
import io.netty.util.internal.StringUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
diff --git a/mallinkCallback/src/main/resources/application-dev.yml b/mallinkCallback/src/main/resources/application-dev.yml
index 8862be1a5..52edc0080 100644
--- a/mallinkCallback/src/main/resources/application-dev.yml
+++ b/mallinkCallback/src/main/resources/application-dev.yml
@@ -117,6 +117,5 @@ fm:
logging:
level:
- tk.mybatis: debug
com.iformall: debug
path: ./logs/admin
\ No newline at end of file
diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/MsgReSendSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/MsgReSendSchedule.java
index 2657b1f3f..776e8d00f 100644
--- a/mallinkSchedule/src/main/java/com/iformall/schedule/MsgReSendSchedule.java
+++ b/mallinkSchedule/src/main/java/com/iformall/schedule/MsgReSendSchedule.java
@@ -25,8 +25,8 @@ public class MsgReSendSchedule {
@Autowired
private MqBaseProducer mqBaseProducer;
- //@Scheduled(cron = "0 */1 * * * *?") // 每5分钟检查一次
- @Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
+ @Scheduled(cron = "0 */5 * * * *?") // 每5分钟检查一次
+ //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次
public void msgReSend() {
logger.info("消息重发开始...");
//消息重发
diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java
index adf45e304..96a49dd44 100644
--- a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java
+++ b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java
@@ -157,8 +157,11 @@ public enum ErrorCode{
TJD_DEDUCE_FEE_FAIL(2063, "TJD停车费抵扣失败"),
SHANGAN_COUPON_FAIL(2065, "优惠券失败"),
- SHANGAN_CMD_FAIL(2066, "优惠券失败"),
+ SHANGAN_CMD_FAIL(2066, "尚安网络异常"),
+ BOLINK_SIGN_ERR(2068, "泊链签名错误"),
+ BOLINK_STOP_FEE_FAIL(2069, "泊链停车费获取失败"),
+ BOLINK_CMD_FAIL(2066, "泊链网络异常"),
/**
* 游戏
diff --git a/mallinkService/src/main/java/com/iformall/domain/po/MemCouponFromDsp.java b/mallinkService/src/main/java/com/iformall/domain/po/MemCouponFromDsp.java
new file mode 100644
index 000000000..13cb2acd7
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/domain/po/MemCouponFromDsp.java
@@ -0,0 +1,35 @@
+package com.iformall.domain.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.iformall.domain.po.base.TenantEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.*;
+
+@TableName(value = "mem_coupon_from_dsp")
+@Data
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class MemCouponFromDsp extends TenantEntity {
+
+ protected Long id;
+
+ @io.swagger.annotations.ApiModelProperty(value="手机号",name="phone")
+ private String phone;
+ @io.swagger.annotations.ApiModelProperty(value="投放ID",name="couponChannelId")
+ private Long couponChannelId;
+ @io.swagger.annotations.ApiModelProperty(value="券ID",name="couponId")
+ private Long couponId;
+ @io.swagger.annotations.ApiModelProperty(value="券码ID",name="couponOrderId")
+ private Long couponOrderId;
+ @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate")
+ private Date createDate;
+ @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate")
+ private Date updateDate;
+ @io.swagger.annotations.ApiModelProperty(value="状态:0-初始;1-已领券;",name="status")
+ private Integer status;
+
+
+}
diff --git a/mallinkService/src/main/java/com/iformall/domain/po/SysUserToken.java b/mallinkService/src/main/java/com/iformall/domain/po/SysUserToken.java
new file mode 100644
index 000000000..05da0cd74
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/domain/po/SysUserToken.java
@@ -0,0 +1,34 @@
+package com.iformall.domain.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.iformall.domain.po.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+
+/**
+ * 系统用户Token
+ *
+ * @author Stormeye
+ */
+@Data
+@TableName("sys_user_token")
+@EqualsAndHashCode(callSuper = true)
+public class SysUserToken extends BaseEntity {
+ @io.swagger.annotations.ApiModelProperty(value="用户ID",name="userId")
+ @TableId(type = IdType.INPUT)
+ private Long userId;
+ @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId")
+ private String tenantId;
+ @io.swagger.annotations.ApiModelProperty(value="token",name="token")
+ private String token;
+ @io.swagger.annotations.ApiModelProperty(value="过期时间",name="expireTime")
+ private Date expireTime;
+ @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateTime")
+ private Date updateTime;
+
+}
diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxCreditHistoryVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxCreditHistoryVo.java
index b8d17977e..8031e0965 100644
--- a/mallinkService/src/main/java/com/iformall/domain/vo/WxCreditHistoryVo.java
+++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxCreditHistoryVo.java
@@ -72,4 +72,7 @@ public class WxCreditHistoryVo extends TenantEntity {
@io.swagger.annotations.ApiModelProperty(value = "小票号", name = "ticketNumber")
private String ticketNumber;
+ @io.swagger.annotations.ApiModelProperty(value = "兑换用途", name = "changePurpose")
+ private String changePurpose;
+
}
diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java b/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java
index b440f1545..f6a131a9f 100644
--- a/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java
+++ b/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java
@@ -5,12 +5,13 @@ package com.iformall.enums;
*/
public enum EnumCarVendor {
- // 1-ETCP, 2-TJD
+ // 1-ETCP, 2-TJD停简单 3-Dahua大华, 4-ShangAn尚安, 5-BoLink泊链
CAR_NOTFOUND(0, "无"),
CAR_ETCP(1, "ETCP"),
CAR_TJD(2, "TJD"),
CAR_DAHUA(3, "DAHUA"),
CAR_SHANGAN(4, "ShangAn"),
+ CAR_BOLINK(5, "BoLink"),
;
public static EnumCarVendor getEnum(Integer code) {
diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCouponChannelType.java b/mallinkService/src/main/java/com/iformall/enums/EnumCouponChannelType.java
index 4c4d4fca8..12350946e 100644
--- a/mallinkService/src/main/java/com/iformall/enums/EnumCouponChannelType.java
+++ b/mallinkService/src/main/java/com/iformall/enums/EnumCouponChannelType.java
@@ -13,7 +13,8 @@ public enum EnumCouponChannelType {
COUPON_CHANNEL_ID_PRESS(6, "砍价频道"),
COUPON_CHANNEL_ID_ORDER_GROUP(7, "拼团频道"),
COUPON_CHANNEL_ID_TOPIC(8, "专题"),
- COUPON_CHANNEL_ID_CREDIT(50, "积分商城")
+ COUPON_CHANNEL_ID_CREDIT(50, "积分商城"),
+ COUPON_CHANNEL_ID_H5(100, "DSP的H5页面"),
;
public static EnumCouponChannelType getEnum(Integer code) {
diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCouponDspStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumCouponDspStatus.java
new file mode 100644
index 000000000..b858f6acd
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/enums/EnumCouponDspStatus.java
@@ -0,0 +1,37 @@
+package com.iformall.enums;
+
+/**
+ * Created by Stormeye on 2018/08/09.
+ */
+public enum EnumCouponDspStatus {
+
+ //0:已接收,1:已注入
+ RECEIVED(0, "已接收"),
+ SENT_CO(1, "已注入")
+ ;
+
+ public static EnumCouponDspStatus getEnum(Integer code) {
+ for (EnumCouponDspStatus value : values()) {
+ if (value.getCode().equals(code)) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+ private Integer code;
+ private String message;
+
+ EnumCouponDspStatus(Integer code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/mallinkService/src/main/java/com/iformall/mapper/MemCouponFromDspMapper.java b/mallinkService/src/main/java/com/iformall/mapper/MemCouponFromDspMapper.java
new file mode 100644
index 000000000..90b202cce
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/mapper/MemCouponFromDspMapper.java
@@ -0,0 +1,17 @@
+package com.iformall.mapper;
+
+import java.util.*;
+import com.iformall.common.CommonMapper;
+import org.apache.ibatis.annotations.Param;
+import com.iformall.domain.po.MemCouponFromDsp;
+
+public interface MemCouponFromDspMapper extends CommonMapper {
+
+ List findList(MemCouponFromDsp memCouponFromDsp);
+
+
+
+
+
+
+}
diff --git a/mallinkService/src/main/java/com/iformall/mapper/SysUserTokenMapper.java b/mallinkService/src/main/java/com/iformall/mapper/SysUserTokenMapper.java
new file mode 100644
index 000000000..030520a11
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/mapper/SysUserTokenMapper.java
@@ -0,0 +1,19 @@
+package com.iformall.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.iformall.domain.po.SysUserToken;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 系统用户Token
+ *
+ * @author Stormeye Wu
+ */
+@Mapper
+public interface SysUserTokenMapper extends BaseMapper {
+
+ SysUserToken queryByToken(String token);
+
+ SysUserToken queryByUserId(long userId);
+
+}
diff --git a/mallinkService/src/main/java/com/iformall/mq/impl/RabbitMqMessageProducer.java b/mallinkService/src/main/java/com/iformall/mq/impl/RabbitMqMessageProducer.java
index 92ca15c2f..fd3f83294 100644
--- a/mallinkService/src/main/java/com/iformall/mq/impl/RabbitMqMessageProducer.java
+++ b/mallinkService/src/main/java/com/iformall/mq/impl/RabbitMqMessageProducer.java
@@ -9,10 +9,9 @@ import com.iformall.service.WxMsgRecordService;
import com.iformall.utils.JsonUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
-import org.springframework.amqp.rabbit.support.CorrelationData;
+import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
diff --git a/mallinkService/src/main/java/com/iformall/service/MemCouponFromDspService.java b/mallinkService/src/main/java/com/iformall/service/MemCouponFromDspService.java
new file mode 100644
index 000000000..5148c2343
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/service/MemCouponFromDspService.java
@@ -0,0 +1,67 @@
+package com.iformall.service;
+
+import com.github.pagehelper.PageInfo;
+import com.iformall.domain.po.MemCouponFromDsp;
+import com.iformall.domain.po.base.TenantEntity;
+
+import java.util.List;
+
+public interface MemCouponFromDspService {
+
+ /**
+ * 根据实体查询分页列表
+ *
+ * @param record
+ * @param pageIndex
+ * @param pageSize
+ * @return
+ */
+ PageInfo listAsPage(MemCouponFromDsp record, Integer pageIndex, Integer pageSize);
+
+ List getList(MemCouponFromDsp record);
+
+ /**
+ * 根据Id获得实体
+ *
+ * @param id
+ * @return
+ */
+ MemCouponFromDsp getById(Long id);
+
+ /**
+ * 保存或更新实体
+ *
+ * @param record
+ */
+ void saveOrUpdate(MemCouponFromDsp record);
+
+ /**
+ * 根据Id删除实体
+ *
+ * @param id
+ */
+ void deleteById(Long id);
+
+ /**
+ * countByInfo
+ * @param record
+ * @return
+ */
+ Integer countByInfo(MemCouponFromDsp record);
+
+ /**
+ * 注券
+ * @param record
+ * @return
+ */
+ Integer couponOrder(MemCouponFromDsp record);
+
+ /**
+ * 注券
+ * @param tenantEntity
+ * @param phone
+ * @return
+ */
+ void couponOrderFromDsp(TenantEntity tenantEntity, String phone);
+
+}
diff --git a/mallinkService/src/main/java/com/iformall/service/SysUserTokenService.java b/mallinkService/src/main/java/com/iformall/service/SysUserTokenService.java
new file mode 100644
index 000000000..99a8f0a9b
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/service/SysUserTokenService.java
@@ -0,0 +1,31 @@
+package com.iformall.service;
+
+import com.iformall.domain.po.MallUserInfo;
+import com.iformall.domain.po.SysUserToken;
+
+/**
+ * 用户Token
+ *
+ * @author Stormeye
+ */
+public interface SysUserTokenService {
+
+ /**
+ * 生成token
+ * @param userId 用户ID
+ */
+ SysUserToken createToken(long userId, String tenantId);
+
+ /**
+ * 退出,修改token值
+ * @param userId 用户ID
+ */
+ void logout(long userId);
+
+ SysUserToken queryByToken(String token);
+
+ SysUserToken queryByUserId(long userId);
+
+ MallUserInfo queryUser(Long userId);
+
+}
diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java
index ee9867681..109325204 100644
--- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java
+++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java
@@ -205,4 +205,10 @@ public interface WxOrderService {
void exportData(WxOrderQueryVo wxOrderQueryVo, HttpServletRequest request, HttpServletResponse response);
+
+ /**
+ * H5支付后, 券再注入
+ */
+ Long saveOuterOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId);
+
}
diff --git a/mallinkService/src/main/java/com/iformall/service/impl/MemCouponFromDspServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/MemCouponFromDspServiceImpl.java
new file mode 100644
index 000000000..bdd1371eb
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/service/impl/MemCouponFromDspServiceImpl.java
@@ -0,0 +1,143 @@
+package com.iformall.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.iformall.domain.po.MemCouponFromDsp;
+import com.iformall.domain.po.WxCUser;
+import com.iformall.domain.po.WxCoupon;
+import com.iformall.domain.po.base.TenantEntity;
+import com.iformall.enums.EnumCouponDspStatus;
+import com.iformall.enums.EnumUserType;
+import com.iformall.mapper.MemCouponFromDspMapper;
+import com.iformall.mapper.WxCouponMapper;
+import com.iformall.service.MemCouponFromDspService;
+import com.iformall.service.WxCUserService;
+import com.iformall.service.WxOrderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.iformall.common.IdWorker;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class MemCouponFromDspServiceImpl implements MemCouponFromDspService {
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ @Autowired
+ private MemCouponFromDspMapper memCouponFromDspMapper;
+
+ @Autowired
+ private WxCouponMapper couponMapper;
+
+ @Autowired
+ private WxOrderService wxOrderService;
+ @Autowired
+ private WxCUserService wxCUserService;
+
+
+ @Override
+ public PageInfo listAsPage(MemCouponFromDsp record, Integer pageIndex, Integer pageSize) {
+ return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> memCouponFromDspMapper.findList(record));
+ }
+
+ @Override
+ public List getList(MemCouponFromDsp record) {
+ return memCouponFromDspMapper.findList(record);
+ }
+
+ @Override
+ public MemCouponFromDsp getById(Long id) {
+ return memCouponFromDspMapper.selectById(id);
+ }
+
+ @Override
+ public void saveOrUpdate(MemCouponFromDsp record) {
+ Date curDate = new Date();
+ if (record.getId() == null) {
+ final IdWorker idWorker = IdWorker.get();
+ record.setId(idWorker.nextId());
+ record.setCreateDate(curDate);
+ record.setUpdateDate(curDate);
+ memCouponFromDspMapper.insert(record);
+ } else {
+ record.setUpdateDate(curDate);
+ memCouponFromDspMapper.updateById(record);
+ }
+ }
+
+ @Override
+ public void deleteById(Long id) {
+ memCouponFromDspMapper.deleteById(id);
+ }
+
+ @Override
+ public Integer countByInfo(MemCouponFromDsp record) {
+ return memCouponFromDspMapper.selectCount(new QueryWrapper<>(record));
+ }
+
+ @Override
+ public Integer couponOrder(MemCouponFromDsp record) {
+ // 获取C端用户
+ WxCUser user = wxCUserService.getByObject(new WxCUser() {{
+ updateTenantInfo(record);
+ setPhone(record.getPhone());
+ }});
+ if (user == null) {
+ return -1;
+ }
+ //用于标记当前操作人为A端用户
+ user.setOperatorType(EnumUserType.MALLUSER.getCode());
+ user.setOperatorId(user.getId());
+ // 手机是否有未注的券
+ MemCouponFromDsp memQ = new MemCouponFromDsp() {{
+ updateTenantInfo(record);
+ setPhone(record.getPhone());
+ setStatus(EnumCouponDspStatus.RECEIVED.getCode());
+ }};
+ List couponFromDsps = memCouponFromDspMapper.findList(memQ);
+ for (MemCouponFromDsp memCouponFromDsp: couponFromDsps) {
+ // 注入券码, 无论此券是有价还是免费
+ WxCoupon coupon = couponMapper.selectById(memCouponFromDsp.getCouponId());
+ if (coupon != null) {
+ try {
+ Long couponOrderId = wxOrderService.saveOuterOrderForCoupon(user, coupon, memCouponFromDsp.getCouponChannelId(), null, null);
+ if (couponOrderId != null) {
+ MemCouponFromDsp updateRecord = new MemCouponFromDsp();
+ updateRecord.updateTenantInfo(memCouponFromDsp);
+ updateRecord.setId(memCouponFromDsp.getId());
+ updateRecord.setCouponOrderId(couponOrderId);
+ updateRecord.setStatus(EnumCouponDspStatus.SENT_CO.getCode());
+ updateRecord.setUpdateDate(new Date());
+ memCouponFromDspMapper.updateById(updateRecord);
+ }
+ } catch (Exception e) {
+ logger.error(e.getMessage());
+ continue;
+ }
+
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public void couponOrderFromDsp(TenantEntity tenantEntity, String phone) {
+ List couponFromDsps = getList( new MemCouponFromDsp() {{
+ updateTenantInfo(tenantEntity);
+ setPhone(phone);
+ }});
+ for(MemCouponFromDsp memCouponFromDsp: couponFromDsps ){
+ couponOrder(memCouponFromDsp);
+ }
+ }
+
+
+
+
+
+
+}
diff --git a/mallinkService/src/main/java/com/iformall/service/impl/SysUserTokenServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/SysUserTokenServiceImpl.java
new file mode 100644
index 000000000..b23d97f86
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/service/impl/SysUserTokenServiceImpl.java
@@ -0,0 +1,89 @@
+package com.iformall.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.iformall.domain.po.MallUserInfo;
+import com.iformall.domain.po.SysUserToken;
+import com.iformall.mapper.MallUserInfoMapper;
+import com.iformall.mapper.SysUserTokenMapper;
+import com.iformall.service.SysUserTokenService;
+import com.iformall.utils.Constant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.UUID;
+
+
+@Service("sysUserTokenService")
+public class SysUserTokenServiceImpl implements SysUserTokenService {
+
+ @Autowired
+ SysUserTokenMapper sysUserTokenMapper;
+
+ @Autowired
+ MallUserInfoMapper mallUserInfoMapper;
+
+
+ @Override
+ public SysUserToken createToken(long userId, String tenantId) {
+ //生成一个token
+ String token = UUID.randomUUID().toString();
+
+ //当前时间
+ Date now = new Date();
+ //过期时间
+ Date expireTime = new Date(now.getTime() + Constant.EXPIRE);
+
+ //判断是否生成过token
+ SysUserToken q = new SysUserToken();
+ q.setUserId(userId);
+ q.setTenantId(tenantId);
+ SysUserToken tokenEntity = sysUserTokenMapper.selectOne(new QueryWrapper<>(q));
+ if(tokenEntity == null){
+ tokenEntity = new SysUserToken();
+ tokenEntity.setUserId(userId);
+ tokenEntity.setTenantId(tenantId);
+ tokenEntity.setToken(token);
+ tokenEntity.setUpdateTime(now);
+ tokenEntity.setExpireTime(expireTime);
+
+ //保存token
+ sysUserTokenMapper.insert(tokenEntity);
+ }else{
+ tokenEntity.setToken(token);
+ tokenEntity.setUpdateTime(now);
+ tokenEntity.setExpireTime(expireTime);
+
+ //更新token
+ sysUserTokenMapper.updateById(tokenEntity);
+ }
+ return tokenEntity;
+ }
+
+ @Override
+ public void logout(long userId) {
+ //生成一个token
+ String token = UUID.randomUUID().toString();
+
+ //修改token
+ SysUserToken tokenEntity = new SysUserToken();
+ tokenEntity.setUserId(userId);
+ tokenEntity.setToken(token);
+ sysUserTokenMapper.updateById(tokenEntity);
+ }
+
+ @Override
+ public SysUserToken queryByToken(String token) {
+ return sysUserTokenMapper.queryByToken(token);
+ }
+
+ @Override
+ public SysUserToken queryByUserId(long userId) {
+ return sysUserTokenMapper.queryByUserId(userId);
+ }
+
+ @Override
+ public MallUserInfo queryUser(Long userId) {
+ return mallUserInfoMapper.selectById(userId);
+ }
+}
diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java
index 29c4d85cf..aee6f8a36 100644
--- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java
+++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java
@@ -75,6 +75,9 @@ public class WxCouponServiceImpl implements WxCouponService {
@Autowired
WxCouponPasswordService couponPasswordService;
+ @Autowired
+ WxPayAccountMapper payAccountMapper;
+
@Autowired
@Qualifier("couponChannelRedisTemplate")
RedisTemplate> cdRedisTemplate;
@@ -267,22 +270,37 @@ public class WxCouponServiceImpl implements WxCouponService {
List merchantParamList = JSONObject.parseArray(record.getMerchantParams(), JSONObject.class);
//有价券判断商户是否配置了分账账号
if (record.getSalePrice() != null && record.getSalePrice() > 0) {
- StringBuffer sb = new StringBuffer();
- boolean flag = false;
- for (int i = 0, size = merchantParamList.size(); i < size; i++) {
- JSONObject jsonObject = merchantParamList.get(i);
- Long id = jsonObject.getLong("id");
- WxMerchant wxMerchant = new WxMerchant();
- wxMerchant.setId(id);
- WxMerchant merchant = wxMerchantMapper.queryMerchantByMerchantIdOfSharingReceiver(wxMerchant);
- if (merchant.getId() == null) {
- flag = true;
- sb.append("[").append(merchant.getName()).append("]");
+ boolean share = false;
+ WxPayAccount payQ = new WxPayAccount() {{
+ updateTenantInfo(record);
+ }};
+ try {
+ WxPayAccount payAccount = payAccountMapper.selectOne(new QueryWrapper<>(payQ));
+ if (payAccount != null) {
+ share = payAccount.checkShare();
}
+ } catch (Exception e) {
+ logger.error(e.getMessage());
}
- if (flag) {
- String message = sb.toString();
- return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "商户:" + message + "还未配置分账账户");
+
+ if (share) {
+ StringBuffer sb = new StringBuffer();
+ boolean flag = false;
+ for (int i = 0, size = merchantParamList.size(); i < size; i++) {
+ JSONObject jsonObject = merchantParamList.get(i);
+ Long id = jsonObject.getLong("id");
+ WxMerchant wxMerchant = new WxMerchant();
+ wxMerchant.setId(id);
+ WxMerchant merchant = wxMerchantMapper.queryMerchantByMerchantIdOfSharingReceiver(wxMerchant);
+ if (merchant.getId() == null) {
+ flag = true;
+ sb.append("[").append(merchant.getName()).append("]");
+ }
+ }
+ if (flag) {
+ String message = sb.toString();
+ return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "商户:" + message + "还未配置分账账户");
+ }
}
}
diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
index 30ab6da52..5acd05fa3 100644
--- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
+++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
@@ -856,6 +856,90 @@ public class WxOrderServiceImpl implements WxOrderService {
return couponOrder;
}
+ /**
+ * 创建 couponOrder
+ *
+ * @param user
+ * @param order
+ * @param coupon
+ */
+ private WxCouponOrder createCouponOrderForOuter(WxOrder order, WxCUser user, WxCoupon coupon, Long couponPasswordId) {
+ Date curr = new Date();
+ Date valid_date = null;
+ int limit_days = Constant.WX_LIMIT_DAYS;
+ if (coupon.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode())) {
+ valid_date = coupon.getValidEndDate();
+ } else {
+ limit_days = coupon.getValidDays();
+ valid_date = DateUtils.getTimeAfterDays(limit_days, curr);
+ }
+ boolean isCard = false;
+ // 检查是否是储值卡
+ if (coupon.getType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) {
+ isCard = true;
+ }
+ final IdWorker idWorker = IdWorker.get();
+
+ WxCouponOrder couponOrder = new WxCouponOrder();
+ couponOrder.setId(idWorker.nextId());
+ couponOrder.updateTenantInfo(order);
+ couponOrder.setCouponId(order.getProductId());
+ couponOrder.setCouponType(coupon.getType());
+ couponOrder.setCUserId(user.getId());
+ couponOrder.setOwnerId(user.getId());
+ couponOrder.setAutoRefund(coupon.getAutoRefund());
+ couponOrder.setOrderId(order.getOrderNumber());
+ couponOrder.setExpiredTime(valid_date);
+ if (!isCard) {
+ couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode());
+ } else {
+ couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode());
+ }
+ couponOrder.setCreateDate(curr);
+ couponOrder.setUpdateDate(curr);
+ couponOrder.setCouponPrice(order.getPayment());
+
+ wxCouponOrderMapper.insert(couponOrder);
+
+ /// 储值卡信息添加
+ if (isCard) {
+ WxPayOrder payOrder = null;
+ Integer fee = 0;
+ WxCardInfo cardInfo = new WxCardInfo();
+ cardInfo.setId(couponOrder.getId());
+ cardInfo.updateTenantInfo(order);
+ cardInfo.setCouponId(order.getProductId());
+ cardInfo.setAmount(coupon.getPrice());
+ cardInfo.setSaleAmount(coupon.getSalePrice());
+ cardInfo.setRemainingAmount(coupon.getPrice());
+
+ // 不论有价免费卡, 钱是线下支付, 所以不设分账
+ cardInfo.setShareFeeAmount(0);
+ cardInfo.setRemainingShareFeeAmount(0);
+ cardInfo.setRateAmount(0);
+ if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) {
+ WxCouponPassword updateCPwd = new WxCouponPassword();
+ updateCPwd.setId(couponPasswordId);
+ updateCPwd.setCardId(cardInfo.getId());
+ updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode());
+ couponPasswordMapper.updateById(updateCPwd);
+ }
+
+ cardInfo.setServiceFeeAmount(fee);
+ cardInfo.setCreateDate(curr);
+ cardInfo.setUpdateDate(curr);
+ cardInfo.setSupportTransfer(coupon.getSupportTransfer());
+
+ //检查卡是否下架,如果是,不可转赠
+ WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId());
+ if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) {
+ cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode());
+ }
+ wxCardInfoMapper.insert(cardInfo);
+ }
+ return couponOrder;
+ }
+
@Override
@Transactional(propagation = Propagation.NESTED, readOnly = false, rollbackFor = {Exception.class})
public WxCouponOrder sendFreeCouponToUser(Long userId, Long couponId, WxCouponSendVo wxCouponSendVo) {
@@ -1617,6 +1701,56 @@ public class WxOrderServiceImpl implements WxOrderService {
return record;
}
+ @Override
+ @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
+ public Long saveOuterOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) {
+ // 1. check user info and coupon info
+ userCouponMerchantCheck(user, coupon);
+ if (coupon.checkIsCreditCoupon()) {
+ //若用户剩余积分比积分售价低则不能支付
+ if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) {
+ throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH);
+ }
+ }
+ // 2. 减库存操作
+ String couponIdStr = String.valueOf(coupon.getId());
+ stockReduce(user, coupon, couponIdStr);
+
+ // 3. 当积分券或者积分停车券时 则进行积分支付
+ Integer orderType;
+ if (coupon.checkIsCreditCoupon()) {
+ creditPay(user, coupon);
+ orderType = EnumOrderType.CREDIT.getCode();
+ } else {
+ orderType = EnumOrderType.COUPON.getCode();
+ }
+
+ // 4. 保存Order
+ WxOrder record = new WxOrder();
+ record.setCouponChannelId(couponChannelId);
+ record.setType(orderType);
+ record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode());
+ record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode());
+ record.setPayment(0);
+ record.setFormId(formId);
+ record.setOrderGroupId(0L);
+ try {
+ saveFreeOrder(record, user, coupon);
+ } catch (Exception e) {
+ logger.error("下订单:" + e.getMessage());
+ throw new MallinkException(ErrorCode.ORDER_SAVE_ERR);
+ }
+
+ // 5. 创建couponOrder
+ try {
+ WxCouponOrder couponOrder = createCouponOrderForOuter(record, user, coupon, couponPasswordId);
+ return couponOrder.getId();
+ } catch (Exception e) {
+ logger.error("couponOrder失败:" + e.getMessage());
+ throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR);
+ }
+ }
+
/**
* 保存订单-免费
*
diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxProfitSharingReceiverServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxProfitSharingReceiverServiceImpl.java
index f71e358dc..ebf4195f4 100644
--- a/mallinkService/src/main/java/com/iformall/service/impl/WxProfitSharingReceiverServiceImpl.java
+++ b/mallinkService/src/main/java/com/iformall/service/impl/WxProfitSharingReceiverServiceImpl.java
@@ -132,10 +132,15 @@ public class WxProfitSharingReceiverServiceImpl implements WxProfitSharingReceiv
//添加分账账户
WxProfitSharingReceiverP wxProfitSharingReceiverP = new WxProfitSharingReceiverP();
- wxProfitSharingReceiverP.setAppid(appInfo.getParentAppId());
- wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
- wxProfitSharingReceiverP.setSub_appid(appInfo.getAppId());
- wxProfitSharingReceiverP.setSub_mch_id(payAccount.getSubMchId());
+ if (StringUtils.isNotBlank(appInfo.getParentAppId())) {
+ wxProfitSharingReceiverP.setAppid(appInfo.getParentAppId());
+ wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
+ wxProfitSharingReceiverP.setSub_appid(appInfo.getAppId());
+ wxProfitSharingReceiverP.setSub_mch_id(payAccount.getSubMchId());
+ } else {
+ wxProfitSharingReceiverP.setAppid(appInfo.getAppId());
+ wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
+ }
wxProfitSharingReceiverP.setNonce_str(Utility.generate32UUID());
wxProfitSharingReceiverP.setSign_type("HMAC-SHA256");
@@ -150,6 +155,7 @@ public class WxProfitSharingReceiverServiceImpl implements WxProfitSharingReceiv
try {
wxProfitSharingReceiverP.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(wxProfitSharingReceiverP), payAccount.getApiKey()));
response = WxProfitSharing.addReceiver(BeanUtils.toStringMap(wxProfitSharingReceiverP));
+ logger.info(response);
} catch (Exception e) {
logger.error(ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getMessage() + e.getMessage());
return new ResultData(ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED, e.getMessage());
@@ -278,10 +284,15 @@ public class WxProfitSharingReceiverServiceImpl implements WxProfitSharingReceiv
} else {
//删除分账账户从微信服务器
WxProfitSharingReceiverP wxProfitSharingReceiverP = new WxProfitSharingReceiverP();
- wxProfitSharingReceiverP.setAppid(appInfo.getParentAppId());
- wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
- wxProfitSharingReceiverP.setSub_appid(appInfo.getAppId());
- wxProfitSharingReceiverP.setSub_mch_id(payAccount.getSubMchId());
+ if (StringUtils.isNotBlank(appInfo.getParentAppId())) {
+ wxProfitSharingReceiverP.setAppid(appInfo.getParentAppId());
+ wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
+ wxProfitSharingReceiverP.setSub_appid(appInfo.getAppId());
+ wxProfitSharingReceiverP.setSub_mch_id(payAccount.getSubMchId());
+ } else {
+ wxProfitSharingReceiverP.setAppid(appInfo.getAppId());
+ wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
+ }
wxProfitSharingReceiverP.setNonce_str(Utility.generate32UUID());
wxProfitSharingReceiverP.setSign_type("HMAC-SHA256");
diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java
index 24d2debad..05e38b2f9 100644
--- a/mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java
+++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java
@@ -431,6 +431,9 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService
WxRentContract updateRentContract = new WxRentContract();
updateRentContract.setId(record.getRentContractId());
updateRentContract.setStatus(EnumRentContractStatus.WAIT_SIGN.getCode());
+ if(wxRentContract.getStatus().equals(EnumRentContractStatus.SUPPLE.getCode())){
+ updateRentContract.setStatus(EnumRentContractStatus.SUPPLE.getCode());
+ }
wxRentContractMapper.updateStatus(updateRentContract);
logger.info("id:{},启动审批流成功,是否补录:{}", record.getRentContractId().toString(), record.getMerchantId() != null);
}
diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java
index 277375b51..8993f7b82 100644
--- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java
+++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java
@@ -1760,10 +1760,16 @@ public class WxRentContractServiceImpl implements WxRentContractService {
public void updatePropertyPreviewBill(WxRentContract record) {
//合并合同-更新物业账单
if (record.getOperationType().equals(EnumContractOperationType.WHOLE.getCode())) {
+ //查签约
WxPropertyContract wxPropertyContract = new WxPropertyContract();
wxPropertyContract.setRentContractId(record.getId());
wxPropertyContract.setStatus(EnumRentContractStatus.WAIT_SIGN.getCode());
WxPropertyContract propertyContract = wxPropertyContractMapper.selectOne(new QueryWrapper(wxPropertyContract));
+ //查补录
+ if(propertyContract==null){
+ wxPropertyContract.setStatus(EnumRentContractStatus.SUPPLE.getCode());
+ propertyContract = wxPropertyContractMapper.selectOne(new QueryWrapper(wxPropertyContract));
+ }
if (propertyContract != null) {
propertyContract.setMerchantId(record.getMerchantId());
wxPropertyContractMapper.updateById(propertyContract);
diff --git a/mallinkService/src/main/java/com/iformall/service/wechat/FmOpenInRedisDBConfigStorage.java b/mallinkService/src/main/java/com/iformall/service/wechat/FmOpenInRedisDBConfigStorage.java
index eb5228cc1..fbdd5b7d4 100644
--- a/mallinkService/src/main/java/com/iformall/service/wechat/FmOpenInRedisDBConfigStorage.java
+++ b/mallinkService/src/main/java/com/iformall/service/wechat/FmOpenInRedisDBConfigStorage.java
@@ -109,7 +109,7 @@ public class FmOpenInRedisDBConfigStorage extends WxOpenInMemoryConfigStorage {
}
@Override
- public void updateComponentAccessTokent(String componentAccessToken, int expiresInSeconds) {
+ public void updateComponentAccessToken(String componentAccessToken, int expiresInSeconds) {
try (Jedis jedis = this.jedisPool.getResource()) {
jedis.setex(this.componentAccessTokenKey, expiresInSeconds - 200, componentAccessToken);
diff --git a/mallinkService/src/main/java/com/iformall/utils/MaUtil.java b/mallinkService/src/main/java/com/iformall/utils/MaUtil.java
index 83e813084..53e7fd1a2 100644
--- a/mallinkService/src/main/java/com/iformall/utils/MaUtil.java
+++ b/mallinkService/src/main/java/com/iformall/utils/MaUtil.java
@@ -2,7 +2,7 @@ package com.iformall.utils;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
-import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import com.iformall.common.FmHttpClientBuilder;
import com.iformall.domain.po.WxAppinfo;
import org.apache.commons.lang3.StringUtils;
@@ -10,7 +10,7 @@ import org.apache.commons.lang3.StringUtils;
public class MaUtil {
static public WxMaService getWeappService(WxAppinfo appinfo) {
- WxMaInMemoryConfig config = new WxMaInMemoryConfig();
+ WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
config.setAppid(appinfo.getAppId());
config.setSecret(appinfo.getSecret());
config.setToken(appinfo.getToken());
diff --git a/mallinkService/src/main/java/com/iformall/utils/car/BoLinkUtil.java b/mallinkService/src/main/java/com/iformall/utils/car/BoLinkUtil.java
new file mode 100644
index 000000000..fc9a90f64
--- /dev/null
+++ b/mallinkService/src/main/java/com/iformall/utils/car/BoLinkUtil.java
@@ -0,0 +1,205 @@
+package com.iformall.utils.car;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.iformall.common.ErrorCode;
+import com.iformall.exception.MallinkException;
+import org.apache.http.Consts;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 尚安停车
+ */
+public class BoLinkUtil {
+ private final static Logger logger = LoggerFactory.getLogger(BoLinkUtil.class);
+
+ public static final String BOLINK_URL = "url";
+ public static final String BOLINK_COMID = "comid";
+ public static final String BOLINK_UNION_ID = "union_id";
+ public static final String BOLINK_KEY = "key";
+ public static final String BOLINK_CAR_NUMBER = "car_number";
+
+ public static final String URL = "https://yun.bolink.club/zld/queryorderprice";
+ public static final String COMID = "30536";
+ public static final String UNION_ID = "200389";
+ public static final String KEY = "Y29PZH9KDT1V7Y1E";
+ public static final String PARK_NUM = "京88888";
+
+ public static final String BOLINK_DATA = "data";
+ public static final String BOLINK_STATE = "state";
+ public static final int BOLINK_SUCCESS = 1;
+ public static final int BOLINK_FAIL = 0;
+ public static final String BOLINK_ERROR = "errmsg";
+
+
+ public static void main(String[] args) throws Exception {
+ String carNumber = "京88888";
+
+ String result = getStopFee(URL, COMID, UNION_ID, KEY, carNumber);
+
+
+ }
+
+ /**
+ * md5算法
+ * @param data
+ * @return
+ * @throws NoSuchAlgorithmException
+ */
+
+ public static String md5(String data) throws NoSuchAlgorithmException {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ md.update(data.getBytes());
+ StringBuffer buf = new StringBuffer();
+ byte[] bits = md.digest();
+ for(int i=0;i") || resp.startsWith("")) {
+ return true;
+ }
+ return false;
+ }
+
+ public static String getStopFee(String url, String comid, String unionId, String key, String carNumber) {
+ Map params = new HashMap<>();
+ params.put(BOLINK_COMID, comid);
+ params.put(BOLINK_UNION_ID, unionId);
+ params.put(BOLINK_CAR_NUMBER, carNumber);
+ try {
+ String sign = getSign(key, JSON.toJSONString(params));
+ } catch (Exception e) {
+ logger.error(e.getMessage());
+ }
+
+ try {
+ String result = Proc(url, key, params);
+ if(result == null) {
+ throw new MallinkException(ErrorCode.BOLINK_CMD_FAIL);
+ }
+ if(checkRespFailed(result)) {
+ throw new MallinkException(ErrorCode.BOLINK_CMD_FAIL);
+ }
+ return result;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ private static String Proc(String url, String key, Map paramMap) {
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+
+ HttpPost httpPost = new HttpPost(url);
+ httpPost.addHeader("Accept-Encoding", "UTF-8");
+
+ StringBuilder sb = new StringBuilder();
+ String sign = null;
+ try{
+ String dataStr = JSON.toJSONString(paramMap);
+ sb.append("{\"data\":").append(dataStr);
+ sign = getSign(key, dataStr);
+ sb.append(",\"sign\":\"").append(sign).append("\"}");
+ }catch(NoSuchAlgorithmException e) {
+ logger.error(e.getLocalizedMessage());
+ }
+
+ String bodyStr = sb.toString();
+ logger.info(bodyStr);
+
+ final Base64.Encoder encoder = Base64.getEncoder();
+ final Base64.Decoder decoder = Base64.getDecoder();
+
+ try {
+ byte[] bodyByte = bodyStr.getBytes("UTF-8");
+ String encodeStr = encoder.encodeToString(bodyByte);
+ StringEntity se = new StringEntity(encodeStr, Consts.UTF_8);
+ se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"UTF-8"));
+ httpPost.setEntity(se);
+ } catch (Exception e) {
+ logger.error(e.getMessage());
+ }
+
+ HttpResponse response = null;
+ try {
+ response = httpClient.execute(httpPost);
+ } catch (Exception e) {
+ logger.error(e.getLocalizedMessage());
+ }
+
+ String result = null;
+
+ //打印StatusLine
+ logger.debug("StatusLine: " + response.getStatusLine());
+ try{
+ //获取实体
+ HttpEntity httpEntity= response.getEntity();
+ String encodeResStr = EntityUtils.toString(httpEntity, "UTF-8");
+ result = new String(decoder.decode(encodeResStr), "UTF-8");
+ logger.debug(result);
+ // {"data":{"errmsg":"查询价格返回超时,请联系车场管理员","state":0,"plate_number":"京88888"},"sign":"DE81DCA41E6C1ACA978906F998A7BC1D"}
+
+ } catch (Exception e) {
+ logger.error(e.getLocalizedMessage());
+ }
+
+ try { //关闭流并释放资源
+ httpClient.close();
+ } catch (IOException e) {
+ logger.error(e.getLocalizedMessage());
+ }
+
+ JSONObject resultObj = JSON.parseObject(result);
+ String resSign = resultObj.getString("sign");
+ if (!resSign.equals(sign)) {
+ logger.error("data sign: " + resSign);
+ throw new MallinkException(ErrorCode.BOLINK_SIGN_ERR);
+ }
+
+ return result;
+ }
+
+
+
+
+}
+
diff --git a/mallinkService/src/main/resources/mapper/MemCouponFromDspMapper.xml b/mallinkService/src/main/resources/mapper/MemCouponFromDspMapper.xml
new file mode 100644
index 000000000..55e17530e
--- /dev/null
+++ b/mallinkService/src/main/resources/mapper/MemCouponFromDspMapper.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `id`,`tenant_id`,`phone`,`coupon_channel_id`,`coupon_id`,`coupon_order_id`,`create_date`,`update_date`,`status`
+
+
+
+ where 1 = 1
+
+ and `id` = #{id}
+
+
+ and `tenant_id` = #{tenantId}
+
+
+ and `phone` = #{phone}
+
+
+ and `coupon_channel_id` = #{couponChannelId}
+
+
+ and `coupon_id` = #{couponId}
+
+
+ and `coupon_order_id` = #{couponOrderId}
+
+
+ and `create_date` = #{createDate}
+
+
+ and `update_date` = #{updateDate}
+
+
+ and `status` = #{status}
+
+
+ and id in
+
+ #{idItem}
+
+
+ order by ${sortColumns}
+
+
+
+
+
+
+
+
+
+
diff --git a/mallinkService/src/main/resources/mapper/SysUserTokenMapper.xml b/mallinkService/src/main/resources/mapper/SysUserTokenMapper.xml
new file mode 100644
index 000000000..90d1d4bae
--- /dev/null
+++ b/mallinkService/src/main/resources/mapper/SysUserTokenMapper.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/mallinkService/src/main/resources/mapper/WxCouponMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponMapper.xml
index e7d8afdb3..5ae375f98 100644
--- a/mallinkService/src/main/resources/mapper/WxCouponMapper.xml
+++ b/mallinkService/src/main/resources/mapper/WxCouponMapper.xml
@@ -832,11 +832,11 @@
wc.tenant_id,wc.`type`,wc.`cover_img`,wc.`cover_picture`,wc.`detail_picture`,wc.`title`,wc.`sub_title`,wc.`sale_price`,wc.`use_price`,wc.`use_limit_quantity`,wc.`send_type`,
wc.`valid_type`,wc.`valid_start_date`,wc.`valid_end_date`,wc.`valid_days`,wc.`detail`,wc.`price`,wc.`unit`,wc.`remain_inventory`,wc.`inventory`,
wc.`remark`,wc.`status`,wc.`create_date`,wc.`update_date`,wc.`business`,wc.`sub_business`,wc.`support_transfer`,wc.`subsidy_num`,wc.`subsidy_type`,
- wc.`press_limit_num`, wc.`press_limit_hours`, wc.`auto_refund`,wc.`credit_price`,wc.`credit_refund`,wc.`conditions`
- ,wc.title as couponName,wc.`cover_img` as couponPic,wc.`cover_picture` as couponPicture,wc.`detail_picture` as detailPicture,wc.id as couponId from wx_coupon_channel ct left join
- wx_coupon wc on wc.id = ct.coupon_id
- where ct.`sub_target_id` = #{id}
- and ct.status = 0
+ wc.`press_limit_num`, wc.`press_limit_hours`, wc.`auto_refund`,wc.`credit_price`,wc.`credit_refund`,wc.`conditions`,
+ wc.title as couponName,wc.`cover_img` as couponPic,wc.`cover_picture` as couponPicture,wc.`detail_picture` as detailPicture,wc.id as couponId
+ from wx_coupon_channel ct
+ left join wx_coupon wc on wc.id = ct.coupon_id
+ where ct.`sub_target_id` = #{id} and ct.status = 0