This commit is contained in:
xuyuncong 2025-10-13 10:36:53 +08:00
parent e153061c87
commit 80087da73e
4 changed files with 101 additions and 55 deletions

View File

@ -77,6 +77,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -2567,24 +2568,32 @@ public class AppInspectionPartnerServiceImpl extends ServiceImpl<AppInspectionPa
.filter(info -> info.getReturnCarUserId() != null) // 过滤 null .filter(info -> info.getReturnCarUserId() != null) // 过滤 null
.collect(Collectors.groupingBy(InspectionInfo::getReturnCarUserId)); .collect(Collectors.groupingBy(InspectionInfo::getReturnCarUserId));
// 先计算所有项目的总完成数 // 先计算所有项目的总完成数和总产值
Map<String, Long> projectTotalMap = new HashMap<>(); Map<String, Long> projectTotalMap = new HashMap<>();
Map<String, BigDecimal> projectTotalOutputValueMap = new HashMap<>(); // 总产值统计
for (Map<String, Object> stringObjectMap : staffCount) { for (Map<String, Object> stringObjectMap : staffCount) {
Set<Long> inspectionInfoIds = new HashSet<>(); Set<Long> inspectionInfoIds = new HashSet<>();
BigDecimal userTotalOutputValue = BigDecimal.ZERO; // 员工总产值
Long userId = (Long) stringObjectMap.get("userId"); Long userId = (Long) stringObjectMap.get("userId");
List<Map<String, Object>> children = (List<Map<String, Object>>) stringObjectMap.get("children"); List<Map<String, Object>> children = (List<Map<String, Object>>) stringObjectMap.get("children");
inspectionInfoIds.addAll( // 处理项目节点
children.stream() for (Map<String, Object> child : children) {
.map(map -> (String) map.get("inspectionInfoId")) // 获取逗号分隔的字符串 BigDecimal outputValue = (BigDecimal) child.get("outputValue");
.flatMap(idsStr -> Arrays.stream(idsStr.split(","))) // 拆分成单个ID字符串 if (outputValue != null) {
.map(String::trim) // 去除前后空格 userTotalOutputValue = userTotalOutputValue.add(outputValue);
.filter(idStr -> !idStr.isEmpty()) // 过滤空字符串 }
.map(Long::valueOf) // 转换为Long类型
.collect(Collectors.toList()) inspectionInfoIds.addAll(
); Arrays.stream(((String) child.get("inspectionInfoId")).split(","))
.map(String::trim)
.filter(idStr -> !idStr.isEmpty())
.map(Long::valueOf)
.collect(Collectors.toList())
);
}
// 获取所有接车信息 // 获取所有接车信息
List<InspectionInfo> inspectionInfos = meetManIdCountMap.get(userId); List<InspectionInfo> inspectionInfos = meetManIdCountMap.get(userId);
@ -2597,18 +2606,20 @@ public class AppInspectionPartnerServiceImpl extends ServiceImpl<AppInspectionPa
inspectionInfoIds.addAll(inspectionInfos.stream().map(InspectionInfo::getId).collect(Collectors.toList())); inspectionInfoIds.addAll(inspectionInfos.stream().map(InspectionInfo::getId).collect(Collectors.toList()));
} }
HashMap<String, Object> objectObjectHashMap = new HashMap<>(); // 添加工单相关项目这些项目产值暂时为0
objectObjectHashMap.put("count", meetCount); HashMap<String, Object> meetCarMap = new HashMap<>();
objectObjectHashMap.put("projectName", "接车拍照"); meetCarMap.put("count", meetCount);
children.add(objectObjectHashMap); meetCarMap.put("projectName", "接车拍照");
meetCarMap.put("outputValue", BigDecimal.ZERO);
children.add(meetCarMap);
HashMap<String, Object> meetCarHashMap = new HashMap<>(); HashMap<String, Object> meetGoMap = new HashMap<>();
meetCarHashMap.put("count", meetGoCount); meetGoMap.put("count", meetGoCount);
meetCarHashMap.put("projectName", "上门接车"); meetGoMap.put("projectName", "上门接车");
children.add(meetCarHashMap); meetGoMap.put("outputValue", BigDecimal.ZERO);
children.add(meetGoMap);
//还车 // 还车信息
//设置totalCount
List<InspectionInfo> returnCarInfoList = returnCarUserIdCountMap.get(userId); List<InspectionInfo> returnCarInfoList = returnCarUserIdCountMap.get(userId);
long returnCount = 0; long returnCount = 0;
long returnGoCount = 0; long returnGoCount = 0;
@ -2616,42 +2627,43 @@ public class AppInspectionPartnerServiceImpl extends ServiceImpl<AppInspectionPa
if (CollUtil.isNotEmpty(returnCarInfoList)) { if (CollUtil.isNotEmpty(returnCarInfoList)) {
inspectionInfoIds.addAll(returnCarInfoList.stream().map(InspectionInfo::getId).collect(Collectors.toList())); inspectionInfoIds.addAll(returnCarInfoList.stream().map(InspectionInfo::getId).collect(Collectors.toList()));
returnCount = Optional.ofNullable(returnCarInfoList) returnCount = returnCarInfoList.stream()
.orElse(Collections.emptyList())
.stream()
.filter(Objects::nonNull)
.filter(i -> i.getReturnType() != null && i.getReturnType() == 0) .filter(i -> i.getReturnType() != null && i.getReturnType() == 0)
.count(); .count();
returnGoCount = Optional.ofNullable(returnCarInfoList) returnGoCount = returnCarInfoList.stream()
.orElse(Collections.emptyList())
.stream()
.filter(Objects::nonNull)
.filter(i -> i.getReturnType() != null && i.getReturnType() == 1) .filter(i -> i.getReturnType() != null && i.getReturnType() == 1)
.count(); .count();
} }
stringObjectMap.put("totalCount", Long.parseLong(String.valueOf(inspectionInfoIds.size()))); stringObjectMap.put("totalCount", inspectionInfoIds.size());
stringObjectMap.put("totalOutputValue", userTotalOutputValue); // 设置员工总产值
Map<String, Object> objectObjectHashMap1 = new HashMap<>(); Map<String, Object> returnCarMap = new HashMap<>();
objectObjectHashMap1.put("count", returnCount); returnCarMap.put("count", returnCount);
objectObjectHashMap1.put("projectName", "还车拍照"); returnCarMap.put("projectName", "还车拍照");
children.add(objectObjectHashMap1); returnCarMap.put("outputValue", BigDecimal.ZERO);
children.add(returnCarMap);
Map<String, Object> returnCarHashMap = new HashMap<>(); Map<String, Object> returnGoMap = new HashMap<>();
returnCarHashMap.put("count", returnGoCount); returnGoMap.put("count", returnGoCount);
returnCarHashMap.put("projectName", "上门还车"); returnGoMap.put("projectName", "上门还车");
children.add(returnCarHashMap); returnGoMap.put("outputValue", BigDecimal.ZERO);
children.add(returnGoMap);
} }
// 计算每个项目的总完成数 // 计算每个项目的总完成数和总产值
for (Map<String, Object> staff : staffCount) { for (Map<String, Object> staff : staffCount) {
List<Map<String, Object>> children = (List<Map<String, Object>>) staff.get("children"); List<Map<String, Object>> children = (List<Map<String, Object>>) staff.get("children");
if (children != null) { if (children != null) {
for (Map<String, Object> child : children) { for (Map<String, Object> child : children) {
String projectName = (String) child.get("projectName"); String projectName = (String) child.get("projectName");
Long count = (Long) child.get("count"); Long count = (Long) child.get("count");
BigDecimal outputValue = (BigDecimal) child.get("outputValue");
projectTotalMap.put(projectName, projectTotalMap.getOrDefault(projectName, 0L) + count); projectTotalMap.put(projectName, projectTotalMap.getOrDefault(projectName, 0L) + count);
projectTotalOutputValueMap.put(projectName,
projectTotalOutputValueMap.getOrDefault(projectName, BigDecimal.ZERO).add(outputValue != null ? outputValue : BigDecimal.ZERO));
} }
} }
} }
@ -2675,19 +2687,22 @@ public class AppInspectionPartnerServiceImpl extends ServiceImpl<AppInspectionPa
} }
} }
// meetCarCount 降序排序员工 // 总产值降序排序员工
staffCount.sort(Comparator.comparingLong( staffCount.sort(Comparator.comparing(
(Map<String, Object> staff) -> (Long) staff.getOrDefault("totalCount", 0L) (Map<String, Object> staff) -> (BigDecimal) staff.getOrDefault("totalOutputValue", BigDecimal.ZERO)
).reversed()); ).reversed());
// 对每个员工的 children count 降序排序 // 对每个员工的 children 按产值降序排序
// 对每个员工的 children先移除 count == 0 的项再按 count 降序排序
staffCount.forEach(staff -> { staffCount.forEach(staff -> {
List<Map<String, Object>> children = (List<Map<String, Object>>) staff.get("children"); List<Map<String, Object>> children = (List<Map<String, Object>>) staff.get("children");
if (children != null) { if (children != null) {
children.removeIf(child -> ((Long) child.getOrDefault("count", 0L)) == 0L); children.removeIf(child -> {
children.sort(Comparator.comparingLong( Long count = (Long) child.getOrDefault("count", 0L);
(Map<String, Object> child) -> (Long) child.getOrDefault("count", 0L) BigDecimal outputValue = (BigDecimal) child.getOrDefault("outputValue", BigDecimal.ZERO);
return count == 0L && outputValue.compareTo(BigDecimal.ZERO) == 0;
});
children.sort(Comparator.comparing(
(Map<String, Object> child) -> (BigDecimal) child.getOrDefault("outputValue", BigDecimal.ZERO)
).reversed()); ).reversed());
} }
}); });

View File

@ -26,6 +26,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -462,6 +463,7 @@ public class InspectionWorkNodeServiceImpl extends ServiceImpl<InspectionWorkNod
m.put("userId", vo.getUserId()); m.put("userId", vo.getUserId());
m.put("nickname", vo.getNickname()); m.put("nickname", vo.getNickname());
m.put("totalCount", 0L); // 初始总数 m.put("totalCount", 0L); // 初始总数
m.put("totalOutputValue", BigDecimal.ZERO); // 初始总产值
m.put("children", new ArrayList<Map<String, Object>>()); m.put("children", new ArrayList<Map<String, Object>>());
return m; return m;
}); });
@ -469,29 +471,50 @@ public class InspectionWorkNodeServiceImpl extends ServiceImpl<InspectionWorkNod
// 添加项目 // 添加项目
List<Map<String, Object>> children = (List<Map<String, Object>>) userEntry.get("children"); List<Map<String, Object>> children = (List<Map<String, Object>>) userEntry.get("children");
vo.setCount(vo.getCount() == null ? 0 : vo.getCount()); vo.setCount(vo.getCount() == null ? 0 : vo.getCount());
if (vo.getCount() == 0) {
// 即使count为0但如果产值不为0也要显示
if (vo.getCount() == 0 && (vo.getOutputValue() == null || vo.getOutputValue().compareTo(BigDecimal.ZERO) == 0)) {
continue; continue;
} }
Map<String, Object> project = new HashMap<>(); Map<String, Object> project = new HashMap<>();
project.put("projectName", vo.getProjectName()); project.put("projectName", vo.getProjectName());
project.put("count", vo.getCount()); project.put("count", vo.getCount());
project.put("id", vo.getId()); project.put("id", vo.getId());
project.put("inspectionInfoId", vo.getInspectionInfoIds()); project.put("inspectionInfoId", vo.getInspectionInfoIds());
project.put("outputValue", vo.getOutputValue() != null ? vo.getOutputValue() : BigDecimal.ZERO);
children.add(project); children.add(project);
// 累加总数 // 累加总数和总产值
Long currentTotal = (Long) userEntry.get("totalCount"); Long currentTotal = (Long) userEntry.get("totalCount");
BigDecimal currentOutputValue = (BigDecimal) userEntry.get("totalOutputValue");
userEntry.put("totalCount", currentTotal + vo.getCount()); userEntry.put("totalCount", currentTotal + vo.getCount());
userEntry.put("totalOutputValue", currentOutputValue.add(
vo.getOutputValue() != null ? vo.getOutputValue() : BigDecimal.ZERO));
} }
// 转成 List 并按 totalCount 降序排序 // 转成 List 并按总产值降序排序
return tempMap.values().stream() return tempMap.values().stream()
.peek(userEntry -> { .peek(userEntry -> {
// 排序每个用户下的项目 children // 排序每个用户下的项目按产值降序产值相同按数量降序
List<Map<String, Object>> children = (List<Map<String, Object>>) userEntry.get("children"); List<Map<String, Object>> children = (List<Map<String, Object>>) userEntry.get("children");
children.sort((a, b) -> Long.compare((Long) b.get("count"), (Long) a.get("count"))); children.sort((a, b) -> {
BigDecimal outputValueA = (BigDecimal) a.get("outputValue");
BigDecimal outputValueB = (BigDecimal) b.get("outputValue");
int result = outputValueB.compareTo(outputValueA);
if (result == 0) {
Long countA = (Long) a.get("count");
Long countB = (Long) b.get("count");
return Long.compare(countB, countA);
}
return result;
});
})
.sorted((a, b) -> {
BigDecimal outputValueA = (BigDecimal) a.get("totalOutputValue");
BigDecimal outputValueB = (BigDecimal) b.get("totalOutputValue");
return outputValueB.compareTo(outputValueA);
}) })
.sorted((a, b) -> Long.compare((Long) b.get("totalCount"), (Long) a.get("totalCount")))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

View File

@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.inspection.vo;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
@Data @Data
public class StaffProjectCountVO { public class StaffProjectCountVO {
private String id; private String id;
@ -12,4 +14,6 @@ public class StaffProjectCountVO {
private Long nodeCount; private Long nodeCount;
// private Long inspectionInfoId; // private Long inspectionInfoId;
private String inspectionInfoIds; private String inspectionInfoIds;
private BigDecimal outputValue; // 项目产值
private BigDecimal goodsPrice; // 商品价格
} }

View File

@ -248,7 +248,10 @@
ip.id AS project_id, ip.id AS project_id,
GROUP_CONCAT(iwn.inspection_info_id) AS inspectionInfoIds, GROUP_CONCAT(iwn.inspection_info_id) AS inspectionInfoIds,
su.nickname, su.nickname,
SUM(IF(iwn.node_count = 0,1,iwn.node_count)) count SUM(IF(iwn.node_count = 0,1,iwn.node_count)) count,
-- 添加产值计算:合格节点的商品价格总和(单位:元)
COALESCE(SUM(CASE WHEN iwn.status = '2' AND iwn.type = '1' THEN oi.goods_price ELSE 0 END) / 100, 0) AS outputValue,
oi.goods_price
FROM FROM
inspection_staff staff inspection_staff staff
LEFT JOIN inspection_work_node iwn ON iwn.deal_user_id = staff.user_id LEFT JOIN inspection_work_node iwn ON iwn.deal_user_id = staff.user_id
@ -256,6 +259,8 @@
AND iwn.create_time BETWEEN concat(#{datetimeRange[0]}, ' 00:00:00') AND concat(#{datetimeRange[1]}, ' 23:59:59') AND iwn.create_time BETWEEN concat(#{datetimeRange[0]}, ' 00:00:00') AND concat(#{datetimeRange[1]}, ' 23:59:59')
</if> </if>
LEFT JOIN inspection_project ip ON ip.id = iwn.project_id LEFT JOIN inspection_project ip ON ip.id = iwn.project_id
LEFT JOIN inspection_info ii ON iwn.inspection_info_id = ii.id
LEFT JOIN order_info oi ON ii.inspection_order_id = oi.id
LEFT JOIN ( LEFT JOIN (
SELECT DISTINCT sur.user_id SELECT DISTINCT sur.user_id
FROM system_user_role sur FROM system_user_role sur
@ -270,9 +275,8 @@
<if test="userId != null and userId != ''"> <if test="userId != null and userId != ''">
AND staff.user_id = #{userId} AND staff.user_id = #{userId}
</if> </if>
</where> </where>
GROUP BY staff.user_id ,ip.id GROUP BY staff.user_id, ip.id
</select> </select>
<select id="selectExceptionNodesByInspectionIds" resultType="java.util.Map"> <select id="selectExceptionNodesByInspectionIds" resultType="java.util.Map">