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

View File

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

View File

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