人天统计修改bug

This commit is contained in:
2026-06-07 22:11:49 +08:00
parent 21ec3321d0
commit a84fcbed56
4 changed files with 71 additions and 39 deletions

View File

@@ -116,11 +116,13 @@ public class LbOrderRowController {
@PostMapping("/generate-daily-sum") @PostMapping("/generate-daily-sum")
@Operation( @Operation(
summary = "按日汇总生成 sum_data 与人天统计", summary = "按日汇总生成统计数据",
description = description =
"按购买时间区间、租户 id 查询 lb_order_row 明细:每天生成一条 sum_datatoday_total_money_sum、" "按购买时间区间、租户 id 查询 lb_order_row 明细并写入统计"
+ "today_unresell_count、today_order_count、avg_amt 等);同时按 buyer_phone + 购买日期" + "dataType=sum_data 时每天生成一条汇总today_total_money_sum、today_unresell_count、"
+ "生成 day_stat 人天统计(当天购买总单数、当天购买总金额、平均金额)并写入表") + "today_order_count、avg_amt 等);"
+ "dataType=day_stat 时按 buyer_phone + 购买日期生成人天统计(当天购买总单数、"
+ "当天购买总金额、平均金额)")
public ResponseEntity<Map<String, Object>> generateDailySum( public ResponseEntity<Map<String, Object>> generateDailySum(
@Parameter(description = "汇总条件", required = true) @RequestBody @Parameter(description = "汇总条件", required = true) @RequestBody
LbOrderRowGenerateSumRequest request) { LbOrderRowGenerateSumRequest request) {
@@ -128,7 +130,8 @@ public class LbOrderRowController {
lbOrderRowService.generateDailySumData( lbOrderRowService.generateDailySumData(
request.getBuyTimeStart(), request.getBuyTimeStart(),
request.getBuyTimeEnd(), request.getBuyTimeEnd(),
request.getTenantId()); request.getTenantId(),
request.getDataType());
Boolean success = (Boolean) result.get("success"); Boolean success = (Boolean) result.get("success");
if (success != null && success) { if (success != null && success) {
return ResponseEntity.ok(result); return ResponseEntity.ok(result);

View File

@@ -4,10 +4,10 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
/** /**
* 按购买时间区间与租户,将 {@code lb_order_row} 明细按日汇总为 {@code sum_data} 并写入表。 * 按购买时间区间与租户,将 {@code lb_order_row} 明细按日汇总写入表。
*/ */
@Data @Data
@Schema(description = "LB 订单按日汇总生成 sum_data 请求") @Schema(description = "LB 订单按日汇总请求")
public class LbOrderRowGenerateSumRequest { public class LbOrderRowGenerateSumRequest {
@Schema(description = "购买时间起buy_time 下限),可空表示不限制") @Schema(description = "购买时间起buy_time 下限),可空表示不限制")
@@ -18,4 +18,9 @@ public class LbOrderRowGenerateSumRequest {
@Schema(description = "租户 id", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "租户 id", requiredMode = Schema.RequiredMode.REQUIRED)
private String tenantId; private String tenantId;
@Schema(
description = "统计类型sum_data=按天汇总day_stat=按 buyer_phone + 购买日期人天统计",
requiredMode = Schema.RequiredMode.REQUIRED)
private String dataType;
} }

View File

@@ -49,10 +49,11 @@ public interface ILbOrderRowService extends IService<LbOrderRow> {
Integer hxrOrderStatus); Integer hxrOrderStatus);
/** /**
* 按购买时间区间与租户查询明细,按天汇总为 {@code sum_data},并按 {@code buyer_phone} + 购买日期 * 按购买时间区间与租户查询明细生成统计并写入 {@code lb_order_row}。
* 生成 {@code day_stat} 人天统计,写入 {@code lb_order_row} * {@code dataType=sum_data} 按天汇总;{@code dataType=day_stat} 按 buyer_phone + 购买日期人天统计
*/ */
Map<String, Object> generateDailySumData(String buyTimeStart, String buyTimeEnd, String tenantId); Map<String, Object> generateDailySumData(
String buyTimeStart, String buyTimeEnd, String tenantId, String dataType);
/** /**
* 按购买时间区间与租户查询 {@code lb_order_row} 明细,将卖家姓名分批发送至钉钉(每批最多 15 条记录)。 * 按购买时间区间与租户查询 {@code lb_order_row} 明细,将卖家姓名分批发送至钉钉(每批最多 15 条记录)。

View File

@@ -429,7 +429,7 @@ public class LbOrderRowServiceImpl extends ServiceImpl<LbOrderRowMapper, LbOrder
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Map<String, Object> generateDailySumData( public Map<String, Object> generateDailySumData(
String buyTimeStart, String buyTimeEnd, String tenantId) { String buyTimeStart, String buyTimeEnd, String tenantId, String dataType) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
try { try {
if (tenantId == null || tenantId.trim().isEmpty()) { if (tenantId == null || tenantId.trim().isEmpty()) {
@@ -437,6 +437,17 @@ public class LbOrderRowServiceImpl extends ServiceImpl<LbOrderRowMapper, LbOrder
result.put("message", "tenantId不能为空"); result.put("message", "tenantId不能为空");
return result; return result;
} }
String statType = dataType != null ? dataType.trim() : "";
if (statType.isEmpty()) {
result.put("success", false);
result.put("message", "dataType不能为空");
return result;
}
if (!SUM_DATA_TYPE.equals(statType) && !BUYER_DAY_STAT_DATA_TYPE.equals(statType)) {
result.put("success", false);
result.put("message", "dataType 仅支持 sum_data 或 day_stat");
return result;
}
String tid = tenantId.trim(); String tid = tenantId.trim();
List<LbOrderRow> details = listDetailRowsByBuyTimeRange(buyTimeStart, buyTimeEnd, tid); List<LbOrderRow> details = listDetailRowsByBuyTimeRange(buyTimeStart, buyTimeEnd, tid);
@@ -445,6 +456,7 @@ public class LbOrderRowServiceImpl extends ServiceImpl<LbOrderRowMapper, LbOrder
result.put("message", "时间范围内无明细数据"); result.put("message", "时间范围内无明细数据");
result.put("generated", 0); result.put("generated", 0);
result.put("sourceCount", 0); result.put("sourceCount", 0);
result.put("dataType", statType);
return result; return result;
} }
@@ -463,50 +475,61 @@ public class LbOrderRowServiceImpl extends ServiceImpl<LbOrderRowMapper, LbOrder
result.put("success", false); result.put("success", false);
result.put("message", "明细 buy_time 均无法解析为日期,无法汇总"); result.put("message", "明细 buy_time 均无法解析为日期,无法汇总");
result.put("skippedNoBuyTime", skippedNoBuyTime); result.put("skippedNoBuyTime", skippedNoBuyTime);
result.put("dataType", statType);
return result; return result;
} }
String nowStr = LocalDateTime.now().format(DAY_TIME_FMT); String nowStr = LocalDateTime.now().format(DAY_TIME_FMT);
List<LbOrderRow> sumRows = new ArrayList<>(byDay.size()); List<LbOrderRow> statRows;
List<LbOrderRow> buyerDayStatRows = new ArrayList<>();
int skippedNoBuyerPhone = 0; int skippedNoBuyerPhone = 0;
for (Map.Entry<LocalDate, List<LbOrderRow>> entry : byDay.entrySet()) { if (SUM_DATA_TYPE.equals(statType)) {
LocalDate day = entry.getKey(); statRows = new ArrayList<>(byDay.size());
List<LbOrderRow> dayRows = entry.getValue(); for (Map.Entry<LocalDate, List<LbOrderRow>> entry : byDay.entrySet()) {
sumRows.add(buildDailySumRow(tid, day, dayRows, nowStr)); statRows.add(buildDailySumRow(tid, entry.getKey(), entry.getValue(), nowStr));
Map<String, List<LbOrderRow>> byBuyerPhone = new LinkedHashMap<>();
for (LbOrderRow row : dayRows) {
String buyerPhone = trimToNull(row.getBuyerPhone());
if (buyerPhone == null) {
skippedNoBuyerPhone++;
continue;
}
byBuyerPhone.computeIfAbsent(buyerPhone, k -> new ArrayList<>()).add(row);
} }
for (Map.Entry<String, List<LbOrderRow>> buyerEntry : byBuyerPhone.entrySet()) { } else {
buyerDayStatRows.add( statRows = new ArrayList<>();
buildBuyerDayStatRow( for (Map.Entry<LocalDate, List<LbOrderRow>> entry : byDay.entrySet()) {
tid, day, buyerEntry.getKey(), buyerEntry.getValue(), nowStr)); LocalDate day = entry.getKey();
List<LbOrderRow> dayRows = entry.getValue();
Map<String, List<LbOrderRow>> byBuyerPhone = new LinkedHashMap<>();
for (LbOrderRow row : dayRows) {
String buyerPhone = trimToNull(row.getBuyerPhone());
if (buyerPhone == null) {
skippedNoBuyerPhone++;
continue;
}
byBuyerPhone.computeIfAbsent(buyerPhone, k -> new ArrayList<>()).add(row);
}
for (Map.Entry<String, List<LbOrderRow>> buyerEntry : byBuyerPhone.entrySet()) {
statRows.add(
buildBuyerDayStatRow(
tid, day, buyerEntry.getKey(), buyerEntry.getValue(), nowStr));
}
}
if (statRows.isEmpty()) {
result.put("success", false);
result.put("message", "明细 buyer_phone 均缺失,无法生成人天统计");
result.put("skippedNoBuyTime", skippedNoBuyTime);
result.put("skippedNoBuyerPhone", skippedNoBuyerPhone);
result.put("dataType", statType);
return result;
} }
} }
List<LbOrderRow> allStatRows = new ArrayList<>(sumRows.size() + buyerDayStatRows.size()); int upserted = upsertBatch(statRows);
allStatRows.addAll(sumRows);
allStatRows.addAll(buyerDayStatRows);
int upserted = upsertBatch(allStatRows);
boolean ok = upserted >= 0; boolean ok = upserted >= 0;
result.put("success", ok); result.put("success", ok);
result.put("message", ok ? "按日汇总完成" : "保存失败"); result.put("message", ok ? "按日汇总完成" : "保存失败");
result.put("generated", ok ? upserted : 0); result.put("generated", ok ? upserted : 0);
result.put("sumDataGenerated", ok ? sumRows.size() : 0);
result.put("buyerDayStatGenerated", ok ? buyerDayStatRows.size() : 0);
result.put("sourceCount", details.size()); result.put("sourceCount", details.size());
result.put("skippedNoBuyTime", skippedNoBuyTime); result.put("skippedNoBuyTime", skippedNoBuyTime);
result.put("skippedNoBuyerPhone", skippedNoBuyerPhone); result.put("dataType", statType);
if (BUYER_DAY_STAT_DATA_TYPE.equals(statType)) {
result.put("skippedNoBuyerPhone", skippedNoBuyerPhone);
}
if (ok) { if (ok) {
result.put("data", sumRows); result.put("data", statRows);
result.put("buyerDayStatData", buyerDayStatRows);
} }
return result; return result;
} catch (Exception e) { } catch (Exception e) {