From f553524baab2c45936289c2d528bb7e45457b64e Mon Sep 17 00:00:00 2001 From: zhp <746006956@qq.com> Date: Mon, 16 Sep 2024 15:42:50 +0800 Subject: [PATCH] =?UTF-8?q?2024-09-16=20=E5=8D=8A=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/api/RemoteChannelService.java | 25 + .../api/RemoteCustomerApplyLogService.java | 25 +- .../system/api/RemoteCustomerService.java | 7 + .../factory/RemoteChannelFallbackFactory.java | 30 + ...RemoteCustomerApplyLogFallbackFactory.java | 10 + .../RemoteCustomerFallbackFactory.java | 5 + .../common/core/constant/RedisConstant.java | 27 + .../core/domain/GuestProbabilityReq.java | 35 + .../core/domain/http/CustomerApplyLog.java | 45 ++ .../ruoyi/common/core/utils/EncryptUtil.java | 636 ++++++++++++++++++ .../ruoyi/common/core/utils/ProbitUtil.java | 155 +++++ .../redis/service/CustomerTokenService.java | 390 +++++++++++ .../btc/controller/PublicAllController.java | 43 ++ .../btc/controller/PublicHalfController.java | 11 +- .../com/ruoyi/btc/domain/CustomerInfoDto.java | 6 + .../btc/service/ISysPublicAllService.java | 27 + .../btc/service/ISysPublicHalfService.java | 5 +- .../service/impl/SysPublicAllServiceImpl.java | 249 +++++++ .../impl/SysPublicHalfServiceImpl.java | 88 ++- .../com/ruoyi/system/config/SystemConfig.java | 23 + .../CustomerApplyLogController.java | 18 +- .../system/controller/CustomerController.java | 5 + .../ruoyi/system/domain/CustomerApplyLog.java | 111 --- .../ruoyi/system/mapper/ChannelMapper.java | 1 - .../system/mapper/CustomerApplyLogMapper.java | 3 +- .../service/ICustomerApplyLogService.java | 10 +- .../system/service/ICustomerService.java | 7 + .../impl/CustomerApplyLogServiceImpl.java | 19 +- .../service/impl/CustomerServiceImpl.java | 25 +- .../mapper/system/CustomerApplyLogMapper.xml | 8 +- 30 files changed, 1899 insertions(+), 150 deletions(-) create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteChannelService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteChannelFallbackFactory.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/RedisConstant.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/GuestProbabilityReq.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/http/CustomerApplyLog.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/EncryptUtil.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ProbitUtil.java create mode 100644 ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/CustomerTokenService.java create mode 100644 ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/controller/PublicAllController.java create mode 100644 ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/ISysPublicAllService.java create mode 100644 ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/impl/SysPublicAllServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/SystemConfig.java delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/CustomerApplyLog.java diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteChannelService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteChannelService.java new file mode 100644 index 00000000..8933a4c6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteChannelService.java @@ -0,0 +1,25 @@ +package com.ruoyi.system.api; + +import com.ruoyi.common.core.constant.SecurityConstants; +import com.ruoyi.common.core.constant.ServiceNameConstants; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.domain.http.CustomerApplyLog; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.system.api.factory.RemoteChannelFallbackFactory; +import com.ruoyi.system.api.factory.RemoteCustomerApplyLogFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +/** + * 用户服务 + * + * @author ruoyi + */ +@FeignClient(contextId = "remoteChannelService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteChannelFallbackFactory.class) +public interface RemoteChannelService +{ + + + + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteCustomerApplyLogService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteCustomerApplyLogService.java index ed2830f2..b4432b65 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteCustomerApplyLogService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteCustomerApplyLogService.java @@ -3,12 +3,12 @@ package com.ruoyi.system.api; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.domain.http.CustomerApplyLog; import com.ruoyi.common.core.domain.http.Merchant; +import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.system.api.factory.RemoteCustomerApplyLogFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -31,4 +31,23 @@ public interface RemoteCustomerApplyLogService @GetMapping("/log/sum") public R sum(@PathVariable("merchantId") Long merchantId,@RequestHeader(SecurityConstants.FROM_SOURCE) String source); + /** + * 获取用户今日是否是否已申请 + * + * + * @param customerID + * @param source 请求来源 + * @return 结果 + */ + @GetMapping("/log/customerApply") + public R customerApply(@PathVariable("customerID") Long customerID,@RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 新增用户 + * @param customerApplyLog + * @return + */ + @PostMapping("/log") + public AjaxResult add(@RequestBody CustomerApplyLog customerApplyLog); + } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteCustomerService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteCustomerService.java index e895d06f..757a544c 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteCustomerService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteCustomerService.java @@ -52,4 +52,11 @@ public interface RemoteCustomerService @PostMapping("/customer/addNewCustomer") public R add(@RequestBody Customer customer,@RequestHeader(SecurityConstants.FROM_SOURCE) String source); + /** + * 获取用户token + * @param phone + * @return + */ + @GetMapping("/customer/getCustomerToken") + public String getCustomerToken(@RequestParam("phone") String phone); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteChannelFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteChannelFallbackFactory.java new file mode 100644 index 00000000..9c865b21 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteChannelFallbackFactory.java @@ -0,0 +1,30 @@ +package com.ruoyi.system.api.factory; + + +import com.ruoyi.system.api.RemoteChannelService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.stereotype.Component; + + +/** + * 用户服务降级处理 + * + * @author ruoyi + */ +@Component +@Slf4j +public class RemoteChannelFallbackFactory implements FallbackFactory +{ + + @Override + public RemoteChannelService create(Throwable throwable) + { + log.error("用户服务调用失败:{}", throwable.getMessage()); + return new RemoteChannelService() + { + + + }; + } +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCustomerApplyLogFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCustomerApplyLogFallbackFactory.java index cede92dc..80eca3bf 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCustomerApplyLogFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCustomerApplyLogFallbackFactory.java @@ -2,7 +2,9 @@ package com.ruoyi.system.api.factory; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.domain.http.CustomerApplyLog; import com.ruoyi.common.core.domain.http.Merchant; +import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.system.api.RemoteCustomerApplyLogService; import com.ruoyi.system.api.RemoteMerchantService; import lombok.extern.slf4j.Slf4j; @@ -35,7 +37,15 @@ public class RemoteCustomerApplyLogFallbackFactory implements FallbackFactory customerApply(Long customerID, String source) { + return null; + } + @Override + public AjaxResult add(CustomerApplyLog customerApplyLog) { + return null; + } }; } } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCustomerFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCustomerFallbackFactory.java index d53b6c3f..ab1a6186 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCustomerFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCustomerFallbackFactory.java @@ -44,6 +44,11 @@ public class RemoteCustomerFallbackFactory implements FallbackFactory base64 decrypt " + outputStr); + return outputStr.trim(); + } + + /** + * 用 AES 算法解密 inputStr。 + * 使用 secretStr 作为 key,ivStr作为 iv。 + * + * @param secretStr + * @param ivStr + * @return + */ + public static byte[] decode(String secretStr, String ivStr, byte[] inputBytes){ + if (keyStrSize != secretStr.length() || ivStrSize != ivStr.length()) { + return null; + } + byte[] secretKeyBytes = secretStr.getBytes(CHARSET); + byte[] ivBytes = ivStr.getBytes(CHARSET); + + byte[] outputBytes = decryptCBCNoPadding(secretKeyBytes, ivBytes, inputBytes); + return outputBytes; + } + + /** + * AES/CBC/NoPadding decrypt + * 16 bytes secretKeyStr + * 16 bytes intVector + * + * @param secretKeyBytes + * @param intVectorBytes + * @param input + * @return + */ + public static byte[] decryptCBCNoPadding(byte[] secretKeyBytes, byte[] intVectorBytes, byte[] input) { + try { + IvParameterSpec iv = new IvParameterSpec(intVectorBytes); + SecretKey secretKey = new SecretKeySpec(secretKeyBytes, AES); + + Cipher cipher = Cipher.getInstance(AES_CBC_NOPADDING); + cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); + byte[] encryptBytes = cipher.doFinal(input); + return encryptBytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * DES 加密加密模式 ECB,填充方式 Pkcs7,输出方式 Base64,字符集 utf8 + * @param data + * @param password + * @return + */ + public static String encryptECBPkcs7(String data, String password) { + if (password== null || password.length() < 8) { throw new RuntimeException("加密失败,key不能小于8位"); } + if(StringUtils.isBlank(data)){ return null; } + + try { + //下面这行在进行PKCS7Padding加密时必须加上,否则报错 + Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + + //根据传入的秘钥内容生成符合DES加密解密格式的秘钥内容 + DESKeySpec dks = new DESKeySpec(password.getBytes()); + //获取DES秘钥生成器对象 + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); + // 生成秘钥:key的长度不能够小于8位字节 + Key secretKey = keyFactory.generateSecret(dks); + //获取DES/ECB/PKCS7Padding该种级别的加解密对象 + Cipher cipher = Cipher.getInstance(DES_ECB_PKCS7PADDING); + //初始化加解密对象【opmode:确定是加密还是解密模式;secretKey是加密解密所用秘钥】 + cipher.init(Cipher.ENCRYPT_MODE, secretKey); + byte[] bytes = cipher.doFinal(data.getBytes(CHARSET)); + return Base64.encode(bytes); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String decryptECBPkcs7(String data, String password) { + if (password== null || password.length() < 8) { throw new RuntimeException("解密失败,key不能小于8位"); } + if(StringUtils.isBlank(data)){ return null; } + + try { + //下面这行在进行PKCS7Padding加密时必须加上,否则报错 + Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + + //根据传入的秘钥内容生成符合DES加密解密格式的秘钥内容 + DESKeySpec dks = new DESKeySpec(password.getBytes()); + //获取DES秘钥生成器对象 + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); + // 生成秘钥:key的长度不能够小于8位字节 + Key secretKey = keyFactory.generateSecret(dks); + //获取DES/ECB/PKCS7Padding该种级别的加解密对象 + Cipher cipher = Cipher.getInstance(DES_ECB_PKCS7PADDING); + //初始化加解密对象【opmode:确定是加密还是解密模式;secretKey是加密解密所用秘钥】 + cipher.init(Cipher.DECRYPT_MODE, secretKey); + return new String(cipher.doFinal(Base64.decode(data.getBytes(charset))), charset); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + + /** + * AES加密 + * @param content 内容 + * @param password 密钥 + * @return 加密后数据 + */ + public static byte[] encryptECBPkcs5(byte[] content, byte[] password) { + if (content == null || password == null) + return null; + try { + Cipher cipher = Cipher.getInstance(AES_ECB_PKCS5PADDING); + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(password, AES)); + return cipher.doFinal(content); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * AES解密 + * @param content 加密内容 + * @param password 密钥 + * @return 解密后数据 + */ + public static byte[] decryptECBPkcs5(byte[] content, byte[] password) { + if (content == null || password == null) + return null; + try { + Cipher cipher = Cipher.getInstance(AES_ECB_PKCS5PADDING); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(password, AES)); + return cipher.doFinal(content); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ProbitUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ProbitUtil.java new file mode 100644 index 00000000..3c06bcec --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ProbitUtil.java @@ -0,0 +1,155 @@ +package com.ruoyi.common.core.utils; + + +import com.ruoyi.common.core.domain.GuestProbabilityReq; +import lombok.extern.slf4j.Slf4j; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 计算助贷计划概率 + * @Author: daisi + * @Date: 2022/4/2 11:10 + */ +@Slf4j +public class ProbitUtil { + public static GuestProbabilityReq calculatePlanTheProbability(List guestProbabilityReqs) { + //按排序价格排序 + Collections.sort(guestProbabilityReqs, new Comparator() { + @Override + public int compare(GuestProbabilityReq o1, GuestProbabilityReq o2) { + return o2.getOrderPrice().compareTo(o1.getOrderPrice()); + } + }); + List list = new ArrayList<>(5); + for (GuestProbabilityReq guestProbabilityReq : guestProbabilityReqs) { +// if (guestProbabilityReq.getOrderPrice().compareTo(guestProbabilityReqs.get(0).getOrderPrice()) == 0) { +// list.add(guestProbabilityReq); +// } + list.add(guestProbabilityReq); + } + log.info("排序后的数据:{}",list); + //重置概率 + resetTranslate(list); + int index = drawGift(list); + return guestProbabilityReqs.get(index); + } + + private static List resetTranslate(List reqs) { + if (reqs.size()!=1){ + //高值得一部分 + int count = 0; + //获取计数 + BigDecimal orderPrice = reqs.get(0).getOrderPrice(); + for (int i = 0; i < reqs.size(); i++) { + if (i+1 guestProbabilityReqList) { + if (null != guestProbabilityReqList && guestProbabilityReqList.size() > 0) { + List orgProbList = new ArrayList(guestProbabilityReqList.size()); + for (GuestProbabilityReq guest : guestProbabilityReqList) { + //按顺序将概率添加到集合中 + orgProbList.add(guest.getGuestProbability()); + } + return draw(orgProbList); + } + return -1; + } + public static int draw(List giftProbList) { + List sortRateList = new ArrayList(); + // 计算概率总和 + Double sumRate = 0D; + for (Double prob : giftProbList) { + sumRate += prob; + } + if (sumRate != 0) { + double rate = 0D; //概率所占比例 + for (Double prob : giftProbList) { + rate += prob; + // 构建一个比例区段组成的集合(避免概率和不为1) + sortRateList.add(rate / sumRate); + } + // 随机生成一个随机数,并排序 + double random = Math.random(); + sortRateList.add(random); + Collections.sort(sortRateList); + // 返回该随机数在比例集合中的索引 + return sortRateList.indexOf(random); + } + return -1; + } + +// public static void main(String[] args) { +//// System.out.println(LocalDateTimeUtils.getStringFromLocalDateTime(LocalDateTimeUtil.beginOfDay(LocalDateTimeUtil.offset(LocalDateTime.now(), -7, ChronoUnit.DAYS)))); +//// System.out.println(LocalDateTimeUtils.getStringFromLocalDateTime(LocalDateTimeUtil.endOfDay(LocalDateTimeUtil.offset(LocalDateTime.now(), -1, ChronoUnit.DAYS)))); +// int a=0; +// List guestProbabilityReqs = new ArrayList<>(); +// for (int i = 0; i < 20; i++) { +// List list = new ArrayList<>(); +// GuestProbabilityReq req = new GuestProbabilityReq(); +// req.setPlanId(1L).setOrderPrice(new BigDecimal(104.00)).setGuestProbability(0.8D); +// +// GuestProbabilityReq req1 = new GuestProbabilityReq(); +// req1.setPlanId(2L).setOrderPrice(new BigDecimal(120)).setGuestProbability(0.8D); +// +// GuestProbabilityReq req2 = new GuestProbabilityReq(); +// req2.setPlanId(3L).setOrderPrice(new BigDecimal(90)).setGuestProbability(0.8D); +// +// GuestProbabilityReq req3 = new GuestProbabilityReq(); +// req3.setPlanId(4L).setOrderPrice(new BigDecimal(110)).setGuestProbability(0.4D); +// +// GuestProbabilityReq req4 = new GuestProbabilityReq(); +// req4.setPlanId(5L).setOrderPrice(new BigDecimal(110)).setGuestProbability(0.6D); +//// +//// GuestProbabilityReq req5 = new GuestProbabilityReq(); +//// req5.setPlanId(6L).setOrderPrice(new BigDecimal(80)).setGuestProbability(0.6D); +// +// list.add(req); +// list.add(req1); +// list.add(req2); +// list.add(req3); +// list.add(req4); +//// list.add(req5); +// +// guestProbabilityReqs.add(calculatePlanTheProbability(list)); +// +// } +// int b = 0; +// int c = 0; +// for (GuestProbabilityReq req:guestProbabilityReqs) { +// if (req.getPlanId()==2){ +// b++; +// }else { +// c++; +// } +// } +// System.out.println("几率:"+c+" "+b); +// } + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/CustomerTokenService.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/CustomerTokenService.java new file mode 100644 index 00000000..f26fcf5e --- /dev/null +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/CustomerTokenService.java @@ -0,0 +1,390 @@ +package com.ruoyi.common.redis.service; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.core.constant.RedisConstant; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * Created with IntelliJ IDEA. + * + * @Author: 黎宇 + * @Date: 2023/08/06/15:05 + * @Description: 用户token管理 + */ + +@Slf4j +@Component +@RequiredArgsConstructor +public class CustomerTokenService { + private final RedisService redisService; + /** + * token过期时间 + */ + private static final Long EXPIRE_TIME = 30 * 24 * 60 * 60L; + + /** + * 随机生成128位的token,包含数字、大小写字母 + * + * @param customerId 用户id + * @param phone 手机号 + * @param deviceType 设备类型 + * @param channelId 渠道id + * @return token + */ + public String generateToken(Long customerId, String phone, String deviceType, Long channelId) { + //获取到老的token + String oldToken = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_KEY + customerId); + if (StringUtils.hasText(oldToken)) { + //删除老的token + this.refreshToken(oldToken); + } + String newToken = null; + boolean exit = true; + while (exit) { + newToken = RandomUtil.randomString(128); + if (!redisService.hasKey(RedisConstant.APP_CUSTOMER_USERNAME_KEY + newToken)) { + exit = false; + } + } + redisService.setCacheObject(RedisConstant.APP_CUSTOMER_USERNAME_KEY + newToken, phone, EXPIRE_TIME, TimeUnit.SECONDS); + redisService.setCacheObject(RedisConstant.APP_CUSTOMER_KEY + customerId, newToken, EXPIRE_TIME, TimeUnit.SECONDS); + redisService.setCacheObject(RedisConstant.APP_CUSTOMER_CHANNEL_KEY + newToken, channelId, EXPIRE_TIME, TimeUnit.SECONDS); + redisService.setCacheObject(RedisConstant.APP_CUSTOMER_TOKEN_KEY + newToken, customerId, EXPIRE_TIME, TimeUnit.SECONDS); + redisService.setCacheObject(RedisConstant.APP_DEVICE_IDENTIFICATION + newToken, deviceType.toString(), EXPIRE_TIME, TimeUnit.SECONDS); + return newToken; + } + + /** + * 判断token是否过期 + * + * @param token token + * @return true:过期,false:未过期 + */ + public boolean isExpire(String token) { + String customerId = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_TOKEN_KEY + token) + StrUtil.EMPTY; + String originalToken = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_KEY + customerId); + String username = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_USERNAME_KEY + token) + StrUtil.EMPTY; + return StringUtils.isEmpty(customerId) || StringUtils.isEmpty(originalToken) || !originalToken.equals(token) || !StringUtils.hasText(username); + } + + /** + * 刷新token有效期 + * + * @param token token + * @param booleans 是否需要退出登录 + */ + public void refreshToken(String token, Boolean... booleans) { + boolean logOut = isLogOut(booleans); + Long customerId = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_TOKEN_KEY + token); + if (Objects.isNull(customerId) && logOut) { + new Exception("登录已过期,请重新登录"); + } + redisService.expire(RedisConstant.APP_CUSTOMER_USERNAME_KEY + token, EXPIRE_TIME, TimeUnit.SECONDS); + redisService.expire(RedisConstant.APP_CUSTOMER_KEY + customerId, EXPIRE_TIME, TimeUnit.SECONDS); + redisService.expire(RedisConstant.APP_CUSTOMER_CHANNEL_KEY + token, EXPIRE_TIME, TimeUnit.SECONDS); + redisService.expire(RedisConstant.APP_CUSTOMER_TOKEN_KEY + token, EXPIRE_TIME, TimeUnit.SECONDS); + redisService.expire(RedisConstant.APP_DEVICE_IDENTIFICATION + token, EXPIRE_TIME, TimeUnit.SECONDS); + } + + /** + * 根据用户id刷新token有效期 + * + * @param customerId 用户id + * @param booleans 是否需要退出登录 + * @return token + */ + public String refreshToken(Long customerId, Boolean... booleans) { + boolean logOut = isLogOut(booleans); + String token = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_KEY + customerId); + if (StringUtils.isEmpty(token) && logOut) { + new Exception("登录已过期,请重新登录"); + } + this.refreshToken(token); + return token; + } + + /** + * 刷新token有效期 + * + * @param request 请求 + */ + public void refreshToken(HttpServletRequest request) { + String token = getToken(request); + this.refreshToken(token); + } + + /** + * 移除token + * + * @param token token + * @param booleans 是否需要退出登录 + */ + public void removeToken(String token, Boolean... booleans) { + boolean logOut = isLogOut(booleans); + Long customerId = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_TOKEN_KEY + token); + if (Objects.isNull(customerId) && logOut) { + new Exception("登录已过期,请重新登录"); + } + redisService.deleteObject(RedisConstant.APP_CUSTOMER_KEY + customerId); + redisService.deleteObject(RedisConstant.APP_CUSTOMER_TOKEN_KEY + token); + redisService.deleteObject(RedisConstant.APP_CUSTOMER_USERNAME_KEY + token); + redisService.deleteObject(RedisConstant.APP_CUSTOMER_CHANNEL_KEY + token); + redisService.deleteObject(RedisConstant.APP_DEVICE_IDENTIFICATION + token); + } + + /** + * 根据用户id移除token + * + * @param customerId 用户id + */ + public void removeToken(Long customerId) { + String token = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_KEY + customerId); + this.removeToken(token); + } + + /** + * 根据HttpServletRequest获取token + * + * @param request HttpServletRequest + * @param booleans 是否需要退出登录 + * @return token + */ + public String getToken(HttpServletRequest request, Boolean... booleans) { + boolean logOut = isLogOut(booleans); + String token = request.getHeader("Authorization"); + if (StringUtils.isEmpty(token) && logOut) { + String requestURI = request.getRequestURI(); + log.info("登录过期重新登录, requestURI:{}, logOut:{}, token:{}", requestURI, logOut, token); + new Exception("登录已过期,请重新登录"); + } + return token; + } + + /** + * 根据用户id获取到token + * + * @param customerId 用户id + * @return token + */ + public String getToken(Long customerId) { + String token = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_KEY + customerId); + if (StringUtils.isEmpty(token)) { + return null; + } + return token; + } + + /** + * 通过token获取到用户的ID + * + * @param token token + * @param logOut 是否需要退出登录 + * @return 用户ID + */ + public Long getCustomerId(String token, Boolean logOut) { + Long customerId = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_TOKEN_KEY + token); + if (Objects.isNull(customerId) && logOut) { + new Exception("登录已过期,请重新登录"); + } + return customerId; + } + + /** + * 根据HttpServletRequest获取到用户的ID + * + * @param request HttpServletRequest + * @param booleans 是否需要退出登录 + * @return 用户ID + */ + public Long getCustomerId(HttpServletRequest request, Boolean... booleans) { + boolean logOut = isLogOut(booleans); + String token = getToken(request, logOut); + if (StringUtils.isEmpty(token)) { + return null; + } + return getCustomerId(token, logOut); + } + + + /** + * 根据token获取到用户的手机号 未解密 + * + * @param token token + * @param booleans 是否需要退出登录 + * @return 手机号 + */ + public String getPhone(String token, Boolean... booleans) { + boolean logOut = isLogOut(booleans); + String phone = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_USERNAME_KEY + token); + if (Objects.isNull(phone) && logOut) { + new Exception("登录已过期,请重新登录"); + } + return phone; + } + + /** + * 根据用户ID获取手机号码 + * + * @param customerId 用户ID + * @param booleans 是否需要退出登录 + * @return 手机号 + */ + public String getPhone(Long customerId, Boolean... booleans) { + String token = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_KEY + customerId); + if (Objects.isNull(token) && isLogOut(booleans)) { + new Exception("登录已过期,请重新登录"); + } + String phone = getPhone(token); +// try { +// phone = EncryptUtil.AESdecode(phone, redisService.getAppEncrypted()); +// }catch (Exception e) { +// return phone; +// } + + return phone; + } + + /** + * 根据HttpServletRequest获取到用户的手机号 + * + * @param request HttpServletRequest + * @return 手机号 + */ + public String getPhone(HttpServletRequest request) { + String token = getToken(request); + return getPhone(token); + } + + /** + * 根据token获取到用户的渠道ID + * + * @param token token + * @param booleans 是否需要退出登录 + * @return 渠道ID + */ + public Long getChannelId(String token, Boolean... booleans) { + Long channelId = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_CHANNEL_KEY + token); + if (Objects.isNull(channelId) && isLogOut(booleans)) { + new Exception("登录已过期,请重新登录"); + } + return channelId; + } + + /** + * 根据HttpServletRequest获取到用户的渠道ID + * + * @param request HttpServletRequest + * @return 渠道ID + */ + public Long getChannelId(HttpServletRequest request, Boolean... booleans) { + String token = getToken(request,booleans); + return getChannelId(token,booleans); + } + + /** + * 根据用户ID获取渠道ID + * + * @param customerId 用户ID + * @param booleans 是否需要退出登录 + * @return 渠道ID + */ + public Long getChannelId(Long customerId, Boolean... booleans) { + String token = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_KEY + customerId); + if (Objects.isNull(token) && isLogOut(booleans)) { + new Exception("登录已过期,请重新登录"); + } + Long channelId = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_CHANNEL_KEY + token); + if (Objects.isNull(channelId) && isLogOut(booleans)) { + new Exception("登录已过期,请重新登录"); + } + return channelId; + } + + /** + * 更新渠道 + * @param customerId 用户ID + * @param channelId 渠道ID + */ + public void setChannelId(Long customerId,Long channelId) { + String token = getToken(customerId); + redisService.setCacheObject(RedisConstant.APP_CUSTOMER_CHANNEL_KEY + token, channelId, EXPIRE_TIME, TimeUnit.SECONDS); + } + + /** + * 根据token获取设备类型 + * + * @param token token + * @param booleans 是否需要退出登录 + * @return 设备类型 + */ + public String getDeviceType(String token, Boolean... booleans) { + String deviceType = redisService.getCacheObject(RedisConstant.APP_DEVICE_IDENTIFICATION + token); + if (Objects.isNull(deviceType) && isLogOut(booleans)) { + new Exception("登录已过期,请重新登录"); + } + return deviceType; + } + + /** + * 根据HttpServletRequest获取设备类型 + * + * @param request HttpServletRequest + * @return 设备类型 + */ + public String getDeviceType(HttpServletRequest request,Boolean... booleans) { + String token = getToken(request,booleans); + return getDeviceType(token,booleans); + } + + /** + * 根据HttpServletRequest获取设备类型 + * + * @param request HttpServletRequest + * @return 设备类型 + */ + public String getDeviceTypeStr(HttpServletRequest request) { + String token = getToken(request); + return getDeviceType(token); + } + + /** + * 根据用户ID获取设备类型 + * + * @param customerId 用户ID + * @param booleans 是否需要退出登录 + * @return 设备类型 + */ + public String getDeviceType(Long customerId, Boolean... booleans) { + String token = redisService.getCacheObject(RedisConstant.APP_CUSTOMER_KEY + customerId); + if (Objects.isNull(token) && isLogOut(booleans)) { + new Exception("登录已过期,请重新登录"); + } + String deviceType = redisService.getCacheObject(RedisConstant.APP_DEVICE_IDENTIFICATION + token); + if (!StringUtils.hasText(deviceType)) { + deviceType = "ANDROID"; + } + return deviceType; + } + + /** + * 是否需要退出登录 + * + * @param booleans 参数值 + * @return 是否需要退出登录 + */ + public Boolean isLogOut(Boolean... booleans) { + if (booleans == null || booleans.length == 0) { + return true; + } + return booleans[0]; + } + +} diff --git a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/controller/PublicAllController.java b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/controller/PublicAllController.java new file mode 100644 index 00000000..2851d210 --- /dev/null +++ b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/controller/PublicAllController.java @@ -0,0 +1,43 @@ +package com.ruoyi.btc.controller; + +import com.ruoyi.btc.domain.ComPublicHalfDto; +import com.ruoyi.btc.service.ISysPublicAllService; +import com.ruoyi.btc.service.ISysPublicHalfService; +import com.ruoyi.common.core.web.domain.AjaxResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + * 半流程API接口写这里 + * + * @author z + */ +@RestController +@Slf4j +@RequestMapping("/all/api") +@RequiredArgsConstructor +public class PublicAllController { + private final ISysPublicAllService sysPublicAllService; + + /** + * 通用半流程撞库 + */ + @PostMapping("check") + public AjaxResult upload(@RequestBody ComPublicHalfDto comPublicHalfDto) + { + sysPublicAllService.check(comPublicHalfDto); + return null; + } + + /** + * 通用半流程撞库 + */ + @PostMapping("input") + public AjaxResult input(@RequestBody ComPublicHalfDto comPublicHalfDto) + { + sysPublicAllService.input(comPublicHalfDto); + return null; + } + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/controller/PublicHalfController.java b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/controller/PublicHalfController.java index 345c8cdb..8f7814d6 100644 --- a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/controller/PublicHalfController.java +++ b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/controller/PublicHalfController.java @@ -5,10 +5,7 @@ import com.ruoyi.btc.service.ISysPublicHalfService; import com.ruoyi.common.core.web.domain.AjaxResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * 半流程API接口写这里 @@ -46,10 +43,10 @@ public class PublicHalfController{ /** * 通用半流程撞库 */ - @PostMapping("checkOrder") - public AjaxResult checkOrder(@RequestBody ComPublicHalfDto comPublicHalfDto) + @GetMapping("checkOrder") + public AjaxResult checkOrder(@RequestParam("phoneMD5")String phoneMd5,@RequestParam("channelSign")String channelSign) { - sysPublicHalfService.checkOrder(comPublicHalfDto); + sysPublicHalfService.checkOrder(phoneMd5,channelSign); return null; } } \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/domain/CustomerInfoDto.java b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/domain/CustomerInfoDto.java index 7af4c349..77eeac28 100644 --- a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/domain/CustomerInfoDto.java +++ b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/domain/CustomerInfoDto.java @@ -6,14 +6,20 @@ import lombok.Data; public class CustomerInfoDto { //手机号码(Md5) private String phoneMd5; + //手机号 + private String phone; //性别 0 男 1 女 private Integer sex; //手机号码(Md5) private String nameMd5; + //姓名 + private String name; //年龄 private Integer age; //手身份证md5 private String idCardMd5; + //身份证好 + private String idCard; //所在城市 private String city; //所在城市代码 diff --git a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/ISysPublicAllService.java b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/ISysPublicAllService.java new file mode 100644 index 00000000..d9535498 --- /dev/null +++ b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/ISysPublicAllService.java @@ -0,0 +1,27 @@ +package com.ruoyi.btc.service; + +import com.ruoyi.btc.domain.ComPublicHalfDto; +import com.ruoyi.common.core.web.domain.AjaxResult; + +/** + * 文件上传接口 + * + * @author ruoyi + */ +public interface ISysPublicAllService +{ + + /** + * 半流程通用撞库接口 + * @param comPublicHalfDto + */ + AjaxResult check(ComPublicHalfDto comPublicHalfDto); + + /** + * 半流程通用进件 + * @param comPublicHalfDto + */ + AjaxResult input(ComPublicHalfDto comPublicHalfDto); + + +} diff --git a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/ISysPublicHalfService.java b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/ISysPublicHalfService.java index 4dcc27cf..7cff70fa 100644 --- a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/ISysPublicHalfService.java +++ b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/ISysPublicHalfService.java @@ -2,6 +2,7 @@ package com.ruoyi.btc.service; import com.ruoyi.btc.domain.ComPublicHalfDto; import com.ruoyi.common.core.web.domain.AjaxResult; +import org.springframework.web.bind.annotation.RequestParam; /** * 文件上传接口 @@ -25,8 +26,8 @@ public interface ISysPublicHalfService /** * 渠道查询订单是否成功 - * @param comPublicHalfDto + * @param */ - AjaxResult checkOrder(ComPublicHalfDto comPublicHalfDto); + AjaxResult checkOrder(String phoneMd5, String channelSign); } diff --git a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/impl/SysPublicAllServiceImpl.java b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/impl/SysPublicAllServiceImpl.java new file mode 100644 index 00000000..0dbc0937 --- /dev/null +++ b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/impl/SysPublicAllServiceImpl.java @@ -0,0 +1,249 @@ +package com.ruoyi.btc.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.btc.domain.ComPublicHalfDto; +import com.ruoyi.btc.domain.CustomerInfoDto; +import com.ruoyi.btc.service.ISysPublicAllService; +import com.ruoyi.common.core.constant.CacheConstants; +import com.ruoyi.common.core.constant.SecurityConstants; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.domain.http.Channel; +import com.ruoyi.common.core.domain.http.Customer; +import com.ruoyi.common.core.domain.http.CustomerApplyLog; +import com.ruoyi.common.core.domain.http.Merchant; +import com.ruoyi.common.core.utils.ProbitUtil; +import com.ruoyi.common.core.utils.SecureUtils; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.system.api.RemoteCustomerApplyLogService; +import com.ruoyi.system.api.RemoteCustomerService; +import com.ruoyi.system.api.RemoteMerchantService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 本地文件存储 + * + * @author ruoyi + */ +@Service +@RequiredArgsConstructor +public class SysPublicAllServiceImpl implements ISysPublicAllService +{ + private final RemoteCustomerService remoteCustomerService; + private final RemoteMerchantService remoteMerchantService; + private final RemoteCustomerApplyLogService remoteCustomerApplyLogService; + private final RedisService redisService; + + /** + * 半流程通用撞库 + * @param comPublicHalfDto + */ + @Override + public AjaxResult check(ComPublicHalfDto comPublicHalfDto) { + //校验 IP地址是否正常 渠道标识是否存在 数据是否为空 + + if (StringUtils.isEmpty(comPublicHalfDto.getChannelSignature())){ + return AjaxResult.error("渠道标识不能未空"); + } + Channel channel = redisService.getCacheObject(CacheConstants.CHANNEL_SIGN + comPublicHalfDto.getChannelSignature()); + if (channel==null||channel.getId()==null){ + return AjaxResult.error("渠道不存在"); + } + if (StringUtils.isEmpty(comPublicHalfDto.getData())){ + return AjaxResult.error("加密数据不能为空"); + } + //解密为customerInfoDto + String s = SecureUtils.AesUtil.AesDecode(comPublicHalfDto.getData(), comPublicHalfDto.getChannelSignature()); + if (s==null){ + return AjaxResult.error("解密异常"); + } + CustomerInfoDto customerInfoDto = JSONObject.parseObject(s, CustomerInfoDto.class); + //校验数据必传参数是否未传 + String checkData = checkData(customerInfoDto); + if (checkData!=null){ + return AjaxResult.error(checkData); + } + //转化字段未数据库中资质字段 并保存 用户未实名状态 一并保存用户申请记录 未申请状态 + Customer customer = new Customer(); + BeanUtil.copyProperties(customerInfoDto,customer); + customer.setChannelId(channel.getId()); + customer.setActurlName(customerInfoDto.getNameMd5()); + customer.setFirstLoginTime(new Date()); + customer.setLastLoginTime(new Date()); + customer.setIsAuth(false); + customer.setStatus(2); + R customerInfoByPhoneMd5 = remoteCustomerService.getCustomerInfoByPhoneMd5(customerInfoDto.getPhoneMd5(), SecurityConstants.INNER); + if (customerInfoByPhoneMd5.getCode()==200){ + remoteCustomerService.updateByPhoneMd5(customer,SecurityConstants.INNER); + }else { + remoteCustomerService.add(customer,SecurityConstants.INNER); + } + //TODO 暂时不做 目前下游暂时不需要 匹配资质 造轮子 返回多个符合的商户 + List merchants = matchMerchant(customer); + //结束返回上游结果 + Map re = new HashMap<>(); + if (merchants.size()>0){ + re.put("data",true); + return AjaxResult.success(re); + } + re.put("data",false); + return AjaxResult.success(re); + } + + /** + * 获取前筛符合的商户 + * @param customer + */ + private List matchMerchant(Customer customer) { + R> listR = remoteMerchantService.merchantList(SecurityConstants.INNER); + if (listR.getCode()!=200){ + return new ArrayList<>(); + } + List merchants = new ArrayList<>(); + for (Merchant merchant:listR.getData()) { + //限量判定 + R sum = remoteCustomerApplyLogService.sum(merchant.getId(), SecurityConstants.INNER); + if (merchant.getLimitType()==1&&merchant.getLimitNum()<=sum.getData()){ + continue; + } + + if (customer.getAge()merchant.getAgeLimitEnd()){ + continue; + } + if (merchant.getChannelLimitType()==1||merchant.getChannelLimitType()==2){ + + List list = Arrays.asList(merchant.getChannelLimit().split(",")).stream().map(val->Long.parseLong(val)).collect(Collectors.toList()); + if (merchant.getChannelLimitType()==1&& !list.contains(customer.getChannelId())){ + continue; + } + if (merchant.getChannelLimitType()==2&& list.contains(customer.getChannelId())){ + continue; + } + } + merchants.add(merchant); + } + return merchants; + } + + /** + * 校验参数 + * @param customerInfoDto + */ + private String checkData(CustomerInfoDto customerInfoDto) { + if (customerInfoDto.getAge()==null){ + return "年龄不能为空"; + } + if (StringUtils.isEmpty(customerInfoDto.getPhoneMd5())){ + return "手机号MD5不能为空"; + } + if (StringUtils.isEmpty(customerInfoDto.getCity())){ + return "城市不能为空"; + } + if (customerInfoDto.getCityCode()==null){ + return "城市编码不能为空"; + } + if (customerInfoDto.getSocialSecurity()==null){ + return "本地社保不能为空"; + } + if (customerInfoDto.getAccumulationFund()==null){ + return "本地公积金不能为空"; + } + if (customerInfoDto.getCar()==null){ + return "车产不能为空"; + } + if (customerInfoDto.getHourse()==null){ + return "房产不能为空"; + } + if (customerInfoDto.getGuarantee()==null){ + return "房产不能为空"; + } + if (customerInfoDto.getZhiMa()==null){ + return "芝麻分不能为空"; + } + if (customerInfoDto.getCareer()==null){ + return "职业不能为空"; + } + if (customerInfoDto.getCreditCard()==null){ + return "信用卡不能为空"; + } + if (customerInfoDto.getEducation()==null){ + return "学历不能为空"; + } + if (customerInfoDto.getMonthlyIncome()==null){ + return "月收入不能为空"; + } + return null; + } + + /** + * 半流程通用进件 + * @param comPublicHalfDto + */ + @Override + public AjaxResult input(ComPublicHalfDto comPublicHalfDto) { + //校验 IP地址是否正常 渠道标识是否存在 数据是否为空 + if (StringUtils.isEmpty(comPublicHalfDto.getChannelSignature())){ + return AjaxResult.error("渠道标识不能未空"); + } + Channel channel = redisService.getCacheObject(CacheConstants.CHANNEL_SIGN + comPublicHalfDto.getChannelSignature()); + if (channel==null||channel.getId()==null){ + return AjaxResult.error("渠道不存在"); + } + if (StringUtils.isEmpty(comPublicHalfDto.getData())){ + return AjaxResult.error("加密数据不能为空"); + } + //解密为customerInfoDto + String s = SecureUtils.AesUtil.AesDecode(comPublicHalfDto.getData(), comPublicHalfDto.getChannelSignature()); + if (s==null){ + return AjaxResult.error("解密异常"); + } + CustomerInfoDto customerInfoDto = JSONObject.parseObject(s, CustomerInfoDto.class); + //校验数据必传参数是否未传 + String checkData = checkData(customerInfoDto); + //转化字段未数据库中资质字段 更新 用户实名状态 一并保存用户申请记录 已申请 + if (checkData!=null){ + return AjaxResult.error(checkData); + } + //转化字段未数据库中资质字段 并保存 用户未实名状态 一并保存用户申请记录 未申请状态 + Customer customer = new Customer(); + BeanUtil.copyProperties(customerInfoDto,customer); + customer.setChannelId(channel.getId()); + customer.setActurlName(customerInfoDto.getName()); + customer.setFirstLoginTime(new Date()); + customer.setLastLoginTime(new Date()); + customer.setIsAuth(true); + customer.setStatus(1); + R customerInfoByPhoneMd5 = remoteCustomerService.getCustomerInfoByPhoneMd5(customerInfoDto.getPhoneMd5(), SecurityConstants.INNER); + if (customerInfoByPhoneMd5.getCode()==200){ + remoteCustomerService.updateByPhoneMd5(customer,SecurityConstants.INNER); + }else { + return AjaxResult.error("今日未撞库"); + } + //匹配资质 造轮子 返回多个符合的商户 + List merchants = matchMerchant(customer); + //TODO 取排序第一的 + + //返回渠道绑定的注册页拼接token + Map result = new HashMap<>(); + Map map = new HashMap<>(); + + //TODO 下游是H5承接不了上游全流程 暂时不做 + CustomerApplyLog customerApplyLog = new CustomerApplyLog(); + customerApplyLog.setCustomerId(customerInfoByPhoneMd5.getData().getId()); + customerApplyLog.setChannelId(channel.getId()); + customerApplyLog.setMerchantId(merchants.get(0).getId()); + customerApplyLog.setOrderStatus(0l); + remoteCustomerApplyLogService.add(customerApplyLog); + //返回上游信息 + return AjaxResult.success(result); + } + + +} diff --git a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/impl/SysPublicHalfServiceImpl.java b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/impl/SysPublicHalfServiceImpl.java index c554ae46..6a8b1289 100644 --- a/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/impl/SysPublicHalfServiceImpl.java +++ b/ruoyi-modules/ruoyi-btc/src/main/java/com/ruoyi/btc/service/impl/SysPublicHalfServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.btc.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; import com.ruoyi.btc.domain.ComPublicHalfDto; import com.ruoyi.btc.domain.CustomerInfoDto; @@ -10,7 +11,9 @@ import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.http.Channel; import com.ruoyi.common.core.domain.http.Customer; +import com.ruoyi.common.core.domain.http.CustomerApplyLog; import com.ruoyi.common.core.domain.http.Merchant; +import com.ruoyi.common.core.utils.ProbitUtil; import com.ruoyi.common.core.utils.SecureUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; @@ -20,6 +23,7 @@ import com.ruoyi.system.api.RemoteCustomerService; import com.ruoyi.system.api.RemoteMerchantService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestParam; import java.util.*; import java.util.stream.Collectors; @@ -186,21 +190,66 @@ public class SysPublicHalfServiceImpl implements ISysPublicHalfService @Override public AjaxResult input(ComPublicHalfDto comPublicHalfDto) { //校验 IP地址是否正常 渠道标识是否存在 数据是否为空 - + if (StringUtils.isEmpty(comPublicHalfDto.getChannelSignature())){ + return AjaxResult.error("渠道标识不能未空"); + } + Channel channel = redisService.getCacheObject(CacheConstants.CHANNEL_SIGN + comPublicHalfDto.getChannelSignature()); + if (channel==null||channel.getId()==null){ + return AjaxResult.error("渠道不存在"); + } + if (StringUtils.isEmpty(comPublicHalfDto.getData())){ + return AjaxResult.error("加密数据不能为空"); + } //解密为customerInfoDto - + String s = SecureUtils.AesUtil.AesDecode(comPublicHalfDto.getData(), comPublicHalfDto.getChannelSignature()); + if (s==null){ + return AjaxResult.error("解密异常"); + } + CustomerInfoDto customerInfoDto = JSONObject.parseObject(s, CustomerInfoDto.class); //校验数据必传参数是否未传 - + String checkData = checkData(customerInfoDto); //转化字段未数据库中资质字段 更新 用户实名状态 一并保存用户申请记录 已申请 - + if (checkData!=null){ + return AjaxResult.error(checkData); + } + //转化字段未数据库中资质字段 并保存 用户未实名状态 一并保存用户申请记录 未申请状态 + Customer customer = new Customer(); + BeanUtil.copyProperties(customerInfoDto,customer); + customer.setChannelId(channel.getId()); + customer.setActurlName(customerInfoDto.getName()); + customer.setFirstLoginTime(new Date()); + customer.setLastLoginTime(new Date()); + customer.setIsAuth(true); + customer.setStatus(1); + R customerInfoByPhoneMd5 = remoteCustomerService.getCustomerInfoByPhoneMd5(customerInfoDto.getPhoneMd5(), SecurityConstants.INNER); + if (customerInfoByPhoneMd5.getCode()==200){ + remoteCustomerService.updateByPhoneMd5(customer,SecurityConstants.INNER); + }else { + return AjaxResult.error("今日未撞库"); + } //匹配资质 造轮子 返回多个符合的商户 - - //取排序第一的 - + List merchants = matchMerchant(customer); + //TODO 取排序第一的 //返回渠道绑定的注册页拼接token - + Map result = new HashMap<>(); + Map map = new HashMap<>(); + if (CollectionUtil.isEmpty(merchants)){ + map.put("url",""); + map.put("regist",false); + result.put("data",map); + return AjaxResult.success(result); + } + String url = channel.getHtmlLocation() + "token="+remoteCustomerService.getCustomerToken(customer.getPhone()); + map.put("url",url); + map.put("regist",true); + result.put("data",map); + CustomerApplyLog customerApplyLog = new CustomerApplyLog(); + customerApplyLog.setCustomerId(customerInfoByPhoneMd5.getData().getId()); + customerApplyLog.setChannelId(channel.getId()); + customerApplyLog.setOrderStatus(0l); + remoteCustomerApplyLogService.add(customerApplyLog); //返回上游信息 - return null; + return AjaxResult.success(result); } /** @@ -208,14 +257,25 @@ public class SysPublicHalfServiceImpl implements ISysPublicHalfService * @param comPublicHalfDto */ @Override - public AjaxResult checkOrder(ComPublicHalfDto comPublicHalfDto) { + public AjaxResult checkOrder(String phoneMd5, String channelSign) { //根据手机号MD5渠道标识 查询是否成功 - + R customerInfoByPhoneMd5 = remoteCustomerService.getCustomerInfoByPhoneMd5(phoneMd5, SecurityConstants.INNER); + Channel channel = redisService.getCacheObject(CacheConstants.CHANNEL_ID + customerInfoByPhoneMd5.getData().getChannelId()); + R booleanR = remoteCustomerApplyLogService.customerApply(customerInfoByPhoneMd5.getData().getId(), SecurityConstants.INNER); //失败直接失败 - + if (!booleanR.getData()){ + return AjaxResult.success("用户未申请","false"); + } //成功抽奖 按扣量比抽 - + //成功数 + double succ = channel.getScore()*0.01; + //扣量数 + double socre = 1-(channel.getScore()*0.01); + List drow = new ArrayList<>(); + drow.add(succ); + drow.add(socre); + int draw = ProbitUtil.draw(drow); //返回是否成功 - return null; + return draw==0?AjaxResult.success("用户已申请",true):AjaxResult.success("用户未申请","false"); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/SystemConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/SystemConfig.java new file mode 100644 index 00000000..2d0ea6eb --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/SystemConfig.java @@ -0,0 +1,23 @@ +package com.ruoyi.system.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Minio 配置信息 + * + * @author ruoyi + */ +@Configuration +@ConfigurationProperties(prefix = "system") +@Data +public class SystemConfig +{ + /** + * 加密密钥 + */ + private String AESkey; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomerApplyLogController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomerApplyLogController.java index acfbc070..f0ff1b2e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomerApplyLogController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomerApplyLogController.java @@ -1,7 +1,6 @@ package com.ruoyi.system.controller; import java.util.List; -import java.io.IOException; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.core.constant.SecurityConstants; @@ -11,7 +10,7 @@ import org.springframework.web.bind.annotation.*; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.annotation.RequiresPermissions; -import com.ruoyi.system.domain.CustomerApplyLog; +import com.ruoyi.common.core.domain.http.CustomerApplyLog; import com.ruoyi.system.service.ICustomerApplyLogService; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.core.web.domain.AjaxResult; @@ -51,10 +50,23 @@ public class CustomerApplyLogController extends BaseController * @param source 请求来源 * @return 结果 */ - @GetMapping("/log/sum") + @GetMapping("/sum") public R sum(@PathVariable("merchantId") Long merchantId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source){ return R.ok(customerApplyLogService.getApplySum(merchantId)); } + + /** + * 获取用户今日是否是否已申请 + * + * + * @param customerID + * @param source 请求来源 + * @return 结果 + */ + @GetMapping("/customerApply") + public R customerApply(@PathVariable("customerID") Long customerID,@RequestHeader(SecurityConstants.FROM_SOURCE) String source){ + return customerApplyLogService.getCustomerApply(customerID); + } /** * 导出客户申请记录列表 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomerController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomerController.java index e562e212..2df2fea0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomerController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomerController.java @@ -131,4 +131,9 @@ public class CustomerController extends BaseController { return toAjax(customerService.deleteCustomerByIds(ids)); } + + @GetMapping("/getCustomerToken") + public String getCustomerToken(@RequestParam("phone") String phone) { + return customerService.getCustomerToken(phone); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/CustomerApplyLog.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/CustomerApplyLog.java deleted file mode 100644 index 69519eaf..00000000 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/CustomerApplyLog.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.ruoyi.system.domain; - -import java.math.BigDecimal; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.ruoyi.common.core.annotation.Excel; -import com.ruoyi.common.core.web.domain.BaseEntity; - -/** - * 客户申请记录对象 customer_apply_log - * - * @author ruoyi - * @date 2024-09-15 - */ -public class CustomerApplyLog extends BaseEntity -{ - private static final long serialVersionUID = 1L; - - /** $column.columnComment */ - private Long id; - - /** 用户id */ - @Excel(name = "用户id") - private Long customerId; - - /** 商户ID */ - @Excel(name = "商户ID") - private Long merchantId; - - /** $column.columnComment */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") - private Long channelId; - - /** 订单状态 0 已申请 1 注册中 2风控中 3下单中 4 下单成功 5已成交 */ - @Excel(name = "订单状态 0 已申请 1 注册中 2风控中 3下单中 4 下单成功 5已成交 ") - private Long orderStatus; - - /** 成交金额 分 */ - @Excel(name = "成交金额 分") - private BigDecimal price; - - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - public void setCustomerId(Long customerId) - { - this.customerId = customerId; - } - - public Long getCustomerId() - { - return customerId; - } - public void setMerchantId(Long merchantId) - { - this.merchantId = merchantId; - } - - public Long getMerchantId() - { - return merchantId; - } - public void setChannelId(Long channelId) - { - this.channelId = channelId; - } - - public Long getChannelId() - { - return channelId; - } - public void setOrderStatus(Long orderStatus) - { - this.orderStatus = orderStatus; - } - - public Long getOrderStatus() - { - return orderStatus; - } - public void setPrice(BigDecimal price) - { - this.price = price; - } - - public BigDecimal getPrice() - { - return price; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("customerId", getCustomerId()) - .append("merchantId", getMerchantId()) - .append("channelId", getChannelId()) - .append("orderStatus", getOrderStatus()) - .append("price", getPrice()) - .append("createTime", getCreateTime()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .toString(); - } -} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChannelMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChannelMapper.java index b948b0a9..23c34960 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChannelMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChannelMapper.java @@ -4,7 +4,6 @@ import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.common.core.domain.http.Channel; -import com.ruoyi.system.domain.CustomerApplyLog; /** * 渠道配置Mapper接口 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/CustomerApplyLogMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/CustomerApplyLogMapper.java index d03ee464..d5e81e50 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/CustomerApplyLogMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/CustomerApplyLogMapper.java @@ -3,8 +3,7 @@ package com.ruoyi.system.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.ruoyi.common.core.domain.http.Merchant; -import com.ruoyi.system.domain.CustomerApplyLog; +import com.ruoyi.common.core.domain.http.CustomerApplyLog; /** * 客户申请记录Mapper接口 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerApplyLogService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerApplyLogService.java index e47be17a..5219e5d5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerApplyLogService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerApplyLogService.java @@ -3,7 +3,8 @@ package com.ruoyi.system.service; import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; -import com.ruoyi.system.domain.CustomerApplyLog; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.domain.http.CustomerApplyLog; /** * 客户申请记录Service接口 @@ -67,4 +68,11 @@ public interface ICustomerApplyLogService extends IService * @return */ Integer getApplySum(Long merchantId); + + /** + * 获取用户今日是否是否已申请 + * @param customerID + * @return + */ + R getCustomerApply(Long customerID); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerService.java index d9fc95ed..966272eb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerService.java @@ -75,4 +75,11 @@ public interface ICustomerService extends IService * @return */ R updateByPhoneMd5(Customer customer); + + /** + * 获取用户tooken + * @param phone + * @return + */ + String getCustomerToken(String phone); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerApplyLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerApplyLogServiceImpl.java index 40803ee3..e6576316 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerApplyLogServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerApplyLogServiceImpl.java @@ -5,12 +5,13 @@ import java.util.List; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.LocalDateTimeUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.system.mapper.CustomerApplyLogMapper; -import com.ruoyi.system.domain.CustomerApplyLog; +import com.ruoyi.common.core.domain.http.CustomerApplyLog; import com.ruoyi.system.service.ICustomerApplyLogService; /** @@ -114,4 +115,20 @@ public class CustomerApplyLogServiceImpl extends ServiceImpl getCustomerApply(Long customerID) { + Long aLong = customerApplyLogMapper.selectCount( + new LambdaQueryWrapper() + .isNotNull(CustomerApplyLog::getMerchantId) + .eq(CustomerApplyLog::getOrderStatus, 0) + .ge(CustomerApplyLog::getCreateTime, LocalDateTimeUtils.getDateFromLocalDateTime(LocalDateTimeUtils.getTodayStartTime())) + .le(CustomerApplyLog::getCreateTime, LocalDateTimeUtils.getDateFromLocalDateTime(LocalDateTimeUtils.getTodayEndTime()))); + return R.ok(aLong>0); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerServiceImpl.java index b51dd9b6..02f96806 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerServiceImpl.java @@ -6,13 +6,19 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.constant.RedisConstant; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.EncryptUtil; +import com.ruoyi.common.redis.service.CustomerTokenService; +import com.ruoyi.system.config.SystemConfig; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import com.ruoyi.system.mapper.CustomerMapper; import com.ruoyi.common.core.domain.http.Customer; import com.ruoyi.system.service.ICustomerService; +import org.springframework.util.StringUtils; /** * 客户信息Service业务层处理 @@ -22,9 +28,11 @@ import com.ruoyi.system.service.ICustomerService; */ @Service @RequiredArgsConstructor +@Slf4j public class CustomerServiceImpl extends ServiceImpl implements IService,ICustomerService { private final CustomerMapper customerMapper; - + private final SystemConfig systemConfig; + private final CustomerTokenService customerTokenService; /** * 查询客户信息 * @@ -126,4 +134,19 @@ public class CustomerServiceImpl extends ServiceImpl i } return R.fail(); } + + @Override + public String getCustomerToken(String phone) { + log.info("获取用户token,手机号:{},加密结果:{}", phone, EncryptUtil.AESencode(phone, systemConfig.getAESkey())); + Customer customer = this.getOne(new LambdaQueryWrapper().eq(Customer::getPhone, EncryptUtil.AESencode(phone, systemConfig.getAESkey()))); + log.info("获取用户token,用户信息:{}", customer); + //获取到用户登陆的token + String token = customerTokenService.getToken(customer.getId()); + if (StringUtils.isEmpty(token)) { + //生成一个长60的token + token = customerTokenService.generateToken(customer.getId(), customer.getPhone(), "ANDROID", customer.getChannelId()); + } + return token; + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CustomerApplyLogMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CustomerApplyLogMapper.xml index ae26b77a..dffcc6a3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CustomerApplyLogMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CustomerApplyLogMapper.xml @@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -20,7 +20,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select id, customer_id, merchant_id, channel_id, order_status, price, create_time, update_time, remark from customer_apply_log - and customer_id = #{customerId} @@ -36,7 +36,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - + insert into customer_apply_log customer_id, @@ -60,7 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + update customer_apply_log customer_id = #{customerId},