Browse Source

Merge branch 'milestone-20251104-现金管理二期' of http://39.101.133.168:8807/huangqizhen/gold-java into lijianlin/feature-20251104110749-现金管理二期

sunjiabei/feature-20251021102635-银行接口
lijianlin 4 days ago
parent
commit
47a6e59350
  1. 74
      src/main/java/com/example/demo/config/MarketConverter.java
  2. 82
      src/main/java/com/example/demo/config/OrderStatusConverter.java
  3. 60
      src/main/java/com/example/demo/config/RefundModelConverter.java
  4. 21
      src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java
  5. 46
      src/main/java/com/example/demo/serviceImpl/coin/RechargeActivityCenterServiceImpl.java
  6. 2
      src/main/resources/cashMapper/MessageMapper.xml

74
src/main/java/com/example/demo/config/MarketConverter.java

@ -0,0 +1,74 @@
package com.example.demo.config;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.util.HashMap;
import java.util.Map;
/**
* 所属地区转换器Integer地区ID 地区名称EasyExcel导出用
*/
public class MarketConverter implements Converter<Integer> {
// 地区ID 地区名称 映射表从数据库表中提取
private static final Map<Integer, String> MARKET_MAP = new HashMap<>();
static {
// 初始化映射关系严格对应数据库表中的id和name
MARKET_MAP.put(1, "Capt");
MARKET_MAP.put(2, "公司");
MARKET_MAP.put(3, "市场部");
MARKET_MAP.put(4, "新加坡");
MARKET_MAP.put(5, "马来西亚");
MARKET_MAP.put(9, "研发部");
MARKET_MAP.put(999, "总部");
MARKET_MAP.put(24016, "加拿大");
MARKET_MAP.put(24018, "泰国");
MARKET_MAP.put(24022, "越南HCM");
MARKET_MAP.put(24027, "韩国");
MARKET_MAP.put(24028, "深圳运营");
MARKET_MAP.put(24030, "非网");
MARKET_MAP.put(24031, "其他");
MARKET_MAP.put(24032, "市场部");
}
/**
* 支持的Java类型Integer与market字段类型一致
*/
@Override
public Class<?> supportJavaTypeKey() {
return Integer.class;
}
/**
* Excel单元格数据类型字符串显示地区名称
*/
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 导出时Integer地区ID 地区名称
*/
@Override
public WriteCellData<?> convertToExcelData(Integer marketId, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
// 未匹配到的ID显示未知地区ID值便于排查异常
String marketName = MARKET_MAP.getOrDefault(marketId, "未知地区(" + marketId + ")");
return new WriteCellData<>(marketName);
}
/**
* 导入时地区名称 Integer地区ID可选实现如需导入可启用
*/
@Override
public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
// 若需支持导入可实现反向映射此处仅导出用返回null即可
return null;
}
}

82
src/main/java/com/example/demo/config/OrderStatusConverter.java

@ -0,0 +1,82 @@
package com.example.demo.config;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.util.HashMap;
import java.util.Map;
/**
* 订单状态转换器Integer值 中文描述EasyExcel导出用
*/
public class OrderStatusConverter implements Converter<Integer> {
// 状态值 中文描述 映射表严格对应注释中的状态
private static final Map<Integer, String> STATUS_MAP = new HashMap<>();
static {
// 初始化映射关系复制注释中的状态避免遗漏
STATUS_MAP.put(0, "线下财务待审核");
STATUS_MAP.put(1, "线下财务审核通过待填手续费");
STATUS_MAP.put(2, "线下财务审核驳回");
STATUS_MAP.put(5, "手动撤回待编辑提交");
STATUS_MAP.put(3, "link线上财务复核待填手续费");
STATUS_MAP.put(4, "收款流程全部结束");
STATUS_MAP.put(6, "退款");
STATUS_MAP.put(10, "地区财务待审核");
STATUS_MAP.put(11, "地区财务手动撤回待编辑提交");
STATUS_MAP.put(12, "地区财务驳回");
STATUS_MAP.put(20, "地区负责人待审核");
STATUS_MAP.put(22, "地区负责人驳回");
STATUS_MAP.put(30, "总部财务待审核");
STATUS_MAP.put(32, "总部财务驳回");
STATUS_MAP.put(40, "执行人待处理");
STATUS_MAP.put(41, "执行人已处理,退款结束");
}
/**
* 支持的Java类型Integer与status字段类型一致
*/
@Override
public Class<?> supportJavaTypeKey() {
return Integer.class;
}
/**
* Excel单元格数据类型字符串显示中文描述
*/
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 导出时Integer状态值 中文描述
*/
@Override
public WriteCellData<?> convertToExcelData(Integer status, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
// 未匹配到的状态显示未知状态避免导出空值
String statusDesc = STATUS_MAP.getOrDefault(status, "未知状态(" + status + ")");
return new WriteCellData<>(statusDesc);
}
/**
* 导入时中文描述 Integer状态值可选实现如需导入可启用
*/
@Override
public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
String statusDesc = cellData.getStringValue();
// 反向映射根据中文描述找状态值如果需要导入功能
for (Map.Entry<Integer, String> entry : STATUS_MAP.entrySet()) {
if (entry.getValue().equals(statusDesc)) {
return entry.getKey();
}
}
// 未匹配到返回null或自定义默认值
return null;
}
}

60
src/main/java/com/example/demo/config/RefundModelConverter.java

@ -0,0 +1,60 @@
package com.example.demo.config;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.util.HashMap;
import java.util.Map;
/**
* 退款方式转换器0全额1部分EasyExcel导出用
*/
public class RefundModelConverter implements Converter<Integer> {
// 退款方式映射表严格对应0=全额1=部分
private static final Map<Integer, String> REFUND_MODEL_MAP = new HashMap<>();
static {
REFUND_MODEL_MAP.put(0, "全额");
REFUND_MODEL_MAP.put(1, "部分");
}
@Override
public Class<?> supportJavaTypeKey() {
return Integer.class; // 支持的Java类型与refundModel字段类型一致
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING; // Excel显示为字符串中文描述
}
/**
* 导出时Integer值 中文描述
*/
@Override
public WriteCellData<?> convertToExcelData(Integer refundModel, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
// 未匹配到的异常值如2null等显示未知退款方式便于排查
String desc = REFUND_MODEL_MAP.getOrDefault(refundModel, "未知退款方式(" + (refundModel == null ? "null" : refundModel) + ")");
return new WriteCellData<>(desc);
}
/**
* 导入时中文描述 Integer值可选实现如需导入可启用
*/
@Override
public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
String desc = cellData.getStringValue();
// 反向映射根据中文找对应数值
for (Map.Entry<Integer, String> entry : REFUND_MODEL_MAP.entrySet()) {
if (entry.getValue().equals(desc)) {
return entry.getKey();
}
}
return null; // 未匹配返回null可根据业务调整默认值
}
}

21
src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java

@ -2,6 +2,9 @@ package com.example.demo.domain.vo.cash;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.example.demo.config.MarketConverter;
import com.example.demo.config.OrderStatusConverter;
import com.example.demo.config.RefundModelConverter;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -26,11 +29,11 @@ import java.util.List;
public class CashRecordDTO{
@ExcelIgnore
private String activity;// 活动
@ExcelProperty("品名称")
@ExcelProperty("品名称")
private String goodsName;// 商品名称
@ExcelProperty("品数量")
@ExcelProperty("品数量")
private Integer goodsNum;// 商品数量
@ExcelProperty("品单位")
@ExcelProperty("品单位")
private String numUnit;// 商品单位
@ExcelIgnore
private BigDecimal gold;//永久金币
@ -93,15 +96,15 @@ public class CashRecordDTO{
/**
* 姓名
*/
@ExcelProperty("姓名")
private String userName;
@ExcelIgnore
private String userName;
@ExcelProperty("姓名")
private String name;
/**
* 所属地区
*/
@ExcelProperty("所属地区")
@ExcelProperty(value = "所属地区",converter = MarketConverter.class)
private Integer market;
/**
@ -146,7 +149,7 @@ public class CashRecordDTO{
30总部财务待审核32总部财务驳回
40执行人待处理41执行人已处理退款结束
*/
@ExcelProperty("订单状态")
@ExcelProperty(value="订单状态",converter = OrderStatusConverter.class)
private Integer status;
/**
@ -182,13 +185,13 @@ public class CashRecordDTO{
/**
* 退款备注理由,客服填写
*/
@ExcelProperty("退款备注")
@ExcelProperty("退款理由")
private String refundReason;
/**
* 退款方式0全额/1部分
*/
@ExcelProperty("退款方式")
@ExcelProperty(value = "退款方式",converter = RefundModelConverter.class)
private Integer refundModel;
/**

46
src/main/java/com/example/demo/serviceImpl/coin/RechargeActivityCenterServiceImpl.java

@ -29,7 +29,7 @@ public class RechargeActivityCenterServiceImpl implements RechargeActivityCenter
@Autowired
private RechargeActivityCenterMapper rechargeActivityCenterMapper;
private static final String ACTIVITY_NAME_REGEX = "^[\\u4e00-\\u9fa5a-zA-Z0-9,。!?、;:\"'()《》【】—~,.:;!'()\\[\\]-_&+=]{1,100}$";
private static final String ACTIVITY_NAME_REGEX = "^[\\u4e00-\\u9fa5a-zA-Z0-9,。!?、;:\"'‘’“”()《》【】—~~,.:;!()\\[\\]\\-_&+=]{1,100}$";
private static final Pattern ACTIVITY_NAME_PATTERN = Pattern.compile(ACTIVITY_NAME_REGEX);
// 根据ID查询活动
@Override
@ -43,35 +43,51 @@ public class RechargeActivityCenterServiceImpl implements RechargeActivityCenter
// 新增活动
@Override
public void addActivity(RechargeActivity activity) {
String activityName = activity.getActivityName();
if (activity.getActivityName().length() > 100) {
// 1. 长度校验
if (activityName.length() > 100) {
throw new IllegalArgumentException("活动名称不能超过100个字符");
}
// 2. 名称重复校验
RechargeActivity activityByName = rechargeActivityCenterMapper.queryActivityByName(activity);
if (activityByName != null) {
throw new IllegalArgumentException("活动名称已存在");
}
// 3. 字符格式校验
if (!ACTIVITY_NAME_PATTERN.matcher(activity.getActivityName()).matches()) {
throw new IllegalArgumentException("活动名称仅允许包含汉字、英文字母、数字及常见标点符号(中英文标点:,。!?、;:\"'()《》【】——~,.:;!'()[]-_&+=)");
// 3. 字符格式校验提取非法字符
if (!ACTIVITY_NAME_PATTERN.matcher(activityName).matches()) {
// 反向匹配提取所有不符合规则的字符
StringBuilder illegalChars = new StringBuilder();
for (char c : activityName.toCharArray()) {
if (!ACTIVITY_NAME_PATTERN.matcher(String.valueOf(c)).matches()) {
// 去重避免重复输出同一非法字符
if (illegalChars.indexOf(String.valueOf(c)) == -1) {
illegalChars.append(c).append("、");
}
}
}
// 去除最后一个顿号拼接提示信息
String illegalStr = illegalChars.deleteCharAt(illegalChars.length() - 1).toString();
throw new IllegalArgumentException(
String.format("活动名称包含非法字符:%s,仅允许包含汉字、英文字母、数字及常见标点符号(中英文标点:,。!??、;:\"'‘’“”()《》【】—~~,.:;!()[]-_&+=)", illegalStr)
);
}
// 4. 时间范围判断设置对应状态
Date startTime = activity.getStartTime();
Date endTime = activity.getEndTime();
Date now = new Date(); // 当前系统本地时间
//获取当前系统时间本地时间与活动时间时区保持一致
Date now = new Date();
//时间范围判断设置对应状态
if (now.before(startTime)) {
// 当前时间 < 开始时间 未开始状态0
activity.setStatus("0");
activity.setStatus("0"); // 未开始
} else if (now.after(endTime)) {
// 当前时间 > 结束时间 已结束状态2
activity.setStatus("2");
activity.setStatus("2"); // 已结束
} else {
// 开始时间 当前时间 结束时间 进行中状态1
activity.setStatus("1");
activity.setStatus("1"); // 进行中
}
rechargeActivityCenterMapper.addActivity(activity);
}

2
src/main/resources/cashMapper/MessageMapper.xml

@ -24,7 +24,7 @@
ORDER BY ${sortField} ${sortOrder}
</when>
<otherwise>
ORDER BY crr.create_time DESC
ORDER BY cz_time DESC
</otherwise>
</choose>
</where>

Loading…
Cancel
Save