diff --git a/.vscode/settings.json b/.vscode/settings.json index 4a52bca..4b9203f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,4 @@ { "java.compile.nullAnalysis.mode": "automatic", "java.configuration.updateBuildConfiguration": "interactive", - "java.format.settings.url": "eclipse-formatter.xml" } \ No newline at end of file diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/model/domain/ModelQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/model/domain/ModelQuery.java index b7e3878..8b21588 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/model/domain/ModelQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/model/domain/ModelQuery.java @@ -1,7 +1,10 @@ package com.ruoyi.bst.model.domain; +import java.time.LocalDate; import java.util.List; +import org.springframework.format.annotation.DateTimeFormat; + import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -13,4 +16,9 @@ public class ModelQuery extends ModelVO { @ApiModelProperty("关键词") private String keyword; + + @ApiModelProperty("创建日期范围") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private List createDateRange; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/model/mapper/ModelMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/model/mapper/ModelMapper.xml index 1faa2d1..23ec1dd 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/model/mapper/ModelMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/model/mapper/ModelMapper.xml @@ -42,6 +42,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{item} + + and date(bm.create_time) >= #{query.createDateRange[0]} + and date(bm.create_time) <= #{query.createDateRange[1]} + and ( bm.name like concat('%', #{query.keyword}, '%') diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/model/service/ModelDashboard.java b/ruoyi-service/src/main/java/com/ruoyi/bst/model/service/ModelDashboard.java index 499f802..73c93b9 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/model/service/ModelDashboard.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/model/service/ModelDashboard.java @@ -13,5 +13,12 @@ public interface ModelDashboard { * @return */ ModelStatVO selectStat(ModelQuery query, List keys); + + /** + * 查询型号数量 + * @param modelQuery + * @return + */ + Integer selectCount(ModelQuery modelQuery); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/model/service/impl/ModelDashboardImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/model/service/impl/ModelDashboardImpl.java index e86f1c9..fd41ef6 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/model/service/impl/ModelDashboardImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/model/service/impl/ModelDashboardImpl.java @@ -22,9 +22,14 @@ public class ModelDashboardImpl implements ModelDashboard { public ModelStatVO selectStat(ModelQuery query, List keys) { ModelStatVO vo = new ModelStatVO(); if (keys.contains(StatKeys.MODEL_COUNT)) { - vo.setCount(MathUtils.dv(modelMapper.selectCount(query))); + vo.setCount(this.selectCount(query)); } return vo; } + + @Override + public Integer selectCount(ModelQuery query) { + return MathUtils.dv(modelMapper.selectCount(query)); + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/Snapshot.java b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/Snapshot.java new file mode 100644 index 0000000..c5c279e --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/Snapshot.java @@ -0,0 +1,30 @@ +package com.ruoyi.bst.snapshot.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 快照对象 bst_snapshot + * + * @author ruoyi + * @date 2025-05-08 + */ +@Data +public class Snapshot extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + private Long id; + + @Excel(name = "类型") + @ApiModelProperty("类型") + private String type; + + @Excel(name = "值") + @ApiModelProperty("值") + private String value; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/SnapshotQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/SnapshotQuery.java new file mode 100644 index 0000000..ec3a1ee --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/SnapshotQuery.java @@ -0,0 +1,18 @@ +package com.ruoyi.bst.snapshot.domain; + +import java.time.LocalDate; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class SnapshotQuery extends SnapshotVO { + + @ApiModelProperty("创建日期范围") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private List createDateRange; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/SnapshotVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/SnapshotVO.java new file mode 100644 index 0000000..c6f1b15 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/SnapshotVO.java @@ -0,0 +1,9 @@ +package com.ruoyi.bst.snapshot.domain; + +import lombok.Data; + +@Data +public class SnapshotVO extends Snapshot { + + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/enums/SnapshotType.java b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/enums/SnapshotType.java new file mode 100644 index 0000000..83904da --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/enums/SnapshotType.java @@ -0,0 +1,15 @@ +package com.ruoyi.bst.snapshot.domain.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum SnapshotType { + + USER_BALANCE("user_balance", "用户余额"); + + private String code; + private String name; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/vo/SnapshotDateVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/vo/SnapshotDateVO.java new file mode 100644 index 0000000..84a5208 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/domain/vo/SnapshotDateVO.java @@ -0,0 +1,17 @@ +package com.ruoyi.bst.snapshot.domain.vo; + +import java.time.LocalDate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class SnapshotDateVO { + + @ApiModelProperty("日期") + private LocalDate date; + + @ApiModelProperty("值") + private String value; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/mapper/SnapshotMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/mapper/SnapshotMapper.java new file mode 100644 index 0000000..adfdcad --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/mapper/SnapshotMapper.java @@ -0,0 +1,84 @@ +package com.ruoyi.bst.snapshot.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.ruoyi.bst.snapshot.domain.Snapshot; +import com.ruoyi.bst.snapshot.domain.SnapshotQuery; +import com.ruoyi.bst.snapshot.domain.SnapshotVO; +import com.ruoyi.bst.snapshot.domain.vo.SnapshotDateVO; + +/** + * 快照Mapper接口 + * + * @author ruoyi + * @date 2025-05-08 + */ +public interface SnapshotMapper +{ + /** + * 查询快照 + * + * @param id 快照主键 + * @return 快照 + */ + SnapshotVO selectSnapshotById(Long id); + + /** + * 查询快照列表 + * + * @param query 快照 + * @return 快照集合 + */ + List selectSnapshotList(@Param("query")SnapshotQuery query); + + /** + * 新增快照 + * + * @param snapshot 快照 + * @return 结果 + */ + int insertSnapshot(Snapshot snapshot); + + /** + * 批量新增快照 + */ + int batchInsert(@Param("list") List list); + + /** + * 批量修改快照 + */ + int batchUpdate(@Param("list") List list); + + /** + * 修改快照 + * + * @param snapshot 快照 + * @return 结果 + */ + public int updateSnapshot(@Param("data") Snapshot snapshot); + + /** + * 删除快照 + * + * @param id 快照主键 + * @return 结果 + */ + int deleteSnapshotById(Long id); + + /** + * 批量删除快照 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSnapshotByIds(Long[] ids); + + /** + * 查询日期快照 + * @param query + * @return + */ + List selectSimpleForDate(@Param("query") SnapshotQuery query); +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/mapper/SnapshotMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/mapper/SnapshotMapper.xml new file mode 100644 index 0000000..6cb15c1 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/mapper/SnapshotMapper.xml @@ -0,0 +1,161 @@ + + + + + + + + select + bs.id, + bs.create_time, + bs.type, + bs.value + from bst_snapshot bs + + + + and bs.type = #{query.type} + ${query.params.dataScope} + + + + + + + + insert into bst_snapshot + + id, + create_time, + type, + value, + + + #{id}, + #{createTime}, + #{type}, + #{value}, + + + + + insert into bst_snapshot + + id, + create_time, + type, + value, + + values + + + #{i.id}, + default, + #{i.createTime}, + default, + #{i.type}, + default, + #{i.value}, + default, + + + + + + update bst_snapshot + + + + + WHEN #{item.id} THEN #{item.id} + + + WHEN #{item.id} THEN `id` + + + + + + + WHEN #{item.id} THEN #{item.createTime} + + + WHEN #{item.id} THEN `create_time` + + + + + + + WHEN #{item.id} THEN #{item.type} + + + WHEN #{item.id} THEN `type` + + + + + + + WHEN #{item.id} THEN #{item.value} + + + WHEN #{item.id} THEN `value` + + + + + where id in + + #{item.id} + + + + + update bst_snapshot + + + + where id = #{data.id} + + + + create_time = #{data.createTime}, + type = #{data.type}, + value = #{data.value}, + + + + delete from bst_snapshot where id = #{id} + + + + delete from bst_snapshot where id in + + #{id} + + + + + + + + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/service/SnapshotService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/service/SnapshotService.java new file mode 100644 index 0000000..40d724d --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/service/SnapshotService.java @@ -0,0 +1,81 @@ +package com.ruoyi.bst.snapshot.service; + +import java.util.List; + +import com.ruoyi.bst.snapshot.domain.Snapshot; +import com.ruoyi.bst.snapshot.domain.SnapshotQuery; +import com.ruoyi.bst.snapshot.domain.SnapshotVO; +import com.ruoyi.bst.snapshot.domain.enums.SnapshotType; +import com.ruoyi.bst.snapshot.domain.vo.SnapshotDateVO; + +/** + * 快照Service接口 + * + * @author ruoyi + * @date 2025-05-08 + */ +public interface SnapshotService +{ + /** + * 查询快照 + * + * @param id 快照主键 + * @return 快照 + */ + public SnapshotVO selectSnapshotById(Long id); + + /** + * 查询快照列表 + * + * @param snapshot 快照 + * @return 快照集合 + */ + public List selectSnapshotList(SnapshotQuery snapshot); + + /** + * 新增快照 + * + * @param snapshot 快照 + * @return 结果 + */ + public int insertSnapshot(Snapshot snapshot); + + /** + * 修改快照 + * + * @param snapshot 快照 + * @return 结果 + */ + public int updateSnapshot(Snapshot snapshot); + + /** + * 批量删除快照 + * + * @param ids 需要删除的快照主键集合 + * @return 结果 + */ + public int deleteSnapshotByIds(Long[] ids); + + /** + * 删除快照信息 + * + * @param id 快照主键 + * @return 结果 + */ + public int deleteSnapshotById(Long id); + + /** + * 记录值 + * @param type + * @param value + * @return + */ + public int record(SnapshotType type, String value); + + /** + * 查询日期快照 + * @param query + * @return + */ + public List selectSimpleForDate(SnapshotQuery query); +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/service/impl/SnapshotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/service/impl/SnapshotServiceImpl.java new file mode 100644 index 0000000..7e54211 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/snapshot/service/impl/SnapshotServiceImpl.java @@ -0,0 +1,117 @@ +package com.ruoyi.bst.snapshot.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.ruoyi.bst.snapshot.domain.Snapshot; +import com.ruoyi.bst.snapshot.domain.SnapshotQuery; +import com.ruoyi.bst.snapshot.domain.SnapshotVO; +import com.ruoyi.bst.snapshot.domain.enums.SnapshotType; +import com.ruoyi.bst.snapshot.domain.vo.SnapshotDateVO; +import com.ruoyi.bst.snapshot.mapper.SnapshotMapper; +import com.ruoyi.bst.snapshot.service.SnapshotService; +import com.ruoyi.common.utils.DateUtils; + +/** + * 快照Service业务层处理 + * + * @author ruoyi + * @date 2025-05-08 + */ +@Service +public class SnapshotServiceImpl implements SnapshotService +{ + @Autowired + private SnapshotMapper snapshotMapper; + + /** + * 查询快照 + * + * @param id 快照主键 + * @return 快照 + */ + @Override + public SnapshotVO selectSnapshotById(Long id) + { + return snapshotMapper.selectSnapshotById(id); + } + + /** + * 查询快照列表 + * + * @param snapshot 快照 + * @return 快照 + */ + @Override + public List selectSnapshotList(SnapshotQuery snapshot) + { + return snapshotMapper.selectSnapshotList(snapshot); + } + + /** + * 新增快照 + * + * @param snapshot 快照 + * @return 结果 + */ + @Override + public int insertSnapshot(Snapshot snapshot) + { + snapshot.setCreateTime(DateUtils.getNowDate()); + return snapshotMapper.insertSnapshot(snapshot); + } + + /** + * 修改快照 + * + * @param snapshot 快照 + * @return 结果 + */ + @Override + public int updateSnapshot(Snapshot snapshot) + { + return snapshotMapper.updateSnapshot(snapshot); + } + + /** + * 批量删除快照 + * + * @param ids 需要删除的快照主键 + * @return 结果 + */ + @Override + public int deleteSnapshotByIds(Long[] ids) + { + return snapshotMapper.deleteSnapshotByIds(ids); + } + + /** + * 删除快照信息 + * + * @param id 快照主键 + * @return 结果 + */ + @Override + public int deleteSnapshotById(Long id) + { + return snapshotMapper.deleteSnapshotById(id); + } + + @Override + public int record(SnapshotType type, String value) { + if (type == null) { + return 0; + } + Snapshot po = new Snapshot(); + po.setType(type.getCode()); + po.setValue(value); + return this.insertSnapshot(po); + } + + @Override + public List selectSimpleForDate(SnapshotQuery query) { + return snapshotMapper.selectSimpleForDate(query); + } +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/constants/WithdrawDailyKeys.java b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/constants/WithdrawDailyKeys.java new file mode 100644 index 0000000..99b3dd6 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/constants/WithdrawDailyKeys.java @@ -0,0 +1,19 @@ +package com.ruoyi.bst.withdraw.constants; + +public class WithdrawDailyKeys { + // 创建日期 + public static final String CREATE_DATE = "date(bw.create_time) as `date`"; + + // 提现总数量 + public static final String WITHDRAW_COUNT = "count(bw.id) as `count`"; + + // 提现总金额 + public static final String WITHDRAW_AMOUNT = "sum(bw.amount) as `amount`"; + + // 提现成功金额 + public static final String WITHDRAW_SUCCESS_AMOUNT = "sum(if (bw.status = 'SUCCESS', bw.arrival_amount, 0)) as `success_amount`"; + + // 提现手续费 + public static final String WITHDRAW_SERVICE_CHARGE = "sum(if (bw.status = 'SUCCESS', bw.service_charge, 0)) as `service_charge`"; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/domain/vo/WithdrawDailyStatVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/domain/vo/WithdrawDailyStatVO.java new file mode 100644 index 0000000..be9aab2 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/domain/vo/WithdrawDailyStatVO.java @@ -0,0 +1,27 @@ +package com.ruoyi.bst.withdraw.domain.vo; + +import java.math.BigDecimal; +import java.time.LocalDate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class WithdrawDailyStatVO { + + @ApiModelProperty("日期") + private LocalDate date; + + @ApiModelProperty("数量") + private Integer count; + + @ApiModelProperty("总金额") + private BigDecimal amount; + + @ApiModelProperty("成功金额") + private BigDecimal successAmount; + + @ApiModelProperty("手续费") + private BigDecimal serviceCharge; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/mapper/WithdrawMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/mapper/WithdrawMapper.java index 9181390..c3bfd89 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/mapper/WithdrawMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/mapper/WithdrawMapper.java @@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Param; import com.ruoyi.bst.withdraw.domain.Withdraw; import com.ruoyi.bst.withdraw.domain.WithdrawQuery; import com.ruoyi.bst.withdraw.domain.WithdrawVO; +import com.ruoyi.bst.withdraw.domain.vo.WithdrawDailyStatVO; /** * 提现Mapper接口 @@ -80,4 +81,19 @@ public interface WithdrawMapper * 根据条件查询数量 */ int selectCount(@Param("query") WithdrawQuery query); + + /** + * 根据条件查询每日提现统计 + */ + List selectDailyStat(@Param("query") WithdrawQuery query, @Param("keys") List keys); + + /** + * 根据条件查询到账金额 + */ + BigDecimal selectSumOfArrivalAmount(@Param("query") WithdrawQuery query); + + /** + * 根据条件查询手续费 + */ + BigDecimal selectSumOfServiceCharge(@Param("query") WithdrawQuery query); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/mapper/WithdrawMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/mapper/WithdrawMapper.xml index f3de040..c5d1079 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/mapper/WithdrawMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/mapper/WithdrawMapper.xml @@ -195,7 +195,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/service/WithdrawDashboard.java b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/service/WithdrawDashboard.java index 1ab6b41..c25f920 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/service/WithdrawDashboard.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/service/WithdrawDashboard.java @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.util.List; import com.ruoyi.bst.withdraw.domain.WithdrawQuery; +import com.ruoyi.bst.withdraw.domain.vo.WithdrawDailyStatVO; import com.ruoyi.bst.withdraw.domain.vo.WithdrawStatVO; public interface WithdrawDashboard { @@ -28,4 +29,18 @@ public interface WithdrawDashboard { * @return */ Integer selectWaitVerifyCount(WithdrawQuery query); + + /** + * 查询每日提现统计 + * @param query + * @return + */ + List selectDailyStat(WithdrawQuery query, List keys); + + /** + * 查询提现手续费 + * @param query + * @return + */ + BigDecimal selectSuccessServiceCharge(WithdrawQuery query); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/service/impl/WithdrawDashboardImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/service/impl/WithdrawDashboardImpl.java index 373a089..8176e9b 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/service/impl/WithdrawDashboardImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/withdraw/service/impl/WithdrawDashboardImpl.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import com.ruoyi.bst.withdraw.domain.WithdrawQuery; import com.ruoyi.bst.withdraw.domain.enums.WithdrawStatus; +import com.ruoyi.bst.withdraw.domain.vo.WithdrawDailyStatVO; import com.ruoyi.bst.withdraw.domain.vo.WithdrawStatVO; import com.ruoyi.bst.withdraw.mapper.WithdrawMapper; import com.ruoyi.bst.withdraw.service.WithdrawDashboard; @@ -38,7 +39,7 @@ public class WithdrawDashboardImpl implements WithdrawDashboard { WithdrawQuery successQuery = new WithdrawQuery(); BeanUtils.copyProperties(query, successQuery); successQuery.setStatus(WithdrawStatus.SUCCESS.getCode()); - return MathUtils.dv(withdrawMapper.selectSumOfAmount(successQuery)); + return MathUtils.dv(withdrawMapper.selectSumOfArrivalAmount(successQuery)); } @Override @@ -48,4 +49,17 @@ public class WithdrawDashboardImpl implements WithdrawDashboard { waitVerifyQuery.setStatus(WithdrawStatus.WAIT_VERIFY.getCode()); return MathUtils.dv(withdrawMapper.selectCount(waitVerifyQuery)); } + + @Override + public List selectDailyStat(WithdrawQuery query, List keys) { + return withdrawMapper.selectDailyStat(query, keys); + } + + @Override + public BigDecimal selectSuccessServiceCharge(WithdrawQuery query) { + WithdrawQuery successQuery = new WithdrawQuery(); + BeanUtils.copyProperties(query, successQuery); + successQuery.setStatus(WithdrawStatus.SUCCESS.getCode()); + return MathUtils.dv(withdrawMapper.selectSumOfServiceCharge(successQuery)); + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/constants/StatKeys.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/constants/StatKeys.java index bd065ee..dc66217 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/constants/StatKeys.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/constants/StatKeys.java @@ -43,6 +43,13 @@ public class StatKeys { // 分成实收金额 public static final String BONUS_ACTUAL_AMOUNT = "bonus_actual_amount"; + // 平台分成金额 + public static final String PLATFORM_BONUS_AMOUNT = "platform_bonus_amount"; + // 平台分成退款 + public static final String PLATFORM_BONUS_REFUND_AMOUNT = "platform_bonus_refund_amount"; + // 平台分成实收金额 + public static final String PLATFORM_BONUS_ACTUAL_AMOUNT = "platform_bonus_actual_amount"; + // 用户数量 public static final String USER_COUNT = "user_count"; // 今日新增用户数量 @@ -78,6 +85,8 @@ public class StatKeys { public static final String WITHDRAW_SUCCESS_AMOUNT = "withdraw_success_amount"; // 待审核的提现数量 public static final String WITHDRAW_WAIT_VERIFY_COUNT = "withdraw_wait_verify_count"; + // 提现手续费 + public static final String WITHDRAW_SERVICE_CHARGE = "withdraw_service_charge"; // 待审核的加盟商申请数量 public static final String MCH_APPLY_APPROVING_COUNT = "mch_apply_approving_count"; diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/platformIncomeDaily/PlatformDailyIncomeQuery.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/platformIncomeDaily/PlatformDailyIncomeQuery.java new file mode 100644 index 0000000..b928503 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/platformIncomeDaily/PlatformDailyIncomeQuery.java @@ -0,0 +1,48 @@ +package com.ruoyi.dashboard.domain.platformIncomeDaily; + +import java.time.LocalDate; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.ruoyi.bst.bonus.domain.BonusQuery; +import com.ruoyi.bst.bonus.domain.enums.BonusArrivalType; +import com.ruoyi.bst.bonus.domain.enums.BonusStatus; +import com.ruoyi.bst.bonusRefund.domain.BonusRefundQuery; +import com.ruoyi.bst.withdraw.domain.WithdrawQuery; +import com.ruoyi.bst.withdraw.domain.enums.WithdrawStatus; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class PlatformDailyIncomeQuery { + + @ApiModelProperty("日期范围") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private List dateRange; + + public BonusQuery toBonusQuery() { + BonusQuery query = new BonusQuery(); + query.setCreateDateRange(dateRange); + query.setStatusList(BonusStatus.valid()); + query.setArrivalTypes(BonusArrivalType.platformList()); + return query; + } + + public BonusRefundQuery toBonusRefundQuery() { + BonusRefundQuery query = new BonusRefundQuery(); + query.setCreateDateRange(dateRange); + query.setBonusStatusList(BonusStatus.valid()); + query.setBonusArrivalTypes(BonusArrivalType.platformList()); + return query; + } + + public WithdrawQuery toWithdrawQuery() { + WithdrawQuery query = new WithdrawQuery(); + query.setCreateDateRange(dateRange); + query.setStatus(WithdrawStatus.SUCCESS.getCode()); + return query; + } + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/platformIncomeDaily/PlatformDailyIncomeVO.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/platformIncomeDaily/PlatformDailyIncomeVO.java new file mode 100644 index 0000000..09f20d8 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/platformIncomeDaily/PlatformDailyIncomeVO.java @@ -0,0 +1,31 @@ +package com.ruoyi.dashboard.domain.platformIncomeDaily; + +import java.math.BigDecimal; +import java.time.LocalDate; + +import com.ruoyi.common.utils.MathUtils; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class PlatformDailyIncomeVO { + + @ApiModelProperty("日期") + private LocalDate date; + + @ApiModelProperty("分成金额") + private BigDecimal bonusAmount; + + @ApiModelProperty("分成退款金额") + private BigDecimal bonusRefundAmount; + + @ApiModelProperty("分成实收") + public BigDecimal getBonusActualAmount() { + return MathUtils.subtractDecimal(bonusAmount, bonusRefundAmount); + } + + @ApiModelProperty("提现服务费") + private BigDecimal withdrawServiceCharge; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatQuery.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatQuery.java index f33b4cc..8346249 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatQuery.java @@ -9,16 +9,19 @@ 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.BonusArrivalType; import com.ruoyi.bst.bonus.domain.enums.BonusStatus; import com.ruoyi.bst.bonusRefund.domain.BonusRefundQuery; import com.ruoyi.bst.device.domain.DeviceQuery; import com.ruoyi.bst.fault.domain.FaultQuery; import com.ruoyi.bst.mchApply.domain.MchApplyQuery; +import com.ruoyi.bst.model.domain.ModelQuery; 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 com.ruoyi.system.user.domain.UserQuery; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -41,7 +44,7 @@ public class RevenueStatQuery { @ApiModelProperty("数据隔离") private Boolean scope; - + // 基础订单查询 private OrderQuery baseOrderQuery() { OrderQuery query = new OrderQuery(); query.setStatusList(OrderStatus.valid()); @@ -52,30 +55,30 @@ public class RevenueStatQuery { return query; } + // 基础分成查询 private BonusQuery baseBonusQuery() { BonusQuery query = new BonusQuery(); query.setStatusList(BonusStatus.valid()); - query.setArrivalId(userId); - query.setAreaId(areaId); query.setScope(scope); return query; } + // 基础分成退款查询 private BonusRefundQuery baseBonusRefundQuery() { BonusRefundQuery query = new BonusRefundQuery(); query.setBonusStatusList(BonusStatus.valid()); - query.setBonusArrivalId(userId); - query.setBonusAreaId(areaId); query.setScope(scope); return query; } + // 订单查询 public OrderQuery toOrderQuery() { OrderQuery query = baseOrderQuery(); query.setCreateDateRange(dateRange); return query; } + // 订单查询(完成订单) public OrderQuery toOrderQueryForEnd() { OrderQuery query = baseOrderQuery(); query.setEndDateRange(dateRange); @@ -83,18 +86,42 @@ public class RevenueStatQuery { return query; } + // 用户分成查询 public BonusQuery toBonusQuery() { BonusQuery query = baseBonusQuery(); + query.setArrivalId(userId); + query.setAreaId(areaId); query.setCreateDateRange(dateRange); return query; } + // 平台分成查询 + public BonusQuery toPlatformBonusQuery() { + BonusQuery query = new BonusQuery(); + query.setCreateDateRange(dateRange); + query.setArrivalTypes(BonusArrivalType.platformList()); + query.setStatusList(BonusStatus.valid()); + return query; + } + + // 用户分成退款查询 public BonusRefundQuery toBonusRefundQuery() { BonusRefundQuery query = baseBonusRefundQuery(); + query.setBonusArrivalId(userId); + query.setBonusAreaId(areaId); query.setCreateDateRange(dateRange); return query; } + // 平台分成退款查询 + public BonusRefundQuery toPlatformBonusRefundQuery() { + BonusRefundQuery query = baseBonusRefundQuery(); + query.setCreateDateRange(dateRange); + query.setBonusArrivalTypes(BonusArrivalType.platformList()); + return query; + } + + // 运营区查询 public AreaQuery toAreaQuery() { AreaQuery query = new AreaQuery(); query.setCreateDateRange(dateRange); @@ -105,6 +132,7 @@ public class RevenueStatQuery { return query; } + // 运营区加盟商查询 public AreaJoinQuery toAreaJoinQuery() { AreaJoinQuery query = new AreaJoinQuery(); query.setCreateDateRange(dateRange); @@ -114,6 +142,7 @@ public class RevenueStatQuery { return query; } + // 设备查询 public DeviceQuery toDeviceQuery() { DeviceQuery query = new DeviceQuery(); query.setCreateDateRange(dateRange); @@ -124,6 +153,7 @@ public class RevenueStatQuery { return query; } + // 提现查询 public WithdrawQuery toWithdrawQuery() { WithdrawQuery query = new WithdrawQuery(); query.setCreateDateRange(dateRange); @@ -132,6 +162,7 @@ public class RevenueStatQuery { return query; } + // 加盟商申请查询 public MchApplyQuery toMchApplyQuery() { MchApplyQuery query = new MchApplyQuery(); query.setCreateDateRange(dateRange); @@ -140,6 +171,7 @@ public class RevenueStatQuery { return query; } + // 故障查询 public FaultQuery toFaultQuery() { FaultQuery query = new FaultQuery(); query.setCreateDateRange(dateRange); @@ -150,6 +182,7 @@ public class RevenueStatQuery { return query; } + // 订单退款查询 public OrderRefundQuery toOrderRefundQuery() { OrderRefundQuery query = new OrderRefundQuery(); query.setStatusList(OrderStatus.valid()); @@ -161,4 +194,22 @@ public class RevenueStatQuery { query.addAreaPermission(AreaJoinPermission.ORDER_VIEW.getCode()); return query; } + + // 用户查询 + public UserQuery toUserQuery() { + UserQuery query = new UserQuery(); + query.setCreateDateRange(dateRange); + query.setUserId(userId); + query.setScope(scope); + return query; + } + + // 车型查询 + public ModelQuery toModelQuery() { + ModelQuery query = new ModelQuery(); + query.setCreateDateRange(dateRange); + query.setUserId(userId); + query.setScope(scope); + return query; + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatVO.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatVO.java index 644d4f7..d766d01 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatVO.java @@ -63,6 +63,15 @@ public class RevenueStatVO { return MathUtils.subtractDecimal(bonusAmount, bonusRefundAmount); } + @ApiModelProperty("平台分成金额") + private BigDecimal platformBonusAmount; + @ApiModelProperty("平台分成退款金额") + private BigDecimal platformBonusRefundAmount; + @ApiModelProperty("平台分成实收金额") + public BigDecimal getPlatformBonusActualAmount() { + return MathUtils.subtractDecimal(platformBonusAmount, platformBonusRefundAmount); + } + @ApiModelProperty("运营区数量") private Integer areaCount; @ApiModelProperty("运营区加盟数量") @@ -83,10 +92,20 @@ public class RevenueStatVO { private BigDecimal withdrawSuccessAmount; @ApiModelProperty("待审核的提现数量") private Integer withdrawWaitVerifyCount; + @ApiModelProperty("提现手续费") + private BigDecimal withdrawServiceCharge; @ApiModelProperty("待审核的加盟商申请数量") private Integer mchApplyApprovingCount; @ApiModelProperty("待处理的故障数量") private Integer faultPendingCount; + + @ApiModelProperty("用户余额") + private BigDecimal userBalance; + @ApiModelProperty("运营商数量") + private Integer userMchCount; + + @ApiModelProperty("车型数量") + private Integer modelCount; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/service/DashboardService.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/service/DashboardService.java index 5f7162b..880d508 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/service/DashboardService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/service/DashboardService.java @@ -1,6 +1,7 @@ package com.ruoyi.dashboard.service; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -8,8 +9,10 @@ import org.springframework.stereotype.Service; import com.ruoyi.bst.area.service.AreaDashboard; import com.ruoyi.bst.areaJoin.service.AreaJoinDashboard; +import com.ruoyi.bst.bonus.constants.BonusDailyKeys; import com.ruoyi.bst.bonus.domain.vo.BonusDailyStatVO; import com.ruoyi.bst.bonus.service.BonusDashboard; +import com.ruoyi.bst.bonusRefund.constants.BonusRefundDailyKeys; import com.ruoyi.bst.bonusRefund.domain.vo.BonusRefundDailyStatVO; import com.ruoyi.bst.bonusRefund.service.BonusRefundDashboard; import com.ruoyi.bst.device.service.DeviceDashboard; @@ -21,12 +24,16 @@ 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.constants.WithdrawDailyKeys; +import com.ruoyi.bst.withdraw.domain.vo.WithdrawDailyStatVO; 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; import com.ruoyi.dashboard.domain.dailyStat.DailyStatVO; +import com.ruoyi.dashboard.domain.platformIncomeDaily.PlatformDailyIncomeQuery; +import com.ruoyi.dashboard.domain.platformIncomeDaily.PlatformDailyIncomeVO; import com.ruoyi.dashboard.domain.revenueStat.RevenueStatQuery; import com.ruoyi.dashboard.domain.revenueStat.RevenueStatVO; import com.ruoyi.dashboard.domain.stat.StatQuery; @@ -201,6 +208,15 @@ public class DashboardService { vo.setBonusCount(bonusDashboard.selectCount(query.toBonusQuery())); } + // 平台分成金额 + if (keys.contains(StatKeys.PLATFORM_BONUS_AMOUNT) || keys.contains(StatKeys.PLATFORM_BONUS_ACTUAL_AMOUNT)) { + vo.setPlatformBonusAmount(bonusDashboard.selectSumOfAmount(query.toPlatformBonusQuery())); + } + // 平台分成退款金额 + if (keys.contains(StatKeys.PLATFORM_BONUS_REFUND_AMOUNT) || keys.contains(StatKeys.PLATFORM_BONUS_ACTUAL_AMOUNT)) { + vo.setPlatformBonusRefundAmount(bonusRefundDashboard.selectSumOfPlatformBonusRefund(query.toPlatformBonusRefundQuery())); + } + // 运营区数量 if (keys.contains(StatKeys.AREA_COUNT)) { vo.setAreaCount(areaDashboard.selectCount(query.toAreaQuery())); @@ -218,7 +234,7 @@ public class DashboardService { if (keys.contains(StatKeys.AREA_JOIN_OPERATION_COUNT)) { vo.setAreaOperationCount(areaJoinDashboard.selectOperationCount(query.toAreaJoinQuery())); } - + // 设备数量 if (keys.contains(StatKeys.DEVICE_COUNT)) { vo.setDeviceCount(deviceDashboard.selectCount(query.toDeviceQuery())); @@ -240,6 +256,10 @@ public class DashboardService { if (keys.contains(StatKeys.WITHDRAW_WAIT_VERIFY_COUNT)) { vo.setWithdrawWaitVerifyCount(withdrawDashboard.selectWaitVerifyCount(query.toWithdrawQuery())); } + // 提现手续费 + if (keys.contains(StatKeys.WITHDRAW_SERVICE_CHARGE)) { + vo.setWithdrawServiceCharge(withdrawDashboard.selectSuccessServiceCharge(query.toWithdrawQuery())); + } // 待审核的加盟商申请数量 if (keys.contains(StatKeys.MCH_APPLY_APPROVING_COUNT)) { @@ -251,6 +271,74 @@ public class DashboardService { vo.setFaultPendingCount(faultDashboard.selectPendingCount(query.toFaultQuery())); } + // 用户余额 + if (keys.contains(StatKeys.USER_BALANCE)) { + vo.setUserBalance(userDashboard.selectSumOfBalance(query.toUserQuery())); + } + // 运营商数量 + if (keys.contains(StatKeys.USER_MCH_COUNT)) { + vo.setUserMchCount(userDashboard.selectMchCount(query.toUserQuery())); + } + + // 车型数量 + if (keys.contains(StatKeys.MODEL_COUNT)) { + vo.setModelCount(modelDashboard.selectCount(query.toModelQuery())); + } + return vo; } + + /** + * 查询平台每日收益 + */ + public List selectPlatformDailyIncome(PlatformDailyIncomeQuery query) { + List result = new ArrayList<>(); + + // 查询分成金额 + List bonusList = bonusDashboard.selectDailyStat( + query.toBonusQuery(), + Arrays.asList(BonusDailyKeys.CREATE_DATE, BonusDailyKeys.BONUS_AMOUNT) + ); + + // 查询分成退款金额 + List bonusRefundList = bonusRefundDashboard.selectDailyStat( + query.toBonusRefundQuery(), + Arrays.asList(BonusRefundDailyKeys.CREATE_DATE, BonusRefundDailyKeys.BONUS_REFUND_AMOUNT) + ); + + // 查询每日提现金额 + List withdrawList = withdrawDashboard.selectDailyStat( + query.toWithdrawQuery(), + Arrays.asList(WithdrawDailyKeys.CREATE_DATE, WithdrawDailyKeys.WITHDRAW_SERVICE_CHARGE) + ); + + if (query.getDateRange() != null && query.getDateRange().size() >= 2) { + result = CollectionUtils.fillVoids(result, PlatformDailyIncomeVO::getDate, (date) -> { + PlatformDailyIncomeVO vo = new PlatformDailyIncomeVO(); + vo.setDate(date); + + // 分成金额 + BonusDailyStatVO bonus = bonusList.stream() + .filter(item -> item.getDate() != null && item.getDate().isEqual(date)) + .findFirst().orElse(new BonusDailyStatVO()); + vo.setBonusAmount(MathUtils.dv(bonus.getAmount())); + + // 分成退款金额 + BonusRefundDailyStatVO bonusRefund = bonusRefundList.stream() + .filter(item -> item.getDate() != null && item.getDate().isEqual(date)) + .findFirst().orElse(new BonusRefundDailyStatVO()); + vo.setBonusRefundAmount(MathUtils.dv(bonusRefund.getAmount())); + + // 提现手续费 + WithdrawDailyStatVO withdraw = withdrawList.stream() + .filter(item -> item.getDate() != null && item.getDate().isEqual(date)) + .findFirst().orElse(new WithdrawDailyStatVO()); + vo.setWithdrawServiceCharge(MathUtils.dv(withdraw.getServiceCharge())); + + return vo; + }, query.getDateRange().get(0), query.getDateRange().get(1)); + } + + return result; + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/system/user/service/UserDashboard.java b/ruoyi-service/src/main/java/com/ruoyi/system/user/service/UserDashboard.java index 4da5064..67eec36 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/system/user/service/UserDashboard.java +++ b/ruoyi-service/src/main/java/com/ruoyi/system/user/service/UserDashboard.java @@ -24,4 +24,19 @@ public interface UserDashboard { */ UserAgentStatVO selectAgentStat(UserQuery query, List keys); + /** + * 查询用户余额 + */ + BigDecimal selectSumOfBalance(UserQuery query); + + /** + * 查询运营商数量 + */ + Integer selectMchCount(UserQuery query); + + /** + * 查询用户数量 + */ + Integer selectCount(UserQuery query); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/system/user/service/impl/UserDashboardImpl.java b/ruoyi-service/src/main/java/com/ruoyi/system/user/service/impl/UserDashboardImpl.java index 3e430be..50e1efc 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/system/user/service/impl/UserDashboardImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/system/user/service/impl/UserDashboardImpl.java @@ -32,7 +32,7 @@ public class UserDashboardImpl implements UserDashboard { public UserStatVO selectStat(UserQuery query, List keys) { UserStatVO vo = new UserStatVO(); if (keys.contains(StatKeys.USER_BALANCE)) { - vo.setBalance(MathUtils.dv(userMapper.selectSumOfBalance(query))); + vo.setBalance(userMapper.selectSumOfBalance(query)); } return vo; } @@ -52,18 +52,19 @@ public class UserDashboardImpl implements UserDashboard { return vo; } - private Integer selectMchCount(UserQuery query) { + @Override + public Integer selectMchCount(UserQuery query) { UserQuery mchQuery = new UserQuery(); BeanUtils.copyProperties(query, mchQuery); mchQuery.setRoleKey(RoleConstants.MCH); - return userMapper.selectCount(mchQuery); + return this.selectCount(mchQuery); } private Integer selectAgentCount(UserQuery query) { UserQuery agentQuery = new UserQuery(); BeanUtils.copyProperties(query, agentQuery); agentQuery.setRoleKey(RoleConstants.AGENT); - return userMapper.selectCount(agentQuery); + return this.selectCount(agentQuery); } // 获取普通用户的数量 @@ -71,7 +72,16 @@ public class UserDashboardImpl implements UserDashboard { UserQuery normalQuery = new UserQuery(); BeanUtils.copyProperties(query, normalQuery); normalQuery.setUserType(UserType.USER.getCode()); - return MathUtils.dv(userMapper.selectCount(normalQuery)); + return this.selectCount(normalQuery); } + @Override + public BigDecimal selectSumOfBalance(UserQuery query) { + return MathUtils.dv(userMapper.selectSumOfBalance(query)); + } + + @Override + public Integer selectCount(UserQuery query) { + return MathUtils.dv(userMapper.selectCount(query)); + } } \ No newline at end of file diff --git a/ruoyi-web/src/main/java/com/ruoyi/task/snapshot/SnapshotTask.java b/ruoyi-web/src/main/java/com/ruoyi/task/snapshot/SnapshotTask.java new file mode 100644 index 0000000..8a7e3c1 --- /dev/null +++ b/ruoyi-web/src/main/java/com/ruoyi/task/snapshot/SnapshotTask.java @@ -0,0 +1,35 @@ +package com.ruoyi.task.snapshot; + +import java.math.BigDecimal; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.ruoyi.bst.snapshot.domain.enums.SnapshotType; +import com.ruoyi.bst.snapshot.service.SnapshotService; +import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.system.user.domain.UserQuery; +import com.ruoyi.system.user.service.UserDashboard; + +import lombok.extern.slf4j.Slf4j; + +@Component +@Slf4j +public class SnapshotTask { + + @Autowired + private SnapshotService snapshotService; + + @Autowired + private UserDashboard userDashboard; + + /** + * 记录用户余额 + */ + public void snapshotUserBalance() { + BigDecimal balance = userDashboard.selectSumOfBalance(new UserQuery()); + int rows = snapshotService.record(SnapshotType.USER_BALANCE, balance.toString()); + ServiceUtil.assertion(rows != 1, "记录用户余额失败"); + } + +} diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/SnapshotController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/SnapshotController.java new file mode 100644 index 0000000..e65b7ec --- /dev/null +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/SnapshotController.java @@ -0,0 +1,110 @@ +package com.ruoyi.web.bst; + +import java.util.List; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.ruoyi.bst.snapshot.domain.Snapshot; +import com.ruoyi.bst.snapshot.domain.SnapshotQuery; +import com.ruoyi.bst.snapshot.domain.SnapshotVO; +import com.ruoyi.bst.snapshot.service.SnapshotService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; + +/** + * 快照Controller + * + * @author ruoyi + * @date 2025-05-08 + */ +@RestController +@RequestMapping("/bst/snapshot") +public class SnapshotController extends BaseController +{ + @Autowired + private SnapshotService snapshotService; + + /** + * 查询快照列表 + */ + @PreAuthorize("@ss.hasPermi('bst:snapshot:list')") + @GetMapping("/list") + public TableDataInfo list(SnapshotQuery query) + { + startPage(); + startOrderBy(); + List list = snapshotService.selectSnapshotList(query); + return getDataTable(list); + } + + /** + * 导出快照列表 + */ + @PreAuthorize("@ss.hasPermi('bst:snapshot:export')") + @Log(title = "快照", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SnapshotQuery query) + { + List list = snapshotService.selectSnapshotList(query); + ExcelUtil util = new ExcelUtil(SnapshotVO.class); + util.exportExcel(response, list, "快照数据"); + } + + /** + * 获取快照详细信息 + */ + @PreAuthorize("@ss.hasPermi('bst:snapshot:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(snapshotService.selectSnapshotById(id)); + } + + /** + * 新增快照 + */ + @PreAuthorize("@ss.hasPermi('bst:snapshot:add')") + @Log(title = "快照", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody Snapshot snapshot) + { + return toAjax(snapshotService.insertSnapshot(snapshot)); + } + + /** + * 修改快照 + */ + @PreAuthorize("@ss.hasPermi('bst:snapshot:edit')") + @Log(title = "快照", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody Snapshot snapshot) + { + return toAjax(snapshotService.updateSnapshot(snapshot)); + } + + /** + * 删除快照 + */ + @PreAuthorize("@ss.hasPermi('bst:snapshot:remove')") + @Log(title = "快照", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(snapshotService.deleteSnapshotByIds(ids)); + } +} diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardController.java b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardController.java index f90c803..273854f 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardController.java @@ -17,6 +17,7 @@ import com.ruoyi.bst.refund.domain.enums.RefundStatus; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.dashboard.domain.dailyStat.DailyStatQuery; +import com.ruoyi.dashboard.domain.platformIncomeDaily.PlatformDailyIncomeQuery; import com.ruoyi.dashboard.domain.revenueStat.RevenueStatQuery; import com.ruoyi.dashboard.domain.stat.StatQuery; import com.ruoyi.dashboard.service.DashboardService; @@ -67,4 +68,12 @@ public class DashboardController extends BaseController { query.setScope(true); return success(dashboardService.selectRevenueStat(query)); } + + @ApiOperation("获取平台每日收益统计") + @PreAuthorize("@ss.hasAnyPermi('dashboard:platformDailyIncome')") + @GetMapping("/platformDailyIncome") + public AjaxResult getPlatformDailyIncome(PlatformDailyIncomeQuery query) { + return success(dashboardService.selectPlatformDailyIncome(query)); + } + } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardSnapshotController.java b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardSnapshotController.java new file mode 100644 index 0000000..a005880 --- /dev/null +++ b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardSnapshotController.java @@ -0,0 +1,46 @@ +package com.ruoyi.web.dashboard; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.ruoyi.bst.snapshot.domain.SnapshotQuery; +import com.ruoyi.bst.snapshot.domain.enums.SnapshotType; +import com.ruoyi.bst.snapshot.domain.vo.SnapshotDateVO; +import com.ruoyi.bst.snapshot.service.SnapshotService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.collection.CollectionUtils; + + +@RestController +@RequestMapping("/dashboard/snapshot") +public class DashboardSnapshotController extends BaseController { + + @Autowired + private SnapshotService snapshotService; + + /** + * 查询每日用户余额 + * @param param + * @return + */ + @GetMapping("/dailyUserBalance") + public AjaxResult dailyUserBalance(SnapshotQuery query) { + query.setType(SnapshotType.USER_BALANCE.getCode()); + List list = snapshotService.selectSimpleForDate(query); + if (query.getCreateDateRange() != null && query.getCreateDateRange().size() >= 2) { + list = CollectionUtils.fillVoids(list, SnapshotDateVO::getDate, (date) -> { + SnapshotDateVO vo = new SnapshotDateVO(); + vo.setDate(date); + vo.setValue("0"); + return vo; + },query.getCreateDateRange().get(0), query.getCreateDateRange().get(1)); + } + return success(list); + } + +} diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardWithdrawController.java b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardWithdrawController.java new file mode 100644 index 0000000..7812ef7 --- /dev/null +++ b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardWithdrawController.java @@ -0,0 +1,61 @@ +package com.ruoyi.web.dashboard; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.ruoyi.bst.withdraw.constants.WithdrawDailyKeys; +import com.ruoyi.bst.withdraw.domain.WithdrawQuery; +import com.ruoyi.bst.withdraw.domain.vo.WithdrawDailyStatVO; +import com.ruoyi.bst.withdraw.service.WithdrawDashboard; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.collection.CollectionUtils; + +import io.swagger.annotations.ApiModelProperty; + +@RestController +@RequestMapping("/dashboard/withdraw") +public class DashboardWithdrawController extends BaseController { + + @Autowired + private WithdrawDashboard withdrawDashboard; + + + @ApiModelProperty("获取每日提现统计") + @PreAuthorize("@ss.hasAnyPermi('dashboard:withdraw:daily')") + @GetMapping("/dailyWithdraw") + public AjaxResult getDailyWithdraw(WithdrawQuery query) { + query.setScope(true); + List list = withdrawDashboard.selectDailyStat( + query, + Arrays.asList( + WithdrawDailyKeys.CREATE_DATE, + WithdrawDailyKeys.WITHDRAW_SERVICE_CHARGE, + WithdrawDailyKeys.WITHDRAW_COUNT, + WithdrawDailyKeys.WITHDRAW_AMOUNT, + WithdrawDailyKeys.WITHDRAW_SUCCESS_AMOUNT + ) + ); + + if (query.getCreateDateRange() != null && query.getCreateDateRange().size() >= 2) { + list = CollectionUtils.fillVoids(list, WithdrawDailyStatVO::getDate, (date) -> { + WithdrawDailyStatVO vo = new WithdrawDailyStatVO(); + vo.setDate(date); + vo.setAmount(BigDecimal.ZERO); + vo.setSuccessAmount(BigDecimal.ZERO); + vo.setServiceCharge(BigDecimal.ZERO); + vo.setCount(0); + return vo; + }, query.getCreateDateRange().get(0), query.getCreateDateRange().get(1)); + } + + return success(list); + } +}