Browse Source

Merge remote-tracking branch 'origin/milestone-20251104-现金管理二期' into milestone-20251104-现金管理二期

sunjiabei/feature-20251021102635-银行接口
sunjiabei 2 weeks ago
parent
commit
9b776f0998
  1. 4
      src/main/java/com/example/demo/Export/ExportService.java
  2. 44
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  3. 9
      src/main/java/com/example/demo/Mysql/MysqlServiceImpl.java
  4. 76
      src/main/java/com/example/demo/RabbitMQ/CashCollectionConsumer.java
  5. 76
      src/main/java/com/example/demo/RabbitMQ/CashRefundConsumer.java
  6. 5
      src/main/java/com/example/demo/RabbitMQ/LogAspect.java
  7. 240
      src/main/java/com/example/demo/config/RabbitMQConfig.java
  8. 19
      src/main/java/com/example/demo/controller/cash/CashCollectionController.java
  9. 82
      src/main/java/com/example/demo/controller/cash/CashRefundController.java
  10. 38
      src/main/java/com/example/demo/controller/coin/ExportController.java
  11. 39
      src/main/java/com/example/demo/domain/DTO/CashDTO.java
  12. 36
      src/main/java/com/example/demo/domain/DTO/FinanceDTO.java
  13. 2
      src/main/java/com/example/demo/domain/vo/cash/CashCollection.java
  14. 66
      src/main/java/com/example/demo/domain/vo/cash/CashCollectionMessage.java
  15. 245
      src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java
  16. 10
      src/main/java/com/example/demo/domain/vo/cash/CashRecordRefund.java
  17. 76
      src/main/java/com/example/demo/domain/vo/cash/CashRefundMessage.java
  18. 24
      src/main/java/com/example/demo/domain/vo/cash/LhlAudit.java
  19. 13
      src/main/java/com/example/demo/domain/vo/coin/IdName.java
  20. 1
      src/main/java/com/example/demo/mapper/cash/CashAuditMapper.java
  21. 7
      src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java
  22. 12
      src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java
  23. 5
      src/main/java/com/example/demo/mapper/coin/AuditMapper.java
  24. 5
      src/main/java/com/example/demo/mapper/coin/MarketMapper.java
  25. 2
      src/main/java/com/example/demo/security/SecurityConfig.java
  26. 4
      src/main/java/com/example/demo/service/cash/RefundService.java
  27. 4
      src/main/java/com/example/demo/service/coin/ExportExcelService.java
  28. 36
      src/main/java/com/example/demo/service/listen/CashListener.java
  29. 36
      src/main/java/com/example/demo/service/listen/FinanceListener.java
  30. 41
      src/main/java/com/example/demo/serviceImpl/cash/CashAuditServiceImpl.java
  31. 102
      src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java
  32. 151
      src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java
  33. 6
      src/main/java/com/example/demo/serviceImpl/coin/AdminServiceImpl.java
  34. 48
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  35. 4
      src/main/resources/cashMapper/CashAuditMapper.xml
  36. 123
      src/main/resources/cashMapper/CashCollectionMapper.xml
  37. 143
      src/main/resources/cashMapper/CashRefundMapper.xml
  38. 74
      src/main/resources/mapper/AuditMapper.xml
  39. 14
      src/main/resources/mapper/MarketMapper.xml

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

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

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

@ -124,6 +124,16 @@ public class ExportServiceImpl implements ExportService {
articleDTO.setUrl("");
articleDTO.setFileName(generateFileName("文章明细", adminName));
articleDTO.setDataNum(0);
} else if(dto instanceof FinanceDTO financeDTO){
financeDTO.setAccount(Integer.valueOf(account));
financeDTO.setUrl("");
financeDTO.setFileName(generateFileName("现金退款明细", adminName));
financeDTO.setDataNum(0);
} else if(dto instanceof CashDTO cashDTO){
cashDTO.setAccount(Integer.valueOf(account));
cashDTO.setUrl("");
cashDTO.setFileName(generateFileName("现金收款明细", adminName));
cashDTO.setDataNum(0);
}
}
@ -211,6 +221,26 @@ public class ExportServiceImpl implements ExportService {
onlineDTO.getFileName(),
onlineDTO.getDataNum()
);
}else if (dto instanceof FinanceDTO financeDTO){
goldDetailMapper.insertExportRecord(
idHolder,
account,
financeDTO.getType(),
financeDTO.getState(),
financeDTO.getUrl(),
financeDTO.getFileName(),
financeDTO.getDataNum()
);
}else if (dto instanceof CashDTO cashDTO){
goldDetailMapper.insertExportRecord(
idHolder,
account,
cashDTO.getType(),
cashDTO.getState(),
cashDTO.getUrl(),
cashDTO.getFileName(),
cashDTO.getDataNum()
);
}
}
@ -239,6 +269,10 @@ public class ExportServiceImpl implements ExportService {
requestData.put(requestDataKey, beanRechargeDTO.getBeanSystemRechargeInfo());
} else if (dto instanceof OnlineDTO onlineDTO){
requestData.put(requestDataKey, onlineDTO.getBeanOnlineRechargeInfo());
}else if(dto instanceof FinanceDTO financeDTO){
requestData.put(requestDataKey, financeDTO.getCashRecordDTO());
}else if (dto instanceof CashDTO cashDTO){
requestData.put(requestDataKey, cashDTO.getCashCollection());
}
exportData.put("requestData", requestData);
@ -294,4 +328,14 @@ public class ExportServiceImpl implements ExportService {
public Result addExportOnline(OnlineDTO dto) {
return addExport(dto, "在线明细", "online:queue:export_queue", "beanOnlineRechargeInfo");
}
@Override
public Result addExportFinance(FinanceDTO dto) {
return addExport(dto, "现金退款明细", "finance:queue:export_queue", "cashRecordDTO");
}
@Override
public Result addExportCash(CashDTO dto) {
return addExport(dto, "现金收款明细", "cash:queue:export_queue", "cashCollection");
}
}

9
src/main/java/com/example/demo/Mysql/MysqlServiceImpl.java

@ -26,6 +26,7 @@ import java.time.LocalDateTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.Date;
@Service
@ -64,7 +65,7 @@ public class MysqlServiceImpl implements MysqlService {
@Override
@Transactional(transactionManager = "mysqlTransactionManager") // 👈 保证插入和用户更新在一个事务
@Transactional(transactionManager = "mysqlTransactionManager",rollbackFor = Exception.class) // 👈 保证插入和用户更新在一个事务
public void getSqlserverData() throws Exception {
logger.info("开始从 SQL Server 同步数据到 MySQL");
@ -357,7 +358,7 @@ public class MysqlServiceImpl implements MysqlService {
if (validZeroTypes.contains(data.gtype)) {
stmt.setInt(13, 0);
stmt.setNull(20, 0);
stmt.setInt(20, 0);
stmt.setString(1, "ERPCZ_" + data.orderNumber);
} else if (validOneTypes.contains(data.gtype)) {
stmt.setInt(13, 1);
@ -415,8 +416,8 @@ public class MysqlServiceImpl implements MysqlService {
} else {
stmt.setInt(17, 1);
}
stmt.setTimestamp(18, data.cz_time);
Timestamp now = new Timestamp(System.currentTimeMillis());
stmt.setTimestamp(18, now);
stmt.setTimestamp(19, data.cz_time);
stmt.setString(21, data.uid);
}

76
src/main/java/com/example/demo/RabbitMQ/CashCollectionConsumer.java

@ -0,0 +1,76 @@
package com.example.demo.RabbitMQ;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.vo.cash.CashCollectionMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 收款流程消息消费者
* 监听收款流程中各个状态变更的消息队列
*/
@Component
@Slf4j
public class CashCollectionConsumer {
/**
* 处理收款订单创建消息
* 当有新的收款订单创建时该方法会被调用
*
* @param message 收款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.COLLECTION_CREATED_QUEUE)
public void handleCollectionCreated(CashCollectionMessage message) {
log.info("收款订单创建通知: 订单号={}, 状态={}, 提交人={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getSubmitterId(), message.getMessage());
}
/**
* 处理收款订单审核通过消息
* 当收款订单审核通过时该方法会被调用
*
* @param message 收款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.COLLECTION_AUDITED_QUEUE)
public void handleCollectionAudited(CashCollectionMessage message) {
log.info("收款订单审核通过通知: 订单号={}, 状态={}, 审核人={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getAuditId(), message.getMessage());
}
/**
* 处理收款订单审核驳回消息
* 当收款订单被审核驳回时该方法会被调用
*
* @param message 收款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.COLLECTION_REJECTED_QUEUE)
public void handleCollectionRejected(CashCollectionMessage message) {
log.info("收款订单审核驳回通知: 订单号={}, 状态={}, 审核人={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getAuditId(), message.getMessage());
}
/**
* 处理收款订单完成消息
* 当收款订单流程全部完成时该方法会被调用
*
* @param message 收款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.COLLECTION_COMPLETED_QUEUE)
public void handleCollectionCompleted(CashCollectionMessage message) {
log.info("收款订单完成通知: 订单号={}, 状态={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getMessage());
}
/**
* 处理收款订单撤回消息
* 当收款订单被撤回时该方法会被调用
*
* @param message 收款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.COLLECTION_CANCELLED_QUEUE)
public void handleCollectionCancelled(CashCollectionMessage message) {
log.info("收款订单撤回通知: 订单号={}, 状态={}, 提交人={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getSubmitterId(), message.getMessage());
}
}

76
src/main/java/com/example/demo/RabbitMQ/CashRefundConsumer.java

@ -0,0 +1,76 @@
package com.example.demo.RabbitMQ;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.vo.cash.CashRefundMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 退款流程消息消费者
* 监听退款流程中各个状态变更的消息队列
*/
@Component
@Slf4j
public class CashRefundConsumer {
/**
* 处理退款订单创建消息
* 当有新的退款订单创建时该方法会被调用
*
* @param message 退款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.REFUND_CREATED_QUEUE)
public void handleRefundCreated(CashRefundMessage message) {
log.info("退款订单创建通知: 订单号={}, 状态={}, 提交人={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getSubmitterId(), message.getMessage());
}
/**
* 处理退款订单审核通过消息
* 当退款订单审核通过时该方法会被调用
*
* @param message 退款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.REFUND_REVIEWED_QUEUE)
public void handleRefundReviewed(CashRefundMessage message) {
log.info("退款订单审核通过通知: 订单号={}, 状态={}, 审核人={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getAuditId(), message.getMessage());
}
/**
* 处理退款订单审核驳回消息
* 当退款订单被审核驳回时该方法会被调用
*
* @param message 退款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.REFUND_REJECTED_QUEUE)
public void handleRefundRejected(CashRefundMessage message) {
log.info("退款订单审核驳回通知: 订单号={}, 状态={}, 审核人={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getAuditId(), message.getMessage());
}
/**
* 处理退款订单执行消息
* 当退款订单被执行时该方法会被调用
*
* @param message 退款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.REFUND_EXECUTED_QUEUE)
public void handleRefundExecuted(CashRefundMessage message) {
log.info("退款订单执行通知: 订单号={}, 状态={}, 执行人={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getExecutorId(), message.getMessage());
}
/**
* 处理退款订单完成消息
* 当退款订单流程全部完成时该方法会被调用
*
* @param message 退款订单消息对象
*/
@RabbitListener(queues = RabbitMQConfig.REFUND_COMPLETED_QUEUE)
public void handleRefundCompleted(CashRefundMessage message) {
log.info("退款订单完成通知: 订单号={}, 状态={}, 消息={}",
message.getOrderCode(), message.getStatus(), message.getMessage());
}
}

5
src/main/java/com/example/demo/RabbitMQ/LogAspect.java

@ -44,6 +44,11 @@ public class LogAspect {
String username = SecurityUtils.getCurrentUsername();
Integer userId = SecurityUtils.getCurrentUserId();
// 添加空值检查
if (userId == null) {
log.warn("无法获取当前用户ID,使用默认值 -1");
userId = -1; // 或者使用其他默认值
}
String ip = getClientIp();
ObjectMapper mapper = new ObjectMapper();

240
src/main/java/com/example/demo/config/RabbitMQConfig.java

@ -1,6 +1,5 @@
package com.example.demo.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
@ -12,12 +11,32 @@ import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* RabbitMQ配置类
* 配置消息队列交换机以及它们之间的绑定关系
*/
@Configuration
public class RabbitMQConfig {
public static final String LOG_QUEUE = "operation_log_queue";
public static final String LOG_EXCHANGE = "operation_log_exchange";
// 收款流程相关队列和交换机常量定义
public static final String CASH_COLLECTION_EXCHANGE = "cash_collection_exchange";
public static final String COLLECTION_CREATED_QUEUE = "collection_created_queue";
public static final String COLLECTION_AUDITED_QUEUE = "collection_audited_queue";
public static final String COLLECTION_COMPLETED_QUEUE = "collection_completed_queue";
public static final String COLLECTION_CANCELLED_QUEUE = "collection_cancelled_queue";
public static final String COLLECTION_REJECTED_QUEUE = "collection_rejected_queue";
// 退款流程相关队列和交换机常量定义
public static final String CASH_REFUND_EXCHANGE = "cash_refund_exchange";
public static final String REFUND_CREATED_QUEUE = "refund_created_queue";
public static final String REFUND_REVIEWED_QUEUE = "refund_reviewed_queue";
public static final String REFUND_EXECUTED_QUEUE = "refund_executed_queue";
public static final String REFUND_COMPLETED_QUEUE = "refund_completed_queue";
public static final String REFUND_REJECTED_QUEUE = "refund_rejected_queue";
@Bean
public Queue logQueue() {
return new Queue(LOG_QUEUE, true);
@ -34,6 +53,225 @@ public class RabbitMQConfig {
.to(logExchange())
.with("log.*");
}
/**
* 创建收款流程交换机
* @return TopicExchange对象
*/
@Bean
public TopicExchange cashCollectionExchange() {
return new TopicExchange(CASH_COLLECTION_EXCHANGE);
}
/**
* 创建收款创建队列
* @return Queue对象
*/
@Bean
public Queue collectionCreatedQueue() {
return new Queue(COLLECTION_CREATED_QUEUE, true);
}
/**
* 创建收款审核队列
* @return Queue对象
*/
@Bean
public Queue collectionAuditedQueue() {
return new Queue(COLLECTION_AUDITED_QUEUE, true);
}
/**
* 创建收款完成队列
* @return Queue对象
*/
@Bean
public Queue collectionCompletedQueue() {
return new Queue(COLLECTION_COMPLETED_QUEUE, true);
}
/**
* 创建收款取消队列
* @return Queue对象
*/
@Bean
public Queue collectionCancelledQueue() {
return new Queue(COLLECTION_CANCELLED_QUEUE, true);
}
/**
* 创建收款拒绝队列
* @return Queue对象
*/
@Bean
public Queue collectionRejectedQueue() {
return new Queue(COLLECTION_REJECTED_QUEUE, true);
}
/**
* 创建退款流程交换机
* @return TopicExchange对象
*/
@Bean
public TopicExchange cashRefundExchange() {
return new TopicExchange(CASH_REFUND_EXCHANGE);
}
/**
* 创建退款创建队列
* @return Queue对象
*/
@Bean
public Queue refundCreatedQueue() {
return new Queue(REFUND_CREATED_QUEUE, true);
}
/**
* 创建退款审核队列
* @return Queue对象
*/
@Bean
public Queue refundReviewedQueue() {
return new Queue(REFUND_REVIEWED_QUEUE, true);
}
/**
* 创建退款执行队列
* @return Queue对象
*/
@Bean
public Queue refundExecutedQueue() {
return new Queue(REFUND_EXECUTED_QUEUE, true);
}
/**
* 创建退款完成队列
* @return Queue对象
*/
@Bean
public Queue refundCompletedQueue() {
return new Queue(REFUND_COMPLETED_QUEUE, true);
}
/**
* 创建退款拒绝队列
* @return Queue对象
*/
@Bean
public Queue refundRejectedQueue() {
return new Queue(REFUND_REJECTED_QUEUE, true);
}
/**
* 绑定收款创建队列到收款交换机
* @return Binding对象
*/
@Bean
public Binding collectionCreatedBinding() {
return BindingBuilder.bind(collectionCreatedQueue())
.to(cashCollectionExchange())
.with("collection.created");
}
/**
* 绑定收款审核队列到收款交换机
* @return Binding对象
*/
@Bean
public Binding collectionAuditedBinding() {
return BindingBuilder.bind(collectionAuditedQueue())
.to(cashCollectionExchange())
.with("collection.audited");
}
/**
* 绑定收款完成队列到收款交换机
* @return Binding对象
*/
@Bean
public Binding collectionCompletedBinding() {
return BindingBuilder.bind(collectionCompletedQueue())
.to(cashCollectionExchange())
.with("collection.completed");
}
/**
* 绑定收款取消队列到收款交换机
* @return Binding对象
*/
@Bean
public Binding collectionCancelledBinding() {
return BindingBuilder.bind(collectionCancelledQueue())
.to(cashCollectionExchange())
.with("collection.cancelled");
}
/**
* 绑定收款拒绝队列到收款交换机
* @return Binding对象
*/
@Bean
public Binding collectionRejectedBinding() {
return BindingBuilder.bind(collectionRejectedQueue())
.to(cashCollectionExchange())
.with("collection.rejected");
}
/**
* 绑定退款创建队列到退款交换机
* @return Binding对象
*/
@Bean
public Binding refundCreatedBinding() {
return BindingBuilder.bind(refundCreatedQueue())
.to(cashRefundExchange())
.with("refund.created");
}
/**
* 绑定退款审核队列到退款交换机
* @return Binding对象
*/
@Bean
public Binding refundReviewedBinding() {
return BindingBuilder.bind(refundReviewedQueue())
.to(cashRefundExchange())
.with("refund.reviewed");
}
/**
* 绑定退款执行队列到退款交换机
* @return Binding对象
*/
@Bean
public Binding refundExecutedBinding() {
return BindingBuilder.bind(refundExecutedQueue())
.to(cashRefundExchange())
.with("refund.executed");
}
/**
* 绑定退款完成队列到退款交换机
* @return Binding对象
*/
@Bean
public Binding refundCompletedBinding() {
return BindingBuilder.bind(refundCompletedQueue())
.to(cashRefundExchange())
.with("refund.completed");
}
/**
* 绑定退款拒绝队列到退款交换机
* @return Binding对象
*/
@Bean
public Binding refundRejectedBinding() {
return BindingBuilder.bind(refundRejectedQueue())
.to(cashRefundExchange())
.with("refund.rejected");
}
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();

19
src/main/java/com/example/demo/controller/cash/CashCollectionController.java

@ -68,7 +68,7 @@ public class CashCollectionController {
}
//撤回未审核的收款订单
@PostMapping("/cancel")
public Result cancel(@RequestBody CashRecord cashRecord) {
public Result cancel(@RequestBody CashCollection cashRecord) {
try {
return Result.success( cashCollectionService.cancel(cashRecord.getOrderCode()));
@ -87,7 +87,7 @@ public class CashCollectionController {
}
//多条件查询收款订单列表
@PostMapping("/selectCollection")
public Result selcetAll(@RequestBody Page page){
public Result selectAll(@RequestBody Page page){
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
@ -111,6 +111,21 @@ public class CashCollectionController {
return Result.error(e.getMessage());
}}
@PostMapping("/export")
public Result export(@RequestBody Page page) throws Exception {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
}
return Result.success(cashCollectionService.selectCollection(page.getPageNum(), page.getPageSize(),page.getCashCollection()));
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
//补全手续费等
@PostMapping("/complete")
public Result complete(@RequestBody CashRecord cashRecord) {

82
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.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.CashRecordRefund;
import com.example.demo.domain.vo.coin.Page;
@ -44,6 +45,8 @@ public class CashRefundController {
private RefundService refundService;
@Autowired
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")) {
// 特权市场9 9999跳过权限校验直接放行传入的 markets
// 如果业务需要也可以在这里做空值处理
if (page.getCashRecordDone() != null) {
if (page.getCashRecordDTO() != null) {
// 保持 requestedMarkets 不变原样接受
// 可选如果 requestedMarkets null可设为默认值或保持 null
}
} else {
// 普通用户必须校验权限
if (requestedMarkets == null || requestedMarkets.isEmpty()) {
page.getCashRecordDone().setMarkets(markets);
page.getCashRecordDTO().setMarkets(markets);
}
if (!markets.containsAll(requestedMarkets)) {
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")
@ -161,4 +208,33 @@ 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()));
}
@PostMapping("/ceshi")
public Result ceshi() {
return Result.success("测试消息");
}
}

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

@ -6,6 +6,7 @@ import com.example.demo.Util.RedisLockUtil;
import com.example.demo.domain.DTO.*;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.Export;
import com.example.demo.domain.DTO.CashDTO;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.service.coin.ExportExcelService;
import com.example.demo.service.coin.GoldDetailService;
@ -195,4 +196,41 @@ public class ExportController {
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);
}
}
@PostMapping("/exportCash")
public Result exportCash(@Valid @RequestBody CashDTO 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.addExportCash(dto);
}finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
}

39
src/main/java/com/example/demo/domain/DTO/CashDTO.java

@ -0,0 +1,39 @@
package com.example.demo.domain.DTO;
import com.example.demo.domain.vo.bean.BeanOnlineRechargeInfo;
import com.example.demo.domain.vo.cash.CashCollection;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName CashDTO
* @description:
* @author: huangqizhen
* @create: 202511-09 09:26
* @Version 1.0
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CashDTO {
private String token;
private String url = "";
private String fileName = "";
private Integer sort = 0;
private String field = "";
private Integer account;
private Integer type = 13; //类型
private Integer state = 0; //状态
private String text = ""; //关键词搜索
private Integer dataNum = 0;
private String deptid = "";
@NotNull(message = "page不能为空")
private Integer page = 1;
@NotNull(message = "pageSize不能为空")
private Integer pageSize = 20;
private CashCollection cashCollection;
}

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;
}

2
src/main/java/com/example/demo/domain/vo/cash/CashCollection.java

@ -61,7 +61,7 @@ public class CashCollection implements Serializable {
private String remark; // 备注
private String receivedRemark; //到账备注
private String rejectReason; // 驳回理由
private String auditId; //审核人id
private Integer auditId; //审核人id
private String auditName; //审核人id
private Integer cashRoleId; //角色id(0客服1地区财务/负责人2总部)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")

66
src/main/java/com/example/demo/domain/vo/cash/CashCollectionMessage.java

@ -0,0 +1,66 @@
package com.example.demo.domain.vo.cash;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* 收款消息实体类
* 用于在收款流程中传递状态变更信息
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CashCollectionMessage {
/**
* 订单ID
*/
private Integer id;
/**
* 订单编号
*/
private String orderCode;
/**
* 订单状态
*/
private Integer status;
/**
* 状态描述
*/
private String statusDescription;
/**
* 消息内容
*/
private String message;
/**
* 提交人ID
*/
private Integer submitterId;
/**
* 提交人姓名
*/
private String submitterName;
/**
* 审核人ID
*/
private Integer auditId;
/**
* 审核人姓名
*/
private String auditName;
/**
* 时间戳
*/
private LocalDateTime timestamp = LocalDateTime.now();
}

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

@ -1,9 +1,14 @@
package com.example.demo.domain.vo.cash;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
@ -16,24 +21,228 @@ import java.util.List;
**/
@Data
@AllArgsConstructor
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;
@NoArgsConstructor
public class CashRecordDTO{
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 handlingCharge;// 手续费
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;
@ExcelIgnore
private List<String> goodsNames;// 商品名称
@ExcelIgnore
private List<String> markets;// 地区
/**
* 序号
*/
private Integer id;
/**
* 精网号
*/
private Integer jwcode;
/**
* 姓名
*/
private String userName;
private String name;
/**
* 所属地区
*/
private Integer market;
/**
* 金币订单号
*/
private String orderCode;
/**
* 银行流水订单号
*/
private String bankCode;
/**
* 永久金币
*/
private BigDecimal permanentGold;
/**
* 免费金币
*/
private BigDecimal freeGold;
/**
* 审核人id
*/
@ExcelIgnore
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
*/
@ExcelIgnore
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
*/
@ExcelIgnore
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;
@ExcelIgnore
private List<Integer> statuses;
@ExcelIgnore
private String processInstanceId; // 流程实例ID
@ExcelIgnore
private String currentTaskId; // 当前任务ID
private String areaServise;
private String areaFinance;
private String areaCharge;
private String headFinance;
@ExcelIgnore
private String sortField;
@ExcelIgnore
private String sortOrder;
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date sTime; // 开始时间
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date eTime; // 结束时间
}

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

@ -17,7 +17,6 @@ import lombok.NoArgsConstructor;
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CashRecordRefund {
/**
* 序号
@ -32,6 +31,7 @@ public class CashRecordRefund {
/**
* 姓名
*/
private String userName;
private String name;
/**
@ -126,6 +126,7 @@ public class CashRecordRefund {
/**
* 退款日期到天
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date refundTime;
/**
@ -141,16 +142,19 @@ public class CashRecordRefund {
/**
* 创建时间
*/
@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;
/**
@ -188,10 +192,12 @@ public class CashRecordRefund {
private String headFinance;
private String sortField;
private String sortOrder;
@ExcelIgnore
@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; // 结束时间
private Integer partRefundGold;
private Integer partRefundFree;
}

76
src/main/java/com/example/demo/domain/vo/cash/CashRefundMessage.java

@ -0,0 +1,76 @@
package com.example.demo.domain.vo.cash;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* 退款消息实体类
* 用于在退款流程中传递状态变更信息
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CashRefundMessage {
/**
* 订单ID
*/
private Integer id;
/**
* 订单编号
*/
private String orderCode;
/**
* 订单状态
*/
private Integer status;
/**
* 状态描述
*/
private String statusDescription;
/**
* 消息内容
*/
private String message;
/**
* 提交人ID
*/
private Integer submitterId;
/**
* 提交人姓名
*/
private String submitterName;
/**
* 审核人ID
*/
private Integer auditId;
/**
* 审核人姓名
*/
private String auditName;
/**
* 执行人ID
*/
private Integer executorId;
/**
* 执行人姓名
*/
private String executorName;
/**
* 时间戳
*/
private LocalDateTime timestamp = LocalDateTime.now();
}

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

@ -0,0 +1,24 @@
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 Integer id;
private String areaServise;//
private String areaFinance;
private String areaCharge;
private String headFinace;
}

13
src/main/java/com/example/demo/domain/vo/coin/IdName.java

@ -0,0 +1,13 @@
package com.example.demo.domain.vo.coin;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IdName {
private Integer id;
private String name;
}

1
src/main/java/com/example/demo/mapper/cash/CashAuditMapper.java

@ -2,7 +2,6 @@ package com.example.demo.mapper.cash;
import com.example.demo.domain.entity.CashRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @program: gold-java

7
src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java

@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
/**
* @program: gold-java
@ -32,7 +33,7 @@ public interface CashCollectionMapper {
@Param("status") Integer status);
//编辑订单
// 编辑订单状态=5后重新提交
int updateByOrderCode(@Param("cashRecord") CashRecord cashRecord);
int updateByOrderCode(@Param("cashRecordCollection") CashRecord cashRecord);
//多条件查询收款订单列表
List<CashCollection> selectCollection1(@Param("pageNum") Integer pageNum,
@Param("pageSize") Integer pageSize,
@ -41,7 +42,7 @@ public interface CashCollectionMapper {
//根据订单号查询待审核的现金收款订单
CashRecord selectAuditByOrderCode(@Param("orderCode") String orderCode);
//补全手续费等信息
int complete(@Param("cashRecord") CashRecord cashRecord);
int complete(@Param("cashRecordCollection") CashRecord cashRecord);
//根据精网号获取姓名
String getNameByJwcode(@Param("jwcode") Integer jwcode);
//根据精网号获取市场名
@ -54,4 +55,6 @@ public interface CashCollectionMapper {
int markSynced(@Param("orderId") Integer orderId);
//根据id查询收款订单
CashCollection selectById(Integer id);
List<CashCollection> selectBatchIds(Set<Integer> relatedIds);
}

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

@ -1,13 +1,12 @@
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 cn.hutool.core.lang.Opt;
import com.example.demo.domain.vo.cash.*;
import com.example.demo.domain.vo.coin.RefundUser;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Set;
/**
* @program: GOLD
@ -32,4 +31,9 @@ public interface CashRefundMapper {
void addAudit(CashRecordDone cashRecordDone);
void updateAudit(CashRecordDone cashRecordDone);
List<CashRecordDTO> financeSelect(CashRecordDTO cashRecordDTO);
//获取各阶段审核人
LhlAudit getAudit(Integer id);
List<CashRecordDTO> exSelect(CashRecordDTO cashRecordDTO);
List<LhlAudit> getAuditBatch(Set<Integer> auditIds);
}

5
src/main/java/com/example/demo/mapper/coin/AuditMapper.java

@ -1,5 +1,7 @@
package com.example.demo.mapper.coin;
import cn.hutool.core.lang.Opt;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.coin.RechargeAudit;
@ -9,6 +11,7 @@ import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* @program: gold-java
@ -46,4 +49,6 @@ public interface AuditMapper {
String getName(Integer auditId);
//更新首充日期
void updateFirstRecharge(Integer jwcode);
List<Admin> getNamesByIds(Set<Integer> submitterIds);
}

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

@ -1,8 +1,11 @@
package com.example.demo.mapper.coin;
import cn.hutool.core.lang.Opt;
import com.example.demo.domain.entity.Market;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Set;
public interface MarketMapper {
List<Market> getMarket();
@ -14,4 +17,6 @@ public interface MarketMapper {
Market getMarketIdDao(String country);
Market getMarketIdBytype(String market);
String getMarketById(String market);
List<Market> getMarketByIds(@Param("marketIds") Set<Integer> marketIds);
}

2
src/main/java/com/example/demo/security/SecurityConfig.java

@ -60,7 +60,7 @@ public class SecurityConfig {
request
.requestMatchers( HttpMethod.POST,
// 用户不登录就可以访问的路径
"/admin/login","/upload/**","/detailY/ERP","/home/java/haiwaiyanfa/gold1/**","/home/java/haiwaiyanfa/**","/statistics/**","/Mysql").permitAll()
"/admin/login","/upload/**","/detailY/ERP","/home/java/haiwaiyanfa/gold1/**","/home/java/haiwaiyanfa/**","/statistics/**","/Mysql/**").permitAll()
.requestMatchers(
"/error","alipay/**","/upload/**","/home/java/haiwaiyanfa/gold1/**","/home/java/haiwaiyanfa/**"
).permitAll()

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

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

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

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

36
src/main/java/com/example/demo/service/listen/CashListener.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 CashListener
* @description:
* @author: huangqizhen
* @create: 202511-09 09:42
* @Version 1.0
**/
@Component
public class CashListener extends BaseMessageListener<String> {
@Autowired
private ExportExcelService exportExcelService;
protected CashListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "cash:queue:export_queue");
}
@Override
protected void handleMessage(String message) {
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.CashExcel(message);
} catch (Exception e) {
handleException(e, message);
}
}
}

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);
}
}
}

41
src/main/java/com/example/demo/serviceImpl/cash/CashAuditServiceImpl.java

@ -1,20 +1,24 @@
package com.example.demo.serviceImpl.cash;
import com.example.demo.Util.GoldTistV2;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.entity.CashRecord;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.cash.CashCollectionMessage;
import com.example.demo.mapper.cash.CashAuditMapper;
import com.example.demo.mapper.cash.CashCollectionMapper;
import com.example.demo.mapper.coin.AuditMapper;
import com.example.demo.mapper.coin.RechargeMapper;
import com.example.demo.service.cash.CashAuditService;
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 java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
@ -23,7 +27,7 @@ import static net.sf.jsqlparser.parser.feature.Feature.update;
/**
* @program: gold-java
* @ClassName CashAuditServiceImpl
* @description:
* @description: 处理收款订单的审核业务逻辑
* @author: Ethan
* @create: 202510-08 10:09
* @Version 1.0
@ -38,6 +42,9 @@ public class CashAuditServiceImpl implements CashAuditService {
private CashCollectionMapper cashCollectionMapper;
@Autowired
private CashAuditMapper cashAuditMapper;
@Autowired
private RabbitTemplate rabbitTemplate;
@Transactional
@Override
public boolean auditCollection(String token, Integer auditId, String orderCode, Integer action, String rejectReason) {
@ -115,13 +122,41 @@ public class CashAuditServiceImpl implements CashAuditService {
user.setCurrentPermanentGold(BigDecimal.valueOf(order.getPermanentGold()));
user.setRechargeNum(1); //充值次数加一
auditMapper.updateUserGold(user);
}}
else if (action==2){ //驳回
}
} else if (action == 2) { //驳回
updateOrder.setStatus(2);
updateOrder.setRejectReason(rejectReason);
}
//更新订单
cashAuditMapper.updateOrder(updateOrder);
// 创建消息队列用于发送审核结果通知
CashCollectionMessage message = new CashCollectionMessage();
message.setId(order.getId());
message.setOrderCode(orderCode);
message.setStatus(updateOrder.getStatus());
message.setStatusDescription(action == 1 ? "线下财务审核通过待填手续费" : "线下财务审核驳回");
message.setMessage(action == 1 ? "收款订单审核通过" : "收款订单审核驳回");
message.setSubmitterId(order.getSubmitterId());
message.setAuditId(auditId);
message.setAuditName(auditName);
message.setTimestamp(LocalDateTime.now());
// 根据审核结果发送不同的消息
if (action == 1) {
// 发送审核通过消息
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_COLLECTION_EXCHANGE,
"collection.audited",
message
);
} else {
// 发送审核驳回消息
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_COLLECTION_EXCHANGE,
"collection.rejected",
message
);
}
return true;
}
}

102
src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java

@ -1,10 +1,12 @@
package com.example.demo.serviceImpl.cash;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.entity.CashRecord;
import com.example.demo.domain.entity.GOrder;
import com.example.demo.domain.entity.RechargeActivity;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.CashCollectionMessage;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.cash.CashCollectionMapper;
import com.example.demo.mapper.coin.MarketMapper;
@ -12,6 +14,7 @@ import com.example.demo.service.cash.CashCollectionService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
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;
@ -26,7 +29,7 @@ import java.util.UUID;
/**
* @program: gold-java
* @ClassName cashCollectionServiceImpl
* @description:
* @description: 处理收款相关业务逻辑
* @author: Ethan
* @create: 202509-26 11:23
* @Version 1.0
@ -39,6 +42,8 @@ public class CashCollectionServiceImpl implements CashCollectionService {
private CashCollectionMapper cashCollectionMapper;
@Autowired
private MarketMapper marketMapper;
@Autowired
private RabbitTemplate rabbitTemplate;
//新增收款订单
@Override
@ -60,11 +65,13 @@ public class CashCollectionServiceImpl implements CashCollectionService {
}
if (cashCollection.getGoodsName().equals("金币充值")) {
if (cashCollection.getPermanentGold() == 0 && cashCollection.getFreeGold() == 0) {
throw new IllegalArgumentException("金币数量不能为空");}
throw new IllegalArgumentException("金币数量不能为空");
}
}
if (!cashCollection.getGoodsName().equals("金币充值")) {
if (cashCollection.getGoodNum() == 0) {
throw new IllegalArgumentException("产品数量不能为空");}
throw new IllegalArgumentException("产品数量不能为空");
}
if (cashCollection.getNumUnit() == null) {
throw new IllegalArgumentException("数量单位不能为空");
}
@ -113,9 +120,25 @@ public class CashCollectionServiceImpl implements CashCollectionService {
//cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(cashRecord.getJwcode()));
//插入新收款订单
cashCollectionMapper.add(cashRecord);
// 发送收款创建消息
CashCollectionMessage message = new CashCollectionMessage();
message.setId(cashRecord.getId());
message.setOrderCode(cashRecord.getOrderCode());
message.setStatus(cashRecord.getStatus());
message.setStatusDescription("线下财务待审核");
message.setMessage("收款订单已创建");
message.setSubmitterId(cashRecord.getSubmitterId());
// 可以通过 submitterId 查询提交人姓名
message.setTimestamp(LocalDateTime.now());
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_COLLECTION_EXCHANGE,
"collection.created",
message
);
return "添加成功";
}
//撤回未审核的订单
@Override
public String cancel(String orderCode) {
@ -128,6 +151,24 @@ public class CashCollectionServiceImpl implements CashCollectionService {
}
//修改订单状态
int rows = cashCollectionMapper.updateStatus(orderCode, 5);
if (rows > 0) {
// 发送收款撤回消息
CashCollectionMessage message = new CashCollectionMessage();
message.setId(cashRecord.getId());
message.setOrderCode(cashRecord.getOrderCode());
message.setStatus(5);
message.setStatusDescription("手动撤回待编辑提交");
message.setMessage("收款订单已撤回");
message.setSubmitterId(cashRecord.getSubmitterId());
message.setAuditId(cashRecord.getAuditId());
message.setTimestamp(LocalDateTime.now());
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_COLLECTION_EXCHANGE,
"collection.cancelled",
message
);
}
return rows > 0 ? "撤回成功" : "撤回失败";
}
@ -151,12 +192,14 @@ public class CashCollectionServiceImpl implements CashCollectionService {
}
if (cashRecord.getGoodsName().equals("金币充值")) {
if (cashRecord.getPermanentGold() == 0 && cashRecord.getFreeGold() == 0) {
throw new IllegalArgumentException("金币数量不能为空");}
throw new IllegalArgumentException("金币数量不能为空");
}
}
if (!cashRecord.getGoodsName().equals("金币充值")) {
if (cashRecord.getGoodNum() == 0) {
throw new IllegalArgumentException("产品数量不能为空");}
throw new IllegalArgumentException("产品数量不能为空");
}
if (cashRecord.getNumUnit() == null) {
throw new IllegalArgumentException("数量单位不能为空");
}
@ -184,21 +227,40 @@ public class CashCollectionServiceImpl implements CashCollectionService {
//地区根据jwcode插入弃用插入前调用接口获取地区和姓名之后前端传入
//cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(cashRecord.getJwcode()));
int rows = cashCollectionMapper.updateByOrderCode(cashRecord);
if (rows > 0) {
// 发送重新提交消息
CashCollectionMessage message = new CashCollectionMessage();
message.setId(cashRecord.getId());
message.setOrderCode(cashRecord.getOrderCode());
message.setStatus(0); // 重新提交后状态变为待审核
message.setStatusDescription("线下财务待审核");
message.setMessage("收款订单已重新提交");
message.setSubmitterId(cashRecord.getSubmitterId());
message.setTimestamp(LocalDateTime.now());
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_COLLECTION_EXCHANGE,
"collection.created",
message
);
}
return rows > 0 ? "重新提交成功" : "重新提交失败";
}
//多条件查询收款订单列表
@Override
public PageInfo<CashCollection> selectCollection(Integer pageNum, Integer pageSize, CashCollection cashCollection) {
//将操作人的地区列表改为id
/* //将操作人的地区列表改为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) {
//角色是总部时若不特地传状态传1346sql处理为1346筛选
if (cashCollection.getStatus() == null) {
cashCollection.setStatus(1346);}
cashCollection.setStatus(1346);
}
cashCollection.setSubmitterId(null);
cashCollection.setReceivedMarket(null);
cashCollection.setSubmitterMarket(null);
@ -207,13 +269,16 @@ public class CashCollectionServiceImpl implements CashCollectionService {
//角色是地方财务提交人置空不设筛选条件,仅按收款地区提交人地区筛选
if (cashCollection.getStatus() == null) {
cashCollection.setStatus(123460);}
cashCollection.setStatus(123460);
}
//状态为待审核和已驳回时按照提交人地区筛选
if (cashCollection.getStatus() == 0 || cashCollection.getStatus() == 2) {
cashCollection.setReceivedMarket(null);}
cashCollection.setReceivedMarket(null);
}
//状态为已通过和Link通过时按收款地区筛选
if (cashCollection.getStatus() == 13) {
cashCollection.setSubmitterMarket(null);}
cashCollection.setSubmitterMarket(null);
}
cashCollection.setSubmitterId(null);
//状态为46已通过和已退款满足收款地区或提交人地区即可
@ -221,15 +286,17 @@ public class CashCollectionServiceImpl implements CashCollectionService {
if (cashCollection.getCashRoleId() == 0) {
//角色是地方财务提交人置空不设筛选条件---仅当角色是0 地方客服时按提交人筛选
if (cashCollection.getStatus() == null) {
cashCollection.setStatus(1234560);}
cashCollection.setStatus(1234560);
}
cashCollection.setSubmitterId(cashCollection.getSubmitterId());
cashCollection.setReceivedMarket(null);
}
cashCollection.setMarkets(markets);
// cashCollection.setMarkets(markets);
PageHelper.startPage(pageNum, pageSize);
List<CashCollection> cashCollections = cashCollectionMapper.selectCollection1(pageNum, pageSize, cashCollection);
return new PageInfo<>(cashCollections);
}
//补全手续费等内容
@Override
public String complete(CashRecord cashRecord) {
@ -239,6 +306,7 @@ public class CashCollectionServiceImpl implements CashCollectionService {
return rows > 0 ? "编辑成功" : "编辑失败";
}
//根据精网号查询姓名和地区
@Override
public User getNameAndMarket(Integer jwcode) {
@ -249,12 +317,14 @@ public class CashCollectionServiceImpl implements CashCollectionService {
return user;
}
//获取收款活动列表
@Override
public List<RechargeActivity> getActivityList() {
LocalDateTime now = LocalDateTime.now();
return cashCollectionMapper.getActivityList(now);
}
//同步g_order订单到cash_record表
@Override
@Transactional(rollbackFor = Exception.class)
@ -312,11 +382,13 @@ public class CashCollectionServiceImpl implements CashCollectionService {
//存入现金库
cashCollectionMapper.add(cashRecord);
cashCollectionMapper.markSynced(gOrder.getId());
}log.info("同步完成一批,数量 {}", gOrders.size());
}
log.info("同步完成一批,数量 {}", gOrders.size());
if (gOrders.size() < 100) {
break; // 最后一批
}
}return "同步完毕";
}
return "同步完毕";
}
@Override

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

@ -1,11 +1,13 @@
package com.example.demo.serviceImpl.cash;
import com.example.demo.Util.GoldTistV2;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.entity.User;
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.CashRefundMessage;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.cash.CashRefundMapper;
import com.example.demo.mapper.coin.AuditMapper;
@ -15,11 +17,13 @@ import com.example.demo.service.cash.RefundService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@ -29,7 +33,7 @@ import static org.apache.commons.lang3.StringUtils.substring;
/**
* @program: GOLD
* @ClassName CashRefundServiceImpl
* @description:
* @description: 处理退款相关业务逻辑
* @author: huangqizhen
* @create: 202509-28 15:02
* @Version 1.0
@ -46,6 +50,9 @@ public class CashRefundServiceImpl implements RefundService {
private AuditMapper auditMapper;
@Autowired
private MarketMapper marketMapper;
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public PageInfo<CashRecordDTO> select(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize);
@ -54,6 +61,7 @@ public class CashRefundServiceImpl implements RefundService {
return new PageInfo<>(list);
}
// 添加退款订单
@Override
public int add(CashRecordRefund cashRecordRefund) throws Exception {
if (cashRecordRefund.getJwcode() == null) {
@ -81,10 +89,29 @@ public class CashRefundServiceImpl implements RefundService {
cashRecordDone1.setId(cashRecordRefund.getId());
cashRecordDone1.setStatus(6);
if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null)
return cashRefundMapper.updateStatus(cashRecordDone1);
cashRefundMapper.updateStatus(cashRecordDone1);
else return Result.error("提交失败").getCode();
// 发送退款创建消息
CashRefundMessage message = new CashRefundMessage();
message.setId(cashRecordRefund.getId());
message.setOrderCode(cashRecordRefund.getOrderCode());
message.setStatus(10);
message.setStatusDescription("地区财务待审核");
message.setMessage("退款订单已创建");
message.setSubmitterId(cashRecordRefund.getSubmitterId());
message.setTimestamp(LocalDateTime.now());
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_REFUND_EXCHANGE,
"refund.created",
message
);
return Result.success("提交成功").getCode();
}
// 更新退款订单信息
@Override
public int update(CashRecordDone cashRecordDone) throws Exception {
if (cashRecordDone.getJwcode() == null) {
@ -106,11 +133,13 @@ public class CashRefundServiceImpl implements RefundService {
return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
}
// 撤回退款订单
@Override
public int withdraw(CashRecordDone cashRecordDone) {
return cashRefundMapper.withdraw(cashRecordDone.getId());
}
// 审核退款订单
@Override
public int review(CashRecordDone cashRecordDone) throws Exception {
if (cashRecordDone.getStatus() == 12 || cashRecordDone.getStatus() == 22) {
@ -122,12 +151,43 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
cashRecordDone1.setStatus(4);
if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
cashRefundMapper.updateStatus(cashRecordDone1);
}}
}
}
cashRefundMapper.updateAudit(cashRecordDone);
int result = cashRefundMapper.review(cashRecordDone);
if (result > 0) {
// 发送审核消息
CashRefundMessage message = new CashRefundMessage();
message.setId(cashRecordDone.getId());
message.setOrderCode(cashRecordDone.getOrderCode());
message.setStatus(cashRecordDone.getStatus());
message.setStatusDescription(getStatusDescription(cashRecordDone.getStatus()));
message.setMessage("退款订单已审核");
message.setSubmitterId(cashRecordDone.getSubmitterId());
message.setAuditId(cashRecordDone.getAuditId());
// 可以通过 auditId 查询审核人姓名
message.setTimestamp(LocalDateTime.now());
if (cashRecordDone.getStatus() == 12 || cashRecordDone.getStatus() == 22) {
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_REFUND_EXCHANGE,
"refund.rejected",
message
);
} else {
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_REFUND_EXCHANGE,
"refund.reviewed",
message
);
}
}
return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
}
// 执行退款操作
@Override
public int executor(CashRecordDone cashRecordDone) throws Exception {
if (cashRecordDone.getRefundVoucher() == null) {
@ -149,14 +209,35 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
throw new RuntimeException("未输入退款金额");
}
int result = cashRefundMapper.executor(cashRecordDone);
if (result > 0) {
// 发送执行消息
CashRefundMessage message = new CashRefundMessage();
message.setId(cashRecordDone.getId());
message.setOrderCode(cashRecordDone.getOrderCode());
message.setStatus(cashRecordDone.getStatus());
message.setStatusDescription(getStatusDescription(cashRecordDone.getStatus()));
message.setMessage("退款订单已执行");
message.setSubmitterId(cashRecordDone.getSubmitterId());
message.setExecutorId(cashRecordDone.getExecutor());
// 可以通过 executorId 查询执行人姓名
message.setTimestamp(LocalDateTime.now());
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_REFUND_EXCHANGE,
"refund.executed",
message
);
}
return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
}
// 更新退款订单状态
@Override
public int updateStatus(CashRecordDone cashRecordDone) {
return cashRefundMapper.updateStatus(cashRecordDone);
}
// 最终审核退款订单
@Override
public int finalreview(CashRecordDone cashRecordDone) {
if (cashRecordDone.getPermanentGold() == null) {
@ -171,7 +252,8 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
cashRecordDone1.setStatus(4);
if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
cashRefundMapper.updateStatus(cashRecordDone1);
}}
}
}
if (cashRecordDone.getGoodsName() != null && cashRecordDone.getStatus() == 40 &&
(cashRecordDone.getGoodsName().equals("金币充值") ||
cashRecordDone.getGoodsName().contains("金币充值"))) {
@ -212,13 +294,59 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
auditMapper.updateUserGold(user);
GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 58, //退款免费+永久金币-充值
(double) (userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getPermanentGold()) / 100,
userGoldRecord.getRemark(),(double) userGoldRecord.getPermanentGold() / 100, auditName, "退款金币充值");}
userGoldRecord.getRemark(), (double) userGoldRecord.getPermanentGold() / 100, auditName, "退款金币充值");
}
cashRefundMapper.updateAudit(cashRecordDone);
int result = cashRefundMapper.review(cashRecordDone);
if (result > 0) {
// 发送最终审核消息
CashRefundMessage message = new CashRefundMessage();
message.setId(cashRecordDone.getId());
message.setOrderCode(cashRecordDone.getOrderCode());
message.setStatus(cashRecordDone.getStatus());
message.setStatusDescription(getStatusDescription(cashRecordDone.getStatus()));
message.setMessage("退款订单已完成");
message.setSubmitterId(cashRecordDone.getSubmitterId());
message.setAuditId(cashRecordDone.getAuditId());
message.setTimestamp(LocalDateTime.now());
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_REFUND_EXCHANGE,
"refund.completed",
message
);
}
return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
}
// 辅助方法根据状态码获取状态描述
private String getStatusDescription(Integer status) {
switch (status) {
case 10:
return "地区财务待审核";
case 11:
return "地区财务手动撤回待编辑提交";
case 12:
return "地区财务驳回";
case 20:
return "地区负责人待审核";
case 22:
return "地区负责人驳回";
case 30:
return "总部财务待审核";
case 32:
return "总部财务驳回";
case 40:
return "执行人待处理";
case 41:
return "执行人已处理,退款结束";
default:
return "未知状态";
}
}
// 财务查询退款订单列表
@Override
public PageInfo<CashRecordDTO> financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize);
@ -226,4 +354,17 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO);
return new PageInfo<>(list);
}
@Override
public PageInfo<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize);
List<CashRecordDTO> list = cashRefundMapper.exSelect(cashRecordDTO);
return new PageInfo<>(list);
}
@Override
public void addOnline(CashRecordRefund cashRecordRefund) {
}
}

6
src/main/java/com/example/demo/serviceImpl/coin/AdminServiceImpl.java

@ -94,7 +94,6 @@ public class AdminServiceImpl implements AdminService {
//更新密码
@Override
public Result updatePassword(Password password) {
String oldPassword = password.getOldPassword();
String newPassword = password.getNewPassword();
String againPassword = password.getAgainPassword();
@ -129,15 +128,15 @@ public class AdminServiceImpl implements AdminService {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// 使用Spring管理的密码编码器不要手动new
String encodedPassword = passwordEncoder.encode(newPassword);
// 更新数据库中的密码
admin.setPassword(encodedPassword);
admin.setUpdateTime(new Date()); // 更新修改时间
adminMapper.updatePassword(admin);
return Result.success("密码修改成功");
} catch (BadCredentialsException e) {
// 旧密码验证失败
return Result.error("原密码错误,请重新输入");
@ -182,6 +181,7 @@ public class AdminServiceImpl implements AdminService {
}
//获取当前登录的管理员账号
public String getCurrentAdminAccount() {
// 1. Security 上下文获取认证信息
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

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

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

4
src/main/resources/cashMapper/CashAuditMapper.xml

@ -4,7 +4,7 @@
<!--审核收款订单-->
<update id="updateOrder">
update cash_record
update cash_record_collection
set status=#{status},
reject_reason=#{rejectReason},
audit_id=#{auditId},
@ -13,7 +13,7 @@
</update>
<select id="getAuditName" resultType="java.lang.String">
select a.admin_name from admin as a left join
cash_record cr on a.id=cr.audit_id
cash_record_collection cr on a.id=cr.audit_id
where a.id=#{auditId} limit 1
</select>
</mapper>

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

@ -6,13 +6,13 @@
<insert id="add" parameterType="com.example.demo.domain.entity.CashRecord"
useGeneratedKeys="true" keyProperty="id">
insert into
cash_record(order_type,jwcode,name,market,activity,
cash_record_collection(order_type,jwcode,name,market,activity,
order_code,goods_name,good_num,num_unit,permanent_gold,free_gold,
payment_currency,payment_amount,received_market,
pay_type,pay_time,status,submitter_id,submitter_market,
voucher,remark)
values(#{orderType},#{jwcode},#{name},#{market},#{activity},
#{orderCode},#{goodsName},#{goodNum},#{NumUnit},#{permanentGold},#{freeGold},#{paymentCurrency},
#{orderCode},#{goodsName},#{goodNum},#{numUnit},#{permanentGold},#{freeGold},#{paymentCurrency},
#{paymentAmount},#{receivedMarket},#{payType},#{payTime},
#{status},#{submitterId},#{submitterMarket},#{voucher},#{remark})
</insert>
@ -29,57 +29,57 @@
<!--更新订单状态-->
<update id="updateStatus">
update cash_record
update cash_record_collection
set status=#{status}
where order_code=#{orderCode}
</update>
<!--更新订单-->
<update id="updateByOrderCode">
UPDATE cash_record
UPDATE cash_record_collection
<set>
jwcode = #{cashRecord.jwcode},
name = #{cashRecord.name},
market = #{cashRecord.market},
activity = #{cashRecord.activity},
goods_name = #{cashRecord.goodsName},
good_num = #{cashRecord.goodNum},
permanent_gold = #{cashRecord.permanentGold},
free_gold = #{cashRecord.freeGold},
Num_unit = #{cashRecord.NumUnit},
payment_currency = #{cashRecord.paymentCurrency},
payment_amount = #{cashRecord.paymentAmount},
received_market = #{cashRecord.receivedMarket},
pay_type = #{cashRecord.payType},
pay_time = #{cashRecord.payTime},
voucher = #{cashRecord.voucher},
remark = #{cashRecord.remark},
jwcode = #{cashRecordCollection.jwcode},
name = #{cashRecordCollection.name},
market = #{cashRecordCollection.market},
activity = #{cashRecordCollection.activity},
goods_name = #{cashRecordCollection.goodsName},
good_num = #{cashRecordCollection.goodNum},
num_unit = #{cashRecordCollection.numUnit},
permanent_gold = #{cashRecordCollection.permanentGold},
free_gold = #{cashRecordCollection.freeGold},
payment_currency = #{cashRecordCollection.paymentCurrency},
payment_amount = #{cashRecordCollection.paymentAmount},
received_market = #{cashRecordCollection.receivedMarket},
pay_type = #{cashRecordCollection.payType},
pay_time = #{cashRecordCollection.payTime},
voucher = #{cashRecordCollection.voucher},
remark = #{cashRecordCollection.remark},
status = 0,
</set>
WHERE order_code = #{cashRecord.orderCode}
WHERE order_code = #{cashRecordCollection.orderCode}
AND status = 5
</update>
<!--补全手续费等字段-->
<update id="complete">
UPDATE cash_record
UPDATE cash_record_collection
<set>
<if test="cashRecord.handlingCharge != null ">
handling_charge = #{cashRecord.handlingCharge},
<if test="cashRecordCollection.handlingCharge != null ">
handling_charge = #{cashRecordCollection.handlingCharge},
</if>
<if test="cashRecord.receivedCurrency != null and cashRecord.receivedCurrency != ''">
received_currency = #{cashRecord.receivedCurrency},
<if test="cashRecordCollection.receivedCurrency != null and cashRecordCollection.receivedCurrency != ''">
received_currency = #{cashRecordCollection.receivedCurrency},
</if>
<if test="cashRecord.receivedAmount != null and cashRecord.receivedAmount != ''">
received_amount = #{cashRecord.receivedAmount},
<if test="cashRecordCollection.receivedAmount != null and cashRecordCollection.receivedAmount != ''">
received_amount = #{cashRecordCollection.receivedAmount},
</if>
<if test="cashRecord.receivedTime != null">
received_time = #{cashRecord.receivedTime},
<if test="cashRecordCollection.receivedTime != null">
received_time = #{cashRecordCollection.receivedTime},
</if>
<if test="cashRecord.paymentCurrency != null and cashRecord.paymentCurrency != ''">
payment_currency = #{cashRecord.paymentCurrency},
<if test="cashRecordCollection.paymentCurrency != null and cashRecordCollection.paymentCurrency != ''">
payment_currency = #{cashRecordCollection.paymentCurrency},
</if>
<!-- 关键:null 就不拼这一列 -->
<if test="cashRecord.paymentAmount != null">
payment_amount = #{cashRecord.paymentAmount},
<if test="cashRecordCollection.paymentAmount != null">
payment_amount = #{cashRecordCollection.paymentAmount},
</if>
<!-- 只有 这些字段全部非空才更新状态 -->
status = CASE
@ -94,7 +94,7 @@
ELSE status
END
</set>
WHERE order_code = #{cashRecord.orderCode}
WHERE order_code = #{cashRecordCollection.orderCode}
AND status IN (1, 3)
</update>
<!--设置gOrder订单为已同步-->
@ -110,7 +110,7 @@
<!--根据订单号获取订单id与状态-->
<select id="selectByOrderCode" resultType="com.example.demo.domain.entity.CashRecord">
select id ,status
from cash_record
from cash_record_collection
where order_code=#{orderCode}
</select>
<!--多条件查询收款订单列表-->
@ -119,6 +119,7 @@
m1.name as marketName,
ra.activity_name as activity,cr.order_code,cr.bank_code,
cr.goods_name,cr.good_num,
cr.num_unit,
cr.permanent_gold/100 as permanentGold,cr.free_gold/100 as freeGold,cr.payment_amount/100 as paymentAmount,
r1.rate_name as paymentCurrency,
r2.rate_name as receivedCurrency,
@ -129,7 +130,7 @@
cr.audit_id,cr.create_time,cr.update_time,cr.audit_time,
a1.admin_name as submitterName,
a2.admin_name as auditName
from cash_record cr
from cash_record_collection cr
left join admin a1 on cr.submitter_id = a1.id
left join admin a2 on cr.audit_id = a2.id
left join market m1 on m1.id = cr.market
@ -211,12 +212,12 @@
</choose>
</select>
<select id="selectAuditByOrderCode" resultType="com.example.demo.domain.entity.CashRecord">
select cash_record.id, status,jwcode,name,market,ra.activity_name as activity,
order_code,bank_code,goods_name,good_num,permanent_gold,free_gold,
payment_currency,payment_amount,pay_type,pay_time,cash_record.status,submitter_id,
select crc.id,jwcode,name,market,ra.activity_name as activity,
order_code,bank_code,goods_name,good_num,num_unit,permanent_gold,free_gold,
payment_currency,payment_amount,pay_type,pay_time,crc.status,submitter_id,
voucher,remark
from cash_record
left join recharge_activity ra on ra.id = cash_record.activity
from cash_record_collection crc
left join recharge_activity ra on ra.id = crc.activity
where order_code=#{orderCode}
</select>
<!--根据精网号获取姓名-->
@ -241,12 +242,36 @@
limit #{size}
</select>
<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_collection 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 id="selectBatchIds" resultType="com.example.demo.domain.vo.cash.CashCollection">
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_collection 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>
<if test="relatedIds != null and relatedIds.size() > 0">
cr.id IN
<foreach collection="relatedIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</where>
</select>
</mapper>

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

@ -6,7 +6,6 @@
jwcode,
name,
market,
activity,
order_code,
bank_code,
permanent_gold,
@ -27,16 +26,15 @@
refund_amount,
related_id,
audit_id,
status,
status
) VALUES (
#{jwcode},
#{name},
#{market},
#{activity},
#{orderCode},
#{bankCode},
#{permanentGold},
#{freeGold},
#{partRefundGold},
#{partRefundFree},
#{submitterId},
#{submitterMarket},
#{voucher},
@ -53,7 +51,7 @@
#{refundAmount},
#{id},
#{auditId},
#{status},
#{status}
);
</insert>
<insert id="addAudit" parameterType="com.example.demo.domain.vo.cash.CashRecordDone" useGeneratedKeys="true" keyProperty="id">
@ -75,7 +73,7 @@
</insert>
<update id="update">
update cash_record
update cash_record_refund
set
status = 10,
refund_model = #{refundModel},
@ -83,15 +81,15 @@
where id = #{id}
</update>
<update id="withdraw">
update cash_record set status = 11
where order_type =2 and id = #{id}
update cash_record_refund set status = 11
where id = #{id}
</update>
<update id="review">
update cash_record set status = #{status},executor = #{executor},reject_reason = #{rejectReason}
where order_type =2 and id = #{id}
update cash_record_refund set status = #{status},executor = #{executor},reject_reason = #{rejectReason}
where id = #{id}
</update>
<update id="executor">
update cash_record set refund_currency = #{refundCurrency},
update cash_record_refund set refund_currency = #{refundCurrency},
refund_amount = #{refundAmount},
refund_channels = #{refundChannels},
refund_time = #{refundTime},
@ -99,10 +97,10 @@
refund_voucher = #{refundVoucher},
status = #{status},
executor = #{executor}
where order_type =2 and id = #{id}
where id = #{id}
</update>
<update id="updateStatus">
update cash_record
update cash_record_collection
set status = #{status}
<where>
<if test="id != null">
@ -133,7 +131,7 @@
</update>
<select id="select" resultType="com.example.demo.domain.vo.cash.CashRecordDone">
<select id="select" resultType="com.example.demo.domain.vo.cash.CashRecordDTO">
select
crr.id,
crr.jwcode,
@ -158,14 +156,15 @@
la.head_finance,
crc.activity,
crc.goods_name,
crc.goods_num,
crc.good_num as goodsNum,
crc.num_unit,
crc.pay_type,
crc.pay_time,
crc.voucher,
crc.remark,
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 cash_record_collection crc on crc.id = crr.related_id
<where>
@ -215,7 +214,7 @@
ORDER BY ${sortField} ${sortOrder}
</when>
<otherwise>
ORDER BY create_time DESC
ORDER BY crr.create_time DESC
</otherwise>
</choose>
</select>
@ -225,7 +224,7 @@
crr.name,
crr.market,
crc.goods_name,
crc.goods_num,
crc.good_num as goodsNum,
crc.num_unit,
crr.refund_model,
crr.submitter_id,
@ -235,9 +234,14 @@
crr.permanent_gold,
crr.free_gold,
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
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}
@ -285,8 +289,105 @@
ORDER BY ${sortField} ${sortOrder}
</when>
<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>
</choose>
</select>
<select id="getAuditBatch" resultType="com.example.demo.domain.vo.cash.LhlAudit">
select * from lhl_audit
<where>
<if test="auditIds != null and auditIds.size() > 0">
id in
<foreach collection="auditIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</where>
</select>
</mapper>

74
src/main/resources/mapper/AuditMapper.xml

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.coin.AuditMapper">
<!-- 修改订单审核人与审核状态-->
<update id="updateOrder">
update user_gold_record
set audit_id = #{auditId},
@ -12,43 +11,29 @@
order by create_time DESC
limit 1
</update>
<!--更新用户余额-->
<update id="updateUserGold">
update user
set sum_permanent_gold = sum_permanent_gold + COALESCE(#{sumPermanentGold},0),
sum_free_june = sum_free_june + COALESCE(#{sumFreeJune},0),
sum_free_december = sum_free_december + COALESCE(#{sumFreeDecember},0),
sum_task_gold = sum_task_gold + COALESCE(#{sumTaskGold},0),
current_permanent_gold = current_permanent_gold + COALESCE(#{currentPermanentGold},0),
current_free_june = current_free_june + COALESCE(#{currentFreeJune},0),
current_free_december = current_free_december + COALESCE(#{currentFreeDecember},0),
current_task_gold = current_task_gold + COALESCE(#{currentTaskGold},0),
recharge_num = recharge_num+COALESCE(#{rechargeNum},0)
<set>
<if test="currentPermanentGold != null">
current_permanent_gold = current_permanent_gold + #{currentPermanentGold},
</if>
<if test="currentFreeJune != null">
current_free_june = current_free_june + #{currentFreeJune},
</if>
<if test="currentFreeDecember != null">
current_free_december = current_free_december + #{currentFreeDecember},
</if>
<if test="currentTaskGold != null">
current_task_gold = current_task_gold + #{currentTaskGold},
</if>
</set>
where jwcode = #{jwcode}
</update>
<!--修改消费订单为已退款-->
<update id="updateOrderRefund">
update user_gold_record
set is_refund = #{isRefund}
where order_code = #{orderCode}
</update>
<update id="updateFirstRecharge">
update user
set first_recharge = NOW()
where jwcode = #{jwcode}
where order_code = #{orderCode} and type in (0,1)
</update>
<!--根据订单号查未审核订单-->
<select id="selectOrderByOrderCode" resultType="com.example.demo.domain.entity.UserGoldRecord">
select * from user_gold_record
where order_code = #{orderCode} and audit_status = 0
and flag=1
ORDER BY create_time DESC
limit 1
</select>
<!--多条件查询充值审核订单-->
<select id="selectRechargeBy" resultType="com.example.demo.domain.vo.coin.RechargeAudit">
SELECT ugr.*,
(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0)) AS freeGold,
@ -113,7 +98,6 @@
</otherwise>
</choose>
</select>
<!--多条件查询退款审核订单-->
<select id="selectRefundBy" resultType="com.example.demo.domain.vo.coin.RefundAudit">
SELECT ugr.*,
(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0)) AS freeGold,
@ -180,17 +164,27 @@
</otherwise>
</choose>
</select>
<!--根据订单号查订单-->
<select id="selectAllOrderByOrderCode" resultType="com.example.demo.domain.entity.UserGoldRecord">
select * from user_gold_record where order_code = #{orderCode} and flag=1
ORDER BY create_time DESC
limit 1
</select>
<select id="getAdminMarket" resultType="java.lang.String">
</select>
<select id="getName" resultType="java.lang.String">
select admin_name from admin where id = #{auditId}
</select>
<select id="getNamesByIds" resultType="com.example.demo.domain.entity.Admin">
select id, admin_name from admin
<where>
<if test="submitterIds != null and submitterIds.size() > 0">
id in
<foreach collection="submitterIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="submitterIds == null or submitterIds.size() == 0">
1=0
</if>
</where>
</select>
<update id="updateFirstRecharge">
update user set first_recharge = now() where jwcode = #{jwcode} and first_recharge is null
</update>
</mapper>

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

@ -35,4 +35,18 @@
<select id="getMarketIdBytype" resultType="com.example.demo.domain.entity.Market">
select * from market where parent_id=#{parentId}
</select>
<select id="getMarketById" resultType="java.lang.String">
select name from market where id=#{market}
</select>
<select id="getMarketByIds" resultType="com.example.demo.domain.entity.Market">
select id,name from market
<where>
<if test="marketIds != null and marketIds.size() > 0">
id in
<foreach collection="marketIds" item="marketId" open="(" separator="," close=")">
#{marketId}
</foreach>
</if>
</where>
</select>
</mapper>
Loading…
Cancel
Save