You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

194 lines
7.8 KiB

package com.example.demo.serviceImpl.coin;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.mapper.coin.ConsumeMapper;
import com.example.demo.mapper.coin.MarketMapper;
import com.example.demo.mapper.coin.RefundMapper;
import com.example.demo.mapper.coin.UserMapper;
import com.example.demo.service.coin.MarketService;
import com.example.demo.service.coin.RefundService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo.domain.vo.coin.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @program: gold-java
* @ClassName RefundServiceImpl
* @description:
* @author: Double
* @create: 2025−06-27 11:50
* @Version 1.0
**/
@Service
public class RefundServiceImpl implements RefundService {
@Autowired
private RefundMapper refundMapper;
@Autowired
private ConsumeMapper consumeMapper;
@Autowired
private UserMapper userMapper;
@Autowired
private MarketMapper marketMapper;
//查找全部退款
@Override
public PageInfo<RefundUser> selectAll(Integer pageNum, Integer pageSize, RefundUser refundUser) throws Exception {
List<String> markets = marketMapper.getMarketIds(refundUser.getMarkets());
refundUser.setMarkets(markets);
PageHelper.startPage(pageNum, pageSize);
List<RefundUser> refundUsers = refundMapper.selectAll(refundUser);
return new PageInfo<>(refundUsers);
}
//统计退款金额
@Override
public Gold statsGold(RefundUser refundUser) {
List<String> markets = marketMapper.getMarketIds(refundUser.getMarkets());
if (markets.contains("9") || markets.contains("9999")) {
markets = null;
}
refundUser.setMarkets(markets);
Gold gold = refundMapper.sumGold(refundUser);
return gold;
}
//查找筛选退款
@Override
public PageInfo<RefundUser> selectBy(Integer pageNum, Integer pageSize, RefundUser refundUser) throws Exception {
List<String> markets = marketMapper.getMarketIds(refundUser.getMarkets());
if (markets.contains("9") || markets.contains("9999")) {
markets = null;
}
refundUser.setMarkets(markets);
PageHelper.startPage(pageNum, pageSize);
List<RefundUser> refundUsers = refundMapper.selectBy(refundUser);
return new PageInfo<>(refundUsers);
}
//添加退款记录
@Transactional
@Override
public Result add(RefundUser refundUser) {
if (refundUser.getTaskGold() == null || refundUser.getFreeGold() == null || refundUser.getPermanentGold() == null) {
return Result.error("金币不能为空");
}
if (refundUser.getTaskGold().compareTo(BigDecimal.ZERO) < 0 ||
refundUser.getFreeGold().compareTo(BigDecimal.ZERO) < 0 ||
refundUser.getPermanentGold().compareTo(BigDecimal.ZERO) < 0) {
return Result.error("金币不能为负数");
}
if (refundUser.getJwcode() < 10000000 || refundUser.getJwcode() > 99999999) {
return Result.error("精网号位数小于8位或大于8位");
}
GoldUser goldUser = userMapper.selectUser(refundUser.getJwcode().toString());
if (goldUser == null) {
return Result.error("用户不存在");
}
UserGoldRecord userGoldRecord = new UserGoldRecord();
if(refundUser.getGoodsName()==null|| refundUser.getGoodsName().isEmpty()){
return Result.error("商品名称不能为空");
}
if(refundUser.getOrderCode()==null|| refundUser.getOrderCode().isEmpty()){
return Result.error("订单号不能为空");
}
String goodsName = refundUser.getGoodsName();
String orderCode = refundUser.getOrderCode();
userGoldRecord.setGoodsName(goodsName); // 商品A
userGoldRecord.setOrderCode("TK_" + orderCode); // TKXF202506281545524400006580
userGoldRecord.setJwcode(refundUser.getJwcode());
userGoldRecord.setRefundType(refundUser.getRefundType());
userGoldRecord.setRefundModel(refundUser.getRefundModel());
userGoldRecord.setPermanentGold(refundUser.getPermanentGold().intValue());
// 获取当前月份(1-12)
int currentMonth = LocalDate.now().getMonthValue();
// 根据当前月份设置对应字段
if (currentMonth >= 1 && currentMonth <= 6) {
// 1-6月:设置6月额度,12月保持默认值
userGoldRecord.setFreeJune(0);
userGoldRecord.setFreeDecember(refundUser.getFreeGold().intValue());
} else {
// 7-12月:设置12月额度,6月保持默认值
userGoldRecord.setFreeJune(refundUser.getFreeGold().intValue());
userGoldRecord.setFreeDecember(0);
}
//信息输入
userGoldRecord.setTaskGold(refundUser.getTaskGold().intValue());
userGoldRecord.setSumGold(refundUser.getSumGold().intValue());
userGoldRecord.setPayPlatform("金币系统");
userGoldRecord.setRemark(refundUser.getRemark());
userGoldRecord.setAdminId(refundUser.getAdminId());
userGoldRecord.setType((byte) 2);
userGoldRecord.setAuditStatus(0);
userGoldRecord.setCreateTime(new Date());
List<ConsumeUser> list = consumeMapper.selectOrderCodeByJwcode(userGoldRecord.getJwcode().toString(), orderCode);
//消费订单号校验
if (list == null || list.isEmpty()) {
return Result.error("该用户没有该订单号");
} else if (list.size() == 1) {
ConsumeUser consumeUser = list.getFirst();
if (consumeUser.getIsRefund().equals(1)) {
return Result.error("该订单已被退款");
}
} else {
return Result.error("消费订单重复");
}
refundMapper.add(userGoldRecord);
consumeMapper.updateIsRefund(orderCode);
return Result.success();
}
//获取退款类型
@Override
public List<String> getRefundType() {
List<String> list = refundMapper.getRefundType();
List<String> filteredList = list.stream()
.filter(Objects::nonNull) // 过滤掉 null 值
.filter(str -> !str.trim().isEmpty()) // 过滤掉空字符串和仅包含空白字符的字符串
.collect(Collectors.toList());
return filteredList;
}
//查找退款商品
@Override
public List<RefundUser> selectGoods(Integer jwcode) {
List<RefundUser> refundUsers = refundMapper.selectGoods(jwcode);
List<RefundUser> list = new ArrayList<>();
for (RefundUser record : refundUsers) {
if (record == null) {
continue;
}
String orderCode = record.getOrderCode() != null ? record.getOrderCode() : "无订单号";
String goodsName = record.getGoodsName() != null ? record.getGoodsName() : "无商品名";
// 拼接格式:订单号_商品名(例如:XF20250629_商品BC)
String combined = orderCode + "_" + goodsName;
RefundUser refundUser = new RefundUser();
refundUser.setOrderCode(orderCode);
refundUser.setGoodsName(goodsName);
refundUser.setSumGold(record.getPermanentGold().add(record.getFreeGold()).add(record.getTaskGold()));
refundUser.setPermanentGold(record.getPermanentGold());
refundUser.setFreeGold(record.getFreeGold());
refundUser.setTaskGold(record.getTaskGold());
list.add(refundUser);
}
return list;
}
}