Browse Source

Merge branch 'milestone-20250702-金币重构一期' of http://39.101.133.168:8807/huangqizhen/gold-java into milestone-20250702-金币重构一期

lihuilin/hotfix-20250810160509-余额地区传参
lihuilin 1 month ago
parent
commit
945610e59a
  1. 24
      README.md
  2. 16
      src/main/java/com/example/demo/controller/ExportController.java
  3. 1
      src/main/java/com/example/demo/domain/vo/RefundAudit.java
  4. 22
      src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java
  5. 2
      src/main/java/com/example/demo/mapper/ConsumeMapper.java
  6. 2
      src/main/java/com/example/demo/service/WorkbenchService.java
  7. 2
      src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java
  8. 11
      src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java
  9. 63
      src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java
  10. 5
      src/main/resources/mapper/AuditMapper.xml
  11. 10
      src/main/resources/mapper/ConsumeMapper.xml
  12. 1
      src/main/resources/mapper/PermissionMapper.xml

24
README.md

@ -1,2 +1,24 @@
# gold-java
# Gold项目
## springBoot:3.3.6
## java :JDK21
## Maven:3.9.8
## Mysql:5.7.44 地址端口号:18.143.76.3:3306
### 测试 :数据库:正式 hwgold aDiw7MERSATdfGta 测试 hwgoldc zB48T55wCsHC8KPz
## 域名
### 测试:hwjb.homilychart.com
### 正式:

16
src/main/java/com/example/demo/controller/ExportController.java

@ -1,10 +1,12 @@
package com.example.demo.controller;
import com.example.demo.Util.BusinessException;
import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.RedisLockUtil;
import com.example.demo.domain.DTO.ConsumeDTO;
import com.example.demo.domain.DTO.RechargeDTO;
import com.example.demo.domain.DTO.RefundDTO;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.Export;
import com.example.demo.domain.vo.Result;
import com.example.demo.service.ExportExcelService;
@ -14,6 +16,7 @@ import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -42,12 +45,14 @@ public class ExportController {
@Autowired
private ExportService exportService;
@PostMapping("/export")
public Result export(@RequestBody Export Export)throws Exception{
public Result export(@Valid @RequestBody Export export, @RequestHeader("token") String token) throws Exception {
try {
return Result.success(exportExcelService.getExcel(Export));
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
export.setAccount(Integer.valueOf(token1.getUsername()));
return Result.success(exportExcelService.getExcel(export));
} catch (Exception e) {
log.error("导出失败", e.getMessage());
return Result.error("导出失败"+e.getMessage());
return Result.error("导出失败" + e.getMessage());
}
}
@PostMapping("/exportRecharge")
@ -90,11 +95,6 @@ public class ExportController {
String requestId = UUID.randomUUID().toString(); // 请求 ID防止误删锁
long expireTime = 5000; // 锁过期时间5秒s
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportConsume(dto);
} finally {
// 释放锁

1
src/main/java/com/example/demo/domain/vo/RefundAudit.java

@ -33,6 +33,7 @@ public class RefundAudit {
private Integer permanentGold; // 永久金币
private Integer freeGold; // 免费金币
private Integer freeJune; // 6月免费金币
private String refundType; //退款类型
private Integer freeDecember; // 12月免费金币
private Integer taskGold; // 任务金币
private String remark; // 备注

22
src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java

@ -31,21 +31,21 @@ public class WorkbenchMarketCard implements Serializable {
private Integer currentFree; // 免费金币余量currentFreeJune + currentFreeDecember
// 卡片二充值相关
private Integer recharge; // 日充值金币数
private Integer money; // 日金额永久金币
private Integer recharge; // 日充值金币数
private Integer money; // 日金额永久金币
private Integer yearlyRecharge; // 全年累计充值金币数
private Integer yearlyMoney; // 全年累计金额
// 卡片三当日消费/退款/消耗相关
private Integer consumePermanent; // 日新增消费永久
private Integer consumeFreeJune; // 日新增消费六月免费
private Integer consumeFreeDecember; // 日新增消费十二月免费
private Integer consumeTask; // 日新增消费任务
private Integer refundPermanent; // 日新增退款永久
private Integer refundFreeJune; // 日新增退款六月免费
private Integer refundFreeDecember; // 日新增退款十二月免费
private Integer refundTask; // 日新增退款任务
private Integer dailyReduce; // 日总消耗 = consumePermanent + consumeFreeJune + consumeFreeDecember + consumeTask - (refundPermanent + refundFreeJune + refundFreeDecember + refundTask)
private Integer consumePermanent; // 日新增消费永久
private Integer consumeFreeJune; // 日新增消费六月免费
private Integer consumeFreeDecember; // 日新增消费十二月免费
private Integer consumeTask; // 日新增消费任务
private Integer refundPermanent; // 日新增退款永久
private Integer refundFreeJune; // 日新增退款六月免费
private Integer refundFreeDecember; // 日新增退款十二月免费
private Integer refundTask; // 日新增退款任务
private Integer dailyReduce; // 日总消耗 = consumePermanent + consumeFreeJune + consumeFreeDecember + consumeTask - (refundPermanent + refundFreeJune + refundFreeDecember + refundTask)
private Integer yearlyConsume; // 全年累计消费
private Integer yearlyRefund; // 全年累计退款金币数
private Integer yearlyReduce; // 全年累计消耗金币数 = yearlyConsume - yearlyRefund

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

@ -25,4 +25,6 @@ public interface ConsumeMapper {
void add(UserGoldRecord userGoldRecord);
void updateIsRefund(String orderCode);
List<ConsumeUser> selectOrderCodeByJwcode(String jwcode,String orderCode);
}

2
src/main/java/com/example/demo/service/WorkbenchService.java

@ -22,7 +22,7 @@ public interface WorkbenchService {
//获取不同地区的工作台统计卡片
WorkbenchCard getCard(String token);
//获取卡片数据
WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics statistics, Date yearlyStartDate, Date currentDate);
WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics currentStatistics,Statistics ydayStatistics, Date yearlyStartDate, Date currentDate);
//获取不同地区的工作台柱状图数据根据类型起止时间地区查询
WorkbenchCard getGraph(String token, Date startDate, Date endDate, List<String> markets);
//根据类型获取年初至今的统计数据

2
src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java

@ -46,7 +46,7 @@ public class AuditServiceImpl implements AuditService {
updateOrder.setAuditStatus(2);
updateOrder.setRejectReason(rejectReason);
updateOrder.setAuditTime(new Date());
auditMapper.updateOrder(updateOrder);
if (order.getType()==2) { //退款
//2.获取对应的消费订单退款订单号去掉开头"TK"即为对应消费订单
String consumeOrderCode = order.getOrderCode().replaceFirst("TK", "");

11
src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java

@ -90,13 +90,14 @@ public class RefundServiceImpl implements RefundService {
List<RefundUser> refundUsers = refundMapper.selectBy(refundUser);
return new PageInfo<>(refundUsers);
}
@Transactional
@Override
public Result add(RefundUser refundUser) {
if(refundUser.getTaskGold()==null||refundUser.getFreeGold()==null||refundUser.getPermanentGold()==null){
if (refundUser.getTaskGold() == null || refundUser.getFreeGold() == null || refundUser.getPermanentGold() == null) {
return Result.error("金币不能为空");
}
if(refundUser.getTaskGold()<0||refundUser.getFreeGold()<0||refundUser.getPermanentGold()<0){
if (refundUser.getTaskGold() < 0 || refundUser.getFreeGold() < 0 || refundUser.getPermanentGold() < 0) {
return Result.error("金币不能为负数");
}
UserGoldRecord userGoldRecord = new UserGoldRecord();
@ -141,6 +142,10 @@ public class RefundServiceImpl implements RefundService {
userGoldRecord.setType((byte) 2);
userGoldRecord.setAuditStatus(0);
userGoldRecord.setCreateTime(new Date());
List<ConsumeUser> list = consumeMapper.selectOrderCodeByJwcode(userGoldRecord.getJwcode().toString(), orderCode);
if (list == null || list.isEmpty()) {
return Result.error("该用户没有该订单号");
}
refundMapper.add(userGoldRecord);
consumeMapper.updateIsRefund(orderCode);
return Result.success();
@ -172,7 +177,7 @@ public class RefundServiceImpl implements RefundService {
String combined = orderCode + "_" + goodsName;
RefundUser refundUser = new RefundUser();
refundUser.setGoodsName(combined);
refundUser.setSumGold(record.getPermanentGold()+record.getFreeGold()+record.getTaskGold());
refundUser.setSumGold(record.getPermanentGold() + record.getFreeGold() + record.getTaskGold());
refundUser.setPermanentGold(record.getPermanentGold());
refundUser.setFreeGold(record.getFreeGold());
refundUser.setTaskGold(record.getTaskGold());

63
src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java

@ -40,14 +40,20 @@ public class WorkbenchServiceImpl implements WorkbenchService {
private StatisticsMapper statisticsMapper;
@Override
public WorkbenchCard getCard(String token) {
Date date=new Date();
Date date=new Date();//当天
Date yday=generalService.getYesterday();
// 获取开始时间和结束时间当天
LocalDateTime startOfDay = date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
.with(LocalTime.MIN);
LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1);
// 获取开始时间和结束时间当天
LocalDateTime startOfYday = yday.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
.with(LocalTime.MIN);
LocalDateTime endOfYday = startOfYday.plusDays(1).minusSeconds(1);
// 获取当前日期
LocalDate today = LocalDate.now();
// 获取当前年份的第一天
@ -61,13 +67,18 @@ public class WorkbenchServiceImpl implements WorkbenchService {
.filter(market -> market != null && !market.trim().isEmpty())
.map(market -> {
// 根据市场名称和日期范围查询统计信息
Statistics statistics = statisticsMapper.selectByMarketAndDate(
Statistics currentStatistics = statisticsMapper.selectByMarketAndDate(
market,
Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()),
Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant())
);
Statistics ydayStatistics = statisticsMapper.selectByMarketAndDate(
market,
Date.from(startOfYday.atZone(ZoneId.systemDefault()).toInstant()),
Date.from(endOfYday.atZone(ZoneId.systemDefault()).toInstant())
);
// 创建并返回市场卡片对象
return createWorkbenchMarketCard(market, statistics, yearlyStartDate, date);
return createWorkbenchMarketCard(market, currentStatistics,ydayStatistics, yearlyStartDate, date);
})
// 收集并行流结果为列表
.collect(Collectors.toList());
@ -137,48 +148,48 @@ public class WorkbenchServiceImpl implements WorkbenchService {
获取卡片数据
*/
@Override
public WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics statistics, Date yearlyStartDate, Date currentDate) {
public WorkbenchMarketCard createWorkbenchMarketCard(String market,Statistics currentStatistics, Statistics ydayStatistics, Date yearlyStartDate, Date currentDate) {
Date date=new Date();
WorkbenchMarketCard card = new WorkbenchMarketCard();
card.setMarket(market);
if (statistics != null) {
if (currentStatistics != null&& ydayStatistics != null) {
// 一次性获取全年统计数据从年初到今天
Map<String, Integer> yearlyStats = calculateAllSum(market, yearlyStartDate, date);
// 卡片一当前金币相关
card.setCurrentPermanent(statistics.getCurrentPermanent());//余量-永久金币
card.setCurrentFreeJune(statistics.getCurrentFreeJune()); //余量-免费六月金币
card.setCurrentFreeDecember(statistics.getCurrentFreeDecember()); //余量-免费十二月金币
card.setCurrentTask(statistics.getCurrentTask()); //余量-任务金币
card.setCurrentPermanent(currentStatistics.getCurrentPermanent());//余量-永久金币
card.setCurrentFreeJune(currentStatistics.getCurrentFreeJune()); //余量-免费六月金币
card.setCurrentFreeDecember(currentStatistics.getCurrentFreeDecember()); //余量-免费十二月金币
card.setCurrentTask(currentStatistics.getCurrentTask()); //余量-任务金币
card.setCurrentFree(card.getCurrentFreeJune() + card.getCurrentFreeDecember()); //余量-免费金币
card.setCurrentGold(card.getCurrentPermanent() + card.getCurrentFree() + card.getCurrentTask()); //余量-总金币
card.setDailyChange(statistics.getDailyChange()); //较前一日变化
card.setDailyChange(currentStatistics.getDailyChange()); //较前一日变化
// 卡片二充值相关
card.setRecharge(statistics.getRecharge()); //充值-日充值
card.setMoney(statistics.getMoney()); //充值-日金额永久
card.setRecharge(ydayStatistics.getRecharge()); //充值-日充值
card.setMoney(ydayStatistics.getMoney()); //充值-日金额永久
card.setYearlyRecharge(yearlyStats.getOrDefault("recharge", 0)); // 充值-全年累计充值
card.setYearlyMoney(yearlyStats.getOrDefault("money", 0)); // 充值-全年累计金额永久//充值-全年累计金额永久
// 卡片三消费与退款
card.setConsumePermanent(statistics.getConsumePermanent());//消费-永久金币
card.setConsumeFreeJune(statistics.getConsumeFreeJune());//消费-免费六月金币
card.setConsumeFreeDecember(statistics.getConsumeFreeDecember());//消费-免费十二月金币
card.setConsumeTask(statistics.getConsumeTask());//消费-任务金币
card.setRefundPermanent(statistics.getRefundPermanent());//退款-永久金币
card.setRefundFreeJune(statistics.getRefundFreeJune());//退款-免费六月金币
card.setRefundFreeDecember(statistics.getRefundFreeDecember());//退款-免费十二月金币
card.setRefundTask(statistics.getRefundTask());//退款-任务金币
//日总消费
card.setConsumePermanent(ydayStatistics.getConsumePermanent());//昨日消费-永久金币
card.setConsumeFreeJune(ydayStatistics.getConsumeFreeJune());//昨日消费-免费六月金币
card.setConsumeFreeDecember(ydayStatistics.getConsumeFreeDecember());//昨日消费-免费十二月金币
card.setConsumeTask(ydayStatistics.getConsumeTask());//昨日消费-任务金币
card.setRefundPermanent(ydayStatistics.getRefundPermanent());//昨日退款-永久金币
card.setRefundFreeJune(ydayStatistics.getRefundFreeJune());//昨日退款-免费六月金币
card.setRefundFreeDecember(ydayStatistics.getRefundFreeDecember());//昨日退款-免费十二月金币
card.setRefundTask(ydayStatistics.getRefundTask());//昨日退款-任务金币
//日总消费
int totalConsume = card.getConsumePermanent() + card.getConsumeFreeJune() + card.getConsumeFreeDecember() + card.getConsumeTask();
//日总退款
//日总退款
int totalRefund = card.getRefundPermanent() + card.getRefundFreeJune() + card.getRefundFreeDecember() + card.getRefundTask();
card.setDailyReduce(totalConsume - totalRefund);//日总消耗
card.setDailyReduce(totalConsume - totalRefund);//日总消耗
card.setYearlyConsume(yearlyStats.getOrDefault("consume", 0)); // 年累计消费
card.setYearlyRefund(yearlyStats.getOrDefault("refund", 0)); // 年累计退款
card.setYearlyReduce(card.getYearlyConsume() - card.getYearlyRefund());//年累计消耗
// 卡片四人头数相关
card.setRechargeNum(statistics.getRechargeNum());
card.setFirstRecharge(statistics.getFirstRecharge());
card.setRechargeNum(currentStatistics.getRechargeNum());
card.setFirstRecharge(currentStatistics.getFirstRecharge());
card.setYearlyRechargeNum(yearlyStats.getOrDefault("rechargeNum", 0));

5
src/main/resources/mapper/AuditMapper.xml

@ -9,6 +9,8 @@
reject_reason = #{rejectReason},
audit_time = #{auditTime}
where order_code = #{orderCode}
order by create_time DESC
limit 1
</update>
<!--更新用户余额-->
<update id="updateUserGold">
@ -34,6 +36,8 @@
<select id="selectOrderByOrderCode" resultType="com.example.demo.domain.entity.UserGoldRecord">
select * from user_gold_record where order_code = #{orderCode}
ORDER BY create_time DESC
limit 1
</select>
<!--多条件查询充值审核订单-->
<select id="selectRechargeBy" resultType="com.example.demo.domain.vo.RechargeAudit">
@ -47,7 +51,6 @@
LEFT JOIN user u ON ugr.jwcode = u.jwcode
LEFT JOIN admin a1 ON ugr.admin_id = a1.id
LEFT JOIN admin a2 ON ugr.audit_id = a2.id
<where>
<if test="rechargeAudit.jwcode != null and rechargeAudit.jwcode != ''">
AND ugr.jwcode = #{rechargeAudit.jwcode}

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

@ -131,6 +131,16 @@
</trim>
</select>
<select id="selectOrderCodeByJwcode" resultType="com.example.demo.domain.vo.ConsumeUser">
SELECT
ugr.jwcode AS jwcode,
ugr.order_code AS orderCode
FROM user_gold_record ugr
where
ugr.order_code = #{orderCode}
AND ugr.jwcode = #{jwcode}
</select>
<insert id="add" parameterType="com.example.demo.domain.entity.UserGoldRecord" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user_gold_record
<trim prefix="(" suffix=")" suffixOverrides=",">

1
src/main/resources/mapper/PermissionMapper.xml

@ -56,6 +56,7 @@
admin.postiton=#{postiton}
</if>
</where>
order by admin.admin_status desc
</select>
<select id="getRole" resultType="com.example.demo.domain.entity.Role">
select * from role

Loading…
Cancel
Save