调整代码结构
This commit is contained in:
@@ -2,16 +2,18 @@ package com.rj.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.rj.entity.DailyUserTrade;
|
||||
import com.rj.service.IDailyUserTradeService;
|
||||
import com.rj.entity.LbDailyUserTrade;
|
||||
import com.rj.service.ILbDailyUserTradeService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.HashMap;
|
||||
@@ -24,40 +26,43 @@ import java.util.UUID;
|
||||
* </p>
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/api/dailyUserTrade")
|
||||
@RequestMapping("/api/lbDailyUserTrade")
|
||||
@Tag(name = "当天用户交易", description = "当天用户交易相关接口")
|
||||
public class DailyUserTradeController {
|
||||
public class LbDailyUserTradeController {
|
||||
|
||||
@Autowired
|
||||
private IDailyUserTradeService dailyUserTradeService;
|
||||
private ILbDailyUserTradeService lbDailyUserTradeService;
|
||||
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增交易记录", description = "新增当天用户交易记录")
|
||||
public ResponseEntity<Map<String, Object>> addDailyUserTrade(
|
||||
public ResponseEntity<Map<String, Object>> addLbDailyUserTrade(
|
||||
@Parameter(description = "当天用户交易信息", required = true)
|
||||
@RequestBody DailyUserTrade dailyUserTrade) {
|
||||
@RequestBody LbDailyUserTrade lbDailyUserTrade) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
if (dailyUserTrade.getId() == null || dailyUserTrade.getId().trim().isEmpty()) {
|
||||
dailyUserTrade.setId(UUID.randomUUID().toString());
|
||||
if (lbDailyUserTrade.getId() == null || lbDailyUserTrade.getId().trim().isEmpty()) {
|
||||
lbDailyUserTrade.setId(UUID.randomUUID().toString());
|
||||
}
|
||||
if (dailyUserTrade.getDailySellAmt() == null) {
|
||||
dailyUserTrade.setDailySellAmt(BigDecimal.ZERO);
|
||||
if (lbDailyUserTrade.getDailySellAmt() == null) {
|
||||
lbDailyUserTrade.setDailySellAmt(BigDecimal.ZERO);
|
||||
}
|
||||
if (dailyUserTrade.getDailyBuyAmt() == null) {
|
||||
dailyUserTrade.setDailyBuyAmt(BigDecimal.ZERO);
|
||||
if (lbDailyUserTrade.getDailyBuyAmt() == null) {
|
||||
lbDailyUserTrade.setDailyBuyAmt(BigDecimal.ZERO);
|
||||
}
|
||||
if (dailyUserTrade.getDiffAmt() == null) {
|
||||
dailyUserTrade.setDiffAmt(dailyUserTrade.getDailySellAmt().subtract(dailyUserTrade.getDailyBuyAmt()));
|
||||
if (lbDailyUserTrade.getDiffAmt() == null) {
|
||||
lbDailyUserTrade.setDiffAmt(lbDailyUserTrade.getDailySellAmt().subtract(lbDailyUserTrade.getDailyBuyAmt()));
|
||||
}
|
||||
dailyUserTrade.setCreatedAt(LocalDateTime.now());
|
||||
dailyUserTrade.setUpdatedAt(LocalDateTime.now());
|
||||
if (lbDailyUserTrade.getReportDate() == null) {
|
||||
lbDailyUserTrade.setReportDate(LocalDate.now());
|
||||
}
|
||||
lbDailyUserTrade.setCreatedAt(LocalDateTime.now());
|
||||
lbDailyUserTrade.setUpdatedAt(LocalDateTime.now());
|
||||
|
||||
boolean success = dailyUserTradeService.save(dailyUserTrade);
|
||||
boolean success = lbDailyUserTradeService.save(lbDailyUserTrade);
|
||||
if (success) {
|
||||
result.put("success", true);
|
||||
result.put("message", "新增成功");
|
||||
result.put("data", dailyUserTrade);
|
||||
result.put("data", lbDailyUserTrade);
|
||||
return ResponseEntity.ok(result);
|
||||
}
|
||||
result.put("success", false);
|
||||
@@ -77,7 +82,7 @@ public class DailyUserTradeController {
|
||||
@PathVariable String id) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
DailyUserTrade data = dailyUserTradeService.getById(id);
|
||||
LbDailyUserTrade data = lbDailyUserTradeService.getById(id);
|
||||
if (data == null) {
|
||||
result.put("success", false);
|
||||
result.put("message", "记录不存在");
|
||||
@@ -111,33 +116,44 @@ public class DailyUserTradeController {
|
||||
@RequestParam(required = false) String promoterId,
|
||||
@Parameter(description = "推广人(模糊查询)")
|
||||
@RequestParam(required = false) String promoterName,
|
||||
@Parameter(description = "报表日期,格式:yyyy-MM-dd")
|
||||
@RequestParam(required = false) String reportDate,
|
||||
@Parameter(description = "创建开始时间,格式:yyyy-MM-dd HH:mm:ss")
|
||||
@RequestParam(required = false) String createdStartTime,
|
||||
@Parameter(description = "创建结束时间,格式:yyyy-MM-dd HH:mm:ss")
|
||||
@RequestParam(required = false) String createdEndTime) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
LambdaQueryWrapper<DailyUserTrade> queryWrapper = new LambdaQueryWrapper<>();
|
||||
LambdaQueryWrapper<LbDailyUserTrade> queryWrapper = new LambdaQueryWrapper<>();
|
||||
if (tenantId != null && !tenantId.trim().isEmpty()) {
|
||||
queryWrapper.eq(DailyUserTrade::getTenantId, tenantId);
|
||||
queryWrapper.eq(LbDailyUserTrade::getTenantId, tenantId);
|
||||
}
|
||||
if (userId != null && !userId.trim().isEmpty()) {
|
||||
queryWrapper.eq(DailyUserTrade::getUserId, userId);
|
||||
queryWrapper.eq(LbDailyUserTrade::getUserId, userId);
|
||||
}
|
||||
if (nickname != null && !nickname.trim().isEmpty()) {
|
||||
queryWrapper.like(DailyUserTrade::getNickname, nickname);
|
||||
queryWrapper.like(LbDailyUserTrade::getNickname, nickname);
|
||||
}
|
||||
if (promoterId != null && !promoterId.trim().isEmpty()) {
|
||||
queryWrapper.eq(DailyUserTrade::getPromoterId, promoterId);
|
||||
queryWrapper.eq(LbDailyUserTrade::getPromoterId, promoterId);
|
||||
}
|
||||
if (promoterName != null && !promoterName.trim().isEmpty()) {
|
||||
queryWrapper.like(DailyUserTrade::getPromoterName, promoterName);
|
||||
queryWrapper.like(LbDailyUserTrade::getPromoterName, promoterName);
|
||||
}
|
||||
if (reportDate != null && !reportDate.trim().isEmpty()) {
|
||||
try {
|
||||
queryWrapper.eq(LbDailyUserTrade::getReportDate, LocalDate.parse(reportDate));
|
||||
} catch (Exception e) {
|
||||
result.put("success", false);
|
||||
result.put("message", "报表日期格式错误,请使用 yyyy-MM-dd");
|
||||
return ResponseEntity.badRequest().body(result);
|
||||
}
|
||||
}
|
||||
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
if (createdStartTime != null && !createdStartTime.trim().isEmpty()) {
|
||||
try {
|
||||
queryWrapper.ge(DailyUserTrade::getCreatedAt, LocalDateTime.parse(createdStartTime, formatter));
|
||||
queryWrapper.ge(LbDailyUserTrade::getCreatedAt, LocalDateTime.parse(createdStartTime, formatter));
|
||||
} catch (Exception e) {
|
||||
result.put("success", false);
|
||||
result.put("message", "创建开始时间格式错误,请使用 yyyy-MM-dd HH:mm:ss");
|
||||
@@ -146,7 +162,7 @@ public class DailyUserTradeController {
|
||||
}
|
||||
if (createdEndTime != null && !createdEndTime.trim().isEmpty()) {
|
||||
try {
|
||||
queryWrapper.le(DailyUserTrade::getCreatedAt, LocalDateTime.parse(createdEndTime, formatter));
|
||||
queryWrapper.le(LbDailyUserTrade::getCreatedAt, LocalDateTime.parse(createdEndTime, formatter));
|
||||
} catch (Exception e) {
|
||||
result.put("success", false);
|
||||
result.put("message", "创建结束时间格式错误,请使用 yyyy-MM-dd HH:mm:ss");
|
||||
@@ -154,8 +170,8 @@ public class DailyUserTradeController {
|
||||
}
|
||||
}
|
||||
|
||||
queryWrapper.orderByDesc(DailyUserTrade::getCreatedAt);
|
||||
Page<DailyUserTrade> page = dailyUserTradeService.page(new Page<>(current, size), queryWrapper);
|
||||
queryWrapper.orderByDesc(LbDailyUserTrade::getCreatedAt);
|
||||
Page<LbDailyUserTrade> page = lbDailyUserTradeService.page(new Page<>(current, size), queryWrapper);
|
||||
|
||||
result.put("success", true);
|
||||
result.put("message", "查询成功");
|
||||
@@ -176,23 +192,23 @@ public class DailyUserTradeController {
|
||||
@Operation(summary = "修改交易记录", description = "根据ID修改当天用户交易记录")
|
||||
public ResponseEntity<Map<String, Object>> update(
|
||||
@Parameter(description = "当天用户交易信息", required = true)
|
||||
@RequestBody DailyUserTrade dailyUserTrade) {
|
||||
@RequestBody LbDailyUserTrade lbDailyUserTrade) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
if (dailyUserTrade.getId() == null || dailyUserTrade.getId().trim().isEmpty()) {
|
||||
if (lbDailyUserTrade.getId() == null || lbDailyUserTrade.getId().trim().isEmpty()) {
|
||||
result.put("success", false);
|
||||
result.put("message", "ID不能为空");
|
||||
return ResponseEntity.badRequest().body(result);
|
||||
}
|
||||
if (dailyUserTrade.getDailySellAmt() != null && dailyUserTrade.getDailyBuyAmt() != null) {
|
||||
dailyUserTrade.setDiffAmt(dailyUserTrade.getDailySellAmt().subtract(dailyUserTrade.getDailyBuyAmt()));
|
||||
if (lbDailyUserTrade.getDailySellAmt() != null && lbDailyUserTrade.getDailyBuyAmt() != null) {
|
||||
lbDailyUserTrade.setDiffAmt(lbDailyUserTrade.getDailySellAmt().subtract(lbDailyUserTrade.getDailyBuyAmt()));
|
||||
}
|
||||
dailyUserTrade.setUpdatedAt(LocalDateTime.now());
|
||||
boolean success = dailyUserTradeService.updateById(dailyUserTrade);
|
||||
lbDailyUserTrade.setUpdatedAt(LocalDateTime.now());
|
||||
boolean success = lbDailyUserTradeService.updateById(lbDailyUserTrade);
|
||||
if (success) {
|
||||
result.put("success", true);
|
||||
result.put("message", "修改成功");
|
||||
result.put("data", dailyUserTrade);
|
||||
result.put("data", lbDailyUserTrade);
|
||||
return ResponseEntity.ok(result);
|
||||
}
|
||||
result.put("success", false);
|
||||
@@ -212,7 +228,7 @@ public class DailyUserTradeController {
|
||||
@PathVariable String id) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
boolean success = dailyUserTradeService.removeById(id);
|
||||
boolean success = lbDailyUserTradeService.removeById(id);
|
||||
if (success) {
|
||||
result.put("success", true);
|
||||
result.put("message", "删除成功");
|
||||
@@ -227,4 +243,26 @@ public class DailyUserTradeController {
|
||||
return ResponseEntity.internalServerError().body(result);
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("/import")
|
||||
@Operation(summary = "导入交易记录", description = "按Excel模板导入当天用户交易记录")
|
||||
public ResponseEntity<Map<String, Object>> importExcel(
|
||||
@Parameter(description = "Excel文件", required = true)
|
||||
@RequestParam("file") MultipartFile file,
|
||||
@Parameter(description = "默认报表日期,格式:yyyy-MM-dd;当Excel行里无报表日期时生效")
|
||||
@RequestParam(required = false) String defaultReportDate) {
|
||||
try {
|
||||
Map<String, Object> result = lbDailyUserTradeService.importFromExcel(file, defaultReportDate);
|
||||
Boolean success = (Boolean) result.get("success");
|
||||
if (Boolean.TRUE.equals(success)) {
|
||||
return ResponseEntity.ok(result);
|
||||
}
|
||||
return ResponseEntity.badRequest().body(result);
|
||||
} catch (Exception e) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("success", false);
|
||||
result.put("message", "导入异常:" + e.getMessage());
|
||||
return ResponseEntity.internalServerError().body(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
@@ -20,7 +21,7 @@ import java.time.LocalDateTime;
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@TableName("lb_daily_user_trade")
|
||||
@Schema(description = "当天用户交易表")
|
||||
public class DailyUserTrade implements Serializable {
|
||||
public class LbDailyUserTrade implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -64,6 +65,10 @@ public class DailyUserTrade implements Serializable {
|
||||
@TableField("desc_content")
|
||||
private String descContent;
|
||||
|
||||
@Schema(description = "报表日期")
|
||||
@TableField("report_date")
|
||||
private LocalDate reportDate;
|
||||
|
||||
@Schema(description = "插入时间")
|
||||
@TableField("created_at")
|
||||
private LocalDateTime createdAt;
|
||||
@@ -1,13 +1,13 @@
|
||||
package com.rj.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.rj.entity.DailyUserTrade;
|
||||
import com.rj.entity.LbDailyUserTrade;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 当天用户交易表 Mapper 接口
|
||||
* </p>
|
||||
*/
|
||||
public interface DailyUserTradeMapper extends BaseMapper<DailyUserTrade> {
|
||||
public interface LbDailyUserTradeMapper extends BaseMapper<LbDailyUserTrade> {
|
||||
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package com.rj.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.rj.entity.DailyUserTrade;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 当天用户交易表 服务类
|
||||
* </p>
|
||||
*/
|
||||
public interface IDailyUserTradeService extends IService<DailyUserTrade> {
|
||||
|
||||
}
|
||||
17
src/main/java/com/rj/service/ILbDailyUserTradeService.java
Normal file
17
src/main/java/com/rj/service/ILbDailyUserTradeService.java
Normal file
@@ -0,0 +1,17 @@
|
||||
package com.rj.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.rj.entity.LbDailyUserTrade;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 当天用户交易表 服务类
|
||||
* </p>
|
||||
*/
|
||||
public interface ILbDailyUserTradeService extends IService<LbDailyUserTrade> {
|
||||
|
||||
Map<String, Object> importFromExcel(MultipartFile file, String defaultReportDate);
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package com.rj.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.rj.entity.DailyUserTrade;
|
||||
import com.rj.mapper.DailyUserTradeMapper;
|
||||
import com.rj.service.IDailyUserTradeService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 当天用户交易表 服务实现类
|
||||
* </p>
|
||||
*/
|
||||
@Service
|
||||
public class DailyUserTradeServiceImpl extends ServiceImpl<DailyUserTradeMapper, DailyUserTrade> implements IDailyUserTradeService {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,280 @@
|
||||
package com.rj.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.rj.entity.LbDailyUserTrade;
|
||||
import com.rj.mapper.LbDailyUserTradeMapper;
|
||||
import com.rj.service.ILbDailyUserTradeService;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.CellType;
|
||||
import org.apache.poi.ss.usermodel.DataFormatter;
|
||||
import org.apache.poi.ss.usermodel.DateUtil;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 当天用户交易表 服务实现类
|
||||
* </p>
|
||||
*/
|
||||
@Service
|
||||
public class LbDailyUserTradeServiceImpl extends ServiceImpl<LbDailyUserTradeMapper, LbDailyUserTrade> implements ILbDailyUserTradeService {
|
||||
|
||||
@Override
|
||||
public Map<String, Object> importFromExcel(MultipartFile file, String defaultReportDate) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
if (file == null || file.isEmpty()) {
|
||||
result.put("success", false);
|
||||
result.put("message", "上传文件不能为空");
|
||||
return result;
|
||||
}
|
||||
String originalFilename = file.getOriginalFilename();
|
||||
if (originalFilename == null || !originalFilename.toLowerCase().endsWith(".xlsx")) {
|
||||
result.put("success", false);
|
||||
result.put("message", "仅支持 .xlsx 文件");
|
||||
return result;
|
||||
}
|
||||
|
||||
LocalDate fallbackReportDate = null;
|
||||
if (StringUtils.isNotBlank(defaultReportDate)) {
|
||||
try {
|
||||
fallbackReportDate = LocalDate.parse(defaultReportDate.trim());
|
||||
} catch (Exception e) {
|
||||
result.put("success", false);
|
||||
result.put("message", "defaultReportDate 格式错误,请使用 yyyy-MM-dd");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
List<LbDailyUserTrade> importList = new ArrayList<>();
|
||||
List<String> skippedRows = new ArrayList<>();
|
||||
DataFormatter dataFormatter = new DataFormatter();
|
||||
try (Workbook workbook = new XSSFWorkbook(file.getInputStream())) {
|
||||
Sheet sheet = workbook.getSheetAt(0);
|
||||
if (sheet == null) {
|
||||
result.put("success", false);
|
||||
result.put("message", "Excel内容为空");
|
||||
return result;
|
||||
}
|
||||
|
||||
int headerRowNum = findHeaderRow(sheet, dataFormatter);
|
||||
if (headerRowNum < 0) {
|
||||
result.put("success", false);
|
||||
result.put("message", "未识别到表头,请确认模板列包含:租户ID、用户ID、单日卖出金额、当日买入金额等字段");
|
||||
return result;
|
||||
}
|
||||
|
||||
Map<String, Integer> headerIndexMap = buildHeaderIndexMap(sheet.getRow(headerRowNum), dataFormatter);
|
||||
for (int i = headerRowNum + 1; i <= sheet.getLastRowNum(); i++) {
|
||||
Row row = sheet.getRow(i);
|
||||
if (row == null || isEmptyRow(row, dataFormatter)) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
LbDailyUserTrade trade = parseTradeRow(row, headerIndexMap, dataFormatter, fallbackReportDate);
|
||||
if (trade == null) {
|
||||
skippedRows.add(String.valueOf(i + 1));
|
||||
continue;
|
||||
}
|
||||
importList.add(trade);
|
||||
} catch (Exception ex) {
|
||||
skippedRows.add((i + 1) + "(" + ex.getMessage() + ")");
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
result.put("success", false);
|
||||
result.put("message", "读取Excel失败:" + e.getMessage());
|
||||
return result;
|
||||
}
|
||||
|
||||
if (importList.isEmpty()) {
|
||||
result.put("success", false);
|
||||
result.put("message", "没有可导入的数据,请检查模板与内容");
|
||||
result.put("skippedRows", skippedRows);
|
||||
return result;
|
||||
}
|
||||
|
||||
boolean saved = this.saveBatch(importList);
|
||||
if (!saved) {
|
||||
result.put("success", false);
|
||||
result.put("message", "导入失败,数据库保存异常");
|
||||
return result;
|
||||
}
|
||||
|
||||
result.put("success", true);
|
||||
result.put("message", "导入成功");
|
||||
result.put("importCount", importList.size());
|
||||
result.put("skipCount", skippedRows.size());
|
||||
result.put("skippedRows", skippedRows);
|
||||
return result;
|
||||
}
|
||||
|
||||
private int findHeaderRow(Sheet sheet, DataFormatter formatter) {
|
||||
int maxRow = Math.min(sheet.getLastRowNum(), 10);
|
||||
for (int i = 0; i <= maxRow; i++) {
|
||||
Row row = sheet.getRow(i);
|
||||
if (row == null) {
|
||||
continue;
|
||||
}
|
||||
Map<String, Integer> headerMap = buildHeaderIndexMap(row, formatter);
|
||||
if (headerMap.containsKey("tenantId") && headerMap.containsKey("userId")) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
private Map<String, Integer> buildHeaderIndexMap(Row headerRow, DataFormatter formatter) {
|
||||
Map<String, Integer> map = new HashMap<>();
|
||||
if (headerRow == null) {
|
||||
return map;
|
||||
}
|
||||
for (Cell cell : headerRow) {
|
||||
String text = normalizeHeader(formatter.formatCellValue(cell));
|
||||
if (text.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
String field = resolveFieldByHeader(text);
|
||||
if (field != null) {
|
||||
map.putIfAbsent(field, cell.getColumnIndex());
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
private String resolveFieldByHeader(String header) {
|
||||
Map<String, Set<String>> aliasMap = new HashMap<>();
|
||||
aliasMap.put("tenantId", Set.of("tenantid", "tenant_id", "租户id", "租户"));
|
||||
aliasMap.put("userId", Set.of("userid", "user_id", "用户id", "用户"));
|
||||
aliasMap.put("nickname", Set.of("nickname", "昵称", "用户名", "客户昵称"));
|
||||
aliasMap.put("dailySellAmt", Set.of("dailysellamt", "daily_sell_amt", "单日卖出金额", "卖出金额", "卖出"));
|
||||
aliasMap.put("dailyBuyAmt", Set.of("dailybuyamt", "daily_buy_amt", "当日买入金额", "买入金额", "买入"));
|
||||
aliasMap.put("diffAmt", Set.of("diffamt", "diff_amt", "差额", "净额"));
|
||||
aliasMap.put("promoterId", Set.of("promoterid", "promoter_id", "推广人id"));
|
||||
aliasMap.put("promoterName", Set.of("promotername", "promoter_name", "推广人", "邀请人"));
|
||||
aliasMap.put("descContent", Set.of("desccontent", "desc_content", "描述", "备注", "说明"));
|
||||
aliasMap.put("reportDate", Set.of("reportdate", "report_date", "报表日期", "统计日期", "日期"));
|
||||
|
||||
for (Map.Entry<String, Set<String>> entry : aliasMap.entrySet()) {
|
||||
if (entry.getValue().contains(header)) {
|
||||
return entry.getKey();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private LbDailyUserTrade parseTradeRow(Row row, Map<String, Integer> headerMap, DataFormatter formatter, LocalDate fallbackReportDate) {
|
||||
String tenantId = readString(row, headerMap.get("tenantId"), formatter);
|
||||
String userId = readString(row, headerMap.get("userId"), formatter);
|
||||
if (tenantId.isEmpty() || userId.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
LbDailyUserTrade trade = new LbDailyUserTrade();
|
||||
trade.setId(UUID.randomUUID().toString());
|
||||
trade.setTenantId(tenantId);
|
||||
trade.setUserId(userId);
|
||||
trade.setNickname(readString(row, headerMap.get("nickname"), formatter));
|
||||
trade.setDailySellAmt(readDecimal(row, headerMap.get("dailySellAmt"), formatter));
|
||||
trade.setDailyBuyAmt(readDecimal(row, headerMap.get("dailyBuyAmt"), formatter));
|
||||
trade.setPromoterId(readString(row, headerMap.get("promoterId"), formatter));
|
||||
trade.setPromoterName(readString(row, headerMap.get("promoterName"), formatter));
|
||||
trade.setDescContent(readString(row, headerMap.get("descContent"), formatter));
|
||||
|
||||
BigDecimal sell = trade.getDailySellAmt() == null ? BigDecimal.ZERO : trade.getDailySellAmt();
|
||||
BigDecimal buy = trade.getDailyBuyAmt() == null ? BigDecimal.ZERO : trade.getDailyBuyAmt();
|
||||
BigDecimal diff = readDecimal(row, headerMap.get("diffAmt"), formatter);
|
||||
trade.setDailySellAmt(sell);
|
||||
trade.setDailyBuyAmt(buy);
|
||||
trade.setDiffAmt(diff == null ? sell.subtract(buy) : diff);
|
||||
|
||||
LocalDate reportDate = readDate(row, headerMap.get("reportDate"), formatter);
|
||||
trade.setReportDate(reportDate != null ? reportDate : (fallbackReportDate != null ? fallbackReportDate : LocalDate.now()));
|
||||
trade.setCreatedAt(LocalDateTime.now());
|
||||
trade.setUpdatedAt(LocalDateTime.now());
|
||||
return trade;
|
||||
}
|
||||
|
||||
private boolean isEmptyRow(Row row, DataFormatter formatter) {
|
||||
for (Cell cell : row) {
|
||||
if (!formatter.formatCellValue(cell).trim().isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private String readString(Row row, Integer index, DataFormatter formatter) {
|
||||
if (index == null) {
|
||||
return "";
|
||||
}
|
||||
Cell cell = row.getCell(index);
|
||||
if (cell == null) {
|
||||
return "";
|
||||
}
|
||||
return formatter.formatCellValue(cell).trim();
|
||||
}
|
||||
|
||||
private BigDecimal readDecimal(Row row, Integer index, DataFormatter formatter) {
|
||||
String value = readString(row, index, formatter);
|
||||
if (value.isEmpty()) {
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
String normalized = value.replace(",", "").replace(",", "");
|
||||
try {
|
||||
return new BigDecimal(normalized);
|
||||
} catch (Exception e) {
|
||||
throw new IllegalArgumentException("金额格式错误: " + value);
|
||||
}
|
||||
}
|
||||
|
||||
private LocalDate readDate(Row row, Integer index, DataFormatter formatter) {
|
||||
if (index == null) {
|
||||
return null;
|
||||
}
|
||||
Cell cell = row.getCell(index);
|
||||
if (cell == null) {
|
||||
return null;
|
||||
}
|
||||
if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {
|
||||
return cell.getLocalDateTimeCellValue().toLocalDate();
|
||||
}
|
||||
String text = formatter.formatCellValue(cell).trim();
|
||||
if (text.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return LocalDate.parse(text);
|
||||
} catch (Exception ignore) {
|
||||
}
|
||||
try {
|
||||
return LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
|
||||
} catch (Exception ignore) {
|
||||
}
|
||||
try {
|
||||
return LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-M-d"));
|
||||
} catch (Exception ignore) {
|
||||
}
|
||||
throw new IllegalArgumentException("日期格式错误: " + text);
|
||||
}
|
||||
|
||||
private String normalizeHeader(String header) {
|
||||
return header == null ? "" : header.toLowerCase().replace(" ", "").replace(" ", "").trim();
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.rj.mapper.DailyUserTradeMapper">
|
||||
<mapper namespace="com.rj.mapper.LbDailyUserTradeMapper">
|
||||
|
||||
<resultMap id="BaseResultMap" type="com.rj.entity.DailyUserTrade">
|
||||
<resultMap id="BaseResultMap" type="com.rj.entity.LbDailyUserTrade">
|
||||
<id column="id" property="id"/>
|
||||
<result column="tenant_id" property="tenantId"/>
|
||||
<result column="user_id" property="userId"/>
|
||||
@@ -13,12 +13,13 @@
|
||||
<result column="promoter_id" property="promoterId"/>
|
||||
<result column="promoter_name" property="promoterName"/>
|
||||
<result column="desc_content" property="descContent"/>
|
||||
<result column="report_date" property="reportDate"/>
|
||||
<result column="created_at" property="createdAt"/>
|
||||
<result column="updated_at" property="updatedAt"/>
|
||||
</resultMap>
|
||||
|
||||
<sql id="Base_Column_List">
|
||||
id, tenant_id, user_id, nickname, daily_sell_amt, daily_buy_amt, diff_amt, promoter_id, promoter_name, desc_content, created_at, updated_at
|
||||
id, tenant_id, user_id, nickname, daily_sell_amt, daily_buy_amt, diff_amt, promoter_id, promoter_name, desc_content, report_date, created_at, updated_at
|
||||
</sql>
|
||||
|
||||
</mapper>
|
||||
@@ -9,6 +9,7 @@ CREATE TABLE `lb_daily_user_trade` (
|
||||
`promoter_id` VARCHAR(64) DEFAULT NULL COMMENT '推广人ID',
|
||||
`promoter_name` VARCHAR(100) DEFAULT NULL COMMENT '推广人',
|
||||
`desc_content` VARCHAR(512) DEFAULT NULL COMMENT '描述',
|
||||
`report_date` DATE DEFAULT NULL COMMENT '报表日期',
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||
PRIMARY KEY (`id`),
|
||||
|
||||
Reference in New Issue
Block a user