人天统计修改bug
This commit is contained in:
@@ -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_data(today_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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 条记录)。
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user