|
@@ -7,6 +7,7 @@ import com.etotem.cfc.common.AdminRoles;
|
|
|
import com.etotem.cfc.common.Result;
|
|
import com.etotem.cfc.common.Result;
|
|
|
import com.etotem.cfc.entity.*;
|
|
import com.etotem.cfc.entity.*;
|
|
|
import com.etotem.cfc.mapper.*;
|
|
import com.etotem.cfc.mapper.*;
|
|
|
|
|
+import com.etotem.cfc.dto.PointsLogVO;
|
|
|
import com.etotem.cfc.dto.TaskReviewDTO;
|
|
import com.etotem.cfc.dto.TaskReviewDTO;
|
|
|
import com.etotem.cfc.service.TaskService;
|
|
import com.etotem.cfc.service.TaskService;
|
|
|
import com.etotem.cfc.service.UserService;
|
|
import com.etotem.cfc.service.UserService;
|
|
@@ -30,6 +31,8 @@ import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
|
|
|
+import java.util.HashSet;
|
|
|
|
|
+import java.util.Set;
|
|
|
import com.etotem.cfc.util.SortUtil;
|
|
import com.etotem.cfc.util.SortUtil;
|
|
|
import com.etotem.cfc.util.ParamUtils;
|
|
import com.etotem.cfc.util.ParamUtils;
|
|
|
|
|
|
|
@@ -598,10 +601,12 @@ public class AdminController {
|
|
|
|
|
|
|
|
// 积分管理
|
|
// 积分管理
|
|
|
@PostMapping("/points/logs")
|
|
@PostMapping("/points/logs")
|
|
|
- public Result<Page<PointsLog>> getPointsLogs(@RequestBody Map<String, Object> params) {
|
|
|
|
|
|
|
+ public Result<Page<PointsLogVO>> getPointsLogs(@RequestBody Map<String, Object> params) {
|
|
|
Integer page = 1;
|
|
Integer page = 1;
|
|
|
Integer size = 10;
|
|
Integer size = 10;
|
|
|
Long memberId = null;
|
|
Long memberId = null;
|
|
|
|
|
+ Long familyId = null;
|
|
|
|
|
+ String keyword = null;
|
|
|
|
|
|
|
|
// 安全解析page
|
|
// 安全解析page
|
|
|
if (params.get("page") != null) {
|
|
if (params.get("page") != null) {
|
|
@@ -625,7 +630,7 @@ public class AdminController {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 安全解析childId
|
|
|
|
|
|
|
+ // 安全解析childId(成员ID)
|
|
|
if (params.get("memberId") != null) {
|
|
if (params.get("memberId") != null) {
|
|
|
if (params.get("memberId") instanceof Number) {
|
|
if (params.get("memberId") instanceof Number) {
|
|
|
memberId = ((Number) params.get("memberId")).longValue();
|
|
memberId = ((Number) params.get("memberId")).longValue();
|
|
@@ -633,13 +638,59 @@ public class AdminController {
|
|
|
try { memberId = Long.parseLong(params.get("memberId").toString()); } catch (Exception e) {}
|
|
try { memberId = Long.parseLong(params.get("memberId").toString()); } catch (Exception e) {}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 安全解析familyId(按家庭筛选)
|
|
|
|
|
+ if (params.get("familyId") != null) {
|
|
|
|
|
+ if (params.get("familyId") instanceof Number) {
|
|
|
|
|
+ familyId = ((Number) params.get("familyId")).longValue();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ try { familyId = Long.parseLong(params.get("familyId").toString()); } catch (Exception e) {}
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 成员姓名模糊查询
|
|
|
|
|
+ if (params.get("keyword") != null) {
|
|
|
|
|
+ keyword = params.get("keyword").toString().trim();
|
|
|
|
|
+ if (keyword.isEmpty()) keyword = null;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
String type = (String) params.get("type");
|
|
String type = (String) params.get("type");
|
|
|
|
|
|
|
|
|
|
+ // points_log.child_id 即 family_members.id:把成员ID/家庭/姓名条件换算成成员ID集合(多条件为交集)
|
|
|
|
|
+ Set<Long> memberIds = null;
|
|
|
|
|
+ if (memberId != null) {
|
|
|
|
|
+ memberIds = new HashSet<>();
|
|
|
|
|
+ memberIds.add(memberId);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (familyId != null || keyword != null) {
|
|
|
|
|
+ LambdaQueryWrapper<FamilyMember> memberWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ if (familyId != null) {
|
|
|
|
|
+ memberWrapper.eq(FamilyMember::getFamilyId, familyId);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (keyword != null) {
|
|
|
|
|
+ memberWrapper.like(FamilyMember::getNickname, keyword);
|
|
|
|
|
+ }
|
|
|
|
|
+ memberWrapper.select(FamilyMember::getId);
|
|
|
|
|
+ Set<Long> filteredIds = new HashSet<>();
|
|
|
|
|
+ for (FamilyMember m : familyMemberMapper.selectList(memberWrapper)) {
|
|
|
|
|
+ filteredIds.add(m.getId());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (memberIds == null) {
|
|
|
|
|
+ memberIds = filteredIds;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ memberIds.retainAll(filteredIds);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // 筛选条件已生效但无匹配成员 → 直接返回空页
|
|
|
|
|
+ if (memberIds != null && memberIds.isEmpty()) {
|
|
|
|
|
+ Page<PointsLogVO> emptyPage = new Page<>(page, size);
|
|
|
|
|
+ return Result.success(emptyPage);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
Page<PointsLog> pageParam = new Page<>(page, size);
|
|
Page<PointsLog> pageParam = new Page<>(page, size);
|
|
|
LambdaQueryWrapper<PointsLog> wrapper = new LambdaQueryWrapper<>();
|
|
LambdaQueryWrapper<PointsLog> wrapper = new LambdaQueryWrapper<>();
|
|
|
- if (memberId != null) {
|
|
|
|
|
- wrapper.eq(PointsLog::getChildId, memberId);
|
|
|
|
|
|
|
+ if (memberIds != null) {
|
|
|
|
|
+ wrapper.in(PointsLog::getChildId, memberIds);
|
|
|
}
|
|
}
|
|
|
if (type != null && !type.isEmpty()) {
|
|
if (type != null && !type.isEmpty()) {
|
|
|
wrapper.eq(PointsLog::getType, type);
|
|
wrapper.eq(PointsLog::getType, type);
|
|
@@ -647,7 +698,58 @@ public class AdminController {
|
|
|
wrapper.orderByDesc(PointsLog::getCreatedAt);
|
|
wrapper.orderByDesc(PointsLog::getCreatedAt);
|
|
|
SortUtil.applySort(wrapper);
|
|
SortUtil.applySort(wrapper);
|
|
|
Page<PointsLog> result = pointsLogMapper.selectPage(pageParam, wrapper);
|
|
Page<PointsLog> result = pointsLogMapper.selectPage(pageParam, wrapper);
|
|
|
- return Result.success(result);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 批量补充成员姓名与所属家庭名称
|
|
|
|
|
+ Set<Long> logMemberIds = new HashSet<>();
|
|
|
|
|
+ for (PointsLog log : result.getRecords()) {
|
|
|
|
|
+ Long logMemberId = log.getChildId() != null ? log.getChildId() : log.getFamilyMemberId();
|
|
|
|
|
+ if (logMemberId != null) logMemberIds.add(logMemberId);
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<Long, FamilyMember> memberMap = new HashMap<>();
|
|
|
|
|
+ if (!logMemberIds.isEmpty()) {
|
|
|
|
|
+ for (FamilyMember m : familyMemberMapper.selectList(
|
|
|
|
|
+ new LambdaQueryWrapper<FamilyMember>().in(FamilyMember::getId, logMemberIds))) {
|
|
|
|
|
+ memberMap.put(m.getId(), m);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<Long, Family> familyMap = new HashMap<>();
|
|
|
|
|
+ Set<Long> familyIds = new HashSet<>();
|
|
|
|
|
+ for (FamilyMember m : memberMap.values()) {
|
|
|
|
|
+ if (m.getFamilyId() != null) familyIds.add(m.getFamilyId());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!familyIds.isEmpty()) {
|
|
|
|
|
+ for (Family f : familyMapper.selectList(
|
|
|
|
|
+ new LambdaQueryWrapper<Family>().in(Family::getId, familyIds))) {
|
|
|
|
|
+ familyMap.put(f.getId(), f);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Page<PointsLogVO> voPage = new Page<>(result.getCurrent(), result.getSize(), result.getTotal());
|
|
|
|
|
+ List<PointsLogVO> voRecords = new ArrayList<>();
|
|
|
|
|
+ for (PointsLog log : result.getRecords()) {
|
|
|
|
|
+ PointsLogVO vo = new PointsLogVO();
|
|
|
|
|
+ vo.setId(log.getId());
|
|
|
|
|
+ vo.setChildId(log.getChildId());
|
|
|
|
|
+ vo.setMemberId(log.getChildId() != null ? log.getChildId() : log.getFamilyMemberId());
|
|
|
|
|
+ vo.setAmount(log.getAmount());
|
|
|
|
|
+ vo.setType(log.getType());
|
|
|
|
|
+ vo.setCategory(log.getCategory());
|
|
|
|
|
+ vo.setDescription(log.getDescription());
|
|
|
|
|
+ vo.setTaskId(log.getTaskId());
|
|
|
|
|
+ vo.setCreatedAt(log.getCreatedAt());
|
|
|
|
|
+ FamilyMember member = memberMap.get(vo.getMemberId());
|
|
|
|
|
+ if (member != null) {
|
|
|
|
|
+ vo.setMemberName(member.getNickname());
|
|
|
|
|
+ vo.setFamilyId(member.getFamilyId());
|
|
|
|
|
+ Family family = familyMap.get(member.getFamilyId());
|
|
|
|
|
+ if (family != null) {
|
|
|
|
|
+ vo.setFamilyName(family.getName());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ voRecords.add(vo);
|
|
|
|
|
+ }
|
|
|
|
|
+ voPage.setRecords(voRecords);
|
|
|
|
|
+ return Result.success(voPage);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@PostMapping("/points/stats")
|
|
@PostMapping("/points/stats")
|