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.
862 lines
41 KiB
862 lines
41 KiB
package com.example.demo.serviceImpl.cash;
|
|
|
|
import com.example.demo.Util.JWTUtil;
|
|
import com.example.demo.Util.LanguageTranslationUtil;
|
|
import com.example.demo.config.RabbitMQConfig;
|
|
import com.example.demo.domain.DTO.AddFundsDTO;
|
|
import com.example.demo.domain.DTO.PerformanceAdjustmentDTO;
|
|
import com.example.demo.domain.DTO.PerformanceDTO;
|
|
import com.example.demo.domain.entity.*;
|
|
import com.example.demo.domain.vo.cash.*;
|
|
import com.example.demo.domain.vo.coin.AreaInfo;
|
|
import com.example.demo.domain.vo.coin.GoldUser;
|
|
import com.example.demo.domain.vo.coin.Messages;
|
|
import com.example.demo.domain.vo.coin.Result;
|
|
import com.example.demo.mapper.cash.CashCollectionMapper;
|
|
import com.example.demo.mapper.coin.MarketMapper;
|
|
import com.example.demo.mapper.coin.UserMapper;
|
|
import com.example.demo.service.cash.CashCollectionService;
|
|
import com.example.demo.service.coin.RechargeActivityCenterService;
|
|
import com.github.pagehelper.PageHelper;
|
|
import com.github.pagehelper.PageInfo;
|
|
import jakarta.servlet.http.HttpServletRequest;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.util.CollectionUtils;
|
|
import org.springframework.web.bind.annotation.RequestHeader;
|
|
import org.springframework.web.context.request.RequestContextHolder;
|
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.time.LocalDateTime;
|
|
import java.time.ZoneOffset;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
|
|
/**
|
|
* @program: gold-java
|
|
* @ClassName cashCollectionServiceImpl
|
|
* @description: 处理收款相关业务逻辑
|
|
* @author: Ethan
|
|
* @create: 2025−09-26 11:23
|
|
* @Version 1.0
|
|
**/
|
|
@Service
|
|
@Slf4j
|
|
public class CashCollectionServiceImpl implements CashCollectionService {
|
|
|
|
@Autowired
|
|
private CashCollectionMapper cashCollectionMapper;
|
|
@Autowired
|
|
private UserMapper userMapper;
|
|
@Autowired
|
|
private MarketMapper marketMapper;
|
|
@Autowired
|
|
private RabbitTemplate rabbitTemplate;
|
|
@Autowired
|
|
private LanguageTranslationUtil languageTranslationUtil;
|
|
@Autowired
|
|
private RechargeActivityCenterService rechargeActivityCenterService;
|
|
|
|
//新增收款订单
|
|
@Override
|
|
public String add(CashCollection cashCollection,@RequestHeader(defaultValue = "zh_CN") String lang) {
|
|
if (cashCollection.getJwcode() == null) {
|
|
throw new IllegalArgumentException("精网号不能为空");
|
|
}
|
|
if (cashCollection.getJwcode() < 10000000 || cashCollection.getJwcode() > 99999999) {
|
|
throw new IllegalArgumentException("精网号必须为 8 位");
|
|
}
|
|
if (cashCollection.getName() == null || cashCollection.getName().isEmpty()){
|
|
throw new IllegalArgumentException("客户姓名不能为空");
|
|
}
|
|
if (cashCollection.getActivity() == null || cashCollection.getActivity().isEmpty()) {
|
|
throw new IllegalArgumentException("活动不能为空");
|
|
}
|
|
if (cashCollection.getWalletId() == null || cashCollection.getWalletId() < 1 || cashCollection.getWalletId() > 10) {
|
|
throw new IllegalArgumentException("钱包 ID 为 1~10");
|
|
}
|
|
if (cashCollection.getGoodsName() == null|| cashCollection.getGoodsName().isEmpty()) {
|
|
throw new IllegalArgumentException("产品名称不能为空");
|
|
}
|
|
if (cashCollection.getGoodsName().equals("金币充值")) {
|
|
if (cashCollection.getPermanentGold() == 0 && cashCollection.getFreeGold() == 0) {
|
|
throw new IllegalArgumentException("金币数量不能为空");
|
|
}
|
|
}
|
|
if (!cashCollection.getGoodsName().equals("金币充值")) {
|
|
if (cashCollection.getGoodNum() == 0) {
|
|
throw new IllegalArgumentException("产品数量不能为空");
|
|
}
|
|
if (cashCollection.getNumUnit() == null|| cashCollection.getNumUnit().isEmpty()) {
|
|
throw new IllegalArgumentException("数量单位不能为空");
|
|
}
|
|
}
|
|
if (cashCollection.getPaymentCurrency() == null || cashCollection.getPaymentCurrency().isEmpty()) {
|
|
throw new IllegalArgumentException("支付币种不能为空");
|
|
}
|
|
if (cashCollection.getPaymentAmount() == null || cashCollection.getPaymentAmount().compareTo(BigDecimal.ZERO) == 0) {
|
|
throw new IllegalArgumentException("支付金额不能为空");
|
|
}
|
|
if (cashCollection.getPayType() == null|| cashCollection.getPayType().isEmpty()) {
|
|
throw new IllegalArgumentException("支付方式不能为空");
|
|
}
|
|
if (cashCollection.getReceivedMarket() == null||cashCollection.getReceivedMarket().isEmpty()) {
|
|
throw new IllegalArgumentException("到账地区不能为空");
|
|
}
|
|
if (cashCollection.getPayTime() == null) {
|
|
throw new IllegalArgumentException("付款时间不能为空");
|
|
}
|
|
AreaInfo areaInfo = rechargeActivityCenterService.queryActivityAreaById(Integer.parseInt(cashCollection.getActivity()));
|
|
// 校验钱包 ID 和到账地区的对应关系
|
|
validateWalletAndMarket(cashCollection.getWalletId(), cashCollection.getReceivedMarket());
|
|
|
|
//生成订单号后半部分
|
|
String orderNumber = UUID.randomUUID().toString().replaceAll("-", "");
|
|
CashRecord cashRecord = new CashRecord();
|
|
//构建订单信息
|
|
cashRecord.setOrderCode("XJ_" + orderNumber); //订单号
|
|
cashRecord.setJwcode(cashCollection.getJwcode()); //精网号
|
|
cashRecord.setName(cashCollection.getName()); //客户姓名
|
|
cashRecord.setActivity(cashCollection.getActivity()); // 活动
|
|
cashRecord.setGoodsName(cashCollection.getGoodsName()); //商品名称
|
|
cashRecord.setGoodNum(cashCollection.getGoodNum()); //商品数量
|
|
cashRecord.setNumUnit(cashCollection.getNumUnit()); //数量单位
|
|
cashRecord.setPermanentGold(cashCollection.getPermanentGold()); //永久金币
|
|
cashRecord.setFreeGold(cashCollection.getFreeGold()); //免费金币
|
|
cashRecord.setWalletId(cashCollection.getWalletId()); // 钱包 ID
|
|
cashRecord.setPaymentCurrency(cashCollection.getPaymentCurrency()); //付款币种
|
|
cashRecord.setPaymentAmount(cashCollection.getPaymentAmount()); //付款金额
|
|
cashRecord.setReceivedMarket(cashCollection.getReceivedMarket()); //到账地区
|
|
cashRecord.setPayType(cashCollection.getPayType()); //支付方式
|
|
cashRecord.setPayTime(cashCollection.getPayTime()); //付款时间
|
|
cashRecord.setVoucher(cashCollection.getVoucher()); //转账凭证
|
|
cashRecord.setRemark(cashCollection.getRemark()); //备注
|
|
cashRecord.setStatus(0); //订单状态:付款线下财务待审核
|
|
cashRecord.setSubmitterId(cashCollection.getSubmitterId()); //提交人 ID
|
|
cashRecord.setSubmitterMarket(cashCollection.getSubmitterMarket());
|
|
cashRecord.setOrderType(1); //订单类型:1-收款
|
|
cashRecord.setMarket(cashCollection.getMarket());
|
|
if(areaInfo.getArea().equals("0")){
|
|
cashRecord.setPerformanceMarket(cashCollection.getMarket());
|
|
}else {
|
|
cashRecord.setPerformanceMarket(areaInfo.getArea());
|
|
}
|
|
|
|
//地区,根据 jwcode 插入
|
|
//cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(cashRecord.getJwcode()));
|
|
//插入新收款订单
|
|
cashCollectionMapper.add(cashRecord);
|
|
// 发送收款创建消息
|
|
Messages message = new Messages();
|
|
message.setJwcode(cashRecord.getJwcode());
|
|
message.setName(cashRecord.getName());
|
|
message.setStatus(cashRecord.getStatus());
|
|
message.setDesc("的现金收款申请待审核,前往审核");
|
|
message.setTitle("现金管理--收款处理");
|
|
message.setType(0);
|
|
message.setTypeId(cashRecord.getId());
|
|
message.setMarket(Integer.valueOf(cashRecord.getMarket()));
|
|
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
|
|
message.setMarketName(marketName);
|
|
message.setQueryId(67);
|
|
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
|
|
return "添加成功";
|
|
}
|
|
|
|
@Override
|
|
public String addFreeCoin(CashCollection cashCollection,@RequestHeader(defaultValue = "zh_CN") String lang) {
|
|
if (cashCollection.getJwcode() == null) {
|
|
throw new IllegalArgumentException("精网号不能为空");
|
|
}
|
|
if (cashCollection.getJwcode() < 10000000 || cashCollection.getJwcode() > 99999999) {
|
|
throw new IllegalArgumentException("精网号必须为8位");
|
|
}
|
|
if (cashCollection.getName() == null || cashCollection.getName().isEmpty()){
|
|
throw new IllegalArgumentException("客户姓名不能为空");
|
|
}
|
|
if (cashCollection.getActivity() == null || cashCollection.getActivity().isEmpty()) {
|
|
throw new IllegalArgumentException("活动不能为空");
|
|
}
|
|
if (cashCollection.getFreeGold() == 0) {
|
|
throw new IllegalArgumentException("免费金币数量不能为空");
|
|
}
|
|
//生成订单号后半部分
|
|
String orderNumber = UUID.randomUUID().toString().replaceAll("-", "");
|
|
CashRecord cashRecord = new CashRecord();
|
|
//构建订单信息
|
|
cashRecord.setOrderCode("XJ_" + orderNumber); //订单号
|
|
cashRecord.setJwcode(cashCollection.getJwcode()); //精网号
|
|
cashRecord.setName(cashCollection.getName()); //客户姓名
|
|
cashRecord.setActivity(cashCollection.getActivity()); // 活动
|
|
cashRecord.setGoodsName("免费金币赠送"); //商品名称
|
|
cashRecord.setFreeGold(cashCollection.getFreeGold()); //免费金币
|
|
cashRecord.setRemark(cashCollection.getRemark()); //备注
|
|
cashRecord.setStatus(0); //订单状态:付款线下财务待审核
|
|
cashRecord.setSubmitterId(cashCollection.getSubmitterId()); //提交人ID
|
|
cashRecord.setSubmitterMarket(cashCollection.getSubmitterMarket());
|
|
cashRecord.setOrderType(1); //订单类型:1-收款
|
|
cashRecord.setMarket(cashCollection.getMarket());
|
|
//地区,根据jwcode插入
|
|
//cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(cashRecord.getJwcode()));
|
|
//插入新收款订单
|
|
cashCollectionMapper.add(cashRecord);
|
|
// 发送收款创建消息
|
|
Messages message = new Messages();
|
|
message.setJwcode(cashRecord.getJwcode());
|
|
message.setName(cashRecord.getName());
|
|
message.setStatus(cashRecord.getStatus());
|
|
message.setDesc("的现金收款申请待审核,请前往审核");
|
|
message.setTitle("现金收款--现金收款");
|
|
message.setType(1);
|
|
message.setTypeId(cashRecord.getId());
|
|
message.setMarket(Integer.valueOf(cashRecord.getMarket()));
|
|
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
|
|
message.setMarketName(marketName);
|
|
message.setQueryId(67);
|
|
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
|
|
return "添加成功";
|
|
}
|
|
|
|
//撤回未审核的订单
|
|
@Override
|
|
public String cancel(String orderCode) {
|
|
// 查询订单是否存在
|
|
CashRecord cashRecord = cashCollectionMapper.selectByOrderCode(orderCode);
|
|
if (cashRecord == null) {
|
|
throw new IllegalArgumentException("订单不存在");
|
|
}
|
|
if (cashRecord.getStatus() != 0) {
|
|
throw new IllegalArgumentException("订单状态不符合条件");
|
|
}
|
|
|
|
// 更新订单状态为撤回状态(5)
|
|
int rows = cashCollectionMapper.updateStatus(orderCode, 5);
|
|
|
|
// 更新与该订单关联的消息记录的 flag 字段为 1
|
|
try {
|
|
// 根据订单ID查找关联的消息记录
|
|
Messages message = new Messages();
|
|
message.setTypeId(cashRecord.getId()); // 订单ID作为消息的 typeId
|
|
message.setType(0); // 消息类型为收款
|
|
|
|
// 更新消息的 flag 字段为 1
|
|
int messageRows = cashCollectionMapper.updateMessageFlagByTypeIdAndType(
|
|
message.getTypeId(), message.getType(), 1);
|
|
|
|
if (messageRows <= 0) {
|
|
log.warn("未找到与订单 {} 关联的消息记录", orderCode);
|
|
}
|
|
} catch (Exception e) {
|
|
log.error("更新消息状态失败,订单号:{}", orderCode, e);
|
|
// 可选择抛出异常或记录日志后继续执行
|
|
}
|
|
return rows > 0 ? "撤回成功" : "撤回失败";
|
|
}
|
|
|
|
//编辑并重新提交收款订单
|
|
@Override
|
|
public String reSubmit(CashRecord cashRecord,@RequestHeader(defaultValue = "zh_CN") String lang) {
|
|
if (cashRecord.getJwcode() == null) {
|
|
throw new IllegalArgumentException("精网号不能为空");
|
|
}
|
|
if (cashRecord.getJwcode() < 10000000 || cashRecord.getJwcode() > 99999999) {
|
|
throw new IllegalArgumentException("精网号必须为 8 位");
|
|
}
|
|
if (cashRecord.getName() == null) {
|
|
throw new IllegalArgumentException("客户姓名不能为空");
|
|
}
|
|
if (cashRecord.getActivity() == null) {
|
|
throw new IllegalArgumentException("活动不能为空");
|
|
}
|
|
if (cashRecord.getGoodsName() == null) {
|
|
throw new IllegalArgumentException("商品名不能为空");
|
|
}
|
|
if (cashRecord.getGoodsName().equals("金币充值")) {
|
|
if (cashRecord.getPermanentGold() == 0 && cashRecord.getFreeGold() == 0) {
|
|
throw new IllegalArgumentException("金币数量不能为空");
|
|
}if (cashRecord.getPermanentGold() == 0){
|
|
throw new IllegalArgumentException("永久金币数量不能为空");
|
|
}
|
|
if (cashRecord.getWalletId() == null) {
|
|
throw new IllegalArgumentException("钱包 ID 不能为空");
|
|
}
|
|
}
|
|
if (!cashRecord.getGoodsName().equals("金币充值")) {
|
|
if (cashRecord.getGoodNum() == 0) {
|
|
throw new IllegalArgumentException("产品数量不能为空");
|
|
}
|
|
if (cashRecord.getNumUnit() == null) {
|
|
throw new IllegalArgumentException("数量单位不能为空");
|
|
}
|
|
}
|
|
if (cashRecord.getPaymentCurrency() == null) {
|
|
throw new IllegalArgumentException("支付币种不能为空");
|
|
}
|
|
if (cashRecord.getPaymentAmount() == null || cashRecord.getPaymentAmount().compareTo(BigDecimal.ZERO) == 0) {
|
|
throw new IllegalArgumentException("支付金额不能为空");
|
|
}
|
|
if (cashRecord.getPayType() == null) {
|
|
throw new IllegalArgumentException("支付方式不能为空");
|
|
}
|
|
if (cashRecord.getReceivedMarket() == null) {
|
|
throw new IllegalArgumentException("到账地区不能为空");
|
|
}
|
|
if (cashRecord.getPayTime() == null) {
|
|
throw new IllegalArgumentException("付款时间不能为空");
|
|
}
|
|
|
|
// 校验钱包 ID 和到账地区的对应关系
|
|
validateWalletAndMarket(cashRecord.getWalletId(), cashRecord.getReceivedMarket());
|
|
|
|
CashRecord status = cashCollectionMapper.selectByOrderCode(cashRecord.getOrderCode());
|
|
if (!status.getStatus().equals(5)) {
|
|
throw new IllegalArgumentException("只允许编辑已撤回订单");
|
|
}
|
|
//地区,根据 jwcode 插入(弃用,插入前调用接口获取地区和姓名,之后前端传入)
|
|
//cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(cashRecord.getJwcode()));
|
|
int rows = cashCollectionMapper.updateByOrderCode(cashRecord);
|
|
if (rows > 0) {
|
|
// 发送收款创建消息
|
|
Messages message = new Messages();
|
|
message.setJwcode(cashRecord.getJwcode());
|
|
message.setName(cashRecord.getName());
|
|
message.setStatus(cashRecord.getStatus());
|
|
message.setDesc("的现金收款申请待审核,前往审核");
|
|
message.setTitle("现金管理--收款处理");
|
|
message.setType(0);
|
|
message.setTypeId(cashRecord.getId());
|
|
message.setMarket(Integer.valueOf(cashRecord.getMarket()));
|
|
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
|
|
message.setMarketName(marketName);
|
|
message.setQueryId(67);
|
|
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
|
|
}
|
|
return rows > 0 ? "重新提交成功" : "重新提交失败";
|
|
}
|
|
|
|
//多条件查询收款订单列表
|
|
@Override
|
|
public PageInfo<CashCollection> selectCollection(Integer pageNum, Integer pageSize, CashCollection cashCollection) {
|
|
/* //将操作人的地区列表改为id
|
|
List<String> markets = marketMapper.getMarketIds(cashCollection.getMarkets());
|
|
if (markets.contains("9") || markets.contains("9999")) {
|
|
markets = null;
|
|
}*/
|
|
// cashCollection.setReceivedMarket(marketMapper.getMarketId(cashCollection.getReceivedMarket()));
|
|
if (cashCollection.getCashRoleId() == 2) {
|
|
//角色是总部时,若不特地传状态,传1346,sql处理为(1,3,4,6)筛选,
|
|
if (cashCollection.getStatus() == null) {
|
|
cashCollection.setStatus(1346);
|
|
}
|
|
cashCollection.setSubmitterId(null);
|
|
cashCollection.setReceivedMarket(null);
|
|
cashCollection.setSubmitterMarket(null);
|
|
}
|
|
if (cashCollection.getCashRoleId() == 1) {
|
|
//角色是地方财务,提交人置空不设筛选条件,仅按收款地区、提交人地区筛选()
|
|
|
|
if (cashCollection.getStatus() == null) {
|
|
cashCollection.setStatus(123460);
|
|
}
|
|
//状态为待审核和已驳回时按照提交人地区筛选
|
|
if (cashCollection.getStatus() == 0 || cashCollection.getStatus() == 2) {
|
|
cashCollection.setReceivedMarket(null);
|
|
}
|
|
//状态为已通过和Link通过时,满足收款地区或提交人地区即可
|
|
/* if (cashCollection.getStatus() == 13) {
|
|
cashCollection.setSubmitterId(null);
|
|
}*/
|
|
//状态为13 或46,已通过或已完成和已退款,满足收款地区或提交人地区即可,
|
|
cashCollection.setSubmitterId(null);
|
|
|
|
|
|
}
|
|
if (cashCollection.getCashRoleId() == 0) {
|
|
//角色是地方财务,提交人置空不设筛选条件---仅当角色是0 地方客服时,按提交人筛选
|
|
if (cashCollection.getStatus() == null) {
|
|
cashCollection.setStatus(1234560);
|
|
}
|
|
cashCollection.setSubmitterId(cashCollection.getSubmitterId());
|
|
cashCollection.setReceivedMarket(null);
|
|
}
|
|
// cashCollection.setMarkets(markets);
|
|
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
|
|
List<CashCollection> cashCollections = cashCollectionMapper.selectCollection1(pageNum, pageSize, cashCollection);
|
|
return new PageInfo<>(cashCollections);
|
|
}
|
|
|
|
//补全手续费等内容
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
public String complete(CashRecord cashRecord) {
|
|
|
|
|
|
if (!Objects.equals(cashRecord.getPaymentCurrency(), cashRecord.getReceivedCurrency())
|
|
&& ("Stripe".equals(cashRecord.getPayType()) || "Paypal".equals(cashRecord.getPayType()))) {
|
|
return "支付币种与收款币种不一致";
|
|
}
|
|
|
|
int rows = cashCollectionMapper.complete(cashRecord);
|
|
String goodsName = cashCollectionMapper.selectGoodsNameByCode(cashRecord.getOrderCode());
|
|
if (goodsName != null && goodsName.equals("金币充值")) {
|
|
cashRecord.setOrderCode(cashRecord.getOrderCode().replace("XJ_", "XJCZ_"));
|
|
//修改金币订单
|
|
cashCollectionMapper.updateGoldOrder(cashRecord);
|
|
}
|
|
return rows > 0 ? "编辑成功" : "编辑失败";
|
|
}
|
|
|
|
//根据精网号查询姓名和地区
|
|
@Override
|
|
public Result getNameAndMarket(Integer jwcode,@RequestHeader(defaultValue = "zh_CN") String lang) {
|
|
try {
|
|
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
|
|
String token = request.getHeader("token");
|
|
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
|
|
|
|
if (admin != null) {
|
|
List<String> list = Arrays.asList(admin.getMarkets().split(","));
|
|
List<String> markets = marketMapper.getMarketIds(list);
|
|
|
|
// 检查用户是否存在
|
|
int userCount = cashCollectionMapper.checkUserExists(jwcode);
|
|
if (userCount == 0) {
|
|
String message = languageTranslationUtil.translate("精网号有误!请检查", lang);
|
|
return Result.error(message);
|
|
}
|
|
|
|
if (markets.contains("9") || markets.contains("9999")) {
|
|
// 有特殊权限,可访问所有用户
|
|
User user = new User();
|
|
user.setMarket(cashCollectionMapper.getMarketByJwcode(jwcode));
|
|
user.setName(cashCollectionMapper.getNameByJwcode(jwcode));
|
|
user.setMarketName(cashCollectionMapper.getMarketNameByJwcode(jwcode));
|
|
return Result.success(user);
|
|
} else {
|
|
// 检查用户所在市场是否在管理员权限范围内
|
|
String userMarket = cashCollectionMapper.getMarketByJwcode(jwcode);
|
|
|
|
if (userMarket != null && markets.contains(userMarket)) {
|
|
// 有权限访问,返回用户信息
|
|
User user = new User();
|
|
user.setMarket(userMarket);
|
|
user.setName(cashCollectionMapper.getNameByJwcode(jwcode));
|
|
user.setMarketName(cashCollectionMapper.getMarketNameByJwcode(jwcode));
|
|
return Result.success(user);
|
|
} else {
|
|
// 无权限,返回用户所属地区
|
|
String userMarketName = cashCollectionMapper.getMarketNameByJwcode(jwcode);
|
|
String translatedMarketName = languageTranslationUtil.translate(userMarketName, lang);
|
|
String message = languageTranslationUtil.translate("无权限访问", lang);
|
|
return Result.errorWithData(message, java.util.Map.of("market", translatedMarketName));
|
|
}
|
|
}
|
|
} else {
|
|
// admin 为 null,即权限验证失败
|
|
String userMarketName = cashCollectionMapper.getMarketNameByJwcode(jwcode);
|
|
String translatedMarketName = languageTranslationUtil.translate(userMarketName, lang);
|
|
String message = languageTranslationUtil.translate("无权限访问", lang);
|
|
return Result.errorWithData(message, java.util.Map.of("market", translatedMarketName));
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
String errorMessage = languageTranslationUtil.translate("精网号有误!请检查", lang);
|
|
return Result.error(errorMessage);
|
|
}
|
|
}
|
|
|
|
//获取收款活动列表
|
|
@Override
|
|
public List<RechargeActivity> getActivityList() {
|
|
LocalDateTime now = LocalDateTime.now();
|
|
return cashCollectionMapper.getActivityList(now);
|
|
}
|
|
|
|
//同步g_order订单到cash_record表
|
|
@Override
|
|
public Object syncToCashRecord() {
|
|
int total = 0;
|
|
while (true) {
|
|
List<GOrder> gOrders = cashCollectionMapper.getUnSync(50);
|
|
if (CollectionUtils.isEmpty(gOrders)) {
|
|
break;
|
|
}
|
|
try {
|
|
// 每批独立事务
|
|
processBatch(gOrders);
|
|
total += gOrders.size();
|
|
log.info("✅ 同步完成一批,数量: {}, 累计: {}", gOrders.size(), total);
|
|
} catch (Exception e) {
|
|
|
|
List<Integer> failedIds = gOrders.stream().map(GOrder::getId).collect(Collectors.toList());
|
|
log.error("失败订单ID: {}", failedIds);
|
|
// 可存入 error_log 表,供人工处理
|
|
|
|
|
|
|
|
|
|
// 这里选择继续下一批(容忍部分失败)
|
|
}
|
|
|
|
if (gOrders.size() < 50) {
|
|
break; // 最后一批
|
|
}
|
|
}
|
|
return "同步完毕,成功处理 " + total + " 条";
|
|
}
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
public void processBatch(List<GOrder> gOrders) {
|
|
for (GOrder gOrder : gOrders) {
|
|
CashRecord cashRecord = new CashRecord();
|
|
//构建基础信息
|
|
cashRecord.setOrderType(1);
|
|
cashRecord.setJwcode(gOrder.getJwcode());
|
|
String name=cashCollectionMapper.getNameByJwcode(gOrder.getJwcode());
|
|
if (name!=null){
|
|
cashRecord.setName(name);
|
|
}else cashRecord.setName("未知");
|
|
|
|
cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(gOrder.getJwcode()));
|
|
cashRecord.setPerformanceMarket(cashRecord.getMarket());
|
|
if (gOrder.getType().equals("gold")){ //充金豆
|
|
cashRecord.setActivity("99");
|
|
cashRecord.setGoodsName("Link充值金豆");
|
|
cashRecord.setRemark("Link充值金豆");
|
|
cashRecord.setNumUnit("个");
|
|
cashRecord.setPermanentGold(0);
|
|
cashRecord.setGoodNum(gOrder.getCount());
|
|
|
|
}
|
|
if (gOrder.getType().equals("gold_coin")){//充金币
|
|
cashRecord.setActivity("98");
|
|
cashRecord.setGoodsName("Link充值金币");
|
|
cashRecord.setRemark("Link充值金币");
|
|
cashRecord.setPermanentGold(gOrder.getCount()*100);
|
|
cashRecord.setGoodNum(0);
|
|
|
|
}
|
|
cashRecord.setOrderCode(gOrder.getOrderNo());
|
|
if (gOrder != null) {
|
|
switch (gOrder.getPayStyle()) {
|
|
case 3:
|
|
cashRecord.setPayType("IOS内购");
|
|
cashRecord.setBankCode(gOrder.getIosTransactionId());
|
|
cashRecord.setReceivedMarket("4");
|
|
cashRecord.setPerformanceMarket("4");
|
|
cashRecord.setPayload("IOS");
|
|
break;
|
|
case 5:
|
|
cashRecord.setPayType("Stripe");
|
|
cashRecord.setReceivedMarket("13");
|
|
cashRecord.setPayload("Stripe");
|
|
break;
|
|
case 6:
|
|
cashRecord.setPayType("PaymentAsia");
|
|
cashRecord.setReceivedMarket("13");
|
|
cashRecord.setPayload("PaymentAsia");
|
|
break;
|
|
case 7:
|
|
cashRecord.setPayType("Ipay88");
|
|
cashRecord.setReceivedMarket("5");
|
|
cashRecord.setPayload("Ipay88");
|
|
break;
|
|
case 9:
|
|
cashRecord.setPayType("FirstData");
|
|
cashRecord.setReceivedMarket("4");
|
|
cashRecord.setBankCode(gOrder.getFirstdataIpgTransactionId());
|
|
cashRecord.setPayload("FirstData");
|
|
break;
|
|
case 10:
|
|
cashRecord.setPayType("PaySolutions");
|
|
cashRecord.setReceivedMarket("24018");
|
|
cashRecord.setPayload("PaySolutions");
|
|
break;
|
|
case 15:
|
|
cashRecord.setPayType("Stripe2");
|
|
cashRecord.setReceivedMarket("4");
|
|
cashRecord.setPayload("Stripe2");
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
cashRecord.setFreeGold(0);
|
|
cashRecord.setPaymentCurrency("");
|
|
cashRecord.setPaymentAmount(BigDecimal.valueOf(0));
|
|
//转换时间戳,加上时区偏移
|
|
cashRecord.setPayTime(LocalDateTime.ofEpochSecond(gOrder.getSuccessTime(), 0, ZoneOffset.of("+08:00")));
|
|
cashRecord.setAuditTime(LocalDateTime.ofEpochSecond(gOrder.getSuccessTime(), 0, ZoneOffset.of("+08:00")));
|
|
cashRecord.setStatus(3);
|
|
cashRecord.setSubmitterId(99999);
|
|
//存入现金库
|
|
cashCollectionMapper.add(cashRecord);
|
|
cashCollectionMapper.markSynced(gOrder.getId());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public CashCollection selectById(CashCollection cashCollection) {
|
|
|
|
return cashCollectionMapper.selectById(cashCollection.getId());
|
|
}
|
|
//根据goldcoin订单号查询收款订单
|
|
@Override
|
|
public CashCollection selectByGoldCoinOrderCode(String orderNo) {
|
|
return cashCollectionMapper.selectByGoldCoinOrderCode(orderNo);
|
|
}
|
|
|
|
//多条件查询收款订单列表
|
|
@Override
|
|
public PageInfo<PerformanceVO> performanceSelect(Integer pageNum, Integer pageSize, PerformanceDTO performanceDTO) {
|
|
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
|
|
List<PerformanceVO> performanceVOs = cashCollectionMapper.performanceSelect(performanceDTO);
|
|
return new PageInfo<>(performanceVOs);
|
|
}
|
|
|
|
// 根据精网号和钱包 ID 查询用户钱包明细列表(分页)
|
|
@Override
|
|
public PageInfo<UserWalletRecordVO> selectWalletRecordsByJwcodeAndWalletId(
|
|
Integer pageNum, Integer pageSize, Integer jwcode, Integer walletId) {
|
|
PageHelper.startPage(pageNum, pageSize);
|
|
List<UserWalletRecordVO> records = cashCollectionMapper.selectWalletRecordsByJwcodeAndWalletId(jwcode, walletId);
|
|
return new PageInfo<>(records);
|
|
}
|
|
|
|
// 根据精网号和地区查询用户的所有钱包 ID 和金币数量(包含用户名和地区)(分页)
|
|
@Override
|
|
public PageInfo<UserWalletVO> selectUserWallets(Integer jwcode, String market, Integer pageNum, Integer pageSize, String sortField, String sortOrder, Integer sortWalletId) {
|
|
// 第一步:先查询符合条件的精网号列表(分页)
|
|
PageHelper.startPage(pageNum, pageSize);
|
|
List<Integer> jwcodeList = cashCollectionMapper.selectDistinctJwcodes(jwcode, market, sortField, sortOrder, sortWalletId);
|
|
PageInfo<Integer> jwcodePageInfo = new PageInfo<>(jwcodeList);
|
|
|
|
// 如果没有符合条件的记录,直接返回空结果
|
|
if (jwcodeList == null || jwcodeList.isEmpty()) {
|
|
PageInfo<UserWalletVO> emptyResult = new PageInfo<>();
|
|
emptyResult.setList(new ArrayList<>());
|
|
emptyResult.setTotal(0);
|
|
emptyResult.setPages(0);
|
|
emptyResult.setPageNum(pageNum);
|
|
emptyResult.setPageSize(pageSize);
|
|
return emptyResult;
|
|
}
|
|
|
|
// 第二步:根据精网号列表查询用户的钱包信息(不分页,返回这些精网号的所有钱包)
|
|
List<UserWalletVO> allWallets = cashCollectionMapper.selectUserWalletsByJwcodes(jwcodeList, market, sortField, sortOrder, sortWalletId);
|
|
|
|
// 第三步:将钱包信息按精网号分组组装
|
|
Map<Integer, UserWalletVO> userWalletMap = new LinkedHashMap<>();
|
|
for (UserWalletVO wallet : allWallets) {
|
|
Integer key = wallet.getJwcode();
|
|
if (!userWalletMap.containsKey(key)) {
|
|
UserWalletVO userWallet = new UserWalletVO();
|
|
userWallet.setJwcode(wallet.getJwcode());
|
|
userWallet.setUserName(wallet.getUserName());
|
|
userWallet.setMarket(wallet.getMarket());
|
|
userWallet.setMarketName(wallet.getMarketName());
|
|
userWallet.setWalletList(new ArrayList<>());
|
|
userWalletMap.put(key, userWallet);
|
|
}
|
|
|
|
// 添加钱包明细
|
|
if (wallet.getWalletList() != null) {
|
|
userWalletMap.get(key).getWalletList().addAll(wallet.getWalletList());
|
|
}
|
|
}
|
|
|
|
// 第四步:按照精网号列表的顺序构建最终结果
|
|
List<UserWalletVO> result = new ArrayList<>();
|
|
for (Integer jwc : jwcodeList) {
|
|
UserWalletVO userWallet = userWalletMap.get(jwc);
|
|
if (userWallet != null) {
|
|
result.add(userWallet);
|
|
}
|
|
}
|
|
|
|
// 第五步:构建并返回 PageInfo
|
|
PageInfo<UserWalletVO> resultPageInfo = new PageInfo<>(result);
|
|
resultPageInfo.setTotal(jwcodePageInfo.getTotal());
|
|
resultPageInfo.setPages(jwcodePageInfo.getPages());
|
|
resultPageInfo.setPageNum(pageNum);
|
|
resultPageInfo.setPageSize(pageSize);
|
|
|
|
return resultPageInfo;
|
|
}
|
|
|
|
//新增流水--其他收入
|
|
@Override
|
|
public String addExFund(CashCollection addFundsDTO) {
|
|
if (addFundsDTO.getPerformanceMarket() == null|| addFundsDTO.getPerformanceMarket().isEmpty())
|
|
throw new IllegalArgumentException("业绩归属地区不能为空");
|
|
if (addFundsDTO.getGoodsName() == null|| addFundsDTO.getGoodsName().isEmpty())
|
|
throw new IllegalArgumentException("收入类别不能为空");
|
|
if (addFundsDTO.getPayType() == null|| addFundsDTO.getPayType().isEmpty())
|
|
throw new IllegalArgumentException("付款方式不能为空");
|
|
if (addFundsDTO.getPaymentCurrency() == null)
|
|
throw new IllegalArgumentException("币种不能为空");
|
|
if (addFundsDTO.getPaymentAmount() == null)
|
|
throw new IllegalArgumentException("付款金额不能为空");
|
|
if (addFundsDTO.getGoodNum() == null)
|
|
addFundsDTO.setGoodNum(0);
|
|
//生成订单号后半部分
|
|
String orderNumber = UUID.randomUUID().toString().replaceAll("-", "");
|
|
//构建订单信息
|
|
addFundsDTO.setOrderCode("QT_" + orderNumber); //订单号
|
|
addFundsDTO.setStatus(4);
|
|
addFundsDTO.setActivity("123");
|
|
addFundsDTO.setJwcode(90039082);
|
|
addFundsDTO.setName("HomilyLink");
|
|
addFundsDTO.setMarket("24032");
|
|
addFundsDTO.setOrderType(1);
|
|
addFundsDTO.setReceivedMarket(addFundsDTO.getPerformanceMarket());
|
|
addFundsDTO.setReceivedAmount(addFundsDTO.getPaymentAmount());
|
|
addFundsDTO.setReceivedCurrency(addFundsDTO.getPaymentCurrency());
|
|
|
|
cashCollectionMapper.addExFund(addFundsDTO);
|
|
return "添加成功";
|
|
}
|
|
//添加iPay88手续费
|
|
@Override
|
|
public String addIpay88Fee(CashCollection cashCollection) {
|
|
if (cashCollection.getPayType()== null|| cashCollection.getPayType().isEmpty())
|
|
throw new IllegalArgumentException("支付方式不能为空");
|
|
if (cashCollection.getPerformanceMarket()== null|| cashCollection.getPerformanceMarket().isEmpty())
|
|
throw new IllegalArgumentException("业绩归属地区不能为空");
|
|
if (cashCollection.getPaymentCurrency()== null|| cashCollection.getPaymentCurrency().isEmpty())
|
|
throw new IllegalArgumentException("币种不能为空");
|
|
if (cashCollection.getHandlingCharge()== null|| cashCollection.getHandlingCharge().compareTo(BigDecimal.ZERO) < 0)
|
|
throw new IllegalArgumentException("手续费不能为空");
|
|
if (cashCollection.getRemark()== null|| cashCollection.getRemark().isEmpty())
|
|
throw new IllegalArgumentException("备注不能为空");
|
|
//生成订单号后半部分
|
|
String orderNumber = UUID.randomUUID().toString().replaceAll("-", "");
|
|
//构建订单信息
|
|
cashCollection.setOrderCode("QT_" + orderNumber); //订单号
|
|
cashCollection.setGoodsName("手续费");
|
|
cashCollection.setReceivedMarket("5");
|
|
cashCollection.setStatus(4);
|
|
cashCollection.setPaymentAmount(BigDecimal.ZERO);
|
|
cashCollection.setJwcode(90039082);
|
|
cashCollection.setName("HomilyLink");
|
|
cashCollection.setMarket("24032");
|
|
cashCollection.setOrderType(1);
|
|
cashCollection.setActivity("124");
|
|
cashCollectionMapper.addIpay88Fee(cashCollection);
|
|
return "添加成功";
|
|
}
|
|
|
|
@Override
|
|
public void adjust(PerformanceAdjustmentDTO adjustDTO) {
|
|
if (adjustDTO == null) {
|
|
throw new IllegalArgumentException("传参不能为空");
|
|
}
|
|
|
|
int[][] matrix = adjustDTO.getMatrix();
|
|
Double weight = adjustDTO.getWeight();
|
|
|
|
if (weight == null) {
|
|
throw new IllegalArgumentException("权重不能为空");
|
|
}
|
|
|
|
// Performance market codes and corresponding Chinese names
|
|
String[] performanceMarkets = {"4", "5", "13", "24018", "24022", "24016"};
|
|
String[] marketNames = {"新加坡", "马来西亚", "香港", "泰国", "越南", "加拿大"};
|
|
// Multiply each element in the matrix by the factor
|
|
for (int i = 0; i < matrix.length; i++) {
|
|
for (int j = 0; j < matrix[i].length; j++) {
|
|
// Calculate adjusted value and round to nearest integer
|
|
int adjustedValue = (int) (matrix[i][j] * weight);
|
|
matrix[i][j] = adjustedValue;
|
|
if (i == j) {
|
|
continue;
|
|
}
|
|
// Skip if value is 0
|
|
if (adjustedValue == 0) {
|
|
continue;
|
|
}
|
|
|
|
// Create order code with timestamp
|
|
String orderCode = "TZ_" + System.currentTimeMillis();
|
|
|
|
// Determine direction and create remark based on value sign
|
|
String fromMarket = performanceMarkets[i];
|
|
String toMarket = performanceMarkets[j];
|
|
String fromName = marketNames[i];
|
|
String toName = marketNames[j];
|
|
|
|
String remark;
|
|
if (adjustedValue > 0) {
|
|
// Positive value: row to column (转出方 to 转入方)
|
|
remark = fromName + "→" + toName + "调整金额:" + adjustedValue;
|
|
} else {
|
|
// Negative value: column to row (转入方 to 转出方)
|
|
remark = toName + "→" + fromName + "调整金额:" + -adjustedValue;
|
|
}
|
|
|
|
// Create CashRecord objects and call mapper adjust method twice
|
|
for (int k = 0; k < 2; k++) {
|
|
CashRecord cashRecord = new CashRecord();
|
|
cashRecord.setOrderCode(orderCode + "_" + k);
|
|
cashRecord.setSubmitterId(adjustDTO.getSubmitterId());
|
|
cashRecord.setSubmitterMarket(adjustDTO.getSubmitterMarket());
|
|
cashRecord.setRemark(remark);
|
|
cashRecord.setPayTime(adjustDTO.getTime());
|
|
if(k == 0){
|
|
cashRecord.setPerformanceMarket(fromMarket);
|
|
cashRecord.setReceivedMarket(fromMarket);
|
|
cashRecord.setReceivedAmount(new BigDecimal(-adjustedValue));
|
|
}else{
|
|
cashRecord.setPerformanceMarket(toMarket);
|
|
cashRecord.setReceivedMarket(toMarket);
|
|
cashRecord.setReceivedAmount(new BigDecimal(adjustedValue));
|
|
}
|
|
// Call mapper adjust method
|
|
cashCollectionMapper.adjust(cashRecord);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 校验钱包 ID 和到账地区的对应关系
|
|
* @param walletId 钱包 ID
|
|
* @param receivedMarket 到账地区 ID
|
|
*/
|
|
private void validateWalletAndMarket(Integer walletId, String receivedMarket) {
|
|
if (walletId == null) {
|
|
return; // 非金币充值不需要校验
|
|
}
|
|
|
|
Map<Integer, String> walletMarketMap = new HashMap<>();
|
|
walletMarketMap.put(2, "13"); // 香港
|
|
walletMarketMap.put(3, "4"); // 新加坡 HC
|
|
walletMarketMap.put(4, "5"); // 马来西亚
|
|
walletMarketMap.put(5, "4"); // 新加坡 CM
|
|
walletMarketMap.put(6, "24016"); // 加拿大
|
|
walletMarketMap.put(7, "24018"); // 泰国 HS
|
|
walletMarketMap.put(8, "24018"); // 泰国 HA
|
|
walletMarketMap.put(9, "24022"); // 越南 HCM
|
|
walletMarketMap.put(10, "24033");// 北京
|
|
|
|
// 钱包 ID=1 为历史钱包,无限制,不需要校验
|
|
if (walletId == 1) {
|
|
return;
|
|
}
|
|
|
|
String expectedMarket = walletMarketMap.get(walletId);
|
|
if (expectedMarket == null) {
|
|
throw new IllegalArgumentException("无效的钱包 ID: " + walletId);
|
|
}
|
|
|
|
if (!expectedMarket.equals(receivedMarket)) {
|
|
String marketName = marketMapper.getMarketNameById(expectedMarket);
|
|
throw new IllegalArgumentException("钱包 ID=" + walletId + " 对应的到账地区应为:" + marketName + "(" + expectedMarket + ")");
|
|
}
|
|
}
|
|
|
|
}
|