报表-交易流水

This commit is contained in:
gaowdong 2025-04-21 16:59:40 +08:00
parent ad1a3b605b
commit 7ec208c6d9
11 changed files with 218 additions and 8 deletions

View File

@ -16,4 +16,5 @@ public class WalletUpdateDTO {
private PayChannelEnum payChannelEnum;
private PayTypeEnum payTypeEnum;
private Long orderNo;
private String deviceSn;
}

View File

@ -14,4 +14,5 @@ public class WalletBalanceOperation {
private Integer payChannel;
private Integer payType;
private Long orderNo;
private String deviceSn;
}

View File

@ -193,7 +193,8 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
walletUpdateDTO.getAccWalletIdEnum().getKey(),
walletUpdateDTO.getAccTradeTypeEnum().getKey(),
walletUpdateDTO.getPayChannelEnum().getKey(),
walletUpdateDTO.getPayTypeEnum().getKey());
walletUpdateDTO.getPayTypeEnum().getKey(),
walletUpdateDTO.getDeviceSn());
operation.setOperationType(WalletBalanceOperationEnum.ADD_BAL.getKey());
operation.setOrderNo(walletUpdateDTO.getOrderNo());
acWalletBalanceOperation(operation);
@ -219,7 +220,8 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
walletUpdateDTO.getAccWalletIdEnum().getKey(),
walletUpdateDTO.getAccTradeTypeEnum().getKey(),
walletUpdateDTO.getPayChannelEnum().getKey(),
walletUpdateDTO.getPayTypeEnum().getKey());
walletUpdateDTO.getPayTypeEnum().getKey(),
walletUpdateDTO.getDeviceSn());
operation.setOperationType(WalletBalanceOperationEnum.REDUCE_BAL.getKey());
operation.setOrderNo(walletUpdateDTO.getOrderNo());
acWalletBalanceOperation(operation);
@ -230,7 +232,7 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
}
private WalletBalanceOperation operationBuilder(BigDecimal amount, Long userId, Integer walletId,
Integer tradeType, Integer payChannel, Integer payType) {
Integer tradeType, Integer payChannel, Integer payType, String deviceSn) {
WalletBalanceOperation operation = new WalletBalanceOperation();
operation.setUserId(userId);
operation.setAmount(amount);
@ -238,6 +240,7 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
operation.setTradeType(tradeType);
operation.setPayChannel(payChannel);
operation.setPayType(payType);
operation.setDeviceSn(deviceSn);
return operation;
}
@ -282,6 +285,9 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
accTrade.setPayState(PayStateEnum.PAY_SUCC.getKey());
accTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey());
accTrade.setUpdateBy(SecurityUtils.getUsername());
accTrade.setWalletBalTotal(walletBalByWalletId);
accTrade.setAccAllBal(walletBalByWalletId);
accTrade.setMachineSn(operation.getDeviceSn());
this.accTradeService.updateAccTrade(accTrade);
}catch (Exception ex) {
if(Objects.nonNull(tradeId)) {
@ -336,6 +342,7 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
if(Objects.nonNull(operation.getOrderNo())) {
accTrade.setOrderNo(operation.getOrderNo().toString());
}
accTrade.setMachineSn(operation.getDeviceSn());
this.accTradeService.insertAccTrade(accTrade);
return tradeId;
}

View File

@ -251,18 +251,23 @@ public class OrderInfoServiceImpl implements IOrderInfoService
private void deductFromWallets(OrderInfo orderInfo, BigDecimal subsidyWalletBal) {
Long orderNo = orderInfo.getOrderId();
String deviceSn = orderInfo.getDeviceSn();
if (orderInfo.getRealAmount().compareTo(subsidyWalletBal) <= 0) {
deductWalletBalance(orderInfo.getRealAmount(), orderInfo.getUserId(), AccWalletIdEnum.SUBSIDY, orderNo);
deductWalletBalance(orderInfo.getRealAmount(), orderInfo.getUserId(), AccWalletIdEnum.SUBSIDY, orderNo, deviceSn);
} else if (subsidyWalletBal.compareTo(BigDecimal.ZERO) > 0) {
deductWalletBalance(subsidyWalletBal, orderInfo.getUserId(), AccWalletIdEnum.SUBSIDY, orderNo);
deductWalletBalance(subsidyWalletBal, orderInfo.getUserId(), AccWalletIdEnum.SUBSIDY, orderNo, deviceSn);
BigDecimal remainAmount = orderInfo.getRealAmount().subtract(subsidyWalletBal);
deductWalletBalance(remainAmount, orderInfo.getUserId(), AccWalletIdEnum.WALLET, orderNo);
deductWalletBalance(remainAmount, orderInfo.getUserId(), AccWalletIdEnum.WALLET, orderNo, deviceSn);
} else {
deductWalletBalance(orderInfo.getRealAmount(), orderInfo.getUserId(), AccWalletIdEnum.WALLET, orderNo);
deductWalletBalance(orderInfo.getRealAmount(), orderInfo.getUserId(), AccWalletIdEnum.WALLET, orderNo, deviceSn);
}
}
private void deductWalletBalance(BigDecimal amount, Long userId, AccWalletIdEnum walletIdEnum, Long orderNo) {
private void deductWalletBalance(BigDecimal amount,
Long userId,
AccWalletIdEnum walletIdEnum,
Long orderNo,
String deviceSn) {
WalletUpdateDTO walletUpdateDTO = new WalletUpdateDTO();
walletUpdateDTO.setAmount(amount);
walletUpdateDTO.setUserId(userId);
@ -271,6 +276,7 @@ public class OrderInfoServiceImpl implements IOrderInfoService
walletUpdateDTO.setPayChannelEnum(PayChannelEnum.ACC);
walletUpdateDTO.setPayTypeEnum(PayTypeEnum.MEAL_CARD);
walletUpdateDTO.setOrderNo(orderNo);
walletUpdateDTO.setDeviceSn(deviceSn);
accWalletInfoService.clearAccWalletBalance(walletUpdateDTO);
}
@ -358,6 +364,7 @@ public class OrderInfoServiceImpl implements IOrderInfoService
walletUpdateDTO.setPayChannelEnum(PayChannelEnum.ACC);
walletUpdateDTO.setPayTypeEnum(PayTypeEnum.MEAL_CARD);
walletUpdateDTO.setOrderNo(orderId);
walletUpdateDTO.setDeviceSn(orderInfo.getDeviceSn());
accWalletInfoService.addAccWalletBalance(walletUpdateDTO);
refundAmount = refundAmount.add(accTrade.getActualAmount());
}

View File

@ -0,0 +1,46 @@
package com.bonus.canteen.core.report.controller;
import com.bonus.canteen.core.order.domain.OrderDetail;
import com.bonus.canteen.core.order.service.IOrderDetailService;
import com.bonus.canteen.core.report.domain.TradeFlowParam;
import com.bonus.canteen.core.report.domain.TradeFlowVO;
import com.bonus.canteen.core.report.service.TradeReportService;
import com.bonus.common.core.utils.poi.ExcelUtil;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.common.log.annotation.SysLog;
import com.bonus.common.log.enums.OperaType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 交易报表
*
* @author ruoyi
* @date 2025-04-14
*/
@Controller
@RequestMapping("/report/trade")
public class TradeReportController extends BaseController
{
@Autowired
private TradeReportService tradeReportService;
/**
* 交易流水
*/
@PostMapping("/flow")
@ResponseBody
public TableDataInfo list(TradeFlowParam param)
{
startPage();
List<TradeFlowVO> list = tradeReportService.selectTradeFlow(param);
return getDataTable(list);
}
}

View File

@ -0,0 +1,28 @@
package com.bonus.canteen.core.report.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class TradeFlowParam implements Serializable {
private Long userId;
private String userName;
private String phonenumber;
private List<Long> deptIdList;
@ApiModelProperty("开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startDateTime;
@ApiModelProperty("结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endDateTime;
public TradeFlowParam() {
this.endDateTime = LocalDateTime.now().plusDays(7);
this.startDateTime = LocalDateTime.now().minusDays(7);
}
}

View File

@ -0,0 +1,25 @@
package com.bonus.canteen.core.report.domain;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class TradeFlowVO implements Serializable {
private Long userId;
private String userName;
private Integer userType;
private String phonenumber;
private Long deptId;
private String deptName;
private Double accAllBal;
private LocalDateTime tradeTime;
private Integer tradeType;
private Integer payType;
private String machineSn;
private String deviceName;
private String createBy;
private Double income;
private Double outcome;
}

View File

@ -0,0 +1,10 @@
package com.bonus.canteen.core.report.mapper;
import com.bonus.canteen.core.report.domain.TradeFlowParam;
import com.bonus.canteen.core.report.domain.TradeFlowVO;
import java.util.List;
public interface TradeReportMapper {
public List<TradeFlowVO> selectTradeFlow(TradeFlowParam param);
}

View File

@ -0,0 +1,10 @@
package com.bonus.canteen.core.report.service;
import com.bonus.canteen.core.report.domain.TradeFlowParam;
import com.bonus.canteen.core.report.domain.TradeFlowVO;
import java.util.List;
public interface TradeReportService {
List<TradeFlowVO> selectTradeFlow(TradeFlowParam param);
}

View File

@ -0,0 +1,21 @@
package com.bonus.canteen.core.report.service.impl;
import com.bonus.canteen.core.report.domain.TradeFlowParam;
import com.bonus.canteen.core.report.domain.TradeFlowVO;
import com.bonus.canteen.core.report.mapper.TradeReportMapper;
import com.bonus.canteen.core.report.service.TradeReportService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class TradeReportServiceImpl implements TradeReportService {
@Resource
TradeReportMapper tradeReportMapper;
@Override
public List<TradeFlowVO> selectTradeFlow(TradeFlowParam param) {
return tradeReportMapper.selectTradeFlow(param);
}
}

View File

@ -0,0 +1,54 @@
<?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.bonus.canteen.core.report.mapper.TradeReportMapper">
<select id="selectTradeFlow" resultType="com.bonus.canteen.core.report.domain.TradeFlowVO">
select
su.user_id,
su.user_name,
su.user_type,
su.phonenumber,
sd.dept_id,
sd.dept_name,
at2.acc_all_bal,
at2.trade_time,
at2.trade_type,
at2.pay_type,
at2.machine_sn,
di.device_name,
at2.create_by,
CASE
WHEN at2.trade_type in (10, 20) then
at2.actual_amount
end as income,
CASE
WHEN at2.trade_type not in (10, 20) then
at2.actual_amount
end as outcome
from
acc_trade at2
left join sys_user su on
at2.user_id = su.user_id
left join sys_dept sd on
su.dept_id = sd.dept_id
left join device_info di on
at2.machine_sn = di.device_sn
where
at2.trade_time <![CDATA[ >= ]]> #{param.startDateTime}
and at2.trade_time <![CDATA[ <= ]]> #{param.endDateTime}
<if test="param.deptIdList != null and param.deptIdList.size() > 0">
and su.dept_id IN
<foreach collection="param.deptIdList" item="deptId" separator="," open="(" close=")">
#{deptId}
</foreach>
</if>
<if test="param.searchValue != null and param.searchValue != ''">
and (
su.nick_name = #{param.searchValue}
or su.phonenumber = #{param.encryptedSearchValue}
or su.user_id like concat('%', #{param.searchValue}, '%')
)
</if>
</select>
</mapper>