From 119981efb6a18165cdf24a9a050c05f7485b7ae8 Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期五, 18 九月 2026 16:58:44 +0800
Subject: [PATCH] feat:门店店长手机号填写方式变更
---
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java | 356 ++++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 280 insertions(+), 76 deletions(-)
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 52c271e..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
@@ -82,6 +82,49 @@
}
/**
+ * 运营商统计的门店范围:平台(0)统计平台门店,其他值统计对应运营商门店。
+ */
+ private List<TStore> listStatisticsStores(Integer operatorId, boolean enabledOnly) {
+ LambdaQueryWrapper<TStore> wrapper = new LambdaQueryWrapper<>();
+ if (enabledOnly) {
+ wrapper.eq(TStore::getState, 1);
+ } else {
+ wrapper.ne(TStore::getState, 3);
+ }
+ if (Integer.valueOf(0).equals(operatorId)) {
+ wrapper.eq(TStore::getType, 1);
+ } else {
+ wrapper.eq(TStore::getType, 2).eq(TStore::getOperatorId, operatorId);
+ }
+ return storeService.list(wrapper);
+ }
+
+ /** 获取统计范围门店发生课程、订场或赛事消费的用户。 */
+ private List<Integer> listStatisticsAppUserIds(Integer operatorId) {
+ List<Integer> storeIds = listStatisticsStores(operatorId, true).stream()
+ .map(TStore::getId).collect(Collectors.toList());
+ if (storeIds.isEmpty()) {
+ return Collections.singletonList(-1);
+ }
+ List<Integer> userIds = new ArrayList<>();
+ List<Integer> courseUserIds = coursePackagePaymentClient.queryPaymentCoursePackage(storeIds);
+ if (courseUserIds != null) {
+ userIds.addAll(courseUserIds);
+ }
+ userIds.addAll(siteBookingService.list(new QueryWrapper<SiteBooking>()
+ .in("storeId", storeIds).eq("state", 1))
+ .stream().map(SiteBooking::getAppUserId).filter(Objects::nonNull)
+ .collect(Collectors.toList()));
+ List<Integer> competitionUserIds = competitionClient.queryAppUserId(storeIds);
+ if (competitionUserIds != null) {
+ userIds.addAll(competitionUserIds);
+ }
+ List<Integer> validUserIds = userIds.stream().filter(Objects::nonNull).distinct()
+ .collect(Collectors.toList());
+ return validUserIds.isEmpty() ? Collections.singletonList(-1) : validUserIds;
+ }
+
+ /**
* 计算门店每日营业整小时数。相同的起止时间表示全天营业,结束时间早于
* 开始时间时按跨午夜营业处理。
*/
@@ -159,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);
@@ -173,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)).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();
@@ -207,7 +275,7 @@
// 根据运营商ID 查询运营商下的所有门店
if (storeId==null){
if (operatorId!=null){
- List<TStore> stores = storeService.list(new QueryWrapper<TStore>().eq("operatorId", operatorId));
+ List<TStore> stores = listStatisticsStores(operatorId, false);
// 拿到该运营商下的门店id集合
storeIds = stores.stream().map(TStore::getId).collect(Collectors.toList());
query.setStoresIds(storeIds);
@@ -225,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<>();
// 会员支付记录
@@ -240,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);
@@ -262,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());
@@ -277,6 +355,7 @@
continue;
}
IncomeVO temp = new IncomeVO();
+ temp.setIncomeType(3);
temp.setInsertTime(registerOrderVO.getInsertTime());
if (registerOrderVO.getMoney() != null) {
temp.setAmount(registerOrderVO.getMoney());
@@ -304,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()));
@@ -319,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()));
@@ -332,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()));
@@ -378,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){
@@ -391,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);
@@ -402,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);
@@ -413,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)));
}
/** 惠民卡采用支付、退款两条事实流水,赠送卡不计营收。 */
@@ -438,6 +553,7 @@
continue;
}
IncomeVO payment = new IncomeVO();
+ payment.setIncomeType(6);
payment.setInsertTime(record.getPaymentTime());
payment.setAmount(record.getSalesMoney());
incomeRecords.add(payment);
@@ -445,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);
@@ -463,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;
}
}
@@ -476,23 +647,28 @@
int currentYear = today.getYear();
List<IncomeStatisticsVO> yearly = new ArrayList<>();
List<Object> years = new ArrayList<>();
+ List<String> yearLabels = new ArrayList<>();
for (int year = currentYear - 9; year <= currentYear; year++) {
final int statisticYear = year;
yearly.add(sumIncomeStatistics(incomeRecords, record -> getRecordDate(record)
.getYear() == statisticYear));
years.add(year);
+ yearLabels.add(String.valueOf(year));
}
List<IncomeStatisticsVO> monthly = new ArrayList<>();
+ List<String> monthLabels = new ArrayList<>();
for (int month = 1; month <= 12; month++) {
final int statisticMonth = month;
monthly.add(sumIncomeStatistics(incomeRecords, record -> {
LocalDate date = getRecordDate(record);
return date.getYear() == currentYear && date.getMonthValue() == statisticMonth;
}));
+ monthLabels.add(String.format("%d-%02d", currentYear, month));
}
List<IncomeStatisticsVO> weekly = new ArrayList<>();
+ List<String> weekLabels = new ArrayList<>();
for (int weekIndex = 3; weekIndex >= 0; weekIndex--) {
LocalDate startDate = today.minusDays(weekIndex * 7L + 6L);
LocalDate endDate = today.minusDays(weekIndex * 7L);
@@ -500,13 +676,17 @@
LocalDate date = getRecordDate(record);
return !date.isBefore(startDate) && !date.isAfter(endDate);
}));
+ weekLabels.add(startDate.format(DateTimeFormatter.ISO_LOCAL_DATE)
+ + " 至 " + endDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
}
List<IncomeStatisticsVO> daily = new ArrayList<>();
+ List<String> dayLabels = new ArrayList<>();
for (int dayIndex = 6; dayIndex >= 0; dayIndex--) {
LocalDate statisticDate = today.minusDays(dayIndex);
daily.add(sumIncomeStatistics(incomeRecords, record -> getRecordDate(record)
.equals(statisticDate)));
+ dayLabels.add(statisticDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
}
IncomeStatisticsVO total = sumIncomeStatistics(incomeRecords, record -> true);
@@ -527,6 +707,10 @@
result.put("weekIncomeStatistics", weekly);
result.put("dayIncomeStatistics", daily);
result.put("year", years);
+ result.put("yearLabels", yearLabels);
+ result.put("monthLabels", monthLabels);
+ result.put("weekLabels", weekLabels);
+ result.put("dayLabels", dayLabels);
// 兼容既有图表消费字段,值调整为总营收金额。
result.put("yearIncome", yearly.stream().map(IncomeStatisticsVO::getTotalIncomeAmount)
.collect(Collectors.toList()));
@@ -817,10 +1001,7 @@
public Object backYys(Integer id) {
id = resolveOperatorId(id);
HashMap<String, Object> map = new HashMap<>();
- List<Integer> userPt = appUserClient.getUserYYs(id);
- if(userPt.size()==0){
- userPt.add(-1);
- }
+ List<Integer> userPt = listStatisticsAppUserIds(id);
ArrayList<Object> integers = new ArrayList<>();
int year = DateUtil.year(new Date());
List<TBackRecord> thisYear = backRecordService.list(new LambdaQueryWrapper<TBackRecord>().like(TBackRecord::getTime, year).in(TBackRecord::getUserId,userPt));
@@ -930,6 +1111,10 @@
//赛事
List<Integer> list2 = competitionClient.queryAppUserId(collect1);
list.addAll(list2);
+ // 没有消费用户时,避免 MyBatis-Plus 生成 userId IN () 的非法 SQL。
+ if (list.isEmpty()) {
+ list.add(-1);
+ }
//门票
HashMap<String, Object> map = new HashMap<>();
@@ -1050,8 +1235,12 @@
@ResponseBody
public Object stuYys(Integer id) {
id = resolveOperatorId(id);
- List<TStore> list4 = storeService.list(new QueryWrapper<TStore>().eq("operatorId", id).eq("state", 1));
+ List<TStore> list4 = listStatisticsStores(id, true);
List<Integer> collect1 = list4.stream().map(TStore::getId).collect(Collectors.toList());
+ // 运营商没有门店时,后续查询不能生成 storeId IN ()。
+ if (collect1.isEmpty()) {
+ collect1.add(-1);
+ }
//课程
List<Integer> list = coursePackagePaymentClient.queryPaymentCoursePackage(collect1);
//场地
@@ -1061,6 +1250,10 @@
//赛事
List<Integer> list2 = competitionClient.queryAppUserId(collect1);
list.addAll(list2);
+ // 下游会员统计同样使用 IN 查询,空用户列表按无匹配记录处理。
+ if (list.isEmpty()) {
+ list.add(-1);
+ }
//门票
HashMap<String, Object> map = appUserClient.stuYys(list);
@@ -1098,7 +1291,7 @@
@ResponseBody
public Object courseYys(Integer id) {
id = resolveOperatorId(id);
- List<Integer> userPt = appUserClient.getUserYYs(id);
+ List<Integer> userPt = listStatisticsAppUserIds(id);
HashMap<String, Object> map = coursePackagePaymentClient.coursePt(userPt);
return map;
}
@@ -1115,7 +1308,7 @@
@ResponseBody
public Object userAndVipYys(Integer id) {
id = resolveOperatorId(id);
- List<TStore> list4 = storeService.list(new QueryWrapper<TStore>().eq("operatorId", id).eq("state", 1));
+ List<TStore> list4 = listStatisticsStores(id, true);
List<Integer> collect1 = list4.stream().map(TStore::getId).collect(Collectors.toList());
//课程
List<Integer> list = coursePackagePaymentClient.queryPaymentCoursePackage(collect1);
@@ -1155,7 +1348,7 @@
List<Integer> userPt = appUserClient.getUserPt(Arrays.asList(1));
HashMap<String, Object> map = competitionClient.actPt(userPt);
- List<TStore> list = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getOperatorId, 0));
+ List<TStore> list = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getOperatorId, 0).ne(TStore::getState, 3));
long l1=0;
for (TStore tStore : list) {
l1 += getStoreOperatingHours(tStore, new Date());
@@ -1168,7 +1361,7 @@
public Object actYys(Integer id) {
id = resolveOperatorId(id);
CompetionVO competionVO = new CompetionVO();
- List<TStore> list4 = storeService.list(new QueryWrapper<TStore>().eq("operatorId", id).eq("state", 1));
+ List<TStore> list4 = listStatisticsStores(id, true);
List<Integer> collect1 = list4.stream().map(TStore::getId).collect(Collectors.toList());
//课程
List<Integer> list = coursePackagePaymentClient.queryPaymentCoursePackage(collect1);
@@ -1187,7 +1380,7 @@
competionVO.setStoreIds(collect1);
HashMap<String, Object> map = competitionClient.actYys(competionVO);
- List<TStore> lists = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getOperatorId, id));
+ List<TStore> lists = listStatisticsStores(id, true);
long l1=0;
for (TStore tStore : lists) {
l1 += getStoreOperatingHours(tStore, new Date());
@@ -1198,26 +1391,22 @@
@RequestMapping(value = "/actStore")
@ResponseBody
public Object actStore(Integer id) {
- List<Integer> collect1 = Arrays.asList(id);
- //课程
- List<Integer> list = coursePackagePaymentClient.queryPaymentCoursePackage(collect1);
- //场地
- List<SiteBooking> list1 = siteBookingService.list(new QueryWrapper<SiteBooking>().in("storeId", collect1).eq("state", 1));
- List<Integer> collect = list1.stream().map(SiteBooking::getAppUserId).collect(Collectors.toList());
- list.addAll(collect);
- //赛事
- List<Integer> list2 = competitionClient.queryAppUserId(collect1);
- list.addAll(list2);
- //门票
-
- HashMap<String, Object> map = competitionClient.actPt(list);
-
- List<TStore> lists = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getOperatorId, 0));
- long l1=0;
- for (TStore tStore : lists) {
- l1 += getStoreOperatingHours(tStore, new Date());
+ if (Integer.valueOf(3).equals(UserExt.getUser().getObjectType())) {
+ id = UserExt.getUser().getObjectId();
+ } else {
+ id = resolveStoreId(id);
}
- map.put("allHour",l1);
+ TStore store = id == null ? null : storeService.getById(id);
+ CompetionVO competionVO = new CompetionVO();
+ if (store == null || !Integer.valueOf(1).equals(store.getState())) {
+ competionVO.setStoreIds(Collections.singletonList(-1));
+ } else {
+ List<Integer> storeIds = Collections.singletonList(store.getId());
+ competionVO.setStoreIds(storeIds);
+ }
+ HashMap<String, Object> map = competitionClient.actStore(competionVO);
+ map.put("allHour", store == null || !Integer.valueOf(1).equals(store.getState())
+ ? 0 : getStoreOperatingHours(store, new Date()));
return map;
}
@@ -1252,7 +1441,7 @@
// List<User> list = sysUserService.list(new LambdaQueryWrapper<User>().eq(User::getObjectType, 2));
// List<Integer> ids = list.stream().map(User::getId).collect(Collectors.toList());
// List<Integer> userIds = appUserClient.getUserYYs(id);
- List<TStore> list4 = storeService.list(new QueryWrapper<TStore>().eq("operatorId", id).eq("state", 1));
+ List<TStore> list4 = listStatisticsStores(id, true);
List<Integer> collect1 = list4.stream().map(TStore::getId).collect(Collectors.toList());
QueryDataFee queryDataFee = new QueryDataFee(time, collect1);
// 课程收入
@@ -1298,7 +1487,7 @@
if(collect.size()==0){
collect.add(-1);
}
- List<TSite> list3 = siteService.list(new LambdaQueryWrapper<TSite>().in(TSite::getId, collect));
+ List<TSite> list3 = siteService.list(new LambdaQueryWrapper<TSite>().in(TSite::getId, collect).ne(TSite::getState, 3));
for (SiteBooking siteBooking : list1) {
for (TSite tSite : list3) {
if(siteBooking.getSiteId().equals(tSite.getId())){
@@ -1308,7 +1497,7 @@
}
- List<TSiteType> list2 = siteTypeService.list();
+ List<TSiteType> list2 = siteTypeService.list(new LambdaQueryWrapper<TSiteType>().ne(TSiteType::getState, 3));
List<Map<String,Object>> mapList = new ArrayList<>();
@@ -1364,6 +1553,10 @@
//赛事
List<Integer> list2 = competitionClient.queryAppUserId(collect1);
list.addAll(list2);
+ // 没有消费用户时,避免 MyBatis-Plus 生成 appUserId IN () 的非法 SQL。
+ if (list.isEmpty()) {
+ list.add(-1);
+ }
//门票
QueryDataFee queryDataFee = new QueryDataFee(time, list);
@@ -1406,9 +1599,9 @@
List<Integer> collects = list1.stream().map(SiteBooking::getSiteId).collect(Collectors.toList());
if(collects.size()==0){
- collect.add(-1);
+ collects.add(-1);
}
- List<TSite> list3 = siteService.list(new LambdaQueryWrapper<TSite>().in(TSite::getId, collects));
+ List<TSite> list3 = siteService.list(new LambdaQueryWrapper<TSite>().in(TSite::getId, collects).ne(TSite::getState, 3));
for (SiteBooking siteBooking : list1) {
for (TSite tSite : list3) {
if(siteBooking.getSiteId().equals(tSite.getId())){
@@ -1418,7 +1611,7 @@
}
- List<TSiteType> lists2 = siteTypeService.list();
+ List<TSiteType> lists2 = siteTypeService.list(new LambdaQueryWrapper<TSiteType>().ne(TSiteType::getState, 3));
List<Map<String,Object>> mapList = new ArrayList<>();
@@ -1449,6 +1642,17 @@
map.put("monthone",month);
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;
}
@@ -1493,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");
@@ -1501,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()
@@ -1549,7 +1753,7 @@
if(collect.size()==0){
collect.add(-1);
}
- List<TSite> list3 = siteService.list(new LambdaQueryWrapper<TSite>().in(TSite::getId, collect));
+ List<TSite> list3 = siteService.list(new LambdaQueryWrapper<TSite>().in(TSite::getId, collect).ne(TSite::getState, 3));
for (SiteBooking siteBooking : list1) {
for (TSite tSite : list3) {
if(siteBooking.getSiteId().equals(tSite.getId())){
@@ -1559,7 +1763,7 @@
}
- List<TSiteType> list2 = siteTypeService.list();
+ List<TSiteType> list2 = siteTypeService.list(new LambdaQueryWrapper<TSiteType>().ne(TSiteType::getState, 3));
List<Map<String,Object>> mapList = new ArrayList<>();
@@ -1626,7 +1830,7 @@
@ResponseBody
public Object stuUserDataYys(Integer id) {
id = resolveOperatorId(id);
- List<TStore> list4 = storeService.list(new QueryWrapper<TStore>().eq("operatorId", id).eq("state", 1));
+ List<TStore> list4 = listStatisticsStores(id, true);
List<Integer> collect1 = list4.stream().map(TStore::getId).collect(Collectors.toList());
//课程
List<Integer> list = coursePackagePaymentClient.queryPaymentCoursePackage(collect1);
@@ -1665,7 +1869,7 @@
@ResponseBody
public Object selectYysJx(Integer id) {
id = resolveOperatorId(id);
- List<TStore> list4 = storeService.list(new QueryWrapper<TStore>().eq("operatorId", id).eq("state", 1));
+ List<TStore> list4 = listStatisticsStores(id, true);
List<Integer> collect1 = list4.stream().map(TStore::getId).collect(Collectors.toList());
//课程
List<Integer> list = coursePackagePaymentClient.queryPaymentCoursePackage(collect1);
--
Gitblit v1.7.1