报表-交易流水
This commit is contained in:
parent
ad1a3b605b
commit
7ec208c6d9
|
|
@ -16,4 +16,5 @@ public class WalletUpdateDTO {
|
||||||
private PayChannelEnum payChannelEnum;
|
private PayChannelEnum payChannelEnum;
|
||||||
private PayTypeEnum payTypeEnum;
|
private PayTypeEnum payTypeEnum;
|
||||||
private Long orderNo;
|
private Long orderNo;
|
||||||
|
private String deviceSn;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,4 +14,5 @@ public class WalletBalanceOperation {
|
||||||
private Integer payChannel;
|
private Integer payChannel;
|
||||||
private Integer payType;
|
private Integer payType;
|
||||||
private Long orderNo;
|
private Long orderNo;
|
||||||
|
private String deviceSn;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -193,7 +193,8 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
|
||||||
walletUpdateDTO.getAccWalletIdEnum().getKey(),
|
walletUpdateDTO.getAccWalletIdEnum().getKey(),
|
||||||
walletUpdateDTO.getAccTradeTypeEnum().getKey(),
|
walletUpdateDTO.getAccTradeTypeEnum().getKey(),
|
||||||
walletUpdateDTO.getPayChannelEnum().getKey(),
|
walletUpdateDTO.getPayChannelEnum().getKey(),
|
||||||
walletUpdateDTO.getPayTypeEnum().getKey());
|
walletUpdateDTO.getPayTypeEnum().getKey(),
|
||||||
|
walletUpdateDTO.getDeviceSn());
|
||||||
operation.setOperationType(WalletBalanceOperationEnum.ADD_BAL.getKey());
|
operation.setOperationType(WalletBalanceOperationEnum.ADD_BAL.getKey());
|
||||||
operation.setOrderNo(walletUpdateDTO.getOrderNo());
|
operation.setOrderNo(walletUpdateDTO.getOrderNo());
|
||||||
acWalletBalanceOperation(operation);
|
acWalletBalanceOperation(operation);
|
||||||
|
|
@ -219,7 +220,8 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
|
||||||
walletUpdateDTO.getAccWalletIdEnum().getKey(),
|
walletUpdateDTO.getAccWalletIdEnum().getKey(),
|
||||||
walletUpdateDTO.getAccTradeTypeEnum().getKey(),
|
walletUpdateDTO.getAccTradeTypeEnum().getKey(),
|
||||||
walletUpdateDTO.getPayChannelEnum().getKey(),
|
walletUpdateDTO.getPayChannelEnum().getKey(),
|
||||||
walletUpdateDTO.getPayTypeEnum().getKey());
|
walletUpdateDTO.getPayTypeEnum().getKey(),
|
||||||
|
walletUpdateDTO.getDeviceSn());
|
||||||
operation.setOperationType(WalletBalanceOperationEnum.REDUCE_BAL.getKey());
|
operation.setOperationType(WalletBalanceOperationEnum.REDUCE_BAL.getKey());
|
||||||
operation.setOrderNo(walletUpdateDTO.getOrderNo());
|
operation.setOrderNo(walletUpdateDTO.getOrderNo());
|
||||||
acWalletBalanceOperation(operation);
|
acWalletBalanceOperation(operation);
|
||||||
|
|
@ -230,7 +232,7 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
|
||||||
}
|
}
|
||||||
|
|
||||||
private WalletBalanceOperation operationBuilder(BigDecimal amount, Long userId, Integer walletId,
|
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();
|
WalletBalanceOperation operation = new WalletBalanceOperation();
|
||||||
operation.setUserId(userId);
|
operation.setUserId(userId);
|
||||||
operation.setAmount(amount);
|
operation.setAmount(amount);
|
||||||
|
|
@ -238,6 +240,7 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
|
||||||
operation.setTradeType(tradeType);
|
operation.setTradeType(tradeType);
|
||||||
operation.setPayChannel(payChannel);
|
operation.setPayChannel(payChannel);
|
||||||
operation.setPayType(payType);
|
operation.setPayType(payType);
|
||||||
|
operation.setDeviceSn(deviceSn);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -282,6 +285,9 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
|
||||||
accTrade.setPayState(PayStateEnum.PAY_SUCC.getKey());
|
accTrade.setPayState(PayStateEnum.PAY_SUCC.getKey());
|
||||||
accTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey());
|
accTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey());
|
||||||
accTrade.setUpdateBy(SecurityUtils.getUsername());
|
accTrade.setUpdateBy(SecurityUtils.getUsername());
|
||||||
|
accTrade.setWalletBalTotal(walletBalByWalletId);
|
||||||
|
accTrade.setAccAllBal(walletBalByWalletId);
|
||||||
|
accTrade.setMachineSn(operation.getDeviceSn());
|
||||||
this.accTradeService.updateAccTrade(accTrade);
|
this.accTradeService.updateAccTrade(accTrade);
|
||||||
}catch (Exception ex) {
|
}catch (Exception ex) {
|
||||||
if(Objects.nonNull(tradeId)) {
|
if(Objects.nonNull(tradeId)) {
|
||||||
|
|
@ -336,6 +342,7 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
|
||||||
if(Objects.nonNull(operation.getOrderNo())) {
|
if(Objects.nonNull(operation.getOrderNo())) {
|
||||||
accTrade.setOrderNo(operation.getOrderNo().toString());
|
accTrade.setOrderNo(operation.getOrderNo().toString());
|
||||||
}
|
}
|
||||||
|
accTrade.setMachineSn(operation.getDeviceSn());
|
||||||
this.accTradeService.insertAccTrade(accTrade);
|
this.accTradeService.insertAccTrade(accTrade);
|
||||||
return tradeId;
|
return tradeId;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -251,18 +251,23 @@ public class OrderInfoServiceImpl implements IOrderInfoService
|
||||||
|
|
||||||
private void deductFromWallets(OrderInfo orderInfo, BigDecimal subsidyWalletBal) {
|
private void deductFromWallets(OrderInfo orderInfo, BigDecimal subsidyWalletBal) {
|
||||||
Long orderNo = orderInfo.getOrderId();
|
Long orderNo = orderInfo.getOrderId();
|
||||||
|
String deviceSn = orderInfo.getDeviceSn();
|
||||||
if (orderInfo.getRealAmount().compareTo(subsidyWalletBal) <= 0) {
|
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) {
|
} 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);
|
BigDecimal remainAmount = orderInfo.getRealAmount().subtract(subsidyWalletBal);
|
||||||
deductWalletBalance(remainAmount, orderInfo.getUserId(), AccWalletIdEnum.WALLET, orderNo);
|
deductWalletBalance(remainAmount, orderInfo.getUserId(), AccWalletIdEnum.WALLET, orderNo, deviceSn);
|
||||||
} else {
|
} 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 walletUpdateDTO = new WalletUpdateDTO();
|
||||||
walletUpdateDTO.setAmount(amount);
|
walletUpdateDTO.setAmount(amount);
|
||||||
walletUpdateDTO.setUserId(userId);
|
walletUpdateDTO.setUserId(userId);
|
||||||
|
|
@ -271,6 +276,7 @@ public class OrderInfoServiceImpl implements IOrderInfoService
|
||||||
walletUpdateDTO.setPayChannelEnum(PayChannelEnum.ACC);
|
walletUpdateDTO.setPayChannelEnum(PayChannelEnum.ACC);
|
||||||
walletUpdateDTO.setPayTypeEnum(PayTypeEnum.MEAL_CARD);
|
walletUpdateDTO.setPayTypeEnum(PayTypeEnum.MEAL_CARD);
|
||||||
walletUpdateDTO.setOrderNo(orderNo);
|
walletUpdateDTO.setOrderNo(orderNo);
|
||||||
|
walletUpdateDTO.setDeviceSn(deviceSn);
|
||||||
accWalletInfoService.clearAccWalletBalance(walletUpdateDTO);
|
accWalletInfoService.clearAccWalletBalance(walletUpdateDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -358,6 +364,7 @@ public class OrderInfoServiceImpl implements IOrderInfoService
|
||||||
walletUpdateDTO.setPayChannelEnum(PayChannelEnum.ACC);
|
walletUpdateDTO.setPayChannelEnum(PayChannelEnum.ACC);
|
||||||
walletUpdateDTO.setPayTypeEnum(PayTypeEnum.MEAL_CARD);
|
walletUpdateDTO.setPayTypeEnum(PayTypeEnum.MEAL_CARD);
|
||||||
walletUpdateDTO.setOrderNo(orderId);
|
walletUpdateDTO.setOrderNo(orderId);
|
||||||
|
walletUpdateDTO.setDeviceSn(orderInfo.getDeviceSn());
|
||||||
accWalletInfoService.addAccWalletBalance(walletUpdateDTO);
|
accWalletInfoService.addAccWalletBalance(walletUpdateDTO);
|
||||||
refundAmount = refundAmount.add(accTrade.getActualAmount());
|
refundAmount = refundAmount.add(accTrade.getActualAmount());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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>
|
||||||
Loading…
Reference in New Issue