Browse Source

11.8 导出与退款

huangqizheng/feature-20251104113536-现金管理二期退款修改
huangqizhen 3 weeks ago
parent
commit
686b5fbb2f
  1. 2
      src/main/java/com/example/demo/Export/ExportService.java
  2. 22
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  3. 78
      src/main/java/com/example/demo/controller/cash/CashRefundController.java
  4. 20
      src/main/java/com/example/demo/controller/coin/ExportController.java
  5. 36
      src/main/java/com/example/demo/domain/DTO/FinanceDTO.java
  6. 232
      src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java
  7. 6
      src/main/java/com/example/demo/domain/vo/cash/CashRecordRefund.java
  8. 23
      src/main/java/com/example/demo/domain/vo/cash/LhlAudit.java
  9. 8
      src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java
  10. 1
      src/main/java/com/example/demo/mapper/coin/MarketMapper.java
  11. 4
      src/main/java/com/example/demo/service/cash/RefundService.java
  12. 2
      src/main/java/com/example/demo/service/coin/ExportExcelService.java
  13. 36
      src/main/java/com/example/demo/service/listen/FinanceListener.java
  14. 161
      src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java
  15. 26
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  16. 18
      src/main/resources/cashMapper/CashCollectionMapper.xml
  17. 107
      src/main/resources/cashMapper/CashRefundMapper.xml
  18. 3
      src/main/resources/mapper/MarketMapper.xml

2
src/main/java/com/example/demo/Export/ExportService.java

@ -28,4 +28,6 @@ public interface ExportService {
Result addExportBean(BeanRechargeDTO dto); Result addExportBean(BeanRechargeDTO dto);
Result addExportOnline(OnlineDTO dto); Result addExportOnline(OnlineDTO dto);
//现金负责人退款导出
Result addExportFinance(FinanceDTO dto);
} }

22
src/main/java/com/example/demo/Export/ExportServiceImpl.java

@ -124,6 +124,11 @@ public class ExportServiceImpl implements ExportService {
articleDTO.setUrl(""); articleDTO.setUrl("");
articleDTO.setFileName(generateFileName("文章明细", adminName)); articleDTO.setFileName(generateFileName("文章明细", adminName));
articleDTO.setDataNum(0); articleDTO.setDataNum(0);
} else if(dto instanceof FinanceDTO financeDTO){
financeDTO.setAccount(Integer.valueOf(account));
financeDTO.setUrl("");
financeDTO.setFileName(generateFileName("现金明细", adminName));
financeDTO.setDataNum(0);
} }
} }
@ -211,6 +216,16 @@ public class ExportServiceImpl implements ExportService {
onlineDTO.getFileName(), onlineDTO.getFileName(),
onlineDTO.getDataNum() onlineDTO.getDataNum()
); );
}else if (dto instanceof FinanceDTO financeDTO){
goldDetailMapper.insertExportRecord(
idHolder,
account,
financeDTO.getType(),
financeDTO.getState(),
financeDTO.getUrl(),
financeDTO.getFileName(),
financeDTO.getDataNum()
);
} }
} }
@ -239,6 +254,8 @@ public class ExportServiceImpl implements ExportService {
requestData.put(requestDataKey, beanRechargeDTO.getBeanSystemRechargeInfo()); requestData.put(requestDataKey, beanRechargeDTO.getBeanSystemRechargeInfo());
} else if (dto instanceof OnlineDTO onlineDTO){ } else if (dto instanceof OnlineDTO onlineDTO){
requestData.put(requestDataKey, onlineDTO.getBeanOnlineRechargeInfo()); requestData.put(requestDataKey, onlineDTO.getBeanOnlineRechargeInfo());
}else if(dto instanceof FinanceDTO financeDTO){
requestData.put(requestDataKey, financeDTO.getCashRecordDTO());
} }
exportData.put("requestData", requestData); exportData.put("requestData", requestData);
@ -294,4 +311,9 @@ public class ExportServiceImpl implements ExportService {
public Result addExportOnline(OnlineDTO dto) { public Result addExportOnline(OnlineDTO dto) {
return addExport(dto, "在线明细", "online:queue:export_queue", "beanOnlineRechargeInfo"); return addExport(dto, "在线明细", "online:queue:export_queue", "beanOnlineRechargeInfo");
} }
@Override
public Result addExportFinance(FinanceDTO dto) {
return addExport(dto, "现金明细", "finance:queue:export_queue", "cashRecordDTO");
}
} }

78
src/main/java/com/example/demo/controller/cash/CashRefundController.java

@ -3,6 +3,7 @@ package com.example.demo.controller.cash;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.cash.CashRecordDone; import com.example.demo.domain.vo.cash.CashRecordDone;
import com.example.demo.domain.vo.cash.CashRecordRefund; import com.example.demo.domain.vo.cash.CashRecordRefund;
import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Page;
@ -44,6 +45,8 @@ public class CashRefundController {
private RefundService refundService; private RefundService refundService;
@Autowired @Autowired
MarketService marketService; MarketService marketService;
/** /**
* 当地财务负责人退款记录 * 当地财务负责人退款记录
*/ */
@ -67,20 +70,20 @@ public class CashRefundController {
} }
// 获取传入的市场列表 // 获取传入的市场列表
List<String> requestedMarkets = page.getCashRecordDone() != null ? page.getCashRecordDone().getMarkets() : null;
List<String> requestedMarkets = page.getCashRecordDTO() != null ? page.getCashRecordDTO().getMarkets() : null;
// 权限校验逻辑 // 权限校验逻辑
if (markets.contains("9") || markets.contains("9999")) { if (markets.contains("9") || markets.contains("9999")) {
// 特权市场9 9999跳过权限校验直接放行传入的 markets // 特权市场9 9999跳过权限校验直接放行传入的 markets
// 如果业务需要也可以在这里做空值处理 // 如果业务需要也可以在这里做空值处理
if (page.getCashRecordDone() != null) {
if (page.getCashRecordDTO() != null) {
// 保持 requestedMarkets 不变原样接受 // 保持 requestedMarkets 不变原样接受
// 可选如果 requestedMarkets null可设为默认值或保持 null // 可选如果 requestedMarkets null可设为默认值或保持 null
} }
} else { } else {
// 普通用户必须校验权限 // 普通用户必须校验权限
if (requestedMarkets == null || requestedMarkets.isEmpty()) { if (requestedMarkets == null || requestedMarkets.isEmpty()) {
page.getCashRecordDone().setMarkets(markets);
page.getCashRecordDTO().setMarkets(markets);
} }
if (!markets.containsAll(requestedMarkets)) { if (!markets.containsAll(requestedMarkets)) {
return Result.error("无权限!请求的市场不在授权范围内。"); return Result.error("无权限!请求的市场不在授权范围内。");
@ -102,6 +105,50 @@ public class CashRefundController {
} }
} }
/** /**
* 执行人查看退款现金记录
*/
@PostMapping("/exSelect")
public Result executor(@RequestBody Page page) throws Exception {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
// 解析 token 获取用户信息
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
List<String> markets = marketService.getMarketIds(userMarkets);
// 校验分页参数
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
}
// 获取传入的市场列表
List<String> requestedMarkets = page.getCashRecordDTO() != null ? page.getCashRecordDTO().getMarkets() : null;
// 权限校验逻辑
if (markets.contains("9") || markets.contains("9999")) {
// 特权市场9 9999跳过权限校验直接放行传入的 markets
// 如果业务需要也可以在这里做空值处理
if (page.getCashRecordDTO() != null) {
// 保持 requestedMarkets 不变原样接受
// 可选如果 requestedMarkets null可设为默认值或保持 null
}
} else {
// 普通用户必须校验权限
if (requestedMarkets == null || requestedMarkets.isEmpty()) {
page.getCashRecordDTO().setMarkets(markets);
}
if (!markets.containsAll(requestedMarkets)) {
return Result.error("无权限!请求的市场不在授权范围内。");
}
// 校验通过保持 requestedMarkets 不变
}
return Result.success(refundService.exSelect(page.getPageNum(), page.getPageSize(), page.getCashRecordDTO()));
}
/**
* 查询客服提交现金记录 * 查询客服提交现金记录
*/ */
@PostMapping("/selecta") @PostMapping("/selecta")
@ -161,4 +208,29 @@ public class CashRefundController {
} }
} }
/**
* 新增线上退款订单
*/
@PostMapping("/addOnline")
public Result addOnline(@RequestBody CashRecordRefund cashRecordRefund){
try {
return Result.success(refundService.add(cashRecordRefund));
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
@PostMapping("/export")
public Result export(@RequestBody Page page) throws Exception {
// 校验分页参数
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
}
return Result.success(refundService.financeSelect(page.getPageNum(), page.getPageSize(), page.getCashRecordDTO()));
}
} }

20
src/main/java/com/example/demo/controller/coin/ExportController.java

@ -195,4 +195,24 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
/**
* 负责人退款导出
*/
@PostMapping("/exportFinance")
public Result exportFinance(@Valid @RequestBody FinanceDTO dto) {
String lockKey = "export:lock:" + dto.getToken();
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportFinance(dto);
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
} }

36
src/main/java/com/example/demo/domain/DTO/FinanceDTO.java

@ -0,0 +1,36 @@
package com.example.demo.domain.DTO;
import com.example.demo.domain.vo.cash.CashRecordDTO;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName FinanceDTO
* @description:
* @author: huangqizhen
* @create: 202511-06 21:22
* @Version 1.0
**/
@Data
@NoArgsConstructor
public class FinanceDTO {
private String token;
private String url = "";
private String fileName = "";
private Integer sort = 0;
private String field = "";
private Integer account;
private Integer type = 12; //类型
private Integer state = 0; //状态
private String text = ""; //关键词搜索
private Integer dataNum = 0;
private String deptid = "";
private CashRecordDTO cashRecordDTO;
@NotNull(message = "page不能为空")
private Integer page = 1;
@NotNull(message = "pageSize不能为空")
private Integer pageSize = 5000;
}

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

@ -1,9 +1,14 @@
package com.example.demo.domain.vo.cash; package com.example.demo.domain.vo.cash;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -16,24 +21,217 @@ import java.util.List;
**/ **/
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor
public class CashRecordDTO extends CashRecordRefund{ public class CashRecordDTO extends CashRecordRefund{
private Integer activity;
private String goodsName;
private Integer goodsNum;
private String numUnit;
private BigDecimal gold;
private BigDecimal free;
private String paymentCurrency;
private BigDecimal paymentAmount;
private String receiveCurrency;
private BigDecimal receiveAmount;
private BigDecimal handlingCharges;
private String payType;
private String receivedMarket;
private String payVoucher;
private String payRemark;
private List<String> goodsNames;
private List<String> markets;
private String activity;// 活动
private String goodsName;// 商品名称
private Integer goodsNum;// 商品数量
private String numUnit;// 商品单位
private BigDecimal gold;//永久金币
private BigDecimal free;//免费金币
private String paymentCurrency;// 支付币种
private BigDecimal paymentAmount;// 支付金额
private String receivedCurrency;// 收款币种
private BigDecimal receivedAmount;// 收款金额
private BigDecimal handlingCharges;// 手续费
private String payBankCode;// 付款银行
private String payType;// 支付方式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private LocalDateTime payTime;// 付款时间
private String receivedMarket;// 收款地区
private String payVoucher;// 支付凭证
private String payRemark;// 支付备注
//提交人
private String paySubmitter;
//提交人
private String Submitter;
//审核人
private String audit;
//到账日期
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private LocalDateTime receivedTime;
private List<String> goodsNames;// 商品名称
private List<String> markets;// 地区
/**
* 序号
*/
private Integer id;
/**
* 精网号
*/
private Integer jwcode;
/**
* 姓名
*/
private String userName;
private String name;
/**
* 所属地区
*/
private String market;
/**
* 金币订单号
*/
private String orderCode;
/**
* 银行流水订单号
*/
private String bankCode;
/**
* 永久金币
*/
private Integer permanentGold;
/**
* 免费金币
*/
private Integer freeGold;
/**
* 审核人id
*/
private Integer auditId;
/**
* 订单状态1位代表收款2位代表退款
0线下财务待审核1线下财务审核通过待填手续费2线下财务审核驳回5手动撤回待编辑提交
3link线上财务复核待填手续费
4收款流程全部结束
6退款
---------------------------------------------
10地区财务待审核;11:地区财务手动撤回待编辑提交12地区财务驳回
20地区负责人待审核22地区负责人驳回
30总部财务待审核32总部财务驳回
40执行人待处理41执行人已处理退款结束
*/
private Integer status;
/**
* 提交人id
*/
private Integer submitterId;
/**
* 提交人地区
*/
private String submitterMarket;
/**
* 转账凭证
*/
private String voucher;
/**
* 备注
*/
private String remark;
/**
* 驳回理由
*/
private String rejectReason;
/**
* 退款备注理由,客服填写
*/
private String refundReason;
/**
* 退款方式0全额/1部分
*/
private Integer refundModel;
/**
* 退款执行人OA号
*/
private Integer executor;
/**
* 退款途径
*/
private String refundChannels;
/**
* 退款日期到天
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date refundTime;
/**
* 退款备注执行人填写
*/
private String refundRemark;
/**
* 退款截图
*/
private String refundVoucher;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date updateTime;
/**
* 审核时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date auditTime;
/**
* 退款币种
*/
private String refundCurrency;
/**
* 退款金额
*/
private String refundAmount;
/**
* 关联收款id
*/
private Integer relatedId;
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startTime; // 开始时间
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间
private String submitterName;
private String auditName;
private String executorName;
private String marketName;
private List<Integer> statuses;
private String processInstanceId; // 流程实例ID
private String currentTaskId; // 当前任务ID
private String areaServise;
private String areaFinance;
private String areaCharge;
private String headFinance;
private String sortField;
private String sortOrder;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date sTime; // 开始时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date eTime; // 结束时间
} }

6
src/main/java/com/example/demo/domain/vo/cash/CashRecordRefund.java

@ -17,7 +17,6 @@ import lombok.NoArgsConstructor;
*/ */
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor
public class CashRecordRefund { public class CashRecordRefund {
/** /**
* 序号 * 序号
@ -32,6 +31,7 @@ public class CashRecordRefund {
/** /**
* 姓名 * 姓名
*/ */
private String userName;
private String name; private String name;
/** /**
@ -126,6 +126,7 @@ public class CashRecordRefund {
/** /**
* 退款日期到天 * 退款日期到天
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date refundTime; private Date refundTime;
/** /**
@ -141,16 +142,19 @@ public class CashRecordRefund {
/** /**
* 创建时间 * 创建时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; private Date createTime;
/** /**
* 更新时间 * 更新时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date updateTime; private Date updateTime;
/** /**
* 审核时间 * 审核时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date auditTime; private Date auditTime;
/** /**

23
src/main/java/com/example/demo/domain/vo/cash/LhlAudit.java

@ -0,0 +1,23 @@
package com.example.demo.domain.vo.cash;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName LhlAudit
* @description:
* @author: huangqizhen
* @create: 202511-05 16:45
* @Version 1.0
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LhlAudit {
private String areaServise;//
private String areaFinance;
private String areaCharge;
private String headFinace;
}

8
src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java

@ -1,9 +1,6 @@
package com.example.demo.mapper.cash; package com.example.demo.mapper.cash;
import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.cash.CashRecordDone;
import com.example.demo.domain.vo.cash.CashRecordRefund;
import com.example.demo.domain.vo.cash.*;
import com.example.demo.domain.vo.coin.RefundUser; import com.example.demo.domain.vo.coin.RefundUser;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@ -32,4 +29,7 @@ public interface CashRefundMapper {
void addAudit(CashRecordDone cashRecordDone); void addAudit(CashRecordDone cashRecordDone);
void updateAudit(CashRecordDone cashRecordDone); void updateAudit(CashRecordDone cashRecordDone);
List<CashRecordDTO> financeSelect(CashRecordDTO cashRecordDTO); List<CashRecordDTO> financeSelect(CashRecordDTO cashRecordDTO);
//获取各阶段审核人
LhlAudit getAudit(Integer id);
List<CashRecordDTO> exSelect(CashRecordDTO cashRecordDTO);
} }

1
src/main/java/com/example/demo/mapper/coin/MarketMapper.java

@ -14,4 +14,5 @@ public interface MarketMapper {
Market getMarketIdDao(String country); Market getMarketIdDao(String country);
Market getMarketIdBytype(String market); Market getMarketIdBytype(String market);
String getMarketById(String market);
} }

4
src/main/java/com/example/demo/service/cash/RefundService.java

@ -32,4 +32,8 @@ public interface RefundService {
int finalreview(CashRecordDone cashRecordDone); int finalreview(CashRecordDone cashRecordDone);
PageInfo<CashRecordDTO> financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO); PageInfo<CashRecordDTO> financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO);
PageInfo<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO);
//新增线上退款记录
void addOnline(CashRecordRefund cashRecordRefund);
} }

2
src/main/java/com/example/demo/service/coin/ExportExcelService.java

@ -34,4 +34,6 @@ public interface ExportExcelService {
Exception OnlineExcel(String message) throws Exception; Exception OnlineExcel(String message) throws Exception;
//负责人退款导出
Exception FinanceExcel(String message) throws Exception;
} }

36
src/main/java/com/example/demo/service/listen/FinanceListener.java

@ -0,0 +1,36 @@
package com.example.demo.service.listen;
import com.example.demo.Util.RedisUtil;
import com.example.demo.service.coin.ExportExcelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @program: GOLD
* @ClassName FinanceListener
* @description:
* @author: huangqizhen
* @create: 202511-06 21:35
* @Version 1.0
**/
@Component
public class FinanceListener extends BaseMessageListener<String>{
@Autowired
private ExportExcelService exportExcelService;
@Autowired
public FinanceListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "finance:queue:export_queue");
}
@Override
protected void handleMessage(String message) {
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.FinanceExcel(message);
} catch (Exception e) {
handleException(e, message);
}
}
}

161
src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java

@ -1,16 +1,19 @@
package com.example.demo.serviceImpl.cash; package com.example.demo.serviceImpl.cash;
import com.example.demo.Util.BusinessException;
import com.example.demo.Util.GoldTistV2; import com.example.demo.Util.GoldTistV2;
import com.example.demo.controller.coin.AuditController;
import com.example.demo.domain.entity.User; import com.example.demo.domain.entity.User;
import com.example.demo.domain.entity.UserGoldRecord; import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.cash.CashRecordDone;
import com.example.demo.domain.vo.cash.CashRecordRefund;
import com.example.demo.domain.vo.cash.*;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.exception.SystemException;
import com.example.demo.mapper.cash.CashCollectionMapper;
import com.example.demo.mapper.cash.CashRefundMapper; import com.example.demo.mapper.cash.CashRefundMapper;
import com.example.demo.mapper.coin.AuditMapper; import com.example.demo.mapper.coin.AuditMapper;
import com.example.demo.mapper.coin.MarketMapper; import com.example.demo.mapper.coin.MarketMapper;
import com.example.demo.mapper.coin.RefundMapper; import com.example.demo.mapper.coin.RefundMapper;
import com.example.demo.service.cash.CashCollectionService;
import com.example.demo.service.cash.RefundService; import com.example.demo.service.cash.RefundService;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -19,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -46,11 +50,53 @@ public class CashRefundServiceImpl implements RefundService {
private AuditMapper auditMapper; private AuditMapper auditMapper;
@Autowired @Autowired
private MarketMapper marketMapper; private MarketMapper marketMapper;
@Autowired
private CashCollectionMapper cashCollectionMapper;
@Autowired
private AuditController auditController;
@Override @Override
public PageInfo<CashRecordDTO> select(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) { public PageInfo<CashRecordDTO> select(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize); PageHelper.startPage(pageNum, pageSize);
// System.out.println(goldDetail.getMarkets()); // System.out.println(goldDetail.getMarkets());
List<CashRecordDTO> list = cashRefundMapper.select(cashRecordDTO); List<CashRecordDTO> list = cashRefundMapper.select(cashRecordDTO);
list.forEach(item -> {
CashCollection cashCollection = cashCollectionMapper.selectById(item.getRelatedId());
String marketName = marketMapper.getMarketById(item.getMarket());
String submitter = auditMapper.getName(item.getSubmitterId());
LhlAudit lhlAudit = cashRefundMapper.getAudit(item.getAuditId());
if(cashCollection.getFreeGold()== null){
cashCollection.setFreeGold(0);
}
if(cashCollection.getPermanentGold()== null){
cashCollection.setPermanentGold(0);
}
BigDecimal free = new BigDecimal(cashCollection.getFreeGold())
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
BigDecimal permanent = new BigDecimal(cashCollection.getPermanentGold())
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
item.setGold(permanent);
item.setFree(free);
item.setActivity(cashCollection.getActivity());
item.setPaymentCurrency(cashCollection.getPaymentCurrency());
item.setPaymentAmount(cashCollection.getPaymentAmount());
item.setReceivedCurrency(cashCollection.getReceivedCurrency());
item.setReceivedAmount(cashCollection.getReceivedAmount());
item.setPayType(cashCollection.getPayType());
item.setPayTime(cashCollection.getPayTime());
item.setPayBankCode(cashCollection.getBankCode());
item.setPaySubmitter(cashCollection.getSubmitterName());
item.setAudit(cashCollection.getAuditName());
item.setReceivedTime(cashCollection.getReceivedTime());
item.setPayVoucher(cashCollection.getVoucher());
item.setPayRemark(cashCollection.getRemark());
item.setMarketName(marketName);
item.setSubmitter(submitter);
item.setAreaServise(lhlAudit.getAreaServise());
item.setAreaFinance(lhlAudit.getAreaFinance());
item.setAreaCharge(lhlAudit.getAreaCharge());
item.setHeadFinance(lhlAudit.getHeadFinace());
});
return new PageInfo<>(list); return new PageInfo<>(list);
} }
@ -224,6 +270,115 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
PageHelper.startPage(pageNum, pageSize); PageHelper.startPage(pageNum, pageSize);
// System.out.println(goldDetail.getMarkets()); // System.out.println(goldDetail.getMarkets());
List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO); List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO);
System.out.println( list);
list.forEach(item -> {
CashCollection cashCollection = cashCollectionMapper.selectById(item.getRelatedId());
String marketName = marketMapper.getMarketById(item.getMarket());
String submitter = auditMapper.getName(item.getSubmitterId());
LhlAudit lhlAudit = cashRefundMapper.getAudit(item.getAuditId());
if(cashCollection.getFreeGold()== null){
cashCollection.setFreeGold(0);
}
if(cashCollection.getPermanentGold()== null){
cashCollection.setPermanentGold(0);
}
BigDecimal free = new BigDecimal(cashCollection.getFreeGold())
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
BigDecimal permanent = new BigDecimal(cashCollection.getPermanentGold())
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
item.setGold(permanent);
item.setFree(free);
item.setActivity(cashCollection.getActivity());
item.setPaymentCurrency(cashCollection.getPaymentCurrency());
item.setPaymentAmount(cashCollection.getPaymentAmount());
item.setReceivedCurrency(cashCollection.getReceivedCurrency());
item.setReceivedAmount(cashCollection.getReceivedAmount());
item.setPayType(cashCollection.getPayType());
item.setPayTime(cashCollection.getPayTime());
item.setPayBankCode(cashCollection.getBankCode());
item.setPaySubmitter(cashCollection.getSubmitterName());
item.setAudit(cashCollection.getAuditName());
item.setReceivedTime(cashCollection.getReceivedTime());
item.setPayVoucher(cashCollection.getVoucher());
item.setPayRemark(cashCollection.getRemark());
item.setMarketName(marketName);
item.setSubmitter(submitter);
item.setAreaServise(lhlAudit.getAreaServise());
item.setAreaFinance(lhlAudit.getAreaFinance());
item.setAreaCharge(lhlAudit.getAreaCharge());
item.setHeadFinance(lhlAudit.getHeadFinace());
});
return new PageInfo<>(list); return new PageInfo<>(list);
} }
@Override
public PageInfo<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize);
// System.out.println(goldDetail.getMarkets());
List<CashRecordDTO> list = cashRefundMapper.exSelect(cashRecordDTO);
list.forEach(item -> {
CashCollection cashCollection = cashCollectionMapper.selectById(item.getRelatedId());
String marketName
= marketMapper.getMarketById(item.getMarket());
String submitter = auditMapper.getName(item.getSubmitterId());
LhlAudit lhlAudit = cashRefundMapper.getAudit(item.getAuditId());
BigDecimal free = new BigDecimal(cashCollection.getFreeGold())
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
BigDecimal permanent = new BigDecimal(cashCollection.getPermanentGold())
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
item.setGold(permanent);
item.setFree(free);
item.setActivity(cashCollection.getActivity());
item.setPaymentCurrency(cashCollection.getPaymentCurrency());
item.setPaymentAmount(cashCollection.getPaymentAmount());
item.setReceivedCurrency(cashCollection.getReceivedCurrency());
item.setReceivedAmount(cashCollection.getReceivedAmount());
item.setPayType(cashCollection.getPayType());
item.setPayTime(cashCollection.getPayTime());
item.setPayBankCode(cashCollection.getBankCode());
item.setPaySubmitter(cashCollection.getSubmitterName());
item.setAudit(cashCollection.getAuditName());
item.setReceivedTime(cashCollection.getReceivedTime());
item.setPayVoucher(cashCollection.getVoucher());
item.setPayRemark(cashCollection.getRemark());
item.setMarketName(marketName);
item.setSubmitter(submitter);
item.setAreaServise(lhlAudit.getAreaServise());
item.setAreaFinance(lhlAudit.getAreaFinance());
item.setAreaCharge(lhlAudit.getAreaCharge());
item.setHeadFinance(lhlAudit.getHeadFinace());
});
return new PageInfo<>(list);
}
@Override
public void addOnline(CashRecordRefund cashRecordRefund) {
if(cashRecordRefund.getJwcode()==null){
throw new BusinessException("未输入精网号") ;
}
if(cashRecordRefund.getRefundModel()== null){
throw new BusinessException("请填充退款类型") ;
}
if(cashRecordRefund.getRefundReason()== null){
throw new BusinessException("请填写退款理由") ;
}
CashRecordDone cashRecordDonetwo = new CashRecordDone();
cashRecordDonetwo.setAreaServise(cashRecordRefund.getAreaServise());
cashRefundMapper.addAudit(cashRecordDonetwo);
cashRecordRefund.setAuditId(cashRecordDonetwo.getId());
cashRecordRefund.setStatus(20);
//生成订单号后半部分
String orderNumber = cashRecordRefund.getOrderCode();
//构建订单信息
cashRecordRefund.setOrderCode("TK" + orderNumber); //订单号
cashRecordRefund.setMarket(String.valueOf(Integer.valueOf(marketMapper.getMarketId(cashRecordRefund.getMarket()))));
cashRefundMapper.insert(cashRecordRefund);
CashRecordDone cashRecordDone1 = new CashRecordDone();
cashRecordDone1.setId(cashRecordRefund.getId());
cashRecordDone1.setStatus(6);
if (cashRecordDone1.getId()!=null||cashRecordDone1.getOrderCode()!= null)
cashRefundMapper.updateStatus(cashRecordDone1);
else throw new SystemException("提交失败") ;
}
} }

26
src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java

@ -8,6 +8,7 @@ import com.example.demo.Util.ExcelUploadUtil;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.controller.bean.BeanConsumeController; import com.example.demo.controller.bean.BeanConsumeController;
import com.example.demo.controller.bean.BeanRechargeController; import com.example.demo.controller.bean.BeanRechargeController;
import com.example.demo.controller.cash.CashRefundController;
import com.example.demo.controller.coin.ConsumeController; import com.example.demo.controller.coin.ConsumeController;
import com.example.demo.controller.coin.GoldDetailController; import com.example.demo.controller.coin.GoldDetailController;
import com.example.demo.controller.coin.RechargeController; import com.example.demo.controller.coin.RechargeController;
@ -18,10 +19,14 @@ import com.example.demo.domain.entity.User;
import com.example.demo.domain.export.Goldmingxi; import com.example.demo.domain.export.Goldmingxi;
import com.example.demo.domain.vo.bean.*; import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.coin.*; import com.example.demo.domain.vo.coin.*;
import com.example.demo.mapper.cash.CashRefundMapper;
import com.example.demo.mapper.coin.ExportMapper; import com.example.demo.mapper.coin.ExportMapper;
import com.example.demo.service.cash.RefundService;
import com.example.demo.service.coin.ExportExcelService; import com.example.demo.service.coin.ExportExcelService;
import com.example.demo.serviceImpl.cash.CashRefundServiceImpl;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
@ -32,6 +37,7 @@ import com.example.demo.service.coin.AiEmotionService;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.Finance;
import org.apache.xmlbeans.impl.xb.xsdschema.Attribute; import org.apache.xmlbeans.impl.xb.xsdschema.Attribute;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@ -76,6 +82,8 @@ public class ExportExcelServiceImpl implements ExportExcelService {
private BeanRechargeController beanRechargeController; private BeanRechargeController beanRechargeController;
@Autowired @Autowired
private AuthenticationManager authenticationManager; private AuthenticationManager authenticationManager;
@Autowired
private CashRefundController cashRefundController;
// 每页查询的数据量 // 每页查询的数据量
private static final int PAGE_SIZE = 5000; private static final int PAGE_SIZE = 5000;
@Autowired @Autowired
@ -261,6 +269,22 @@ public class ExportExcelServiceImpl implements ExportExcelService {
} }
@Override @Override
public Exception FinanceExcel(String message) throws Exception {
return exportExcelGeneric(message, "financeUser", page -> {
try {
JsonNode rootNode = objectMapper.readTree(message);
JsonNode requestDataNode = rootNode.path("requestData");
JsonNode beanRechargeNode = requestDataNode.path("cashRecordDTO");
CashRecordDTO cashRecordDTO = objectMapper.treeToValue(beanRechargeNode, CashRecordDTO.class);
page.setCashRecordDTO(cashRecordDTO);
return cashRefundController.export(page);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
@Override
public List<Export> getExcel(Export export) { public List<Export> getExcel(Export export) {
List<Export> list = exportMapper.getExportRecord(export.getAccount(),export.getType()); List<Export> list = exportMapper.getExportRecord(export.getAccount(),export.getType());
System.out.println(list+"-------------------------------"); System.out.println(list+"-------------------------------");
@ -497,6 +521,8 @@ public class ExportExcelServiceImpl implements ExportExcelService {
return BeanSystemRechargeInfo.class; return BeanSystemRechargeInfo.class;
case "onlineUser": case "onlineUser":
return BeanOnlineRechargeInfo.class; return BeanOnlineRechargeInfo.class;
case "financeUser":
return CashRecordDTO.class;
default: default:
throw new IllegalArgumentException("不支持的导出类型: " + exportType); throw new IllegalArgumentException("不支持的导出类型: " + exportType);
} }

18
src/main/resources/cashMapper/CashCollectionMapper.xml

@ -241,12 +241,16 @@
limit #{size} limit #{size}
</select> </select>
<select id="selectById" resultType="com.example.demo.domain.vo.cash.CashCollection"> <select id="selectById" resultType="com.example.demo.domain.vo.cash.CashCollection">
select id,jwcode,name,market,activity,
order_code,bank_code,goods_name,good_num,num_unit,permanent_gold,free_gold,
payment_currency,payment_amount,received_currency,received_amount,handling_charge,
pay_type,received_market,pay_time,received_time,audit_id,status,submitter_id,
submitter_market,voucher,remark,audit_time
from cash_record
where id=#{id}
select cr.id,cr.jwcode,cr.name,cr.market,
cr.order_code,cr.bank_code,cr.goods_name,cr.good_num,cr.num_unit,cr.permanent_gold,cr.free_gold,
cr.payment_currency,cr.payment_amount,cr.received_currency,cr.received_amount,cr.handling_charge,
cr.pay_type,cr.received_market,cr.pay_time,cr.received_time,cr.audit_id,cr.status,cr.submitter_id,
cr.submitter_market,cr.voucher,cr.remark,cr.audit_time,a1.admin_name as submitterName,
a2.admin_name as auditName,ra.activity_name as activity
from cash_record cr
left join admin a1 on cr.submitter_id = a1.id
left join admin a2 on cr.audit_id = a2.id
left join recharge_activity ra on ra.id = cr.activity
where cr.id=#{id}
</select> </select>
</mapper> </mapper>

107
src/main/resources/cashMapper/CashRefundMapper.xml

@ -6,7 +6,6 @@
jwcode, jwcode,
name, name,
market, market,
activity,
order_code, order_code,
bank_code, bank_code,
permanent_gold, permanent_gold,
@ -32,7 +31,6 @@
#{jwcode}, #{jwcode},
#{name}, #{name},
#{market}, #{market},
#{activity},
#{orderCode}, #{orderCode},
#{bankCode}, #{bankCode},
#{permanentGold}, #{permanentGold},
@ -133,7 +131,7 @@
</update> </update>
<select id="select" resultType="com.example.demo.domain.vo.cash.CashRecordDone">
<select id="select" resultType="com.example.demo.domain.vo.cash.CashRecordDTO">
select select
crr.id, crr.id,
crr.jwcode, crr.jwcode,
@ -158,14 +156,15 @@
la.head_finance, la.head_finance,
crc.activity, crc.activity,
crc.goods_name, crc.goods_name,
crc.goods_num,
crc.good_num as goodsNum,
crc.num_unit, crc.num_unit,
crc.pay_type, crc.pay_type,
crc.pay_time, crc.pay_time,
crc.voucher, crc.voucher,
crc.remark, crc.remark,
crc.payment_currency, crc.payment_currency,
crc.payment_amount,
crc.payment_amount
from cash_record_refund crr
left join lhl_audit la on la.id = crr.audit_id left join lhl_audit la on la.id = crr.audit_id
left join cash_record_collection crc on crc.id = crr.related_id left join cash_record_collection crc on crc.id = crr.related_id
<where> <where>
@ -215,7 +214,7 @@
ORDER BY ${sortField} ${sortOrder} ORDER BY ${sortField} ${sortOrder}
</when> </when>
<otherwise> <otherwise>
ORDER BY create_time DESC
ORDER BY crr.create_time DESC
</otherwise> </otherwise>
</choose> </choose>
</select> </select>
@ -225,7 +224,7 @@
crr.name, crr.name,
crr.market, crr.market,
crc.goods_name, crc.goods_name,
crc.goods_num,
crc.good_num as goodsNum,
crc.num_unit, crc.num_unit,
crr.refund_model, crr.refund_model,
crr.submitter_id, crr.submitter_id,
@ -235,9 +234,14 @@
crr.permanent_gold, crr.permanent_gold,
crr.free_gold, crr.free_gold,
crr.audit_id, crr.audit_id,
crr.related_id
crr.related_id,
la.area_servise,
la.area_finance,
la.area_charge,
la.head_finance
from cash_record_refund crr from cash_record_refund crr
left join cash_record_collection crc on crc.id = crr.related_id left join cash_record_collection crc on crc.id = crr.related_id
left join lhl_audit la on la.id = crr.audit_id
<where> <where>
<if test="status != null"> <if test="status != null">
and crr.status = #{status} and crr.status = #{status}
@ -285,8 +289,93 @@
ORDER BY ${sortField} ${sortOrder} ORDER BY ${sortField} ${sortOrder}
</when> </when>
<otherwise> <otherwise>
ORDER BY create_time DESC
ORDER BY crr.create_time DESC
</otherwise>
</choose>
</select>
<select id="getAudit" resultType="com.example.demo.domain.vo.cash.LhlAudit">
select la.id,
la.area_servise,
la.area_finance,
la.area_charge,
la.head_finance
from lhl_audit la
where la.id = #{id}
</select>
<select id="exSelect" resultType="com.example.demo.domain.vo.cash.CashRecordDTO">
select crr.id,
crr.jwcode,
crr.name,
crr.market,
crc.goods_name,
crc.good_num as goodsNum,
crc.num_unit,
crr.refund_model,
crr.refund_currency,
crr.refund_amount,
crr.refund_channels,
crr.voucher,
crr.refund_time,
crr.status,
crr.audit_id,
crr.related_id,
la.area_servise,
la.area_finance,
la.area_charge,
la.head_finance
from cash_record_refund crr
left join cash_record_collection crc on crc.id = crr.related_id
left join lhl_audit la on la.id = crr.audit_id
<where>
<if test="status != null">
and crr.status = #{status}
</if>
<if test="name != null and name.length() > 0">
and crr.name = #{name}
</if>
<if test="jwcode != null">
and crr.jwcode = #{jwcode}
</if>
<if test="markets!= null and markets.size > 0">
AND crr.market IN
<foreach collection="markets" item="markets" open="(" separator="," close=")">
#{markets}
</foreach>
</if>
<if test="statuses!= null and statuses.size > 0">
AND crr.status IN
<foreach collection="statuses" item="statuses" open="(" separator="," close=")">
#{statuses}
</foreach>
</if>
<if test="goodsNames!= null and goodsNames.size > 0">
AND crc.goods_name IN
<foreach collection="goodsNames" item="goodsNames" open="(" separator="," close=")">
#{goodsNames}
</foreach>
</if>
<if test="refundCurrency != null and refundCurrency.size > 0">
AND crr.refund_currency = #{refundCurrency}
</if>
<if test="refundChannels != null and refundChannels.length()>0">
and crc.refund_channels = #{refundChannels}
</if>
<if test="startTime != null and endTime != null">
and crc.`refund_time` BETWEEN #{startTime} AND #{endTime}
</if>
<if test=" submitterId!= null">
and crr.submitter_id = #{submitterId}
</if>
</where>
<choose>
<when test="sortField != null and sortField.length > 0 or sortOrder != null and sortOrder.length > 0">
ORDER BY ${sortField} ${sortOrder}
</when>
<otherwise>
ORDER BY crr.create_time DESC
</otherwise> </otherwise>
</choose> </choose>
</select> </select>
</mapper> </mapper>

3
src/main/resources/mapper/MarketMapper.xml

@ -35,4 +35,7 @@
<select id="getMarketIdBytype" resultType="com.example.demo.domain.entity.Market"> <select id="getMarketIdBytype" resultType="com.example.demo.domain.entity.Market">
select * from market where parent_id=#{parentId} select * from market where parent_id=#{parentId}
</select> </select>
<select id="getMarketById" resultType="java.lang.String">
select name from market where id=#{market}
</select>
</mapper> </mapper>
Loading…
Cancel
Save