人天统计修改bug
This commit is contained in:
@@ -116,11 +116,13 @@ public class LbOrderRowController {
|
||||
|
||||
@PostMapping("/generate-daily-sum")
|
||||
@Operation(
|
||||
summary = "按日汇总生成 sum_data 与人天统计",
|
||||
summary = "按日汇总生成统计数据",
|
||||
description =
|
||||
"按购买时间区间、租户 id 查询 lb_order_row 明细:每天生成一条 sum_data(today_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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 条记录)。
|
||||
|
||||
@@ -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,17 +475,23 @@ 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;
|
||||
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));
|
||||
}
|
||||
} else {
|
||||
statRows = new ArrayList<>();
|
||||
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());
|
||||
@@ -484,29 +502,34 @@ public class LbOrderRowServiceImpl extends ServiceImpl<LbOrderRowMapper, LbOrder
|
||||
byBuyerPhone.computeIfAbsent(buyerPhone, k -> new ArrayList<>()).add(row);
|
||||
}
|
||||
for (Map.Entry<String, List<LbOrderRow>> buyerEntry : byBuyerPhone.entrySet()) {
|
||||
buyerDayStatRows.add(
|
||||
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("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) {
|
||||
|
||||
Reference in New Issue
Block a user