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