补充最后成交日期
This commit is contained in:
@@ -129,8 +129,11 @@ public class LbDepartmentUserController {
|
|||||||
@Parameter(description = "是否活跃:1活跃 0不活跃") @RequestParam(name = "is_active", required = false) Integer isActive,
|
@Parameter(description = "是否活跃:1活跃 0不活跃") @RequestParam(name = "is_active", required = false) Integer isActive,
|
||||||
@Parameter(description = "加入日期,查询 join_date 大于该日期的数据")
|
@Parameter(description = "加入日期,查询 join_date 大于该日期的数据")
|
||||||
@RequestParam(name = "join_date", required = false)
|
@RequestParam(name = "join_date", required = false)
|
||||||
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate joinDate) {
|
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate joinDate,
|
||||||
Map<String, Object> result = lbDepartmentUserService.getDepartmentUserTree(tenantId, isActive, joinDate);
|
@Parameter(description = "最后成交日期,查询 last_trade_date 大于该日期的数据")
|
||||||
|
@RequestParam(name = "last_trade_date", required = false)
|
||||||
|
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate lastTradeDate) {
|
||||||
|
Map<String, Object> result = lbDepartmentUserService.getDepartmentUserTree(tenantId, isActive, joinDate, lastTradeDate);
|
||||||
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);
|
||||||
|
|||||||
@@ -40,5 +40,5 @@ public interface ILbDepartmentUserService extends IService<LbDepartmentUser> {
|
|||||||
/**
|
/**
|
||||||
* 按租户查询部门用户并构建父子树(parent_id 对应 lb_user.pid)。
|
* 按租户查询部门用户并构建父子树(parent_id 对应 lb_user.pid)。
|
||||||
*/
|
*/
|
||||||
Map<String, Object> getDepartmentUserTree(String tenantId, Integer isActive, LocalDate joinDate);
|
Map<String, Object> getDepartmentUserTree(String tenantId, Integer isActive, LocalDate joinDate, LocalDate lastTradeDate);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.rj.entity.LbDailyUserTrade;
|
import com.rj.entity.LbDailyUserTrade;
|
||||||
import com.rj.entity.LbDepartmentUser;
|
import com.rj.entity.LbDepartmentUser;
|
||||||
|
import com.rj.entity.LbOrderRow;
|
||||||
import com.rj.entity.LbPurchaseApply;
|
import com.rj.entity.LbPurchaseApply;
|
||||||
import com.rj.entity.LbUser;
|
import com.rj.entity.LbUser;
|
||||||
import com.rj.mapper.LbDailyUserTradeMapper;
|
import com.rj.mapper.LbDailyUserTradeMapper;
|
||||||
import com.rj.mapper.LbDepartmentUserMapper;
|
import com.rj.mapper.LbDepartmentUserMapper;
|
||||||
|
import com.rj.mapper.LbOrderRowMapper;
|
||||||
import com.rj.mapper.LbPurchaseApplyMapper;
|
import com.rj.mapper.LbPurchaseApplyMapper;
|
||||||
import com.rj.mapper.LbUserMapper;
|
import com.rj.mapper.LbUserMapper;
|
||||||
import com.rj.service.ILbDepartmentUserService;
|
import com.rj.service.ILbDepartmentUserService;
|
||||||
@@ -16,7 +18,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -24,6 +25,8 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.time.format.DateTimeParseException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -35,12 +38,21 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMap
|
|||||||
|
|
||||||
private static final int PURCHASE_APPLY_BATCH_SIZE = 200;
|
private static final int PURCHASE_APPLY_BATCH_SIZE = 200;
|
||||||
|
|
||||||
|
private static final String ORDER_DATA_TYPE_DETAIL = "detail_data";
|
||||||
|
|
||||||
|
private static final DateTimeFormatter ORDER_DAY_TIME_FMT =
|
||||||
|
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
|
private static final DateTimeFormatter ORDER_DAY_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private LbDailyUserTradeMapper lbDailyUserTradeMapper;
|
private LbDailyUserTradeMapper lbDailyUserTradeMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private LbPurchaseApplyMapper lbPurchaseApplyMapper;
|
private LbPurchaseApplyMapper lbPurchaseApplyMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private LbUserMapper lbUserMapper;
|
private LbUserMapper lbUserMapper;
|
||||||
|
@Autowired
|
||||||
|
private LbOrderRowMapper lbOrderRowMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> add(LbDepartmentUser entity) {
|
public Map<String, Object> add(LbDepartmentUser entity) {
|
||||||
@@ -458,28 +470,23 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMap
|
|||||||
}
|
}
|
||||||
|
|
||||||
Set<String> tradeActiveUserIds = new HashSet<>();
|
Set<String> tradeActiveUserIds = new HashSet<>();
|
||||||
Map<String, LbDailyUserTrade> latestTradeByUserId = new HashMap<>();
|
Map<String, LbOrderRow> latestOrderByBuyerId = new HashMap<>();
|
||||||
List<LbDailyUserTrade> tradeUserRows = lbDailyUserTradeMapper.selectList(
|
List<LbOrderRow> orderRows = lbOrderRowMapper.selectList(
|
||||||
new LambdaQueryWrapper<LbDailyUserTrade>()
|
new LambdaQueryWrapper<LbOrderRow>()
|
||||||
.eq(LbDailyUserTrade::getTenantId, tenantIdTrim)
|
.eq(LbOrderRow::getTenantId, tenantIdTrim)
|
||||||
.isNotNull(LbDailyUserTrade::getUserId)
|
.eq(LbOrderRow::getDataType, ORDER_DATA_TYPE_DETAIL)
|
||||||
.select(LbDailyUserTrade::getUserId,
|
.isNotNull(LbOrderRow::getBuyerId)
|
||||||
LbDailyUserTrade::getReportDate,
|
.isNotNull(LbOrderRow::getPayTime));
|
||||||
LbDailyUserTrade::getDailyBuyAmt));
|
if (orderRows != null) {
|
||||||
if (tradeUserRows != null) {
|
for (LbOrderRow row : orderRows) {
|
||||||
for (LbDailyUserTrade row : tradeUserRows) {
|
if (!isPaidOrderRow(row)) {
|
||||||
String tradeUserId = trimToNull(row.getUserId());
|
|
||||||
if (tradeUserId == null) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tradeActiveUserIds.add(tradeUserId);
|
String buyerUserId = String.valueOf(row.getBuyerId());
|
||||||
if (row.getReportDate() != null
|
tradeActiveUserIds.add(buyerUserId);
|
||||||
&& row.getDailyBuyAmt() != null
|
LbOrderRow prev = latestOrderByBuyerId.get(buyerUserId);
|
||||||
&& row.getDailyBuyAmt().compareTo(BigDecimal.ONE) >= 0) {
|
if (prev == null || isOrderPayTimeNewer(row, prev)) {
|
||||||
LbDailyUserTrade prev = latestTradeByUserId.get(tradeUserId);
|
latestOrderByBuyerId.put(buyerUserId, row);
|
||||||
if (prev == null || isTradeReportDateNewer(row, prev)) {
|
|
||||||
latestTradeByUserId.put(tradeUserId, row);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -524,10 +531,12 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMap
|
|||||||
}
|
}
|
||||||
|
|
||||||
entity.setOrgChain(buildOrgChain(lbUser.getId(), userById));
|
entity.setOrgChain(buildOrgChain(lbUser.getId(), userById));
|
||||||
LbDailyUserTrade latestTrade = latestTradeByUserId.get(userId);
|
|
||||||
if (latestTrade != null) {
|
|
||||||
entity.setLastTradeDate(latestTrade.getReportDate());
|
LbOrderRow latestOrder = latestOrderByBuyerId.get(userId);
|
||||||
entity.setLastBuyAmt(latestTrade.getDailyBuyAmt());
|
if (latestOrder != null) {
|
||||||
|
entity.setLastTradeDate(parseOrderTimeToDate(latestOrder.getPayTime()));
|
||||||
|
entity.setLastBuyAmt(latestOrder.getTotalMoney());
|
||||||
} else {
|
} else {
|
||||||
entity.setLastTradeDate(null);
|
entity.setLastTradeDate(null);
|
||||||
entity.setLastBuyAmt(null);
|
entity.setLastBuyAmt(null);
|
||||||
@@ -633,7 +642,7 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMap
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getDepartmentUserTree(String tenantId, Integer isActive, LocalDate joinDate) {
|
public Map<String, Object> getDepartmentUserTree(String tenantId, Integer isActive, LocalDate joinDate, LocalDate lastTradeDate) {
|
||||||
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()) {
|
||||||
@@ -651,6 +660,9 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMap
|
|||||||
if (joinDate != null) {
|
if (joinDate != null) {
|
||||||
queryWrapper.gt(LbDepartmentUser::getJoinDate, joinDate);
|
queryWrapper.gt(LbDepartmentUser::getJoinDate, joinDate);
|
||||||
}
|
}
|
||||||
|
if (lastTradeDate != null) {
|
||||||
|
queryWrapper.gt(LbDepartmentUser::getLastTradeDate, lastTradeDate);
|
||||||
|
}
|
||||||
List<LbDepartmentUser> deptUsers = this.list(queryWrapper);
|
List<LbDepartmentUser> deptUsers = this.list(queryWrapper);
|
||||||
if (deptUsers == null || deptUsers.isEmpty()) {
|
if (deptUsers == null || deptUsers.isEmpty()) {
|
||||||
result.put("success", true);
|
result.put("success", true);
|
||||||
@@ -802,6 +814,69 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMap
|
|||||||
return reportDate.isAfter(prevReportDate);
|
return reportDate.isAfter(prevReportDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isPaidOrderRow(LbOrderRow row) {
|
||||||
|
String payTime = row.getPayTime();
|
||||||
|
return payTime != null && !payTime.trim().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isOrderPayTimeNewer(LbOrderRow order, LbOrderRow prev) {
|
||||||
|
LocalDateTime payTime = parseOrderTime(payTimeOrBuyTime(order));
|
||||||
|
LocalDateTime prevPayTime = parseOrderTime(payTimeOrBuyTime(prev));
|
||||||
|
if (payTime == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (prevPayTime == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
int cmp = payTime.compareTo(prevPayTime);
|
||||||
|
if (cmp != 0) {
|
||||||
|
return cmp > 0;
|
||||||
|
}
|
||||||
|
Long id = order.getId();
|
||||||
|
Long prevId = prev.getId();
|
||||||
|
if (id == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (prevId == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return id > prevId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String payTimeOrBuyTime(LbOrderRow row) {
|
||||||
|
if (row.getPayTime() != null && !row.getPayTime().trim().isEmpty()) {
|
||||||
|
return row.getPayTime().trim();
|
||||||
|
}
|
||||||
|
return row.getBuyTime() == null ? null : row.getBuyTime().trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LocalDateTime parseOrderTime(String timeText) {
|
||||||
|
if (timeText == null || timeText.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return LocalDateTime.parse(timeText, ORDER_DAY_TIME_FMT);
|
||||||
|
} catch (DateTimeParseException ignored) {
|
||||||
|
// continue
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return LocalDate.parse(timeText.substring(0, Math.min(10, timeText.length())), ORDER_DAY_FMT)
|
||||||
|
.atStartOfDay();
|
||||||
|
} catch (DateTimeParseException ignored) {
|
||||||
|
// continue
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return LocalDateTime.parse(timeText, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
|
||||||
|
} catch (DateTimeParseException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LocalDate parseOrderTimeToDate(String timeText) {
|
||||||
|
LocalDateTime dateTime = parseOrderTime(timeText);
|
||||||
|
return dateTime == null ? null : dateTime.toLocalDate();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按最近交易日写入 last_trade_date、last_buy_amt;若新交易日更晚则覆盖,否则保留原值。
|
* 按最近交易日写入 last_trade_date、last_buy_amt;若新交易日更晚则覆盖,否则保留原值。
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user