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 selectCollection(Integer pageNum, Integer pageSize, CashCollection cashCollection) { /* //将操作人的地区列表改为id List 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 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 list = Arrays.asList(admin.getMarkets().split(",")); List 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 getActivityList() { LocalDateTime now = LocalDateTime.now(); return cashCollectionMapper.getActivityList(now); } //同步g_order订单到cash_record表 @Override public Object syncToCashRecord() { int total = 0; while (true) { List gOrders = cashCollectionMapper.getUnSync(50); if (CollectionUtils.isEmpty(gOrders)) { break; } try { // 每批独立事务 processBatch(gOrders); total += gOrders.size(); log.info("✅ 同步完成一批,数量: {}, 累计: {}", gOrders.size(), total); } catch (Exception e) { List 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 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 performanceSelect(Integer pageNum, Integer pageSize, PerformanceDTO performanceDTO) { PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper List performanceVOs = cashCollectionMapper.performanceSelect(performanceDTO); return new PageInfo<>(performanceVOs); } // 根据精网号和钱包 ID 查询用户钱包明细列表(分页) @Override public PageInfo selectWalletRecordsByJwcodeAndWalletId( Integer pageNum, Integer pageSize, Integer jwcode, Integer walletId) { PageHelper.startPage(pageNum, pageSize); List records = cashCollectionMapper.selectWalletRecordsByJwcodeAndWalletId(jwcode, walletId); return new PageInfo<>(records); } // 根据精网号和地区查询用户的所有钱包 ID 和金币数量(包含用户名和地区)(分页) @Override public PageInfo selectUserWallets(Integer jwcode, String market, Integer pageNum, Integer pageSize, String sortField, String sortOrder, Integer sortWalletId) { // 第一步:先查询符合条件的精网号列表(分页) PageHelper.startPage(pageNum, pageSize); List jwcodeList = cashCollectionMapper.selectDistinctJwcodes(jwcode, market, sortField, sortOrder, sortWalletId); PageInfo jwcodePageInfo = new PageInfo<>(jwcodeList); // 如果没有符合条件的记录,直接返回空结果 if (jwcodeList == null || jwcodeList.isEmpty()) { PageInfo emptyResult = new PageInfo<>(); emptyResult.setList(new ArrayList<>()); emptyResult.setTotal(0); emptyResult.setPages(0); emptyResult.setPageNum(pageNum); emptyResult.setPageSize(pageSize); return emptyResult; } // 第二步:根据精网号列表查询用户的钱包信息(不分页,返回这些精网号的所有钱包) List allWallets = cashCollectionMapper.selectUserWalletsByJwcodes(jwcodeList, market, sortField, sortOrder, sortWalletId); // 第三步:将钱包信息按精网号分组组装 Map 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 result = new ArrayList<>(); for (Integer jwc : jwcodeList) { UserWalletVO userWallet = userWalletMap.get(jwc); if (userWallet != null) { result.add(userWallet); } } // 第五步:构建并返回 PageInfo PageInfo 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 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 + ")"); } } }