更新统计数据

This commit is contained in:
磷叶 2025-05-07 11:12:47 +08:00
parent 2cb3a7b9ae
commit 79337dbfb3
17 changed files with 276 additions and 16 deletions

View File

@ -137,7 +137,7 @@ public class MathUtils {
for (int i = 1; i < values.length; i++) {
BigDecimal value = values[i];
if (value == null) {
continue;
return null;
}
if (min == null || value.compareTo(min) < 0) {
min = value;

View File

@ -282,13 +282,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</otherwise>
</choose>
</foreach>
bb.status = 'WAIT_DIVIDE',
bb.wait_amount = bb.wait_amount + bb.invalid_amount,
bb.invalid_amount = 0
</trim>
where bb.id in
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item.id}
</foreach>
and <include refid="checkAmount"/>
and bb.status = 'WAIT_DIVIDE'
and bb.status in ('INVALID', 'WAIT_DIVIDE')
</update>
<update id="pay">

View File

@ -190,4 +190,20 @@ public class Order extends BaseEntity {
@ApiModelProperty("审核备注")
private String verifyRemark;
@Excel(name = "实收骑行费")
@ApiModelProperty("实收骑行费")
private BigDecimal actualRidingFee;
@Excel(name = "实收调度费")
@ApiModelProperty("实收调度费")
private BigDecimal actualDispatchFee;
@Excel(name = "实收管理费")
@ApiModelProperty("实收管理费")
private BigDecimal actualManageFee;
@Excel(name = "实收车损费")
@ApiModelProperty("实收车损费")
private BigDecimal actualDeductionFee;
}

View File

@ -69,6 +69,10 @@ public class OrderVO extends Order implements IotDevice {
@ApiModelProperty("管理员退款金额")
private BigDecimal payAdminRefund;
// 实收金额 = 最小值支付金额,结算金额 - 退款金额 - 退款中金额
@ApiModelProperty("实收金额")
private BigDecimal actualAmount;
@Override
public String mac() {
return this.deviceMac;

View File

@ -16,4 +16,7 @@ public class OrderRefundQuery extends OrderQuery {
@ApiModelProperty("退款状态列表")
private List<String> refundStatusList;
@ApiModelProperty("退款类型")
private String refundType;
}

View File

@ -179,4 +179,44 @@ public interface OrderMapper {
*/
BigDecimal selectSumOfActualAmount(@Param("query") OrderQuery query);
/**
* 查询订单骑行费
*
* @param query 查询条件
* @return 结果
*/
BigDecimal selectSumOfActualRiddingFee(@Param("query") OrderQuery query);
/**
* 查询订单车损费
*
* @param query 查询条件
* @return 结果
*/
BigDecimal selectSumOfActualDeductionFee(@Param("query") OrderQuery query);
/**
* 查询订单调度费
*
* @param query 查询条件
* @return 结果
*/
BigDecimal selectSumOfActualDispatchFee(@Param("query") OrderQuery query);
/**
* 查询订单管理费
*
* @param query 查询条件
* @return 结果
*/
BigDecimal selectSumOfActualManageFee(@Param("query") OrderQuery query);
/**
* 查询订单总金额
*
* @param query 查询条件
* @return 结果
*/
BigDecimal selectSumOfActualTotalAmount(@Param("query") OrderQuery query);
}

View File

@ -9,6 +9,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result column="suit_interval_rule" property="suitIntervalRule" typeHandler="com.ruoyi.bst.suit.mapper.typehanlder.SuitIntervalFeeRuleJsonListTypeHandler"/>
</resultMap>
<sql id="actualAmount">
bp.amount - bp.refunded - bp.refunding
</sql>
<sql id="selectOrderVo">
select
bo.id,
@ -52,6 +56,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
bo.area_user_id,
bo.area_agent_id,
bo.cancel_remark,
bo.actual_riding_fee,
bo.actual_dispatch_fee,
bo.actual_manage_fee,
bo.actual_deduction_fee,
<include refid="actualAmount"/> as actual_amount,
ba.name as area_name,
su.nick_name as user_name,
su.user_name as user_phone,
@ -175,6 +184,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and date(br.create_time) &gt;= #{query.refundCreateDateRange[0]}
and date(br.create_time) &lt;= #{query.refundCreateDateRange[1]}
</if>
<if test="query.refundType != null and query.refundType != ''">
and br.type = #{query.refundType}
</if>
</sql>
<select id="selectOrderList" parameterType="OrderQuery" resultMap="OrderResult">
@ -232,6 +244,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="areaUserId != null">area_user_id,</if>
<if test="areaAgentId != null">area_agent_id,</if>
<if test="cancelRemark != null">cancel_remark,</if>
<if test="actualRidingFee != null">actual_riding_fee,</if>
<if test="actualDispatchFee != null">actual_dispatch_fee,</if>
<if test="actualManageFee != null">actual_manage_fee,</if>
<if test="actualDeductionFee != null">actual_deduction_fee,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="no != null and no != ''">#{no},</if>
@ -274,6 +290,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="areaUserId != null">#{areaUserId},</if>
<if test="areaAgentId != null">#{areaAgentId},</if>
<if test="cancelRemark != null">#{cancelRemark},</if>
<if test="actualRidingFee != null">#{actualRidingFee},</if>
<if test="actualDispatchFee != null">#{actualDispatchFee},</if>
<if test="actualManageFee != null">#{actualManageFee},</if>
<if test="actualDeductionFee != null">#{actualDeductionFee},</if>
</trim>
</insert>
@ -326,6 +346,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="data.areaUserId != null">area_user_id = #{data.areaUserId},</if>
<if test="data.areaAgentId != null">area_agent_id = #{data.areaAgentId},</if>
<if test="data.cancelRemark != null">cancel_remark = #{data.cancelRemark},</if>
<if test="data.actualRidingFee != null">actual_riding_fee = #{data.actualRidingFee},</if>
<if test="data.actualDispatchFee != null">actual_dispatch_fee = #{data.actualDispatchFee},</if>
<if test="data.actualManageFee != null">actual_manage_fee = #{data.actualManageFee},</if>
<if test="data.actualDeductionFee != null">actual_deduction_fee = #{data.actualDeductionFee},</if>
</sql>
<delete id="deleteOrderById" parameterType="Long">
@ -434,7 +458,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select
bo.area_id,
ba.name as area_name,
LEAST(sum(bo.total_fee), sum(bp.amount)) as actual_amount,
sum(<include refid="actualAmount"/>) as actual_amount,
count(bo.id) as `count`,
sum(if(bo.status = 'PROCESSING', 1, 0)) as processing_count
from <include refid="searchTables"/>
@ -463,6 +487,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<update id="addDeductionFee">
update bst_order bo
set bo.deduction_fee = bo.deduction_fee + #{deductionFee},
bo.actual_deduction_fee = bo.actual_deduction_fee + #{deductionFee},
bo.total_fee = bo.total_fee + #{deductionFee}
where bo.id = #{id} and bo.total_fee + #{deductionFee} &lt;= bo.deposit_fee
</update>
@ -480,10 +505,61 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- selectSumOfActualAmount -->
<select id="selectSumOfActualAmount" resultType="BigDecimal">
select sum(<include refid="actualAmount"/>)
from <include refid="searchTables"/>
<where>
<include refid="searchCondition"/>
</where>
</select>
<!-- selectSumOfActualRidingFee -->
<select id="selectSumOfActualRiddingFee" resultType="BigDecimal">
select sum(bo.actual_riding_fee)
from <include refid="searchTables"/>
<where>
<include refid="searchCondition"/>
</where>
</select>
<!-- selectSumOfActualDeductionFee -->
<select id="selectSumOfActualDeductionFee" resultType="BigDecimal">
select sum(bo.actual_deduction_fee)
from <include refid="searchTables"/>
<where>
<include refid="searchCondition"/>
</where>
</select>
<!-- selectSumOfActualDispatchFee -->
<select id="selectSumOfActualDispatchFee" resultType="BigDecimal">
select sum(bo.actual_dispatch_fee)
from <include refid="searchTables"/>
<where>
<include refid="searchCondition"/>
</where>
</select>
<!-- selectSumOfActualManageFee -->
<select id="selectSumOfActualManageFee" resultType="BigDecimal">
select sum(bo.actual_manage_fee)
from <include refid="searchTables"/>
<where>
<include refid="searchCondition"/>
</where>
</select>
<!-- selectSumOfActualTotalAmount -->
<select id="selectSumOfActualTotalAmount">
select sum(LEAST(bo.total_fee, bp.amount))
from <include refid="searchTables"/>
<where>
<include refid="searchCondition"/>
</where>
</select>
</mapper>

View File

@ -92,4 +92,30 @@ public interface OrderDashboard {
* 查询订单实收金额
*/
BigDecimal selectSumOfActualAmount(OrderQuery query);
/**
* 查询订单骑行费
*/
BigDecimal selectSumOfActualRiddingFee(OrderQuery query);
/**
* 查询订单车损费
*/
BigDecimal selectSumOfActualDeductionFee(OrderQuery query);
/**
* 查询订单调度费
*/
BigDecimal selectSumOfActualDispatchFee(OrderQuery query);
/**
* 查询订单管理费
*/
BigDecimal selectSumOfActualManageFee(OrderQuery query);
/**
* 查询订单总金额
*/
BigDecimal selectSumOfActualTotalAmount(OrderQuery query);
}

View File

@ -337,6 +337,9 @@ public class OrderConverterImpl implements OrderConverter{
data.setReturnType(order.getReturnType());
data.setEndAreaSubName(order.getEndAreaSubName());
data.setEndReason(order.getEndReason());
data.setActualRidingFee(order.getActualRidingFee());
data.setActualDispatchFee(order.getActualDispatchFee());
data.setActualManageFee(order.getActualManageFee());
return data;
}

View File

@ -118,4 +118,29 @@ public class OrderDashboardImpl implements OrderDashboard {
public BigDecimal selectSumOfActualAmount(OrderQuery query) {
return MathUtils.dv(orderMapper.selectSumOfActualAmount(query));
}
@Override
public BigDecimal selectSumOfActualRiddingFee(OrderQuery query) {
return MathUtils.dv(orderMapper.selectSumOfActualRiddingFee(query));
}
@Override
public BigDecimal selectSumOfActualDeductionFee(OrderQuery query) {
return MathUtils.dv(orderMapper.selectSumOfActualDeductionFee(query));
}
@Override
public BigDecimal selectSumOfActualDispatchFee(OrderQuery query) {
return MathUtils.dv(orderMapper.selectSumOfActualDispatchFee(query));
}
@Override
public BigDecimal selectSumOfActualManageFee(OrderQuery query) {
return MathUtils.dv(orderMapper.selectSumOfActualManageFee(query));
}
@Override
public BigDecimal selectSumOfActualTotalAmount(OrderQuery query) {
return MathUtils.dv(orderMapper.selectSumOfActualTotalAmount(query));
}
}

View File

@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
import com.ruoyi.bst.bonus.domain.enums.BonusBstType;
import com.ruoyi.bst.bonus.service.BonusService;
import com.ruoyi.bst.device.domain.enums.DeviceUnLockType;
import com.ruoyi.bst.device.domain.vo.DeviceIotVO;
@ -76,10 +75,6 @@ public class OrderPayHandlerImpl implements PayHandler {
int rows = orderMapper.updateByQuery(data, query);
ServiceUtil.assertion(rows != 1, "更新ID为%s的订单失败", order.getId());
// 分成更新为待分成状态
boolean valid = bonusService.validByBst(BonusBstType.ORDER, order.getId());
ServiceUtil.assertion(!valid, "更新ID为%s的订单分成失败", order.getId());
// 开始使用订单设备
int start = orderDeviceService.start(orderDevice);
ServiceUtil.assertion(start != 1, "开始使用ID为%s的订单设备失败", orderDevice.getId());

View File

@ -477,6 +477,17 @@ public class OrderServiceImpl implements OrderService {
order.setDispatchFee(orderFee.getDispatchFee());
order.setRidingFee(orderFee.getRidingFee());
order.setTotalFee(orderFee.getTotalFee());
// 实收金额
BigDecimal remain = order.getPayedAmount();
// 骑行费实收
order.setActualRidingFee(MathUtils.min(remain, order.getRidingFee()));
remain = MathUtils.subtractDecimal(remain, order.getActualRidingFee());
// 调度费实收
order.setActualDispatchFee(MathUtils.min(remain, order.getDispatchFee()));
remain = MathUtils.subtractDecimal(remain, order.getActualDispatchFee());
// 管理费实收
order.setActualManageFee(MathUtils.min(remain, order.getManageFee()));
}
private int refundRemainAmount(OrderVO order) {

View File

@ -21,7 +21,7 @@ public class StatKeys {
public static final String ORDER_STATUS_COUNT = "order_status_count";
// 订单完成状态数量
public static final String ORDER_END_STATUS_COUNT = "order_end_status_count";
// 订单实收金额
// 订单金额
public static final String ORDER_ACTUAL_AMOUNT = "order_actual_amount";
// 订单骑行费
public static final String ORDER_RIDDING_FEE = "order_ridding_fee";

View File

@ -7,6 +7,7 @@ import org.springframework.format.annotation.DateTimeFormat;
import com.ruoyi.bst.area.domain.AreaQuery;
import com.ruoyi.bst.areaJoin.domain.AreaJoinQuery;
import com.ruoyi.bst.areaJoin.domain.enums.AreaJoinPermission;
import com.ruoyi.bst.bonus.domain.BonusQuery;
import com.ruoyi.bst.bonus.domain.enums.BonusStatus;
import com.ruoyi.bst.bonusRefund.domain.BonusRefundQuery;
@ -15,6 +16,8 @@ import com.ruoyi.bst.fault.domain.FaultQuery;
import com.ruoyi.bst.mchApply.domain.MchApplyQuery;
import com.ruoyi.bst.order.domain.OrderQuery;
import com.ruoyi.bst.order.domain.enums.OrderStatus;
import com.ruoyi.bst.order.domain.query.OrderRefundQuery;
import com.ruoyi.bst.refund.domain.enums.RefundStatus;
import com.ruoyi.bst.withdraw.domain.WithdrawQuery;
import io.swagger.annotations.ApiModelProperty;
@ -45,6 +48,7 @@ public class RevenueStatQuery {
query.setUserId(userId);
query.setAreaId(areaId);
query.setScope(scope);
query.addAreaPermission(AreaJoinPermission.ORDER_VIEW.getCode());
return query;
}
@ -75,6 +79,7 @@ public class RevenueStatQuery {
public OrderQuery toOrderQueryForEnd() {
OrderQuery query = baseOrderQuery();
query.setEndDateRange(dateRange);
query.setStatusList(OrderStatus.finishedList());
return query;
}
@ -96,6 +101,7 @@ public class RevenueStatQuery {
query.setId(areaId);
query.setUserId(userId);
query.setScope(scope);
query.addAreaPermission(AreaJoinPermission.AREA_VIEW.getCode());
return query;
}
@ -114,6 +120,7 @@ public class RevenueStatQuery {
query.setAreaId(areaId);
query.setMchId(userId);
query.setScope(scope);
query.addAreaPermission(AreaJoinPermission.DEVICE_VIEW.getCode());
return query;
}
@ -139,6 +146,19 @@ public class RevenueStatQuery {
query.setStoreId(userId);
query.setAreaId(areaId);
query.setScope(scope);
query.addAreaPermission(AreaJoinPermission.FAULT_VIEW.getCode());
return query;
}
public OrderRefundQuery toOrderRefundQuery() {
OrderRefundQuery query = new OrderRefundQuery();
query.setStatusList(OrderStatus.valid());
query.setRefundStatusList(RefundStatus.valid());
query.setRefundCreateDateRange(dateRange);
query.setBonusUserId(userId);
query.setAreaId(areaId);
query.setScope(scope);
query.addAreaPermission(AreaJoinPermission.ORDER_VIEW.getCode());
return query;
}
}

View File

@ -16,6 +16,8 @@ public class RevenueStatVO {
private Integer orderUserCount;
@ApiModelProperty("订单总金额")
private BigDecimal orderActualTotalAmount;
@ApiModelProperty("订单实收金额")
private BigDecimal orderActualAmount;
@ApiModelProperty("订单骑行费")
private BigDecimal orderRiddingFee;
@ApiModelProperty("订单车损费")
@ -28,6 +30,10 @@ public class RevenueStatVO {
private Integer orderCount;
@ApiModelProperty("订单退款金额")
private BigDecimal orderRefundAmount;
@ApiModelProperty("订单自动退款金额")
private BigDecimal orderAutoRefundAmount;
@ApiModelProperty("订单人工退款金额")
private BigDecimal orderAdminRefundAmount;
@ApiModelProperty("订单状态数量(创建时间)")
private Map<String, Integer> orderStatusMap;
@ApiModelProperty("订单状态数量(完成时间)")
@ -43,10 +49,6 @@ public class RevenueStatVO {
}
return count;
}
@ApiModelProperty("订单实收金额")
public BigDecimal getOrderActualAmount() {
return MathUtils.subtractDecimal(orderActualTotalAmount, orderRefundAmount);
}
@ApiModelProperty("分成总金额")
private BigDecimal bonusAmount;

View File

@ -16,10 +16,13 @@ import com.ruoyi.bst.device.service.DeviceDashboard;
import com.ruoyi.bst.fault.service.FaultDashboard;
import com.ruoyi.bst.mchApply.service.MchApplyDashboard;
import com.ruoyi.bst.model.service.ModelDashboard;
import com.ruoyi.bst.order.domain.query.OrderRefundQuery;
import com.ruoyi.bst.order.domain.vo.OrderDailyRefundStatVO;
import com.ruoyi.bst.order.domain.vo.OrderDailyStatVO;
import com.ruoyi.bst.order.service.OrderDashboard;
import com.ruoyi.bst.refund.domain.enums.RefundType;
import com.ruoyi.bst.withdraw.service.WithdrawDashboard;
import com.ruoyi.common.utils.MathUtils;
import com.ruoyi.common.utils.collection.CollectionUtils;
import com.ruoyi.dashboard.constants.StatKeys;
import com.ruoyi.dashboard.domain.dailyStat.DailyStatQuery;
@ -135,18 +138,51 @@ public class DashboardService {
if (keys.contains(StatKeys.ORDER_USER_COUNT)) {
vo.setOrderUserCount(orderDashboard.selectUserCount(query.toOrderQuery()));
}
// 订单实收金额
// 订单金额
if (keys.contains(StatKeys.ORDER_ACTUAL_AMOUNT)) {
vo.setOrderActualTotalAmount(orderDashboard.selectSumOfActualAmount(query.toOrderQueryForEnd()));
vo.setOrderActualTotalAmount(orderDashboard.selectSumOfActualTotalAmount(query.toOrderQueryForEnd()));
vo.setOrderActualAmount(orderDashboard.selectSumOfActualAmount(query.toOrderQueryForEnd()));
}
// 订单骑行费
if (keys.contains(StatKeys.ORDER_RIDDING_FEE)) {
vo.setOrderRiddingFee(orderDashboard.selectSumOfActualRiddingFee(query.toOrderQueryForEnd()));
}
// 订单车损费
if (keys.contains(StatKeys.ORDER_DEDUCTION_FEE)) {
vo.setOrderDeductionFee(orderDashboard.selectSumOfActualDeductionFee(query.toOrderQueryForEnd()));
}
// 订单调度费
if (keys.contains(StatKeys.ORDER_DISPATCH_FEE)) {
vo.setOrderDispatchFee(orderDashboard.selectSumOfActualDispatchFee(query.toOrderQueryForEnd()));
}
// 订单管理费
if (keys.contains(StatKeys.ORDER_MANAGE_FEE)) {
vo.setOrderManageFee(orderDashboard.selectSumOfActualManageFee(query.toOrderQueryForEnd()));
}
// 订单数量
if (keys.contains(StatKeys.ORDER_COUNT)) {
vo.setOrderCount(orderDashboard.selectCount(query.toOrderQuery()));
}
// 订单退款金额
if (keys.contains(StatKeys.ORDER_REFUND_AMOUNT)) {
OrderRefundQuery refundQuery = query.toOrderRefundQuery();
refundQuery.setRefundType(RefundType.AUTO.getCode());
vo.setOrderAutoRefundAmount(orderDashboard.selectRefundAmount(refundQuery));
refundQuery.setRefundType(RefundType.ADMIN.getCode());
vo.setOrderAdminRefundAmount(orderDashboard.selectRefundAmount(refundQuery));
vo.setOrderRefundAmount(MathUtils.addDecimal(vo.getOrderAutoRefundAmount(), vo.getOrderAdminRefundAmount()));
}
// 订单状态数量
if (keys.contains(StatKeys.ORDER_STATUS_COUNT)) {
vo.setOrderStatusMap(orderDashboard.selectStatusCount(query.toOrderQuery()));
}
// 订单完成状态数量
if (keys.contains(StatKeys.ORDER_END_STATUS_COUNT)) {
vo.setOrderEndStatusMap(orderDashboard.selectStatusCount(query.toOrderQueryForEnd()));
}
// 分成总金额
if (keys.contains(StatKeys.BONUS_AMOUNT) || keys.contains(StatKeys.BONUS_ACTUAL_AMOUNT)) {