Browse Source

8月18日数据库金币统计优化

lijianlin/feature-20250728171217-三期金豆消费相关
sunjiabei 4 days ago
parent
commit
68e6616850
  1. 1
      src/main/java/com/example/demo/controller/coin/ConsumeController.java
  2. 75
      src/main/java/com/example/demo/domain/vo/coin/HistoryRecord.java
  3. 2
      src/main/java/com/example/demo/mapper/coin/ConsumeMapper.java
  4. 22
      src/main/java/com/example/demo/mapper/coin/HistoryRecordMapper.java
  5. 3
      src/main/java/com/example/demo/mapper/coin/RechargeMapper.java
  6. 2
      src/main/java/com/example/demo/mapper/coin/RefundMapper.java
  7. 14
      src/main/java/com/example/demo/service/coin/HistoryRecordService.java
  8. 30
      src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java
  9. 16
      src/main/java/com/example/demo/serviceImpl/coin/HistoryRecordServiceImpl.java
  10. 24
      src/main/java/com/example/demo/serviceImpl/coin/RechargeServiceImpl.java
  11. 31
      src/main/java/com/example/demo/serviceImpl/coin/RefundServiceImpl.java
  12. 31
      src/main/resources/jindouMapper/BeanRechargeMapper2.xml
  13. 42
      src/main/resources/mapper/ConsumeMapper.xml
  14. 42
      src/main/resources/mapper/RechargeMapper.xml
  15. 45
      src/main/resources/mapper/RefundMapper.xml
  16. 31
      src/main/resources/paymapper/BeanRechargeMapper3.xml
  17. 8
      src/main/resources/sqlServiceMapper/HistoryRecordMapper.xml

1
src/main/java/com/example/demo/controller/coin/ConsumeController.java

@ -126,6 +126,7 @@ public class ConsumeController {
Gold gold = consumeService.statsGold(consumeUser);
return Result.success(gold);
} catch (Exception e) {
e.printStackTrace();
return Result.error("请检查数据的格式");
}
}

75
src/main/java/com/example/demo/domain/vo/coin/HistoryRecord.java

@ -0,0 +1,75 @@
package com.example.demo.domain.vo.coin;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @program: gold-java
* @ClassName HistoryRecord
* @description:
* @author: Double
* @create: 202508-18 13:42
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HistoryRecord implements Serializable {
private static final long serialVersionUID = 1L;
@ExcelProperty("客户姓名")
private String name; // 客户姓名
@ExcelProperty("精网号")
private Integer jwcode; // 精网号
@ExcelProperty("所属地区")
private String market; // 所属地区
@ExcelProperty("商品名称")
private String goodsName; // 商品名称
@ExcelProperty("消费平台")
private String payPlatform; // 消费平台
@ExcelProperty("金币总数")
private BigDecimal sumGold; // 金币总数
@ExcelProperty("永久金币")
private BigDecimal permanentGold; // 永久金币
@ExcelProperty("免费金币")
private BigDecimal freeGold; // 免费金币
@ExcelProperty("任务金币")
private BigDecimal taskGold; // 任务金币
@ExcelProperty("备注")
private String remark; // 备注
@ExcelProperty("提交人ID")
private Integer adminId; //提交人Id
@ExcelProperty("提交人姓名")
private String adminName; //提交人姓名
@ExcelProperty("是否退款")
private Integer isRefund; //是否退款
@ExcelProperty("消费时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; // 消费时间
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startTime; // 开始时间
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间
@ExcelIgnore
private String sortField; //排序字段
@ExcelIgnore
private String sortOrder; //排序顺序
@ExcelIgnore
private List<String> markets; // 地区列表
@ExcelProperty
private Integer flag; //是否为员工号
}

2
src/main/java/com/example/demo/mapper/coin/ConsumeMapper.java

@ -2,6 +2,7 @@ package com.example.demo.mapper.coin;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.coin.ConsumeUser;
import com.example.demo.domain.vo.coin.Gold;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@ -36,4 +37,5 @@ public interface ConsumeMapper {
void updateUserGold(UserGoldRecord userGoldRecord);
Gold sumGold(ConsumeUser consumeUser);
}

22
src/main/java/com/example/demo/mapper/coin/HistoryRecordMapper.java

@ -0,0 +1,22 @@
package com.example.demo.mapper.coin;
import com.example.demo.domain.vo.coin.HistoryRecord;
import java.util.List;
/**
* @program: gold-java
* @ClassName HistoryRecordMapper
* @description:
* @author: Double
* @create: 202508-18 13:41
* @Version 1.0
**/
public interface HistoryRecordMapper {
//获取旧的历史记录
List<HistoryRecord> getOldHistoryRecord(HistoryRecord historyRecord);
//获取新的历史记录
List<HistoryRecord> getNewHistoryRecord(HistoryRecord historyRecord);
}

3
src/main/java/com/example/demo/mapper/coin/RechargeMapper.java

@ -2,6 +2,7 @@ package com.example.demo.mapper.coin;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.RechargeUser;
import com.example.demo.domain.vo.coin.RefundUser;
import org.apache.ibatis.annotations.Mapper;
@ -25,4 +26,6 @@ public interface RechargeMapper {
List<RechargeUser> selectBy(RechargeUser rechargeUser);
//添加充值订单
void add(UserGoldRecord userGoldRecord);
Gold sumGold(RechargeUser rechargeUser);
}

2
src/main/java/com/example/demo/mapper/coin/RefundMapper.java

@ -2,6 +2,7 @@ package com.example.demo.mapper.coin;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.coin.ConsumeUser;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.RefundUser;
import org.apache.ibatis.annotations.Mapper;
@ -34,4 +35,5 @@ public interface RefundMapper {
//获取商品
List<RefundUser> selectGoods(Integer jwcode);
Gold sumGold(RefundUser refundUser);
}

14
src/main/java/com/example/demo/service/coin/HistoryRecordService.java

@ -0,0 +1,14 @@
package com.example.demo.service.coin;
/**
@program: gold-java
@ClassName HistorySelectService
@description:
@author: Double
@create: 202508-18 13:37
@Version 1.0
**/
public interface HistoryRecordService {
}

30
src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java

@ -67,35 +67,7 @@ public class ConsumeServiceImpl implements ConsumeService {
markets=null;
}
consumeUser.setMarkets(markets);
Gold gold = new Gold();
List<ConsumeUser> consumeUsers = consumeMapper.selectBy(consumeUser);
// 初始化累加器
BigDecimal permanentGoldSum = BigDecimal.valueOf(0);
BigDecimal freeGoldSum = BigDecimal.valueOf(0);
BigDecimal taskGoldSum = BigDecimal.valueOf(0);
// 遍历消费记录并累加金币
for (ConsumeUser user : consumeUsers) {
// 累加永久金币
if (user.getPermanentGold() != null) {
permanentGoldSum = permanentGoldSum.add(user.getPermanentGold());
}
// 累加免费金币
if (user.getFreeGold() != null) {
freeGoldSum = freeGoldSum.add(user.getFreeGold());
}
// 累加任务金币
if (user.getTaskGold() != null) {
taskGoldSum = taskGoldSum.add(user.getTaskGold());
}
}
// 将累加结果设置到Gold对象
gold.setPermanentGolds(permanentGoldSum);
gold.setFreeGolds(freeGoldSum);
gold.setTaskGolds(taskGoldSum);
Gold gold = consumeMapper.sumGold(consumeUser);
return gold;
}

16
src/main/java/com/example/demo/serviceImpl/coin/HistoryRecordServiceImpl.java

@ -0,0 +1,16 @@
package com.example.demo.serviceImpl.coin;
import com.example.demo.service.coin.HistoryRecordService;
/**
* @program: gold-java
* @ClassName HistorySelect
* @description:
* @author: Double
* @create: 202508-18 13:37
* @Version 1.0
**/
public class HistoryRecordServiceImpl implements HistoryRecordService {
}

24
src/main/java/com/example/demo/serviceImpl/coin/RechargeServiceImpl.java

@ -81,29 +81,7 @@ public class RechargeServiceImpl implements RechargeService {
}
rechargeUser.setMarkets(markets);
Gold gold = new Gold();
List<RechargeUser> rechargeUsers = rechargeMapper.selectBy(rechargeUser);
// 初始化累加器
BigDecimal permanentGoldSum = new BigDecimal(0);
BigDecimal freeGoldSum = new BigDecimal(0);
// 遍历充值记录并累加金币
for (RechargeUser user : rechargeUsers) {
// 累加永久金币
if (user.getPermanentGold() != null) {
permanentGoldSum = permanentGoldSum.add(user.getPermanentGold());
}
// 累加免费金币
if (user.getFreeGold() != null) {
freeGoldSum = freeGoldSum.add(user.getFreeGold());
}
}
// 将累加结果设置到Gold对象
gold.setPermanentGolds(permanentGoldSum);
gold.setFreeGolds(freeGoldSum);
Gold gold = rechargeMapper.sumGold(rechargeUser);
return gold;
}

31
src/main/java/com/example/demo/serviceImpl/coin/RefundServiceImpl.java

@ -65,36 +65,7 @@ public class RefundServiceImpl implements RefundService {
markets = null;
}
refundUser.setMarkets(markets);
Gold gold = new Gold();
List<RefundUser> refundUsers = refundMapper.selectBy(refundUser);
// 初始化累加器
BigDecimal permanentGoldSum = BigDecimal.valueOf(0);
BigDecimal freeGoldSum = BigDecimal.valueOf(0);
BigDecimal taskGoldSum = BigDecimal.valueOf(0);
// 遍历退款记录并累加金币
for (RefundUser user : refundUsers) {
// 累加永久金币
if (user.getPermanentGold() != null) {
permanentGoldSum = permanentGoldSum.add(user.getPermanentGold());
}
// 累加免费金币
if (user.getFreeGold() != null) {
freeGoldSum = freeGoldSum.add(user.getFreeGold());
}
// 累加任务金币
if (user.getTaskGold() != null) {
taskGoldSum = taskGoldSum.add(user.getTaskGold());
}
}
// 将累加结果设置到Gold对象
gold.setPermanentGolds(permanentGoldSum);
gold.setFreeGolds(freeGoldSum);
gold.setTaskGolds(taskGoldSum);
Gold gold = refundMapper.sumGold(refundUser);
return gold;
}

31
src/main/resources/jindouMapper/BeanRechargeMapper2.xml

@ -81,36 +81,5 @@
AND FROM_UNIXTIME(f.time) BETWEEN #{startTime} AND #{endTime}
</if>
</where>
<trim prefix="ORDER BY" suffixOverrides=",">
<choose>
<!-- 当指定排序字段时使用指定字段排序 -->
<when test="sortField != null and sortField != ''">
<choose>
<!-- 对金币数量的排序处理 -->
<when test="sortField == 'permanentBean'">f.money_buy</when>
<when test="sortField == 'freeBean'">f.money_free</when>
<!-- 对时间字段的排序处理 -->
<when test="sortField == 'rechargeTime'">f.time</when>
<!-- 其他字段不支持排序,使用默认排序 -->
<otherwise>f.time</otherwise>
</choose>
<!-- 排序方向处理 -->
<if test="sortOrder != null and sortOrder != ''">
<choose>
<when test="sortOrder == 'ASC'">ASC</when>
<when test="sortOrder == 'DESC'">DESC</when>
<otherwise>DESC</otherwise>
</choose>
</if>
<if test="sortOrder == null or sortOrder == ''">
DESC
</if>
</when>
<!-- 未指定排序字段时,使用默认的时间降序排序 -->
<otherwise>
f.time DESC
</otherwise>
</choose>
</trim>
</select>
</mapper>

42
src/main/resources/mapper/ConsumeMapper.xml

@ -158,6 +158,48 @@
</trim>
</select>
<!-- 查询筛选后消费记录 -->
<select id="sumGold" resultType="com.example.demo.domain.vo.coin.Gold">
SELECT
SUM(ugr.sum_gold)/100 AS sumGolds,
SUM(ugr.permanent_gold)/100 AS permanentGolds,
sum(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0))/100 AS freeGolds,
SUM(ugr.task_gold)/100 AS taskGolds,
count(ugr.id) AS totalNum
FROM user_gold_record ugr
left JOIN
user u ON u.jwcode = ugr.jwcode
left join market m ON u.market = m.id
<where>
ugr.type = 1 AND ugr.flag = 1
<if test="markets != null and markets.size() > 0">
AND u.market IN
<foreach collection="markets" item="market" open="(" separator="," close=")">
#{market}
</foreach>
</if>
<if test="flag != 0">
AND u.flag = 1
</if>
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}
</if>
<if test="goodsName != null and goodsName != ''">
AND ugr.goods_name = #{goodsName}
</if>
<if test="market != null and market != ''">
AND u.market = #{market}
</if>
<if test="payPlatform != null and payPlatform != ''">
AND ugr.pay_platform = #{payPlatform}
</if>
<if test="startTime != null and endTime != null">
AND ugr.create_time BETWEEN #{startTime} AND #{endTime}
</if>
</where>
</select>
<select id="selectOrderCodeByJwcode" resultType="com.example.demo.domain.vo.coin.ConsumeUser">
SELECT ugr.jwcode AS jwcode,
ugr.order_code AS orderCode,

42
src/main/resources/mapper/RechargeMapper.xml

@ -161,6 +161,48 @@
</trim>
</select>
<!-- 查询筛选后充值记录 -->
<select id="sumGold" resultType="com.example.demo.domain.vo.coin.Gold">
SELECT
sum(ugr.money)/100 AS money,
sum(ugr.permanent_gold)/100 AS permanentGolds,
sum(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0))/100 AS freeGolds,
count(ugr.id) AS totalNum
FROM user_gold_record ugr
left JOIN user u ON u.jwcode = ugr.jwcode
left join market m ON u.market = m.id
<where>
ugr.type = 0 AND ugr.audit_status IN (1,3)
AND ugr.flag = 1
<!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="markets != null and markets.size() > 0">
AND u.market IN
<foreach collection="markets" item="market" open="(" separator="," close=")">
#{market}
</foreach>
</if>
<if test="flag != 0">
AND u.flag = 1
</if>
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}
</if>
<if test="activity != null and activity != ''">
AND ugr.activity = #{activity}
</if>
<if test="market != null and market != ''">
AND u.market = #{market}
</if>
<if test="payPlatform != null and payPlatform != ''">
AND ugr.pay_platform = #{payPlatform}
</if>
<if test="startTime != null and endTime != null">
AND ugr.audit_time BETWEEN #{startTime} AND #{endTime}
</if>
</where>
</select>
<insert id="add" parameterType="com.example.demo.domain.entity.UserGoldRecord" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user_gold_record
<trim prefix="(" suffix=")" suffixOverrides=",">

45
src/main/resources/mapper/RefundMapper.xml

@ -168,6 +168,51 @@
</trim>
</select>
<!-- 查询筛选后消费记录 -->
<select id="sumGold" resultType="com.example.demo.domain.vo.coin.Gold">
SELECT
SUM(ugr.sum_gold)/100 AS sumGold,
SUM(ugr.permanent_gold)/100 AS permanentGold,
SUM(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0))/100 AS freeGold,
SUM(ugr.task_gold)/100 AS taskGold,
count(ugr.id) AS totalNum
FROM user_gold_record ugr
left JOIN
user u ON u.jwcode = ugr.jwcode
left join market m ON u.market = m.id
<where>
ugr.type = 2 AND ugr.audit_status IN (1,3) AND ugr.flag = 1
<!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="markets != null and markets.size() > 0">
AND u.market IN
<foreach collection="markets" item="market" open="(" separator="," close=")">
#{market}
</foreach>
</if>
<if test="flag != 0">
AND u.flag = 1
</if>
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}
</if>
<if test="goodsName != null and goodsName != ''">
AND ugr.goods_name = #{goodsName}
</if>
<if test="market != null and market != ''">
AND u.market = #{market}
</if>
<if test="refundModel != null and refundModel != ''">
AND ugr.refund_model = #{refundModel}
</if>
<if test="refundType != null and refundType != ''">
AND ugr.refund_type = #{refundType}
</if>
<if test="startTime != null and endTime != null">
AND ugr.audit_time BETWEEN #{startTime} AND #{endTime}
</if>
</where>
</select>
<insert id="add" parameterType="com.example.demo.domain.entity.UserGoldRecord" useGeneratedKeys="true"
keyProperty="id">
INSERT INTO user_gold_record

31
src/main/resources/paymapper/BeanRechargeMapper3.xml

@ -92,36 +92,5 @@
AND FROM_UNIXTIME(g.add_time) BETWEEN #{startTime} AND #{endTime}
</if>
</where>
<trim prefix="ORDER BY" suffixOverrides=",">
<choose>
<!-- 当指定排序字段时使用指定字段排序 -->
<when test="sortField != null and sortField != ''">
<choose>
<!-- 对金币数量的排序处理 -->
<when test="sortField == 'num'">g.count</when>
<when test="sortField == 'money'">g.price</when>
<!-- 对时间字段的排序处理 -->
<when test="sortField == 'rechargeTime'">g.add_time</when>
<!-- 其他字段不支持排序,使用默认排序 -->
<otherwise>g.add_time</otherwise>
</choose>
<!-- 排序方向处理 -->
<if test="sortOrder != null and sortOrder != ''">
<choose>
<when test="sortOrder == 'ASC'">ASC</when>
<when test="sortOrder == 'DESC'">DESC</when>
<otherwise>DESC</otherwise>
</choose>
</if>
<if test="sortOrder == null or sortOrder == ''">
DESC
</if>
</when>
<!-- 未指定排序字段时,使用默认的时间降序排序 -->
<otherwise>
g.add_time DESC
</otherwise>
</choose>
</trim>
</select>
</mapper>

8
src/main/resources/sqlServiceMapper/HistoryRecordMapper.xml

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.coin.HistoryRecordMapper">
<select id="getOldHistoryRecord" resultType="com.example.demo.domain.vo.coin.HistoryRecord">
</select>
<select id="getNewHistoryRecord" resultType="com.example.demo.domain.vo.coin.HistoryRecord">
</select>
</mapper>
Loading…
Cancel
Save