From 328ba81892349e09d21c4806298c1d7db27298e9 Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期五, 18 九月 2026 13:53:29 +0800
Subject: [PATCH] bug:统计数据修改
---
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java | 211 +++++++++++++++++++++++++-----
cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java | 6
cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/GameDataQuery.java | 2
cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java | 22 ++
cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/GameDataQuery.java | 2
cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java | 72 +++++-----
cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/storeIncome.html | 16 +
cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java | 3
cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java | 6
cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/operatorIncome.html | 16 +
cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/platformIncome.html | 42 +++++
cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java | 3
12 files changed, 306 insertions(+), 95 deletions(-)
diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java
index cda182d..3e0b04e 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java
@@ -1109,10 +1109,11 @@
if (ToolUtil.isNotEmpty(data)) {
String stime = data.split(" - ")[0] + " 00:00:00";
String etime = data.split(" - ")[1] + " 23:59:59";
- vipPaymentLambdaQueryWrapper.between(VipPayment::getInsertTime, stime, etime);
+ vipPaymentLambdaQueryWrapper.between(VipPayment::getPayTime, stime, etime);
}
vipPaymentLambdaQueryWrapper.in(VipPayment::getAppUserId, ids);
vipPaymentLambdaQueryWrapper.eq(VipPayment::getPayStatus, 2);
+ vipPaymentLambdaQueryWrapper.eq(VipPayment::getState, 1);
List<VipPayment> list = vipPaymentService.list(vipPaymentLambdaQueryWrapper);
double sum = list.stream().mapToDouble(VipPayment::getAmount).sum();
@@ -1122,10 +1123,11 @@
if (ToolUtil.isNotEmpty(data)) {
String stime = data.split(" - ")[0] + " 00:00:00";
String etime = data.split(" - ")[1] + " 23:59:59";
- rechargeRecordsLambdaQueryWrapper.between(RechargeRecords::getInsertTime, stime, etime);
+ rechargeRecordsLambdaQueryWrapper.between(RechargeRecords::getPayTime, stime, etime);
}
rechargeRecordsLambdaQueryWrapper.in(RechargeRecords::getAppUserId, ids);
rechargeRecordsLambdaQueryWrapper.eq(RechargeRecords::getPayStatus, 2);
+ rechargeRecordsLambdaQueryWrapper.eq(RechargeRecords::getState, 1);
List<RechargeRecords> list1 = rechargeRecordsService.list(rechargeRecordsLambdaQueryWrapper);
double sum1 = list1.stream().map(RechargeRecords::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add).doubleValue();
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
index 4a0f1d5..5121290 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
@@ -31,6 +31,7 @@
import javax.annotation.Resource;
import javax.xml.crypto.Data;
+import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
@@ -2174,13 +2175,16 @@
public HashMap<String, Object> queryFee(@RequestBody QueryDataFee queryDataFee) {
HashMap<String, Object> map = new HashMap<>();
String data = queryDataFee.getData();
- List<Integer> ids = queryDataFee.getIds();
+ List<Integer> ids = queryDataFee.getIds() == null
+ ? new ArrayList<>() : new ArrayList<>(queryDataFee.getIds());
if (ids.size() == 0) {
ids.add(-1);
- } else {
-
}
- List<PointsMerchandise> list1 = pmdsService.list(new LambdaQueryWrapper<PointsMerchandise>().eq(PointsMerchandise::getRedemptionMethod, 3));
+ // 只查询门票商品(type=3),并按购买记录关联的商品 ID 统计。
+ // 旧逻辑会对每一笔订单遍历全部门票商品,导致日/月/季/年卡被重复累加。
+ List<PointsMerchandise> tickets = pmdsService.list(new LambdaQueryWrapper<PointsMerchandise>()
+ .eq(PointsMerchandise::getRedemptionMethod, 3)
+ .eq(PointsMerchandise::getType, 3));
LambdaQueryWrapper<UserPointsMerchandise> vipPaymentLambdaQueryWrapper = new LambdaQueryWrapper<>();
if (ToolUtil.isNotEmpty(data)) {
String stime = data.split(" - ")[0] + " 00:00:00";
@@ -2188,48 +2192,46 @@
vipPaymentLambdaQueryWrapper.between(UserPointsMerchandise::getInsertTime, stime, etime);
}
vipPaymentLambdaQueryWrapper.in(UserPointsMerchandise::getUserId, ids);
- List<Integer> collect = list1.stream().map(PointsMerchandise::getId).collect(Collectors.toList());
+ List<Integer> collect = tickets.stream().map(PointsMerchandise::getId).collect(Collectors.toList());
if (collect.size() == 0) {
collect.add(-1);
}
vipPaymentLambdaQueryWrapper.in(UserPointsMerchandise::getPointsMerchandiseId, collect);
vipPaymentLambdaQueryWrapper.eq(UserPointsMerchandise::getPayStatus, 2);
- ArrayList<Integer> objects = new ArrayList<>();
+ vipPaymentLambdaQueryWrapper.and(wrapper -> wrapper.isNull(UserPointsMerchandise::getState)
+ .or().eq(UserPointsMerchandise::getState, 1));
List<UserPointsMerchandise> list = upmseService.list(vipPaymentLambdaQueryWrapper);
- double a = 0;
- double d = 0;
- double m = 0;
- double j = 0;
- double y = 0;
+ Map<Integer, PointsMerchandise> ticketMap = tickets.stream()
+ .collect(Collectors.toMap(PointsMerchandise::getId, ticket -> ticket, (first, ignored) -> first));
+ BigDecimal all = BigDecimal.ZERO;
+ BigDecimal day = BigDecimal.ZERO;
+ BigDecimal month = BigDecimal.ZERO;
+ BigDecimal quarter = BigDecimal.ZERO;
+ BigDecimal year = BigDecimal.ZERO;
for (UserPointsMerchandise userPointsMerchandise : list) {
- for (PointsMerchandise pointsMerchandise : list1) {
- if (pointsMerchandise.getId() == userPointsMerchandise.getPointsMerchandiseId()) {
- a += pointsMerchandise.getCash().doubleValue();
- }
- if (pointsMerchandise.getType() == 3) {
- if (pointsMerchandise.getCardType() == 1) {
- d += pointsMerchandise.getCash().doubleValue();
- }
- if (pointsMerchandise.getCardType() == 2) {
- m += pointsMerchandise.getCash().doubleValue();
- }
- if (pointsMerchandise.getCardType() == 3) {
- j += pointsMerchandise.getCash().doubleValue();
- }
- if (pointsMerchandise.getCardType() == 4) {
- y += pointsMerchandise.getCash().doubleValue();
- }
- }
+ PointsMerchandise ticket = ticketMap.get(userPointsMerchandise.getPointsMerchandiseId());
+ if (ticket == null || userPointsMerchandise.getCash() == null) {
+ continue;
}
-
+ BigDecimal paidCash = userPointsMerchandise.getCash();
+ all = all.add(paidCash);
+ if (Integer.valueOf(1).equals(ticket.getCardType())) {
+ day = day.add(paidCash);
+ } else if (Integer.valueOf(2).equals(ticket.getCardType())) {
+ month = month.add(paidCash);
+ } else if (Integer.valueOf(3).equals(ticket.getCardType())) {
+ quarter = quarter.add(paidCash);
+ } else if (Integer.valueOf(4).equals(ticket.getCardType())) {
+ year = year.add(paidCash);
+ }
}
- map.put("all", a);
- map.put("day", d);
- map.put("month", m);
- map.put("quarter", j);
- map.put("year", y);
+ map.put("all", all);
+ map.put("day", day);
+ map.put("month", month);
+ map.put("quarter", quarter);
+ map.put("year", year);
return map;
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
index 8dafa9e..2dbded4 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
@@ -1012,10 +1012,11 @@
if (ToolUtil.isNotEmpty(data)) {
String stime = data.split(" - ")[0] + " 00:00:00";
String etime = data.split(" - ")[1] + " 23:59:59";
- vipPaymentLambdaQueryWrapper.between(PaymentCompetition::getInsertTime, stime, etime);
+ vipPaymentLambdaQueryWrapper.between(PaymentCompetition::getPayTime, stime, etime);
}
vipPaymentLambdaQueryWrapper.in(PaymentCompetition::getCompetitionId, ids);
vipPaymentLambdaQueryWrapper.eq(PaymentCompetition::getPayStatus, 2);
+ vipPaymentLambdaQueryWrapper.eq(PaymentCompetition::getState, 1);
ArrayList<Integer> objects = new ArrayList<>();
objects.add(1);
objects.add(2);
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
index 7b04c29..20dd3af 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
@@ -618,10 +618,13 @@
if (ToolUtil.isNotEmpty(data)) {
String stime = data.split(" - ")[0] + " 00:00:00";
String etime = data.split(" - ")[1] + " 23:59:59";
+ // 课程订单没有单独 payTime 字段;已支付订单以创建时间作为支付入账时间。
wrapper.between(CoursePackageOrder::getInsertTime, stime, etime);
}
wrapper.in(CoursePackageOrder::getCoursePackageId, ids);
wrapper.eq(CoursePackageOrder::getPayStatus, 2);
+ wrapper.eq(CoursePackageOrder::getState, 1);
+ wrapper.eq(CoursePackageOrder::getStatus, 1);
ArrayList<Integer> objects = new ArrayList<>();
objects.add(1);
objects.add(2);
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
index e544dda..ec3577a 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
@@ -491,11 +491,23 @@
}
}
TAppUser appUser = appUserClient.queryAppUser1(re.getAppUserId());
- String[] split = re.getStudentIds().split(",");
- Student student = studentClient.queryStudentById(Integer.valueOf(split[0]));
- re.setPayStudent(student.getName());
- re.setPayUser(appUser.getName());
- re.setPhone(appUser.getPhone());
+ // 统计接口只关心订单金额;历史订单可能没有关联学员或用户,不能因此整批查询失败。
+ re.setPayStudent("无");
+ if (re.getStudentIds() != null && !re.getStudentIds().trim().isEmpty()) {
+ try {
+ String[] split = re.getStudentIds().split(",");
+ Student student = studentClient.queryStudentById(Integer.valueOf(split[0]));
+ if (student != null && student.getName() != null) {
+ re.setPayStudent(student.getName());
+ }
+ } catch (NumberFormatException ignored) {
+ // 历史脏数据按“无学员”返回,避免影响其他有效订单。
+ }
+ }
+ if (appUser != null) {
+ re.setPayUser(appUser.getName());
+ re.setPhone(appUser.getPhone());
+ }
}
return res;
}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/GameDataQuery.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/GameDataQuery.java
index 069ab7f..b4639cb 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/GameDataQuery.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/GameDataQuery.java
@@ -6,4 +6,6 @@
public class GameDataQuery {
Integer objectId;
Integer storeId;
+ String startTime;
+ String endTime;
}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
index ffa4b76..4edd750 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
@@ -202,8 +202,18 @@
*/
@RequestMapping("/platform")
public String index(Model model) {
- Object o = type1(null);
- model.addAttribute("data",o);
+ // type1 保留课程/门票/订场扇形图所需的图表明细;金额卡片再以营收接口覆盖,
+ // 避免图表数据丢失,也避免收入类型与净收入的统计口径不一致。
+ Map<String, Object> typeData = (Map<String, Object>) type1(null);
+ Map<String, Object> incomeData = (Map<String, Object>) getIncomeData(null, null, null);
+ Map<Integer, BigDecimal> incomeTypeNet = (Map<Integer, BigDecimal>) incomeData.get("incomeTypeNet");
+ typeData.put("fee1", incomeTypeNet.getOrDefault(1, BigDecimal.ZERO));
+ typeData.put("fee2", incomeTypeNet.getOrDefault(2, BigDecimal.ZERO));
+ typeData.put("fee3", incomeTypeNet.getOrDefault(3, BigDecimal.ZERO));
+ typeData.put("fee4", incomeTypeNet.getOrDefault(4, BigDecimal.ZERO));
+ typeData.put("fee5", incomeTypeNet.getOrDefault(5, BigDecimal.ZERO));
+ typeData.put("fee7", incomeTypeNet.getOrDefault(6, BigDecimal.ZERO));
+ model.addAttribute("data", typeData);
// 教学统计
HashMap<String, Object> map = appUserClient.queryUserAge();
model.addAttribute("stuData",map);
@@ -216,19 +226,34 @@
*/
@RequestMapping(value = "/getIncomeData")
@ResponseBody
- public Object getIncomeData(Integer operatorId,Integer storeId) {
-// operatorId = resolveOperatorId(operatorId);
-// storeId = resolveStoreId(operatorId);
+ public Object getIncomeData(Integer operatorId,Integer storeId, String time) {
+ Integer roleType = UserExt.getUser().getObjectType();
Integer objectId = UserExt.getUser().getObjectId();
- List<Integer> cityManagerId= new ArrayList<>();
- if(objectId>0){
- operatorId=objectId;
- if(storeId==null){
- cityManagerId= storeService.list(new QueryWrapper<TStore>().eq("cityManagerId", objectId).ne("state", 3)).stream().map(TStore::getId).collect(Collectors.toList());
- }else {
- cityManagerId.add(storeId);
- }
+ // 同一接口由平台、运营商、门店三个统计页面复用:
+ // 平台角色不应因自身 objectId 被错误收窄为某个运营商;运营商和门店只能查看各自范围。
+ if (Integer.valueOf(3).equals(roleType)) {
+ operatorId = null;
+ storeId = objectId;
+ } else if (Integer.valueOf(2).equals(roleType)) {
+ operatorId = objectId;
+ storeId = resolveStoreId(storeId);
+ }
+
+ // 参数代表当前统计目标,而非当前登录人的角色;平台账号查看运营商/门店页时,
+ // 会员、充值也必须跟随被查看的运营商/门店归属。
+ Integer statisticsScopeType = Integer.valueOf(3).equals(roleType) || storeId != null ? 3
+ : (Integer.valueOf(2).equals(roleType) || operatorId != null ? 2 : 1);
+ Integer statisticsScopeObjectId = statisticsScopeType == 3 ? storeId
+ : (statisticsScopeType == 2 ? operatorId : null);
+
+ List<Integer> cityManagerId= new ArrayList<>();
+ if (Integer.valueOf(2).equals(statisticsScopeType) && statisticsScopeObjectId != null) {
+ cityManagerId = storeService.list(new QueryWrapper<TStore>()
+ .eq("cityManagerId", statisticsScopeObjectId).ne("state", 3))
+ .stream().map(TStore::getId).collect(Collectors.toList());
+ } else if (Integer.valueOf(3).equals(statisticsScopeType) && statisticsScopeObjectId != null) {
+ cityManagerId.add(statisticsScopeObjectId);
}
// 报名课程查询query
RegisterOrderQuery query = new RegisterOrderQuery();
@@ -268,14 +293,20 @@
siteBookingQuery.setStoreIds(list);
competitionQuery.setStoreId(storeId);
}
-
-
- Integer roleType = UserExt.getUser().getObjectType();
- rechargeRecordsQuery.setInsertType(roleType);
- query.setInsertType(roleType);
- competitionQuery.setInsertType(roleType);
- incomeQuery.setInsertType(roleType);
- rechargeRecordsQuery.setObjectId(UserExt.getUser().getObjectId());
+ // 会员、充值按当前统计目标的用户创建来源归属。平台全量统计仅按 insertType=1,
+ // 不能叠加当前平台账号的 addUserId 条件。
+ rechargeRecordsQuery.setInsertType(statisticsScopeType);
+ query.setInsertType(statisticsScopeType);
+ competitionQuery.setInsertType(statisticsScopeType);
+ incomeQuery.setInsertType(statisticsScopeType);
+ rechargeRecordsQuery.setTime(time);
+ query.setRegisterTime(time);
+ competitionQuery.setTime(time);
+ incomeQuery.setTime(time);
+ siteBookingQuery.setTime(time);
+ if (!Integer.valueOf(1).equals(statisticsScopeType)) {
+ rechargeRecordsQuery.setObjectId(statisticsScopeObjectId);
+ }
List<IncomeVO> incomeVOS = new ArrayList<>();
Set<Long> usedCouponIds = new HashSet<>();
// 会员支付记录
@@ -283,16 +314,19 @@
for (VipPayment vipPayment : vipPayments) {
if (vipPayment.getPayStatus() == 3 && vipPayment.getAmount() != null) {
IncomeVO payment = new IncomeVO();
+ payment.setIncomeType(1);
payment.setInsertTime(vipPayment.getPayTime() == null ? vipPayment.getInsertTime() : vipPayment.getPayTime());
payment.setAmount(BigDecimal.valueOf(vipPayment.getAmount()));
incomeVOS.add(payment);
IncomeVO refund = new IncomeVO();
+ refund.setIncomeType(1);
refund.setInsertTime(vipPayment.getRefundTime() == null ? vipPayment.getInsertTime() : vipPayment.getRefundTime());
refund.setRefundAmount(BigDecimal.valueOf(vipPayment.getAmount()));
incomeVOS.add(refund);
continue;
}
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(1);
if (vipPayment.getState()!=3){
temp.setInsertTime(vipPayment.getPayTime());
incomeVOS.add(temp);
@@ -305,6 +339,7 @@
List<RechargeRecordsVO> rechargeRecordsVOS = financeClient.rechargeList(rechargeRecordsQuery);
for (RechargeRecordsVO rechargeRecordsVO : rechargeRecordsVOS) {
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(2);
temp.setInsertTime(rechargeRecordsVO.getPayTime());
if (rechargeRecordsVO.getAmount() != null) {
temp.setAmount(rechargeRecordsVO.getAmount());
@@ -320,6 +355,7 @@
continue;
}
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(3);
temp.setInsertTime(registerOrderVO.getInsertTime());
if (registerOrderVO.getMoney() != null) {
temp.setAmount(registerOrderVO.getMoney());
@@ -347,11 +383,13 @@
}
if (competition.getPayStatus() == 3 && competition.getAmount() != null) {
IncomeVO payment = new IncomeVO();
+ payment.setIncomeType(4);
payment.setInsertTime(competition.getPayTime() == null
? competition.getInsertTime() : competition.getPayTime());
payment.setAmount(BigDecimal.valueOf(competition.getAmount()));
incomeVOS.add(payment);
IncomeVO refund = new IncomeVO();
+ refund.setIncomeType(4);
refund.setInsertTime(competition.getRefundTime() == null
? competition.getInsertTime() : competition.getRefundTime());
refund.setRefundAmount(BigDecimal.valueOf(competition.getAmount()));
@@ -362,6 +400,7 @@
continue;
}
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(4);
temp.setInsertTime(competition.getPayTime());
if (competition.getAmount() != null) {
temp.setAmount(new BigDecimal(competition.getAmount().toString()));
@@ -375,14 +414,17 @@
List<SiteBooking> siteBookings = siteClient.listAll(siteBookingQuery);
for (SiteBooking siteBooking : siteBookings) {
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(5);
if (siteBooking.getStatus() == 5) {
if (siteBooking.getPayMoney() != null) {
IncomeVO payment = new IncomeVO();
+ payment.setIncomeType(5);
payment.setInsertTime(siteBooking.getPayTime() == null
? siteBooking.getInsertTime() : siteBooking.getPayTime());
payment.setAmount(BigDecimal.valueOf(siteBooking.getPayMoney()));
incomeVOS.add(payment);
IncomeVO refund = new IncomeVO();
+ refund.setIncomeType(5);
refund.setInsertTime(siteBooking.getCancelTime() == null
? siteBooking.getInsertTime() : siteBooking.getCancelTime());
refund.setRefundAmount(BigDecimal.valueOf(siteBooking.getPayMoney()));
@@ -421,6 +463,7 @@
List<PointMerchandiseIncomeVo> amount = pointMercharsClient.getAmount(cityManagerId);
for (PointMerchandiseIncomeVo pointMerchandiseIncomeVo : amount) {
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(6);
if (pointMerchandiseIncomeVo==null) continue;
temp.setInsertTime(pointMerchandiseIncomeVo.getInsertTime());
if (pointMerchandiseIncomeVo.getCash()!=null){
@@ -434,6 +477,7 @@
List<TGameRecord> data = ballClient.getData(gameDataQuery);
for (TGameRecord datum : data) {
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(5);
temp.setAmount(datum.getMoney());
temp.setInsertTime(datum.getTime());
incomeVOS.add(temp);
@@ -445,6 +489,7 @@
List<TGameRecord> data = ballClient.getData(gameDataQuery);
for (TGameRecord datum : data) {
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(5);
temp.setAmount(datum.getMoney());
temp.setInsertTime(datum.getTime());
incomeVOS.add(temp);
@@ -456,13 +501,40 @@
List<TGameRecord> data = ballClient.getData(gameDataQuery);
for (TGameRecord datum : data) {
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(5);
temp.setAmount(datum.getMoney());
temp.setInsertTime(datum.getTime());
incomeVOS.add(temp);
}
}
- Map<String, Object> monthlyData = buildIncomeStatistics(incomeVOS);
+ // 部分跨服务查询不支持日期参数,统一在收入明细层按支付/退款时间过滤,
+ // 确保总营收、净收入和收入类型统计使用完全相同的数据集。
+ List<IncomeVO> statisticsIncomeVOS = filterIncomeRecordsByTime(incomeVOS, time);
+ Map<String, Object> monthlyData = buildIncomeStatistics(statisticsIncomeVOS);
+ monthlyData.put("incomeTypeNet", buildIncomeTypeNet(statisticsIncomeVOS, null));
+ // 门票饼图需要日/月/季/年卡拆分;此前该数据只在 type1 内部返回,
+ // 现随统一营收接口返回,供平台页直接使用。
+ monthlyData.put("ticketIncome", getTicketIncome(time, operatorId, storeId));
return monthlyData;
+ }
+
+ private Map<String, Object> getTicketIncome(String time, Integer operatorId, Integer storeId) {
+ List<Integer> userIds;
+ if (storeId != null) {
+ userIds = appUserClient.getUserStore(storeId);
+ } else if (operatorId != null) {
+ userIds = appUserClient.getUserYYs(operatorId);
+ } else {
+ List<Integer> platformUserIds = sysUserService.list(new LambdaQueryWrapper<User>()
+ .eq(User::getObjectType, 1))
+ .stream().map(User::getId).collect(Collectors.toList());
+ userIds = appUserClient.getUserPt(platformUserIds);
+ }
+ if (userIds == null) {
+ userIds = new ArrayList<>();
+ }
+ // 活动服务对空集合会补充 -1,传入可变副本以兼容该历史实现。
+ return pointMercharsClient.queryFee(new QueryDataFee(time, new ArrayList<>(userIds)));
}
/** 惠民卡采用支付、退款两条事实流水,赠送卡不计营收。 */
@@ -481,6 +553,7 @@
continue;
}
IncomeVO payment = new IncomeVO();
+ payment.setIncomeType(6);
payment.setInsertTime(record.getPaymentTime());
payment.setAmount(record.getSalesMoney());
incomeRecords.add(payment);
@@ -488,6 +561,7 @@
|| Integer.valueOf(2).equals(record.getRefundStatus())
|| Integer.valueOf(3).equals(record.getRefundStatus())) {
IncomeVO refund = new IncomeVO();
+ refund.setIncomeType(6);
refund.setInsertTime(record.getRefundTime() == null ? record.getPaymentTime() : record.getRefundTime());
refund.setRefundAmount(record.getSalesMoney());
incomeRecords.add(refund);
@@ -506,9 +580,63 @@
continue;
}
IncomeVO payment = new IncomeVO();
+ payment.setIncomeType(6);
payment.setInsertTime(record.getPaymentTime());
payment.setAmount(BigDecimal.valueOf(record.getCash()));
incomeRecords.add(payment);
+ }
+ }
+
+ /**
+ * 收入类型统计与净收入共用同一份收入明细。
+ * 类型 1-5 对应会员、充值、课程、赛事、订场;6 为商品及其他平台收入。
+ */
+ private Map<Integer, BigDecimal> buildIncomeTypeNet(List<IncomeVO> incomeRecords, String time) {
+ Map<Integer, BigDecimal> result = new HashMap<>();
+ for (int type = 1; type <= 6; type++) {
+ result.put(type, BigDecimal.ZERO);
+ }
+ Date startTime = null;
+ Date endTime = null;
+ if (ToolUtil.isNotEmpty(time)) {
+ try {
+ startTime = DateUtil.parse(time.split(" - ")[0] + " 00:00:00");
+ endTime = DateUtil.parse(time.split(" - ")[1] + " 23:59:59");
+ } catch (Exception ignored) {
+ // 页面日期格式异常时与原接口一致,不额外按日期过滤。
+ }
+ }
+ for (IncomeVO record : incomeRecords) {
+ if (record.getIncomeType() == null || record.getInsertTime() == null) {
+ continue;
+ }
+ if (startTime != null && (record.getInsertTime().before(startTime)
+ || record.getInsertTime().after(endTime))) {
+ continue;
+ }
+ BigDecimal netAmount = getZeroIfNull(record.getAmount())
+ .subtract(getZeroIfNull(record.getRefundAmount()));
+ result.put(record.getIncomeType(), result.getOrDefault(record.getIncomeType(), BigDecimal.ZERO)
+ .add(netAmount));
+ }
+ return result;
+ }
+
+ private List<IncomeVO> filterIncomeRecordsByTime(List<IncomeVO> incomeRecords, String time) {
+ if (ToolUtil.isEmpty(time)) {
+ return incomeRecords;
+ }
+ try {
+ Date startTime = DateUtil.parse(time.split(" - ")[0] + " 00:00:00");
+ Date endTime = DateUtil.parse(time.split(" - ")[1] + " 23:59:59");
+ return incomeRecords.stream()
+ .filter(record -> record.getInsertTime() != null
+ && !record.getInsertTime().before(startTime)
+ && !record.getInsertTime().after(endTime))
+ .collect(Collectors.toList());
+ } catch (Exception ignored) {
+ // 兼容旧页面的日期格式:解析失败时保留原有全量统计行为。
+ return incomeRecords;
}
}
@@ -1515,6 +1643,17 @@
map.put("quarterone",quarter);
map.put("yearone",year);
+ // 数值卡片复用营收数据的同一批收入明细和退款口径。图表数据仍沿用原查询,
+ // 但收入类型净额之和始终与“营收数据-净收入”一致。
+ Map<String, Object> incomeData = (Map<String, Object>) getIncomeData(null, null, time);
+ Map<Integer, BigDecimal> incomeTypeNet = (Map<Integer, BigDecimal>) incomeData.get("incomeTypeNet");
+ map.put("fee1", incomeTypeNet.getOrDefault(1, BigDecimal.ZERO));
+ map.put("fee2", incomeTypeNet.getOrDefault(2, BigDecimal.ZERO));
+ map.put("fee3", incomeTypeNet.getOrDefault(3, BigDecimal.ZERO));
+ map.put("fee4", incomeTypeNet.getOrDefault(4, BigDecimal.ZERO));
+ map.put("fee5", incomeTypeNet.getOrDefault(5, BigDecimal.ZERO));
+ map.put("fee7", incomeTypeNet.getOrDefault(6, BigDecimal.ZERO));
+
return map;
}
@@ -1558,6 +1697,11 @@
List<Integer> ids = list.stream().map(User::getId).collect(Collectors.toList());
List<Integer> userIds = appUserClient.getUserPt(ids);
QueryDataFee queryDataFee = new QueryDataFee(time, userIds);
+ // 课程和赛事接口的 ids 参数表示门店 ID;不能把平台用户 ID 传入。
+ List<Integer> platformStoreIds = storeService.list(new LambdaQueryWrapper<TStore>()
+ .eq(TStore::getState, 1))
+ .stream().map(TStore::getId).collect(Collectors.toList());
+ QueryDataFee storeFeeQuery = new QueryDataFee(time, platformStoreIds);
// 会员费
HashMap<String, Object> map1 = appUserClient.queryFee(queryDataFee);
Object fee1 = map1.get("fee1");
@@ -1566,41 +1710,36 @@
Object fee2 = map1.get("fee2");
map.put("fee2",fee2);
// 课程收入
- HashMap<String, Object> map3 = courseClient.queryFee(queryDataFee);
+ HashMap<String, Object> map3 = courseClient.queryFee(storeFeeQuery);
map.put("fee3",map3.get("fee"));
Object data = map3.get("data");
map.put("courseData",data);
// 赛事收入
- Double aDouble1 = competitionClient.queryFee(queryDataFee);
+ Double aDouble1 = competitionClient.queryFee(storeFeeQuery);
map.put("fee4",aDouble1);
// 订场
- if(ids.size()==0){
- ids.add(-1);
- }
LambdaQueryWrapper<SiteBooking> vipPaymentLambdaQueryWrapper = new LambdaQueryWrapper<>();
if(ToolUtil.isNotEmpty(time)){
String stime = time.split(" - ")[0]+" 00:00:00";
String etime = time.split(" - ")[1]+" 23:59:59";
- vipPaymentLambdaQueryWrapper.between(SiteBooking::getInsertTime,stime,etime);
+ vipPaymentLambdaQueryWrapper.between(SiteBooking::getPayTime,stime,etime);
}
- if(userIds.size()==0){
- userIds.add(-1);
- }
+ vipPaymentLambdaQueryWrapper.eq(SiteBooking::getState, 1);
vipPaymentLambdaQueryWrapper.ne(SiteBooking::getStatus,0);
vipPaymentLambdaQueryWrapper.ne(SiteBooking::getStatus,5);
ArrayList<Integer> objects = new ArrayList<>();
objects.add(1);
objects.add(2);
vipPaymentLambdaQueryWrapper.in(SiteBooking::getPayType,objects);
- List<SiteBooking> list1 = siteBookingService.list(new QueryWrapper<SiteBooking>()
- .ne("status",0)
- .ne("status",5)
- .ne("payType",3)
- .ne("payType",4));
+ List<SiteBooking> list1 = siteBookingService.list(vipPaymentLambdaQueryWrapper);
double sum = list1.stream().mapToDouble(SiteBooking::getPayMoney).sum();
// 智慧球场查询query
GameDataQuery gameDataQuery = new GameDataQuery();
gameDataQuery.setObjectId(0);
+ if (ToolUtil.isNotEmpty(time)) {
+ gameDataQuery.setStartTime(time.split(" - ")[0] + " 00:00:00");
+ gameDataQuery.setEndTime(time.split(" - ")[1] + " 23:59:59");
+ }
// 平台智慧球场
List<TGameRecord> data1 = ballClient.getData(gameDataQuery);
double sum1 = data1.stream()
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/operatorIncome.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/operatorIncome.html
index 3b9c55b..7167686 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/operatorIncome.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/operatorIncome.html
@@ -140,10 +140,12 @@
</br>
</br>
+ <span>会员费收入:<label id="fee1">0.0</label></span>
+ <span>玩湃币充值收入:<label id="fee2">0.0</label></span>
<span>课程收入:<label id="fee3">0.0</label></span>
<span>活动/赛事收入:<label id="fee4">0.0</label></span>
<span>订场收入:<label id="fee5">0.0</label></span>
- <span>门票收入:<label id="fee7">0.0</label></span>
+ <span>商品/其他收入:<label id="fee7">0.0</label></span>
</br>
</br>
</br>
@@ -384,6 +386,13 @@
netIncomeAmount.innerText = resp.netIncomeAmount || 0;
couponDeductionAmount.innerText = resp.couponDeductionAmount || 0;
refundAmount.innerText = resp.refundAmount || 0;
+ var incomeTypeNet = resp.incomeTypeNet || {};
+ $("#fee1").text(incomeTypeNet[1] || 0);
+ $("#fee2").text(incomeTypeNet[2] || 0);
+ $("#fee3").text(incomeTypeNet[3] || 0);
+ $("#fee4").text(incomeTypeNet[4] || 0);
+ $("#fee5").text(incomeTypeNet[5] || 0);
+ $("#fee7").text(incomeTypeNet[6] || 0);
t3.innerText = "月度营收:"+list[2]+" ";
t4.innerText = "周度营收:"+list[3]+" ";
t5.innerText = "日度营收:"+list[4]+" ";
@@ -466,6 +475,7 @@
});
ajax.set("type",1);
ajax.set("operatorId",id);
+ ajax.set("time",beginTime);
ajax.start();
// 营收
var income = echarts.init(document.getElementById('income'));
@@ -879,10 +889,6 @@
}
var ajax = new $ax(Feng.ctxPath + "/data/selectYys", function (data) {
- $("#fee3").text(data.fee3)
- $("#fee4").text(data.fee4)
- $("#fee5").text(data.fee5)
- $("#fee7").text(data.fee7)
$("#day").val(data.dayone)
$("#month").val(data.monthone)
$("#quarter").val(data.quarterone)
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/platformIncome.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/platformIncome.html
index 82560aa..7dd965b 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/platformIncome.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/platformIncome.html
@@ -188,9 +188,9 @@
<span>会员费收入:<label id="fee1">${data.fee1}</label></span>
<span>玩湃币充值收入:<label id="fee2">${data.fee2}</label></span>
<span>课程收入:<label id="fee3">${data.fee3}</label></span>
- <span>活动/赛事收入:<label id="fee4">${data.fee4}</label></span>
+ <span>赛事收入:<label id="fee4">${data.fee4}</label></span>
<span>订场收入:<label id="fee5">${data.fee5}</label></span>
- <span>商品收入:<label id="fee7">${data.fee7}</label></span>
+ <span>商品/其他收入:<label id="fee7">${data.fee7}</label></span>
</br>
</br>
</br>
@@ -357,11 +357,23 @@
});
function search1() {
var time = $("#beginTime").val();
- var ajax9 = new $ax(Feng.ctxPath + "/data/type1", function(data){
-
+ // 营收卡片与收入类型卡片使用同一接口、同一时间范围,避免筛选后口径不一致。
+ var incomeAjax = new $ax(Feng.ctxPath + "/data/getIncomeData", function(resp){
+ $("#totalIncome").text(resp.incomeStatistics.totalIncomeAmount || 0);
+ $("#netIncomeAmount").text(resp.incomeStatistics.netIncomeAmount || 0);
+ $("#couponDeductionAmount").text(resp.incomeStatistics.couponDeductionAmount || 0);
+ $("#refundAmount").text(resp.incomeStatistics.refundAmount || 0);
+ var incomeTypeNet = resp.incomeTypeNet || {};
+ $("#fee1").text(incomeTypeNet[1] || 0);
+ $("#fee2").text(incomeTypeNet[2] || 0);
+ $("#fee3").text(incomeTypeNet[3] || 0);
+ $("#fee4").text(incomeTypeNet[4] || 0);
+ $("#fee5").text(incomeTypeNet[5] || 0);
+ $("#fee7").text(incomeTypeNet[6] || 0);
+ renderTicketIncomeChart(resp.ticketIncome || {});
});
- ajax9.set("time",time);
- ajax9.start();
+ incomeAjax.set("time", time);
+ incomeAjax.start();
}
var ans = [];
var weekX = ["1周","2周","3周","4周"];
@@ -369,6 +381,24 @@
var yearX = [];
var timeX = [];
var dataX = [];
+
+ function renderTicketIncomeChart(ticketIncome) {
+ var chartDom = document.getElementById('cookieTicket');
+ var myChart = echarts.getInstanceByDom(chartDom) || echarts.init(chartDom);
+ myChart.setOption({
+ title: {text: '门票收入', left: 'center'},
+ tooltip: {trigger: 'item'},
+ series: [{
+ name: '门票收入', type: 'pie', radius: '50%',
+ data: [
+ {value: ticketIncome.day || 0, name: '日卡'},
+ {value: ticketIncome.month || 0, name: '月卡'},
+ {value: ticketIncome.quarter || 0, name: '季卡'},
+ {value: ticketIncome.year || 0, name: '年卡'}
+ ]
+ }]
+ }, true);
+ }
// 创建一个日期对象
var currentDate = new Date();
// 获取当前日期的号数
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/storeIncome.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/storeIncome.html
index b991950..3e88fa6 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/storeIncome.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/storeIncome.html
@@ -130,10 +130,12 @@
<div class="col-sm-10" style="width: 1500px" >
</br>
</br>
+ <span>会员费收入:<label id="fee1">0.0</label></span>
+ <span>玩湃币充值收入:<label id="fee2">0.0</label></span>
<span>课程收入:<label id="fee3">0.0</label></span>
<span>活动/赛事收入:<label id="fee4">0.0</label></span>
<span>订场收入:<label id="fee5">0.0</label></span>
- <span>商品收入:<label id="fee7">0.0</label></span>
+ <span>商品/其他收入:<label id="fee7">0.0</label></span>
</br>
</br>
</br>
@@ -337,6 +339,13 @@
$("#netIncomeAmount").text(resp.incomeStatistics.netIncomeAmount || 0);
$("#couponDeductionAmount").text(resp.incomeStatistics.couponDeductionAmount || 0);
$("#refundAmount").text(resp.incomeStatistics.refundAmount || 0);
+ var incomeTypeNet = resp.incomeTypeNet || {};
+ $("#fee1").text(incomeTypeNet[1] || 0);
+ $("#fee2").text(incomeTypeNet[2] || 0);
+ $("#fee3").text(incomeTypeNet[3] || 0);
+ $("#fee4").text(incomeTypeNet[4] || 0);
+ $("#fee5").text(incomeTypeNet[5] || 0);
+ $("#fee7").text(incomeTypeNet[6] || 0);
renderIncomeStatisticsList("yearIncomeStatistics", "历年营收明细", resp.yearLabels, resp.yearIncomeStatistics);
renderIncomeStatisticsList("monthIncomeStatistics", "本年各月营收明细", resp.monthLabels, resp.monthIncomeStatistics);
renderIncomeStatisticsList("weekIncomeStatistics", "近四周营收明细", resp.weekLabels, resp.weekIncomeStatistics);
@@ -348,6 +357,7 @@
});
ajax.set("type", 1);
ajax.set("storeId", $("#objectType").val() == 3 ? $("#objectId").val() : $("#cCode").val());
+ ajax.set("time", $("#beginTime").val());
ajax.start();
}
@@ -364,10 +374,6 @@
}
var ajax = new $ax(Feng.ctxPath + "/data/selectStore", function (data) {
- $("#fee3").text(data.fee3)
- $("#fee4").text(data.fee4)
- $("#fee5").text(data.fee5)
- $("#fee7").text(data.fee7)
$("#day").val(data.dayone)
$("#month").val(data.monthone)
$("#quarter").val(data.quarterone)
diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java
index cf2faf8..cc43702 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java
@@ -55,6 +55,9 @@
QueryWrapper<TGameRecord> wrapper = new QueryWrapper<TGameRecord>().eq("status", 1)
.ne("payType", 3)
.ne("payType", 4);
+ if (query.getStartTime() != null && query.getEndTime() != null) {
+ wrapper.between("time", query.getStartTime(), query.getEndTime());
+ }
wrapper.in("gameId", gameIds);
List<TGameRecord> list = gameRecordService.list(wrapper);
return list;
@@ -68,6 +71,9 @@
QueryWrapper<TGameRecord> wrapper = new QueryWrapper<TGameRecord>()
.eq("status", 1)
.in("payType", 1, 2);
+ if (query.getStartTime() != null && query.getEndTime() != null) {
+ wrapper.between("time", query.getStartTime(), query.getEndTime());
+ }
wrapper.in("gameId", gameIds);
List<TGameRecord> list = gameRecordService.list(wrapper);
return list;
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/GameDataQuery.java b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/GameDataQuery.java
index 23af790..9f3f3a7 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/GameDataQuery.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/GameDataQuery.java
@@ -6,4 +6,6 @@
public class GameDataQuery {
Integer objectId;
Integer storeId;
+ String startTime;
+ String endTime;
}
--
Gitblit v1.7.1