Merge remote-tracking branch 'origin/test' into test
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
package com.czg.service.market.mapper;
|
||||
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import com.czg.market.entity.MkEnableConfig;
|
||||
|
||||
/**
|
||||
* 兑换码明细 映射层。
|
||||
*
|
||||
* @author zs
|
||||
* @since 2025-10-21
|
||||
*/
|
||||
public interface MkEnableConfigMapper extends BaseMapper<MkEnableConfig> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.czg.service.market.mapper;
|
||||
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import com.czg.market.entity.MkRechargeRedemptionCode;
|
||||
|
||||
/**
|
||||
* 兑换码明细 映射层。
|
||||
*
|
||||
* @author zs
|
||||
* @since 2025-10-21
|
||||
*/
|
||||
public interface MkRechargeRedemptionCodeMapper extends BaseMapper<MkRechargeRedemptionCode> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.czg.service.market.mapper;
|
||||
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import com.czg.market.entity.MkRechargeRedemptionConfig;
|
||||
|
||||
/**
|
||||
* 充值优惠券修改 映射层。
|
||||
*
|
||||
* @author zs
|
||||
* @since 2025-10-21
|
||||
*/
|
||||
public interface MkRechargeRedemptionConfigMapper extends BaseMapper<MkRechargeRedemptionConfig> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.czg.service.market.service.impl;
|
||||
|
||||
import com.czg.constant.TableValueConstant;
|
||||
import com.mybatisflex.core.query.QueryWrapper;
|
||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||
import com.czg.market.entity.MkEnableConfig;
|
||||
import com.czg.market.service.MkEnableConfigService;
|
||||
import com.czg.service.market.mapper.MkEnableConfigMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 兑换码明细 服务层实现。
|
||||
*
|
||||
* @author zs
|
||||
* @since 2025-10-21
|
||||
*/
|
||||
@Service
|
||||
public class MkEnableConfigServiceImpl extends ServiceImpl<MkEnableConfigMapper, MkEnableConfig> implements MkEnableConfigService{
|
||||
|
||||
@Override
|
||||
public Integer detail(Long mainShopId, Long shopId, TableValueConstant.EnableConfig.Type type) {
|
||||
MkEnableConfig one = getOne(new QueryWrapper().eq(MkEnableConfig::getMainShopId, mainShopId).eq(MkEnableConfig::getType, type.getCode()));
|
||||
if (one == null) {
|
||||
one = new MkEnableConfig();
|
||||
one.setMainShopId(mainShopId);
|
||||
one.setIsEnable(1);
|
||||
one.setShopId(shopId);
|
||||
save(one);
|
||||
}
|
||||
return one.getIsEnable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean upEnable(Long mainShopId, Long shopId, Integer enable, TableValueConstant.EnableConfig.Type type) {
|
||||
MkEnableConfig one = getOne(new QueryWrapper().eq(MkEnableConfig::getMainShopId, mainShopId).eq(MkEnableConfig::getType, type.getCode()));
|
||||
if (one == null) {
|
||||
one = new MkEnableConfig();
|
||||
one.setMainShopId(mainShopId);
|
||||
one.setIsEnable(enable);
|
||||
one.setShopId(shopId);
|
||||
save(one);
|
||||
}else {
|
||||
one.setIsEnable(enable);
|
||||
updateById(one);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.czg.service.market.service.impl;
|
||||
|
||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||
import com.czg.market.entity.MkRechargeRedemptionCode;
|
||||
import com.czg.market.service.MkRechargeRedemptionCodeService;
|
||||
import com.czg.service.market.mapper.MkRechargeRedemptionCodeMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 兑换码明细 服务层实现。
|
||||
*
|
||||
* @author zs
|
||||
* @since 2025-10-21
|
||||
*/
|
||||
@Service
|
||||
public class MkRechargeRedemptionCodeServiceImpl extends ServiceImpl<MkRechargeRedemptionCodeMapper, MkRechargeRedemptionCode> implements MkRechargeRedemptionCodeService{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,233 @@
|
||||
package com.czg.service.market.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.poi.excel.ExcelUtil;
|
||||
import cn.hutool.poi.excel.ExcelWriter;
|
||||
import com.czg.account.entity.ShopUser;
|
||||
import com.czg.exception.CzgException;
|
||||
import com.czg.market.dto.MkRechargeRedemptionConfigDTO;
|
||||
import com.czg.market.entity.MkRechargeRedemptionCode;
|
||||
import com.czg.market.service.MkRechargeRedemptionCodeService;
|
||||
import com.czg.market.vo.MkRechargeRedemptionCodeVO;
|
||||
import com.czg.market.vo.MkRechargeRedemptionConfigVO;
|
||||
import com.czg.utils.AssertUtil;
|
||||
import com.czg.utils.MyQueryWrapper;
|
||||
import com.czg.utils.PageUtil;
|
||||
import com.mybatisflex.core.paginate.Page;
|
||||
import com.mybatisflex.core.query.QueryWrapper;
|
||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||
import com.czg.market.entity.MkRechargeRedemptionConfig;
|
||||
import com.czg.market.service.MkRechargeRedemptionConfigService;
|
||||
import com.czg.service.market.mapper.MkRechargeRedemptionConfigMapper;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 充值优惠券修改 服务层实现。
|
||||
*
|
||||
* @author zs
|
||||
* @since 2025-10-21
|
||||
*/
|
||||
@Service
|
||||
public class MkRechargeRedemptionConfigServiceImpl extends ServiceImpl<MkRechargeRedemptionConfigMapper, MkRechargeRedemptionConfig> implements MkRechargeRedemptionConfigService{
|
||||
@Resource
|
||||
private MkRechargeRedemptionCodeService codeService;
|
||||
|
||||
/**
|
||||
* 生成指定活动的兑换码集合
|
||||
* @param activityId 活动ID
|
||||
* @param count 生成数量(≤1000)
|
||||
*/
|
||||
public static Set<String> generateCodes(long activityId, int count) {
|
||||
Set<String> codes = new HashSet<>();
|
||||
|
||||
String actPart = String.format("%03d", activityId % 1000);
|
||||
|
||||
while (codes.size() < count) {
|
||||
String patternPart = generatePatternNumber();
|
||||
String code = actPart + patternPart;
|
||||
codes.add(code);
|
||||
}
|
||||
return codes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成“有规律”的9位数字串
|
||||
* 包含连续或重复数字,提升记忆性
|
||||
*/
|
||||
private static String generatePatternNumber() {
|
||||
// 随机选择模式类型
|
||||
int mode = RandomUtil.randomInt(1, 4);
|
||||
|
||||
switch (mode) {
|
||||
case 1:
|
||||
// 连续上升(如 123456789, 456789123)
|
||||
int start = RandomUtil.randomInt(0, 5);
|
||||
StringBuilder sb1 = new StringBuilder();
|
||||
for (int i = 0; i < 9; i++) {
|
||||
sb1.append((start + i) % 10);
|
||||
}
|
||||
return sb1.toString();
|
||||
|
||||
case 2:
|
||||
// 连续下降(如 987654321, 654321987)
|
||||
int down = RandomUtil.randomInt(3, 9);
|
||||
StringBuilder sb2 = new StringBuilder();
|
||||
for (int i = 0; i < 9; i++) {
|
||||
sb2.append((down - i + 10) % 10);
|
||||
}
|
||||
return sb2.toString();
|
||||
|
||||
case 3:
|
||||
// 带重复数字(如 112233445, 778899001)
|
||||
String base = RandomUtil.randomNumbers(3);
|
||||
String repeat = "%s%s%s%s%s%s".formatted(base.charAt(0), base.charAt(0), base.charAt(1), base.charAt(1), base.charAt(2), base.charAt(2));
|
||||
// 补3位随机数
|
||||
return (repeat + RandomUtil.randomNumbers(3)).substring(0, 9);
|
||||
|
||||
default:
|
||||
return RandomUtil.randomNumbers(9);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Set<String> codes = generateCodes(12, 1000);
|
||||
codes.forEach(System.out::println);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MkRechargeRedemptionConfigVO detail(Long mainShopId) {
|
||||
return getOneAs(new QueryWrapper().eq(MkRechargeRedemptionConfig::getMainShopId, mainShopId), MkRechargeRedemptionConfigVO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<MkRechargeRedemptionConfig> pageInfo(Long mainShopId, Integer status) {
|
||||
QueryWrapper queryWrapper = new QueryWrapper().eq(MkRechargeRedemptionConfig::getMainShopId, mainShopId);
|
||||
switch (status) {
|
||||
case 0:
|
||||
queryWrapper.le(MkRechargeRedemptionConfig::getStartTime, DateUtil.date()).ge(MkRechargeRedemptionConfig::getEndTime, DateUtil.date());
|
||||
break;
|
||||
case 1:
|
||||
queryWrapper.gt(MkRechargeRedemptionConfig::getStartTime, DateUtil.date()).lt(MkRechargeRedemptionConfig::getEndTime, DateUtil.date());
|
||||
break;
|
||||
}
|
||||
Page<MkRechargeRedemptionConfig> page = page(PageUtil.buildPage(), queryWrapper);
|
||||
page.getRecords().forEach(item -> {
|
||||
if (item.getStartTime() != null && item.getEndTime() != null) {
|
||||
item.setStatus(!item.getStartTime().isAfter(DateUtil.date().toLocalDateTime()) && item.getEndTime().isBefore(DateUtil.date().toLocalDateTime()) ? 0 : 1);
|
||||
}else {
|
||||
item.setStatus(0);
|
||||
}
|
||||
});
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Long mainShopId, MkRechargeRedemptionConfigDTO dto) {
|
||||
long count = count(new QueryWrapper().eq(MkRechargeRedemptionConfig::getName, dto.getName()).eq(MkRechargeRedemptionConfig::getMainShopId, mainShopId));
|
||||
AssertUtil.isTrue(count > 0, "名称已存在");
|
||||
MkRechargeRedemptionConfig config = BeanUtil.copyProperties(dto, MkRechargeRedemptionConfig.class);
|
||||
config.setMainShopId(mainShopId);
|
||||
save(config);
|
||||
|
||||
ArrayList<MkRechargeRedemptionCode> codeArrayList = new ArrayList<>();
|
||||
generateCodes(config.getId(), config.getTotal()).forEach(code -> {
|
||||
codeArrayList.add(new MkRechargeRedemptionCode().setRedemptionId(config.getId())
|
||||
.setMainShopId(mainShopId).setCode(code));
|
||||
});
|
||||
|
||||
return codeService.saveBatch(codeArrayList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean edit(Long shopId, MkRechargeRedemptionConfigDTO dto) {
|
||||
MkRechargeRedemptionConfig config = getOne(new QueryWrapper().eq(MkRechargeRedemptionConfig::getMainShopId, shopId).eq(MkRechargeRedemptionConfig::getId, dto.getId()));
|
||||
AssertUtil.isNull(config, "活动不存在");
|
||||
if (dto.getStock() != null) {
|
||||
if (config.getStock() < dto.getStock()) {
|
||||
throw new CzgException("库存仅允许删减");
|
||||
}
|
||||
int subStock = config.getStock() - dto.getStock();
|
||||
List<MkRechargeRedemptionCode> subCodeList = codeService.list(new QueryWrapper().eq(MkRechargeRedemptionCode::getRedemptionId, config.getId()).eq(MkRechargeRedemptionCode::getStatus, 0).limit(subStock));
|
||||
subCodeList.forEach(item -> item.setStatus(1));
|
||||
codeService.updateBatch(subCodeList);
|
||||
}
|
||||
|
||||
BeanUtil.copyProperties(dto, config, "total", "amount", "startTime", "endTime");
|
||||
return updateById(config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<MkRechargeRedemptionCodeVO> codeList(Long mainShopId, Long id, String code, Integer status) {
|
||||
QueryWrapper queryWrapper = new MyQueryWrapper()
|
||||
.selectAll(MkRechargeRedemptionCode.class)
|
||||
.select(ShopUser::getNickName, ShopUser::getPhone)
|
||||
.eq(MkRechargeRedemptionCode::getMainShopId, mainShopId)
|
||||
.eq(MkRechargeRedemptionCode::getRedemptionId, id);
|
||||
queryWrapper.eq(MkRechargeRedemptionCode::getStatus, status);
|
||||
if (StrUtil.isNotBlank(code)) {
|
||||
queryWrapper.like(MkRechargeRedemptionCode::getCode, code);
|
||||
}
|
||||
queryWrapper.leftJoin(ShopUser.class).on(ShopUser::getId, MkRechargeRedemptionCode::getShopUserId);
|
||||
return codeService.pageAs(PageUtil.buildPage(), queryWrapper, MkRechargeRedemptionCodeVO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exportCodeList(Long mainShopId, Long redemptionId, String code, Integer status, HttpServletResponse response, HttpServletRequest request) {
|
||||
QueryWrapper queryWrapper = new MyQueryWrapper()
|
||||
.selectAll(MkRechargeRedemptionCode.class)
|
||||
.select(ShopUser::getNickName, ShopUser::getPhone)
|
||||
.eq(MkRechargeRedemptionCode::getMainShopId, mainShopId)
|
||||
.eq(MkRechargeRedemptionCode::getRedemptionId, redemptionId);
|
||||
queryWrapper.eq(MkRechargeRedemptionCode::getStatus, status);
|
||||
if (StrUtil.isNotBlank(code)) {
|
||||
queryWrapper.like(MkRechargeRedemptionCode::getCode, code);
|
||||
}
|
||||
queryWrapper.leftJoin(ShopUser.class).on(ShopUser::getId, MkRechargeRedemptionCode::getShopUserId);
|
||||
List<MkRechargeRedemptionCodeVO> mkRechargeRedemptionCodeVOS = codeService.listAs(queryWrapper, MkRechargeRedemptionCodeVO.class);
|
||||
|
||||
List<Map<String, Object>> list = mkRechargeRedemptionCodeVOS.stream()
|
||||
.map(item -> {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("code", item.getCode());
|
||||
map.put("redemptionTime", item.getRedemptionTime());
|
||||
map.put("userInfo", item.getShopUserId() == null ? "" : item.getNickName() + " " + item.getPhone());
|
||||
return map;
|
||||
})
|
||||
.toList();
|
||||
// 1. 创建 ExcelWriter
|
||||
ExcelWriter writer = ExcelUtil.getWriter(true);
|
||||
|
||||
// 2. 自定义标题别名(可选)
|
||||
|
||||
// 3. 写入数据
|
||||
|
||||
// 4. 设置响应头,告诉浏览器下载文件
|
||||
try (writer) {
|
||||
writer.addHeaderAlias("code", "兑换码");
|
||||
writer.addHeaderAlias("redemptionTime", "兑换时间");
|
||||
writer.addHeaderAlias("userInfo", "用户信息");
|
||||
writer.write(list, true);
|
||||
response.setContentType("application/vnd.ms-excel;charset=utf-8");
|
||||
String fileName;
|
||||
fileName = URLEncoder.encode("兑换码", StandardCharsets.UTF_8);
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
|
||||
// 5. 输出到浏览器
|
||||
writer.flush(response.getOutputStream(), true);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?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.czg.service.market.mapper.MkEnableConfigMapper">
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?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.czg.service.market.mapper.MkRechargeRedemptionCodeMapper">
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?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.czg.service.market.mapper.MkRechargeRedemptionConfigMapper">
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user