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..4c0dfa3ed 100644
--- a/mallinkAdmin/pom.xml
+++ b/mallinkAdmin/pom.xml
@@ -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/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/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/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/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/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/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/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