/api/v2/acc/metadata/query 余额查询-查询配置

This commit is contained in:
tqzhang 2025-02-05 16:59:54 +08:00
parent 7c3e23bc9b
commit bc0f0ec174
34 changed files with 1905 additions and 7 deletions

View File

@ -221,6 +221,12 @@
<version>33.0.0-jre</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.12.780</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,101 @@
package com.bonus.framework.config.deserializer;
import com.beust.jcommander.internal.Maps;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy$1MM$2dd$3HH$4mm$5ss$6";
public static final String YYYY_MM_DD_HH_MM = "yyyy$1MM$2dd$3HH$4mm$5";
public static final String YYYY_MM_DD_HH = "yyyy$1MM$2dd$3HH$4";
public static final String YYYY_MM_DD = "yyyy$1MM$2dd$3";
public static final String YYYY_MM = "yyyy$1MM$2";
public static final String HH_MM_SS = "HH$1mm$2ss$3";
public static final String HH_MM = "HH$1mm$2";
private static final Map<String, Pattern> patternMap = Maps.newLinkedHashMap();
public static void main(String[] args) {
System.out.println(getPattern("2014/10/10 11:11:11"));
System.out.println(getPattern("2014-10-10"));
System.out.println(getPattern("2014-10-10 11:11"));
System.out.println(getPattern("2014-10"));
System.out.println(getPattern("2014年10月10日 11点11分11秒"));
System.out.println(getPattern("11:11:11"));
System.out.println(getPattern("11点11分"));
}
public static String getPattern(String dateString) {
Iterator var1 = patternMap.entrySet().iterator();
while(var1.hasNext()) {
Map.Entry<String, Pattern> entry = (Map.Entry)var1.next();
Matcher matcher = ((Pattern)entry.getValue()).matcher(dateString);
if (matcher.find()) {
if ("yyyy$1MM$2dd$3HH$4mm$5ss$6".equals(entry.getKey())) {
return "yyyy$1MM$2dd$3HH$4mm$5ss$6".replace("$1", matcher.group(1)).replace("$2", matcher.group(2)).replace("$3", matcher.group(3)).replace("$4", matcher.group(4)).replace("$5", matcher.group(5)).replace("$6", matcher.group(6));
}
if ("yyyy$1MM$2dd$3HH$4mm$5".equals(entry.getKey())) {
return "yyyy$1MM$2dd$3HH$4mm$5".replace("$1", matcher.group(1)).replace("$2", matcher.group(2)).replace("$3", matcher.group(3)).replace("$4", matcher.group(4)).replace("$5", matcher.group(5));
}
if ("yyyy$1MM$2dd$3HH$4".equals(entry.getKey())) {
return "yyyy$1MM$2dd$3HH$4".replace("$1", matcher.group(1)).replace("$2", matcher.group(2)).replace("$3", matcher.group(3)).replace("$4", matcher.group(4));
}
if ("yyyy$1MM$2dd$3".equals(entry.getKey())) {
return "yyyy$1MM$2dd$3".replace("$1", matcher.group(1)).replace("$2", matcher.group(2)).replace("$3", matcher.group(3));
}
if ("yyyy$1MM$2".equals(entry.getKey())) {
return "yyyy$1MM$2".replace("$1", matcher.group(1)).replace("$2", matcher.group(2));
}
if ("HH$1mm$2ss$3".equals(entry.getKey())) {
return "HH$1mm$2ss$3".replace("$1", matcher.group(1)).replace("$2", matcher.group(2)).replace("$3", matcher.group(3));
}
if ("HH$1mm$2".equals(entry.getKey())) {
return "HH$1mm$2".replace("$1", matcher.group(1)).replace("$2", matcher.group(2));
}
}
}
return null;
}
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
if (StringUtils.isBlank(p.getText())) {
return null;
} else {
String pattern = getPattern(p.getText());
if (pattern == null) {
throw new RuntimeException("不支持的日期格式:" + p.getText());
} else {
return LocalDateTime.parse(p.getText(), DateTimeFormatter.ofPattern(pattern));
}
}
}
static {
patternMap.put("yyyy$1MM$2dd$3HH$4mm$5ss$6", Pattern.compile("^\\d{4}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D?)$"));
patternMap.put("yyyy$1MM$2dd$3HH$4mm$5", Pattern.compile("^\\d{4}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D?)$"));
patternMap.put("yyyy$1MM$2dd$3HH$4", Pattern.compile("^\\d{4}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D?)$"));
patternMap.put("yyyy$1MM$2dd$3", Pattern.compile("^\\d{4}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D?)$"));
patternMap.put("yyyy$1MM$2", Pattern.compile("^\\d{4}(\\D+)\\d{1,2}(\\D?)$"));
patternMap.put("HH$1mm$2ss$3", Pattern.compile("^\\d{1,2}(\\D+)\\d{1,2}(\\D+)\\d{1,2}(\\D?)$"));
patternMap.put("HH$1mm$2", Pattern.compile("^\\d{1,2}(\\D+)\\d{1,2}(\\D?)$"));
}
}

View File

@ -0,0 +1,64 @@
package com.bonus.framework.config.serializer;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeSerializer extends JsonSerializer<LocalDateTime> {
private final String pattern;
public DateTimeSerializer(String pattern) {
this.pattern = pattern;
}
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.format(DateTimeFormatter.ofPattern(this.pattern)));
}
public static class HH_MM extends DateTimeSerializer {
public HH_MM() {
super("HH:mm");
}
}
public static class HH_MM_SS extends DateTimeSerializer {
public HH_MM_SS() {
super("HH:mm:ss");
}
}
public static class YYYY_MM extends DateTimeSerializer {
public YYYY_MM() {
super("yyyy-MM");
}
}
public static class YYYY_MM_DD extends DateTimeSerializer {
public YYYY_MM_DD() {
super("yyyy-MM-dd");
}
}
public static class YYYY_MM_DD_HH extends DateTimeSerializer {
public YYYY_MM_DD_HH() {
super("yyyy-MM-dd HH");
}
}
public static class YYYY_MM_DD_HH_MM extends DateTimeSerializer {
public YYYY_MM_DD_HH_MM() {
super("yyyy-MM-dd HH:mm");
}
}
public static class YYYY_MM_DD_HH_MM_SS extends DateTimeSerializer {
public YYYY_MM_DD_HH_MM_SS() {
super("yyyy-MM-dd HH:mm:ss");
}
}
}

View File

@ -135,12 +135,16 @@
<artifactId>alipay-sdk-java</artifactId>
<version>4.34.0.ALL</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>mybatis-plus-extension</artifactId>-->
<!-- <version>3.5.6</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.10.1</version>
</dependency>
</dependencies>
<build>

View File

@ -16,7 +16,11 @@
</description>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.10.1</version>
</dependency>
<!--加密依赖包-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>

View File

@ -0,0 +1,32 @@
package com.bonus.core.account.v3.metadata.controller;
import com.bonus.core.account.v3.metadata.model.AccMetadataModel;
import com.bonus.core.account.v3.metadata.service.AccMetadataService;
import com.sun.org.slf4j.internal.Logger;
import com.sun.org.slf4j.internal.LoggerFactory;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping({"/api/v2/acc/metadata"})
@Api(
tags = {"账户配置控制器"}
)
public class AccMetadataController {
private static final Logger log = LoggerFactory.getLogger(AccMetadataController.class);
@Resource
@Lazy
private AccMetadataService accMetadataService;
@ApiOperation("查询配置")
@PostMapping({"/query"})
public AccMetadataModel queryMetadata() {
return this.accMetadataService.queryMetadata();
}
}

View File

@ -0,0 +1,117 @@
package com.bonus.core.account.v3.metadata.enums;
import cn.hutool.core.collection.ListUtil;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public enum AccWalletIdEnum {
WALLET(1, "个人钱包"),
SUBSIDY(2, "补贴钱包"),
LUCK_MONEY(4, "红包");
private final Integer key;
private final String desc;
private AccWalletIdEnum(Integer key, String desc) {
this.key = key;
this.desc = desc;
}
public static String getDesc(Integer key) {
AccWalletIdEnum[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
AccWalletIdEnum temp = var1[var3];
if (temp.getKey().equals(key)) {
return temp.getDesc();
}
}
return "";
}
public static AccWalletIdEnum getEnum(Integer key) {
AccWalletIdEnum[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
AccWalletIdEnum temp = var1[var3];
if (temp.getKey().equals(key)) {
return temp;
}
}
return null;
}
public static Map<Integer, AccWalletIdEnum> getEnumMap() {
return (Map)Arrays.stream(values()).collect(Collectors.toMap(AccWalletIdEnum::getKey, Function.identity()));
}
public static List<Integer> checkAccCancelWallet() {
return Arrays.asList(WALLET.getKey(), SUBSIDY.getKey());
}
public static String getAllWalletId() {
List<Integer> list = new ArrayList();
AccWalletIdEnum[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
AccWalletIdEnum temp = var1[var3];
list.add(temp.getKey());
}
return StringUtils.join(list, ",");
}
public static List<Integer> getAllWalletIdList() {
List<Integer> list = new ArrayList();
AccWalletIdEnum[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
AccWalletIdEnum temp = var1[var3];
list.add(temp.getKey());
}
return list;
}
public static boolean ifSupportOpenRecharge(Integer walletId) {
return ListUtil.toList(new Integer[]{WALLET.getKey(), SUBSIDY.getKey()}).contains(walletId);
}
public static boolean iFCorrectWalletId(Integer key) {
List<Integer> list = new ArrayList();
AccWalletIdEnum[] var2 = values();
int var3 = var2.length;
for(int var4 = 0; var4 < var3; ++var4) {
AccWalletIdEnum temp = var2[var4];
list.add(temp.getKey());
}
return list.contains(key);
}
public Integer getKey() {
return this.key;
}
public String getDesc() {
return this.desc;
}
// $FF: synthetic method
private static AccWalletIdEnum[] $values() {
return new AccWalletIdEnum[]{WALLET, SUBSIDY, LUCK_MONEY};
}
}

View File

@ -0,0 +1,101 @@
package com.bonus.core.account.v3.metadata.model;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import com.bonus.core.account.v3.metadata.enums.AccWalletIdEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel("账户配置模型")
public class AccMetadataModel {
@ApiModelProperty("账户支付顺序(1,2,4)")
private String accPayOrder;
@ApiModelProperty("是否启用第三方充值 默认否")
private String ifUseThirdRecharge;
@ApiModelProperty("是否查询第三方余额 默认否")
private String ifUseThirdAccBal;
@ApiModelProperty("账户个人钱包-最低余额限制 默认0")
private String minBalanceLimit;
@ApiModelProperty("账户补贴钱包-最低余额限制 默认0")
private String minSubBalanceLimit;
@ApiModelProperty("账户红包钱包-最低余额限制 默认0")
private String minRedBalanceLimit;
@ApiModelProperty("移动端取款是否审批 默认否 1是 2否")
private String ifApproveMobileWithdraw;
@ApiModelProperty("移动端是否支持取款 默认否")
private String ifSupportMobileWithdraw;
@ApiModelProperty("离线支付默认使用钱包(个人钱包)")
private String offlineWalletPay;
public String getAccPayOrder() {
return StrUtil.isBlank(this.accPayOrder) ? AccWalletIdEnum.getAllWalletId() : this.accPayOrder;
}
public String getOfflineWalletPay() {
return CharSequenceUtil.isBlank(this.offlineWalletPay) ? String.valueOf(AccWalletIdEnum.WALLET.getKey()) : this.offlineWalletPay;
}
public String getIfUseThirdRecharge() {
return this.ifUseThirdRecharge;
}
public String getIfUseThirdAccBal() {
return this.ifUseThirdAccBal;
}
public String getMinBalanceLimit() {
return this.minBalanceLimit;
}
public String getMinSubBalanceLimit() {
return this.minSubBalanceLimit;
}
public String getMinRedBalanceLimit() {
return this.minRedBalanceLimit;
}
public String getIfApproveMobileWithdraw() {
return this.ifApproveMobileWithdraw;
}
public String getIfSupportMobileWithdraw() {
return this.ifSupportMobileWithdraw;
}
public void setAccPayOrder(final String accPayOrder) {
this.accPayOrder = accPayOrder;
}
public void setIfUseThirdRecharge(final String ifUseThirdRecharge) {
this.ifUseThirdRecharge = ifUseThirdRecharge;
}
public void setIfUseThirdAccBal(final String ifUseThirdAccBal) {
this.ifUseThirdAccBal = ifUseThirdAccBal;
}
public void setMinBalanceLimit(final String minBalanceLimit) {
this.minBalanceLimit = minBalanceLimit;
}
public void setMinSubBalanceLimit(final String minSubBalanceLimit) {
this.minSubBalanceLimit = minSubBalanceLimit;
}
public void setMinRedBalanceLimit(final String minRedBalanceLimit) {
this.minRedBalanceLimit = minRedBalanceLimit;
}
public void setIfApproveMobileWithdraw(final String ifApproveMobileWithdraw) {
this.ifApproveMobileWithdraw = ifApproveMobileWithdraw;
}
public void setIfSupportMobileWithdraw(final String ifSupportMobileWithdraw) {
this.ifSupportMobileWithdraw = ifSupportMobileWithdraw;
}
public void setOfflineWalletPay(final String offlineWalletPay) {
this.offlineWalletPay = offlineWalletPay;
}
}

View File

@ -0,0 +1,21 @@
package com.bonus.core.account.v3.metadata.service;
import com.bonus.core.account.v3.metadata.model.AccMetadataModel;
import com.bonus.core.allocation.api.AllocMetadataApi;
import com.bonus.core.common.enums.MetadataModelTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class AccMetadataService {
@Resource
@Lazy
private AllocMetadataApi allocMetadataApi;
public AccMetadataModel queryMetadata() {
return (AccMetadataModel)this.allocMetadataApi.queryMetadataModel(MetadataModelTypeEnum.ACC, new AccMetadataModel());
}
}

View File

@ -0,0 +1,9 @@
package com.bonus.core.allocation.alloc.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bonus.core.allocation.alloc.model.AllocMetadata;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AllocPayMetadataMapper extends BaseMapper<AllocMetadata> {
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.bonus.core.allocation.alloc.mapper.AllocPayMetadataMapper">
</mapper>

View File

@ -0,0 +1,51 @@
package com.bonus.core.allocation.alloc.model;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bonus.core.common.enums.MetadataModelTypeEnum;
import com.bonus.framework.config.deserializer.DateTimeDeserializer;
import com.bonus.framework.config.serializer.DateTimeSerializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
@TableName("alloc_metadata")
@ApiModel("元数据配置表")
@Data
public class AllocMetadata {
@TableId
@ApiModelProperty("元数据id")
private Long metadataId;
@ApiModelProperty("区域id")
private Long areaId;
@ApiModelProperty("食堂id")
private Long canteenId;
@ApiModelProperty("档口id")
private Long stallId;
@ApiModelProperty("是否有效 1是2否")
private Integer ifActive;
@ApiModelProperty("模型类型")
private String modelType;
@ApiModelProperty("模型key")
private String modelKey;
@ApiModelProperty("模型值")
private String modelValue;
@ApiModelProperty("模型key备注")
private String modelKeyRemark;
@ApiModelProperty("创建人")
private String crby;
@ApiModelProperty("创建时间")
private LocalDateTime crtime;
@ApiModelProperty("更新人")
private String upby;
@ApiModelProperty("更新时间")
private LocalDateTime uptime;
}

View File

@ -0,0 +1,38 @@
package com.bonus.core.allocation.alloc.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel("元数据model")
public class MetadataModel {
@ApiModelProperty("模型key")
private String modelKey;
@ApiModelProperty("模型值")
private String modelValue;
@ApiModelProperty("模型key备注")
private String modelKeyRemark;
public String getModelKey() {
return this.modelKey;
}
public String getModelValue() {
return this.modelValue;
}
public String getModelKeyRemark() {
return this.modelKeyRemark;
}
public void setModelKey(final String modelKey) {
this.modelKey = modelKey;
}
public void setModelValue(final String modelValue) {
this.modelValue = modelValue;
}
public void setModelKeyRemark(final String modelKeyRemark) {
this.modelKeyRemark = modelKeyRemark;
}
}

View File

@ -0,0 +1,12 @@
package com.bonus.core.allocation.alloc.service;
import com.bonus.core.allocation.alloc.model.AllocMetadata;
import com.bonus.core.common.enums.MetadataModelTypeEnum;
import java.util.List;
public interface AllocMetadataService {
List<AllocMetadata> listPayMetadataByType(MetadataModelTypeEnum modelType, Long canteenId, Long stallId);
}

View File

@ -0,0 +1,75 @@
package com.bonus.core.allocation.alloc.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bonus.core.allocation.alloc.mapper.AllocPayMetadataMapper;
import com.bonus.core.allocation.alloc.model.AllocMetadata;
import com.bonus.core.allocation.alloc.service.AllocMetadataService;
import com.bonus.core.allocation.api.AllocStallApi;
import com.bonus.core.allocation.canteen.model.AllocStall;
import com.bonus.core.common.enums.MetadataModelTypeEnum;
import com.bonus.core.common.redis.RedisUtil;
import com.bonus.core.common.utils.TenantContextHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class AllocMetadataServiceImpl extends ServiceImpl<AllocPayMetadataMapper, AllocMetadata> implements AllocMetadataService {
private static final Logger log = LoggerFactory.getLogger(AllocMetadataServiceImpl.class);
private static final String CACHE_PREFIX = "yst:";
private static final String CACHE_KEY = "pay-mata-data";
private static final long CACHE_SECONDS = 3600L;
@Resource
private AllocStallApi allocStallApi;
public List<AllocMetadata> listPayMetadataCacheable(MetadataModelTypeEnum modelTypeEnum) {
return this.listPayMetadataCacheable(modelTypeEnum.getKey());
}
private List<AllocMetadata> listPayMetadataCacheable(String modelType) {
String var10000 = this.getCacheKeyPrefix();
String cacheKey = var10000 + modelType;
Object cacheObj = RedisUtil.getObj(cacheKey);
if (cacheObj instanceof List) {
return (List)cacheObj;
} else {
List<AllocMetadata> selectList = this.baseMapper.selectList(Wrappers.lambdaQuery(AllocMetadata.class).eq(AllocMetadata::getModelType, modelType));
RedisUtil.setObj(cacheKey, selectList, 3600L);
return selectList;
}
}
public String getCacheKeyPrefix() {
return "yst:" + TenantContextHolder.getTenantId() + ":pay-mata-data:";
}
@Override
public List<AllocMetadata> listPayMetadataByType(MetadataModelTypeEnum modelType, Long canteenId, Long stallId) {
if (ObjectUtil.isNotNull(stallId) && ObjectUtil.isNull(canteenId)) {
AllocStall stall = this.allocStallApi.getAllocStall(stallId);
if (!ObjectUtil.isNull(stall) && !ObjectUtil.isNull(stall.getCanteenId())) {
canteenId = stall.getCanteenId();
} else {
log.warn("【配置项】未查到档口关联食堂:{},{},{}", new Object[]{modelType, canteenId, stallId});
}
}
Long finalCanteenId = canteenId;
return (List)this.listPayMetadataCacheable(modelType).stream().filter((s) -> {
return ObjectUtil.equal(s.getCanteenId(), finalCanteenId) && ObjectUtil.equal(s.getStallId(), stallId);
}).collect(Collectors.toList());
}
public String getPayMetadataValue(MetadataModelTypeEnum modelTypeEnum, String modelKey, Long canteenId, Long stallId) {
return (String)this.listPayMetadataByType(modelTypeEnum, canteenId, stallId).stream().filter((s) -> {
return StrUtil.equals(s.getModelKey(), modelKey);
}).map(AllocMetadata::getModelValue).filter(Objects::nonNull).findFirst().orElse("");
}
}

View File

@ -0,0 +1,30 @@
package com.bonus.core.allocation.api;
import com.bonus.core.common.enums.MetadataModelTypeEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @ClassName: AllocMetadataApi
* @author: tqzhang
* @Date: 2025/1/24 23:51
* @version: 1.0
* @description:
*/
@Component
public class AllocMetadataApi {
private static final Logger log = LoggerFactory.getLogger(AllocMetadataApi.class);
@Resource
@Lazy
private GlobalMetadataApi globalMetadataApi;
public <T> T queryMetadataModel(MetadataModelTypeEnum modelTypeEnum, T t) {
return this.globalMetadataApi.getModel(modelTypeEnum, t, (Long)null, (Long)null);
}
}

View File

@ -0,0 +1,21 @@
package com.bonus.core.allocation.api;
import com.bonus.core.allocation.canteen.model.AllocStall;
import com.bonus.core.allocation.canteen.service.AllocStallService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class AllocStallApi {
private static final Logger log = LoggerFactory.getLogger(AllocStallApi.class);
@Resource
@Lazy
private AllocStallService allocStallService;
public AllocStall getAllocStall(Long stallId) {
return this.allocStallService.getAllocStallCache(stallId);
}
}

View File

@ -0,0 +1,33 @@
package com.bonus.core.allocation.api;
import cn.hutool.core.util.ObjectUtil;
import com.bonus.core.allocation.alloc.model.AllocMetadata;
import com.bonus.core.allocation.alloc.service.AllocMetadataService;
import com.bonus.core.allocation.util.MetadataUtil;
import com.bonus.core.common.enums.MetadataModelTypeEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
@Component
public class GlobalMetadataApi {
private static final Logger log = LoggerFactory.getLogger(GlobalMetadataApi.class);
@Resource
@Lazy
private AllocMetadataService allocMetadataService;
public <T> T getModel(MetadataModelTypeEnum modelTypeEnum, T t, Long canteenId, Long stallId) {
List<AllocMetadata> metadataList = this.getList(modelTypeEnum, canteenId, stallId);
return MetadataUtil.transferToPayModel(metadataList, t);
}
public List<AllocMetadata> getList(MetadataModelTypeEnum modelTypeEnum, Long canteenId, Long stallId) {
Long finalCanteenId = ObjectUtil.equal(canteenId, -1) ? null : canteenId;
Long finalStallId = ObjectUtil.equal(stallId, -1) ? null : stallId;
return this.allocMetadataService.listPayMetadataByType(modelTypeEnum, finalCanteenId, finalStallId);
}
}

View File

@ -0,0 +1,9 @@
package com.bonus.core.allocation.canteen.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bonus.core.allocation.canteen.model.AllocStall;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AllocStallMapper extends BaseMapper<AllocStall> {
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.bonus.core.allocation.canteen.mapper.AllocStallMapper">
</mapper>

View File

@ -0,0 +1,370 @@
package com.bonus.core.allocation.canteen.model;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bonus.core.common.utils.SysUtil;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
import java.time.LocalTime;
@TableName("alloc_stall")
@ApiModel("档口信息表")
public class AllocStall {
@TableId
@ApiModelProperty("主键id")
private Long id;
@ApiModelProperty("档口id")
private Long stallId;
@ApiModelProperty("档口编号")
private String stallNum;
@ApiModelProperty("档口名称")
private String stallName;
@ApiModelProperty("食堂id")
private Long canteenId;
@ApiModelProperty("区域id")
private Long areaId;
@ApiModelProperty("档口业务类型")
private Integer stallType;
@ApiModelProperty("第三方档口id")
private String thirdStallId;
@ApiModelProperty("人员id")
private Long custId;
@ApiModelProperty("联系电话")
private String contactTel;
@ApiModelProperty("主营项目")
private String mainProject;
@ApiModelProperty("档口营业状态")
private Integer businessState;
@ApiModelProperty("营业时间")
@JsonDeserialize(
using = LocalTimeDeserializer.class
)
@JsonSerialize(
using = LocalTimeSerializer.class
)
private LocalTime startBusinessTime;
@JsonDeserialize(
using = LocalTimeDeserializer.class
)
@JsonSerialize(
using = LocalTimeSerializer.class
)
private LocalTime endBusinessTime;
@ApiModelProperty("是否启用叫号")
private Integer ifUseCallNum;
@ApiModelProperty("线上流水号前缀")
private String onLineMealCodePrefix;
@ApiModelProperty("线下流水号前缀")
private String offLineMealCodePrefix;
@ApiModelProperty("是否启用配送配置")
private Integer ifEnableDelivery;
@ApiModelProperty("配送方式(多个数据之间 使用,分隔)")
private String deliveries;
@ApiModelProperty("是否启用点餐配置")
private Integer ifEnableOrder;
@ApiModelProperty("档口图片链接")
private String imgUrl;
@ApiModelProperty("是否支持报餐")
private Integer ifBook;
@ApiModelProperty("是否支持预定餐")
private Integer ifReserve;
@ApiModelProperty("是否启用收款码")
private Integer ifEnablePayCode;
@ApiModelProperty("档口收款码链接")
private String payCodeUrl;
@ApiModelProperty("是否删除")
private Integer ifDel;
@ApiModelProperty("创建人")
private String crby;
@ApiModelProperty("创建时间")
@JsonDeserialize(
using = LocalDateTimeDeserializer.class
)
@JsonSerialize(
using = LocalDateTimeSerializer.class
)
private LocalDateTime crtime;
@ApiModelProperty("更新人")
private String upby;
@ApiModelProperty("更新时间")
@JsonDeserialize(
using = LocalDateTimeDeserializer.class
)
@JsonSerialize(
using = LocalDateTimeSerializer.class
)
private LocalDateTime uptime;
public AllocStall(Long stallId) {
this.stallId = stallId;
}
public AllocStall(Long stallId, Long canteenId, String stallName, Integer stallType, String thirdStallId) {
this.stallId = stallId;
this.canteenId = canteenId;
this.stallName = stallName;
this.stallType = stallType;
this.thirdStallId = thirdStallId;
}
public String getImgUrl() {
return SysUtil.getCutPath(this.imgUrl);
}
public String getPayCodeUrl() {
return SysUtil.getCutPath(this.payCodeUrl);
}
public Long getId() {
return this.id;
}
public Long getStallId() {
return this.stallId;
}
public String getStallNum() {
return this.stallNum;
}
public String getStallName() {
return this.stallName;
}
public Long getCanteenId() {
return this.canteenId;
}
public Long getAreaId() {
return this.areaId;
}
public Integer getStallType() {
return this.stallType;
}
public String getThirdStallId() {
return this.thirdStallId;
}
public Long getCustId() {
return this.custId;
}
public String getContactTel() {
return this.contactTel;
}
public String getMainProject() {
return this.mainProject;
}
public Integer getBusinessState() {
return this.businessState;
}
public LocalTime getStartBusinessTime() {
return this.startBusinessTime;
}
public LocalTime getEndBusinessTime() {
return this.endBusinessTime;
}
public Integer getIfUseCallNum() {
return this.ifUseCallNum;
}
public String getOnLineMealCodePrefix() {
return this.onLineMealCodePrefix;
}
public String getOffLineMealCodePrefix() {
return this.offLineMealCodePrefix;
}
public Integer getIfEnableDelivery() {
return this.ifEnableDelivery;
}
public String getDeliveries() {
return this.deliveries;
}
public Integer getIfEnableOrder() {
return this.ifEnableOrder;
}
public Integer getIfBook() {
return this.ifBook;
}
public Integer getIfReserve() {
return this.ifReserve;
}
public Integer getIfEnablePayCode() {
return this.ifEnablePayCode;
}
public Integer getIfDel() {
return this.ifDel;
}
public String getCrby() {
return this.crby;
}
public LocalDateTime getCrtime() {
return this.crtime;
}
public String getUpby() {
return this.upby;
}
public LocalDateTime getUptime() {
return this.uptime;
}
public void setId(final Long id) {
this.id = id;
}
public void setStallId(final Long stallId) {
this.stallId = stallId;
}
public void setStallNum(final String stallNum) {
this.stallNum = stallNum;
}
public void setStallName(final String stallName) {
this.stallName = stallName;
}
public void setCanteenId(final Long canteenId) {
this.canteenId = canteenId;
}
public void setAreaId(final Long areaId) {
this.areaId = areaId;
}
public void setStallType(final Integer stallType) {
this.stallType = stallType;
}
public void setThirdStallId(final String thirdStallId) {
this.thirdStallId = thirdStallId;
}
public void setCustId(final Long custId) {
this.custId = custId;
}
public void setContactTel(final String contactTel) {
this.contactTel = contactTel;
}
public void setMainProject(final String mainProject) {
this.mainProject = mainProject;
}
public void setBusinessState(final Integer businessState) {
this.businessState = businessState;
}
@JsonDeserialize(
using = LocalTimeDeserializer.class
)
public void setStartBusinessTime(final LocalTime startBusinessTime) {
this.startBusinessTime = startBusinessTime;
}
@JsonDeserialize(
using = LocalTimeDeserializer.class
)
public void setEndBusinessTime(final LocalTime endBusinessTime) {
this.endBusinessTime = endBusinessTime;
}
public void setIfUseCallNum(final Integer ifUseCallNum) {
this.ifUseCallNum = ifUseCallNum;
}
public void setOnLineMealCodePrefix(final String onLineMealCodePrefix) {
this.onLineMealCodePrefix = onLineMealCodePrefix;
}
public void setOffLineMealCodePrefix(final String offLineMealCodePrefix) {
this.offLineMealCodePrefix = offLineMealCodePrefix;
}
public void setIfEnableDelivery(final Integer ifEnableDelivery) {
this.ifEnableDelivery = ifEnableDelivery;
}
public void setDeliveries(final String deliveries) {
this.deliveries = deliveries;
}
public void setIfEnableOrder(final Integer ifEnableOrder) {
this.ifEnableOrder = ifEnableOrder;
}
public void setImgUrl(final String imgUrl) {
this.imgUrl = imgUrl;
}
public void setIfBook(final Integer ifBook) {
this.ifBook = ifBook;
}
public void setIfReserve(final Integer ifReserve) {
this.ifReserve = ifReserve;
}
public void setIfEnablePayCode(final Integer ifEnablePayCode) {
this.ifEnablePayCode = ifEnablePayCode;
}
public void setPayCodeUrl(final String payCodeUrl) {
this.payCodeUrl = payCodeUrl;
}
public void setIfDel(final Integer ifDel) {
this.ifDel = ifDel;
}
public void setCrby(final String crby) {
this.crby = crby;
}
@JsonDeserialize(
using = LocalDateTimeDeserializer.class
)
public void setCrtime(final LocalDateTime crtime) {
this.crtime = crtime;
}
public void setUpby(final String upby) {
this.upby = upby;
}
@JsonDeserialize(
using = LocalDateTimeDeserializer.class
)
public void setUptime(final LocalDateTime uptime) {
this.uptime = uptime;
}
}

View File

@ -0,0 +1,10 @@
package com.bonus.core.allocation.canteen.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bonus.core.allocation.canteen.model.AllocStall;
public interface AllocStallService extends IService<AllocStall> {
AllocStall getAllocStallCache(Long stallId);
}

View File

@ -0,0 +1,48 @@
package com.bonus.core.allocation.canteen.service.impl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
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.bonus.core.allocation.canteen.mapper.AllocStallMapper;
import com.bonus.core.allocation.canteen.model.AllocStall;
import com.bonus.core.allocation.canteen.service.AllocStallService;
import com.bonus.core.common.redis.RedisUtil;
import com.bonus.core.common.utils.TenantContextHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class AllocStallServiceImpl extends ServiceImpl<AllocStallMapper, AllocStall> implements AllocStallService{
private static final Logger log = LoggerFactory.getLogger(AllocStallServiceImpl.class);
private static final String CACHE_PREFIX = "yst:";
private static final String CACHE_KEY = "alloc-stall";
private static final long CACHE_SECONDS = 3600L;
@Override
public AllocStall getAllocStallCache(Long stallId) {
if (ObjectUtil.isNull(stallId)) {
return null;
} else {
String cacheKey = this.getCacheKey(stallId);
String allocStallStr = RedisUtil.getString(cacheKey);
if (CharSequenceUtil.isNotBlank(allocStallStr)) {
return (AllocStall)JSONUtil.toBean(allocStallStr, AllocStall.class);
} else {
AllocStall allocStall = this.getOne(new LambdaQueryWrapper<AllocStall>().eq(AllocStall::getStallId, stallId));
allocStallStr = JSONUtil.toJsonStr(allocStall);
RedisUtil.setString(cacheKey, allocStallStr, 3600L);
return allocStall;
}
}
}
private String getCacheKey(Long stallId) {
Long var10000 = TenantContextHolder.getTenantId();
return "yst:" + var10000 + ":alloc-stall:" + stallId;
}
}

View File

@ -0,0 +1,103 @@
package com.bonus.core.allocation.util;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.json.JSONUtil;
import com.bonus.core.allocation.alloc.model.AllocMetadata;
import com.bonus.core.allocation.alloc.model.MetadataModel;
import com.sun.org.slf4j.internal.Logger;
import com.sun.org.slf4j.internal.LoggerFactory;
import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;
public class MetadataUtil {
private static final Logger log = LoggerFactory.getLogger(MetadataUtil.class);
private static final String URL = "url";
private static final String PATH = "path";
private static final String CERT = "cert";
private MetadataUtil() {
}
public static <T> T transferToPayModel(List<AllocMetadata> payMetadataList, T t) {
T t1 = (T) JSONUtil.toBean(JSONUtil.toJsonStr(t), t.getClass());
if (CollUtil.isEmpty(payMetadataList)) {
return t1;
} else {
Map<String, String> metadataMap = (Map)payMetadataList.stream().collect(Collectors.toMap((s) -> {
return CharSequenceUtil.nullToEmpty(s.getModelKey());
}, (s) -> {
return CharSequenceUtil.nullToEmpty(s.getModelValue());
}));
BeanUtil.fillBeanWithMapIgnoreCase(metadataMap, t1, true);
return t1;
}
}
public static <T> Map<String, MetadataModel> getStringMetadataMap(T t) {
Map<String, String> methodMap = new HashMap();
Method[] methods = t.getClass().getMethods();
Method[] var3 = methods;
int var4 = methods.length;
for(int var5 = 0; var5 < var4; ++var5) {
Method method = var3[var5];
String methodName = method.getName();
if (methodName.startsWith("get") && !methodName.contains("Class") && !methodName.contains("AreaId")) {
String modelKey = CharSequenceUtil.lowerFirst(methodName.substring(3));
String modelValue = null;
try {
modelValue = String.valueOf(method.invoke(t, (Object[])null));
} catch (InvocationTargetException | IllegalAccessException var13) {
System.out.println(modelKey + ",数据转换时,未获取到对应方法");
}
if (CharSequenceUtil.isNotBlank(modelValue) && !modelValue.contains("null")) {
methodMap.put(modelKey, modelValue);
} else {
methodMap.put(modelKey, "");
}
}
}
Map<String, String> fieldMap = new HashMap();
Field[] declaredFields = t.getClass().getDeclaredFields();
Field[] declaredSuperFields = t.getClass().getSuperclass().getDeclaredFields();
List<Field> fieldList = new ArrayList(Arrays.asList(declaredFields));
fieldList.addAll(Arrays.asList(declaredSuperFields));
Iterator var18 = fieldList.iterator();
while(var18.hasNext()) {
Field field = (Field)var18.next();
if (field.getAnnotation(ApiModelProperty.class) != null) {
fieldMap.put(field.getName().toLowerCase(), ((ApiModelProperty)field.getAnnotation(ApiModelProperty.class)).value());
}
}
Map<String, MetadataModel> metadataMap = new HashMap();
Iterator var21 = methodMap.entrySet().iterator();
while(var21.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry)var21.next();
String filed = (String)entry.getKey();
String lowerCaseField = filed.toLowerCase();
if (fieldMap.containsKey(lowerCaseField)) {
MetadataModel metadata = new MetadataModel();
metadata.setModelKey(filed);
metadata.setModelValue((String)entry.getValue());
metadata.setModelKeyRemark(lowerCaseField);
metadataMap.put(filed, metadata);
}
}
return metadataMap;
}
}

View File

@ -0,0 +1,85 @@
package com.bonus.core.common.enums;
import cn.hutool.core.collection.CollUtil;
import java.util.List;
public enum MetadataModelTypeEnum {
ACC("acc", "账户配置"),
ATTENDANCE("Attendance", "考勤配置"),
CUSTOMER("customer", "人员配置"),
CUSTOMER_FACE("customer", "人员-人脸特征值配置"),
DELIVERY("delivery", "配送配置"),
DEVICE("device", "设备配置"),
DEVICE_CABINET("device", "设备-取餐柜配置"),
DEVICE_WEIGHT("device", "设备-计量主机配置"),
DEVICE_CONSUME("device", "设备-消费机配置"),
ENTERPRISE_CODE("enterpriseCode", "支付宝企业码"),
MARKETING("supermarket", "商超配置"),
MEALTIME("mealtime", "餐次配置"),
MENU("menu", "菜品菜谱配置"),
MERCHANT("merchant", "商家配置"),
MOBILE("mobile", "移动端配置"),
MOBILE_COMMON("mobile", "移动端通用配置"),
NOTICE("notice", "通知配置"),
NOTICE_PRINT("notice", "通知-打印配置"),
NUTRITION("nutrition", "营养模块配置"),
ORDER("order", "订单配置"),
ORDER_CHARGEBACK("order", "订单-退单配置"),
ORDER_RESERVE("order", "订单-订餐配置"),
ORDER_DELIVERY("order", "订单-配送配置"),
PAY("pay", "支付配置"),
PAY_ALIPAY("pay", "支付-支付宝配置"),
PAY_WECHATPAY("pay", "支付-微信配置"),
PAY_WECHATPAY_SCORE("pay", "支付-微信支付分配置"),
PAY_SHOUQIANBA("pay", "支付-收钱吧配置"),
PAY_UNIONPAY_QUICK("pay", "支付-银联云闪付配置"),
PAY_ABC("pay", "支付-农业银行配置"),
PAY_ICBC("pay", "支付-工商银行配置"),
PAY_OTHER("pay", "支付-其他支付配置"),
REPORT("report", "报表配置"),
REPORT_DATA_SCREEN("report", "数据大屏"),
DRP_SUPPLIER_SCORE("drp", "出入库-供应商评分"),
DRP("drp", "出入库");
private final String key;
private final String desc;
public boolean supportSeparated() {
return CollUtil.contains(supportSeparatedTypes(), this.key);
}
public static List<String> supportSeparatedTypes() {
return CollUtil.toList(new String[]{MEALTIME.getKey(), DELIVERY.getKey(), ORDER.getKey(), PAY.getKey()});
}
public static String modelKeyOfSeparatedType(String key) {
if (DELIVERY.getKey().equals(key)) {
return "ifEnableDelivery";
} else if (ORDER.getKey().equals(key)) {
return "ifEnableOrder";
} else if (PAY.getKey().equals(key)) {
return "ifEnablePay";
} else {
return MEALTIME.getKey().equals(key) ? "ifEnableMealtime" : "";
}
}
private MetadataModelTypeEnum(String key, String desc) {
this.key = key;
this.desc = desc;
}
public String getKey() {
return this.key;
}
public String getDesc() {
return this.desc;
}
// $FF: synthetic method
private static MetadataModelTypeEnum[] $values() {
return new MetadataModelTypeEnum[]{ACC, ATTENDANCE, CUSTOMER, CUSTOMER_FACE, DELIVERY, DEVICE, DEVICE_CABINET, DEVICE_WEIGHT, DEVICE_CONSUME, ENTERPRISE_CODE, MARKETING, MEALTIME, MENU, MERCHANT, MOBILE, MOBILE_COMMON, NOTICE, NOTICE_PRINT, NUTRITION, ORDER, ORDER_CHARGEBACK, ORDER_RESERVE, ORDER_DELIVERY, PAY, PAY_ALIPAY, PAY_WECHATPAY, PAY_WECHATPAY_SCORE, PAY_SHOUQIANBA, PAY_UNIONPAY_QUICK, PAY_ABC, PAY_ICBC, PAY_OTHER, REPORT, REPORT_DATA_SCREEN, DRP_SUPPLIER_SCORE, DRP};
}
}

View File

@ -0,0 +1,125 @@
package com.bonus.core.common.redis;
import cn.hutool.core.collection.CollUtil;
import com.bonus.core.common.utils.SpringContextHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class RedisUtil {
private static final Logger log = LoggerFactory.getLogger(RedisUtil.class);
public static void setString(String key, String value) {
setString(key, value, (Long)null);
}
public static void setString(String key, String value, Long timeOut) {
timeOut = timeoutFilter(timeOut);
if (value != null) {
if (timeOut != null) {
stringRedisTemplate().opsForValue().set(key, value, timeOut, TimeUnit.SECONDS);
} else {
stringRedisTemplate().opsForValue().set(key, value);
}
}
}
public static Boolean setIfPresentString(String key, String value, Long timeOut) {
timeOut = timeoutFilter(timeOut);
if (value != null) {
return timeOut != null ? stringRedisTemplate().opsForValue().setIfPresent(key, value, timeOut, TimeUnit.SECONDS) : stringRedisTemplate().opsForValue().setIfPresent(key, value);
} else {
return false;
}
}
public static String getString(String key) {
return (String)stringRedisTemplate().opsForValue().get(key);
}
public static void setObj(String key, Object value) {
setObj(key, value, (Long)null);
}
public static void setObj(String key, Object value, Long timeOut) {
timeOut = timeoutFilter(timeOut);
if (value != null) {
if (timeOut != null) {
redisTemplate().opsForValue().set(key, value, timeOut, TimeUnit.SECONDS);
} else {
redisTemplate().opsForValue().set(key, value);
}
}
}
public static Object getObj(String key) {
return redisTemplate().opsForValue().get(key);
}
public static void delete(String key) {
redisTemplate().delete(key);
}
public static void deleteByPattern(String keyPattern) {
Set<Object> keys = redisTemplate().keys(keyPattern);
if (CollUtil.isNotEmpty(keys)) {
redisTemplate().delete(keys);
}
}
private static Long timeoutFilter(Long timeout) {
Long maxExpSecond = (Long)environment().getProperty("spring.redis.custom-max-expiration-second", Long.class);
if (maxExpSecond != null && (timeout == null || timeout > maxExpSecond)) {
timeout = maxExpSecond;
}
return timeout;
}
public static List<String> keysByPattern(String pattern) {
Set<Object> keys = redisTemplate().keys(pattern);
return (List)(CollUtil.isEmpty(keys) ? new ArrayList() : (List)keys.stream().map(Object::toString).collect(Collectors.toList()));
}
public static void multiSet(Map map) {
redisTemplate().opsForValue().multiSet(map);
}
public static List multiGet(List keys) {
return redisTemplate().opsForValue().multiGet(keys);
}
public static void zAdd(String key, Object value, double score) {
redisTemplate().opsForZSet().add(key, value, score);
}
public static Set<ZSetOperations.TypedTuple<Object>> zGetList(String key, long start, long end) {
return redisTemplate().opsForZSet().rangeWithScores(key, start, end);
}
private static StringRedisTemplate stringRedisTemplate() {
return (StringRedisTemplate) SpringContextHolder.getBean(StringRedisTemplate.class);
}
private static RedisTemplate<Object, Object> redisTemplate() {
return (RedisTemplate)SpringContextHolder.getBean("redisTemplate");
}
private static Environment environment() {
return (Environment)SpringContextHolder.getBean(Environment.class);
}
}

View File

@ -0,0 +1,108 @@
package com.bonus.core.common.utils;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(
prefix = "oss"
)
public class OssProperties {
private String endpoint;
private String customDomain;
private Boolean pathStyleAccess = true;
private String appId;
private String region;
private String accessKey;
private String secretKey;
private String bucketName = "lnyst";
private Boolean useHttp = false;
private Integer expiresTime = 604800;
private Boolean useToken = false;
public String getEndpoint() {
return this.endpoint;
}
public String getCustomDomain() {
return this.customDomain;
}
public Boolean getPathStyleAccess() {
return this.pathStyleAccess;
}
public String getAppId() {
return this.appId;
}
public String getRegion() {
return this.region;
}
public String getAccessKey() {
return this.accessKey;
}
public String getSecretKey() {
return this.secretKey;
}
public String getBucketName() {
return this.bucketName;
}
public Boolean getUseHttp() {
return this.useHttp;
}
public Integer getExpiresTime() {
return this.expiresTime;
}
public Boolean getUseToken() {
return this.useToken;
}
public void setEndpoint(final String endpoint) {
this.endpoint = endpoint;
}
public void setCustomDomain(final String customDomain) {
this.customDomain = customDomain;
}
public void setPathStyleAccess(final Boolean pathStyleAccess) {
this.pathStyleAccess = pathStyleAccess;
}
public void setAppId(final String appId) {
this.appId = appId;
}
public void setRegion(final String region) {
this.region = region;
}
public void setAccessKey(final String accessKey) {
this.accessKey = accessKey;
}
public void setSecretKey(final String secretKey) {
this.secretKey = secretKey;
}
public void setBucketName(final String bucketName) {
this.bucketName = bucketName;
}
public void setUseHttp(final Boolean useHttp) {
this.useHttp = useHttp;
}
public void setExpiresTime(final Integer expiresTime) {
this.expiresTime = expiresTime;
}
public void setUseToken(final Boolean useToken) {
this.useToken = useToken;
}
}

View File

@ -0,0 +1,36 @@
package com.bonus.core.common.utils;
import com.amazonaws.services.s3.AmazonS3;
import org.springframework.beans.factory.InitializingBean;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class OssTemplate implements InitializingBean {
private final OssProperties ossProperties;
private AmazonS3 amazonS3;
public String getObjectURL(String bucketName, String objectName, Integer expires) {
try {
Date date = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.add(13, expires);
URL url = this.amazonS3.generatePresignedUrl(bucketName, objectName, calendar.getTime());
return url.toString();
} catch (Throwable var7) {
throw var7;
}
}
public OssTemplate(final OssProperties ossProperties) {
this.ossProperties = ossProperties;
}
@Override
public void afterPropertiesSet() throws Exception {
}
}

View File

@ -0,0 +1,53 @@
package com.bonus.core.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@Service
@Lazy(false)
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
private static final Logger log = LoggerFactory.getLogger(SpringContextHolder.class);
private static ApplicationContext applicationContext = null;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolder.applicationContext = applicationContext;
}
public static <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> requiredType) {
return applicationContext.getBean(requiredType);
}
public static void clearHolder() {
if (log.isDebugEnabled()) {
log.debug("清除SpringContextHolder中的ApplicationContext:" + String.valueOf(applicationContext));
}
applicationContext = null;
}
public static void publishEvent(ApplicationEvent event) {
if (applicationContext != null) {
applicationContext.publishEvent(event);
}
}
@Override
public void destroy() {
clearHolder();
}
}

View File

@ -0,0 +1,36 @@
package com.bonus.core.common.utils;
import java.nio.charset.Charset;
public final class StandardCharsets {
private StandardCharsets() {
throw new AssertionError("No java.nio.charset.StandardCharsets instances for you!");
}
/**
* Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the
* Unicode character set
*/
public static final Charset US_ASCII = Charset.forName("US-ASCII");
/**
* ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
*/
public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
/**
* Eight-bit UCS Transformation Format
*/
public static final Charset UTF_8 = Charset.forName("UTF-8");
/**
* Sixteen-bit UCS Transformation Format, big-endian byte order
*/
public static final Charset UTF_16BE = Charset.forName("UTF-16BE");
/**
* Sixteen-bit UCS Transformation Format, little-endian byte order
*/
public static final Charset UTF_16LE = Charset.forName("UTF-16LE");
/**
* Sixteen-bit UCS Transformation Format, byte order identified by an
* optional byte-order mark
*/
public static final Charset UTF_16 = Charset.forName("UTF-16");
}

View File

@ -0,0 +1,137 @@
package com.bonus.core.common.utils;
import cn.hutool.core.text.CharSequenceUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.stream.Collectors;
@Component
public class SysUtil {
private static final Logger log = LoggerFactory.getLogger(SysUtil.class);
@Value("${system.sysfile.prefixOffline}")
private String prefixOffline;
@Value("${system.sysfile.bucket}")
private String prefixBucket;
@Value("${system.sysfile.prefixOnline}")
private String prefixOnline;
private static final SysUtilProxy sysUtilProxy = new SysUtilProxy();
private static String prefixOn;
private static String bucket;
private static String prefixOff;
@PostConstruct
public void init() {
prefixOn = this.prefixOnline;
bucket = this.prefixBucket;
prefixOff = this.prefixOffline;
}
public static String getPrefix() {
return sysUtilProxy.getPrefix(prefixOn, prefixOff);
}
public static String getBucket() {
return bucket;
}
public static String getCutFileUrl(String fileUrl) {
log.info("出参_补图_原路径:{},前缀:{},存储桶:{}", new Object[]{fileUrl, getPrefix(), getBucket()});
String cutFileUrl = getCutFileUrl(fileUrl, getPrefix(), getBucket());
log.info("出参_补图_补图后路径:{}", cutFileUrl);
return cutFileUrl;
}
public static String getCutPath(String fileUrl) {
log.info("入参_裁图_原路径:{},前缀:{},存储桶:{}", new Object[]{fileUrl, getPrefix(), getBucket()});
if (!CharSequenceUtil.isBlank(fileUrl) && !fileUrl.startsWith(getBucket())) {
if (Boolean.FALSE.equals(getOssProperties().getUseToken())) {
return fileUrl.replace(getPrefix(), getBucket());
} else {
fileUrl = getUnEncodeUrl(fileUrl);
fileUrl = fileUrl.replace(getPrefix(), getBucket());
fileUrl = getCutSignUrl(fileUrl);
log.info("入参_裁图_裁剪后路径:{}", fileUrl);
return fileUrl;
}
} else {
return fileUrl;
}
}
public static String getCutPathMulti(String fileUrl) {
return CharSequenceUtil.contains(fileUrl, ",") ? (String)CharSequenceUtil.split(fileUrl, ",", true, true).stream().map(SysUtil::getCutPath).collect(Collectors.joining(",")) : getCutPath(fileUrl);
}
public static String getFilePath(String fileUrl) {
if (CharSequenceUtil.isBlank(fileUrl)) {
return fileUrl;
} else {
String cutPath = getCutPath(fileUrl);
return cutPath.replace(getBucket(), "");
}
}
public static String getObjectName(String fileUrl) {
if (CharSequenceUtil.isBlank(fileUrl)) {
return fileUrl;
} else {
String cutPath = getCutPath(fileUrl);
String replace = cutPath.replace(getBucket(), "");
if (CharSequenceUtil.startWith(replace, "/")) {
replace = replace.substring(1);
}
return replace;
}
}
public static OssTemplate getOssTemplate() {
return (OssTemplate)SpringContextHolder.getBean(OssTemplate.class);
}
public static OssProperties getOssProperties() {
return (OssProperties)SpringContextHolder.getBean(OssProperties.class);
}
public static String getUnEncodeUrl(String url) {
if (CharSequenceUtil.isBlank(url)) {
return url;
} else {
try {
String decodedUrl = URLDecoder.decode(url, String.valueOf(StandardCharsets.UTF_8));
return !decodedUrl.equals(url) ? decodedUrl : url;
} catch (IllegalArgumentException var2) {
log.info("图片url解码失败,图片url:{},异常信息_:{},详情_:", new Object[]{url, var2.getMessage(), var2});
return url;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
public static String getCutSignUrl(String fileUrl) {
return CharSequenceUtil.isNotBlank(fileUrl) && fileUrl.contains("?") ? fileUrl.substring(0, fileUrl.indexOf("?")) : fileUrl;
}
public static String getCutFileUrl(String fileUrl, String filePrefix, String prefixBucket) {
if (CharSequenceUtil.isBlank(fileUrl)) {
return fileUrl;
} else if (Boolean.FALSE.equals(getOssProperties().getUseToken())) {
return !fileUrl.startsWith("http") && !fileUrl.startsWith("https") ? fileUrl.replace(prefixBucket, filePrefix) : fileUrl;
} else {
if (fileUrl.startsWith("http") || fileUrl.startsWith("https")) {
fileUrl = fileUrl.replace(filePrefix + "/", "");
}
fileUrl = getCutSignUrl(fileUrl);
fileUrl = fileUrl.replace(prefixBucket + "/", "");
return getOssTemplate().getObjectURL(prefixBucket, fileUrl, getOssProperties().getExpiresTime());
}
}
}

View File

@ -0,0 +1,19 @@
package com.bonus.core.common.utils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
public class SysUtilProxy {
public String getPrefix(String prefixOn, String prefixOff) {
if (RequestContextHolder.getRequestAttributes() != null) {
HttpServletRequest request = ((ServletRequestAttributes)Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
String headerValue = request.getHeader("X-Env");
return "online".equals(headerValue) ? prefixOn : prefixOff;
} else {
return prefixOff;
}
}
}

View File

@ -0,0 +1,21 @@
package com.bonus.core.common.utils;
public final class TenantContextHolder {
private static final ThreadLocal<Long> THREAD_LOCAL_TENANT = new InheritableThreadLocal();
public static Long getTenantId() {
return (Long)THREAD_LOCAL_TENANT.get();
}
public static void setTenantId(Long tenantId) {
THREAD_LOCAL_TENANT.set(tenantId);
}
public static void clear() {
THREAD_LOCAL_TENANT.remove();
}
private TenantContextHolder() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
}

10
pom.xml
View File

@ -37,6 +37,7 @@
<poi.version>4.1.2</poi.version>
<transmittable-thread-local.version>2.14.4</transmittable-thread-local.version>
<jasypt-spring-boot-starter.version>3.0.2</jasypt-spring-boot-starter.version>
<mybatis-plus.version>3.5.10.1</mybatis-plus.version>
</properties>
<!-- 依赖声明 -->
@ -240,6 +241,15 @@
<artifactId>bonus-api-system</artifactId>
<version>${bonus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>