fix: 目标积分只设置二级部门,三级部门自动继承二级部门配置

This commit is contained in:
Your Name 2026-01-08 13:37:18 +08:00
parent 40d7633e6f
commit 1380ef401a
2 changed files with 117 additions and 48 deletions

View File

@ -1122,7 +1122,7 @@ public class AnalyticsService {
}
/**
* 获取延误扣分比例
* 获取延误扣分比例(三级部门继承二级部门的配置)
* @param deptId 部门ID
* @param month 月份 yyyy-MM
* @return 扣分比例(默认1%)
@ -1133,28 +1133,9 @@ public class AnalyticsService {
}
try {
// 先查找指定月份的配置
DesignerTargetScore config = designerTargetScoreMapper.selectOne(
new LambdaQueryWrapper<DesignerTargetScore>()
.eq(DesignerTargetScore::getDeptId, deptId)
.isNull(DesignerTargetScore::getUserId) // 部门通用配置
.eq(DesignerTargetScore::getEffectiveMonth, month)
);
if (config != null && config.getDeductionRate() != null) {
return config.getDeductionRate();
}
// 查找通用配置(没有指定月份的)
config = designerTargetScoreMapper.selectOne(
new LambdaQueryWrapper<DesignerTargetScore>()
.eq(DesignerTargetScore::getDeptId, deptId)
.isNull(DesignerTargetScore::getUserId)
.isNull(DesignerTargetScore::getEffectiveMonth)
);
if (config != null && config.getDeductionRate() != null) {
return config.getDeductionRate();
BigDecimal rate = findDeptDeductionRate(deptId, month);
if (rate != null) {
return rate;
}
} catch (Exception e) {
log.warn("获取扣分比例配置失败: deptId={}, month={}", deptId, month, e);
@ -1164,7 +1145,48 @@ public class AnalyticsService {
}
/**
* 获取设计师目标积分
* 递归查找部门扣分比例(向上查找父部门配置)
*/
private BigDecimal findDeptDeductionRate(Long deptId, String month) {
if (deptId == null || deptId == 0) {
return null;
}
// 先查找指定月份的配置
DesignerTargetScore config = designerTargetScoreMapper.selectOne(
new LambdaQueryWrapper<DesignerTargetScore>()
.eq(DesignerTargetScore::getDeptId, deptId)
.isNull(DesignerTargetScore::getUserId)
.eq(DesignerTargetScore::getEffectiveMonth, month)
);
if (config != null && config.getDeductionRate() != null) {
return config.getDeductionRate();
}
// 查找通用配置(没有指定月份的)
config = designerTargetScoreMapper.selectOne(
new LambdaQueryWrapper<DesignerTargetScore>()
.eq(DesignerTargetScore::getDeptId, deptId)
.isNull(DesignerTargetScore::getUserId)
.isNull(DesignerTargetScore::getEffectiveMonth)
);
if (config != null && config.getDeductionRate() != null) {
return config.getDeductionRate();
}
// 当前部门没有配置,向上查找父部门
Department dept = departmentMapper.selectById(deptId);
if (dept != null && dept.getParentId() != null && dept.getParentId() > 0) {
return findDeptDeductionRate(dept.getParentId(), month);
}
return null;
}
/**
* 获取设计师目标积分(三级部门继承二级部门的目标积分)
* @param userId 用户ID
* @param deptId 部门ID
* @param month 月份 yyyy-MM
@ -1185,29 +1207,11 @@ public class AnalyticsService {
}
}
// 查找部门通用配置
// 查找部门通用配置(支持向上继承:三级部门继承二级部门的配置)
if (deptId != null) {
DesignerTargetScore config = designerTargetScoreMapper.selectOne(
new LambdaQueryWrapper<DesignerTargetScore>()
.eq(DesignerTargetScore::getDeptId, deptId)
.isNull(DesignerTargetScore::getUserId)
.eq(DesignerTargetScore::getEffectiveMonth, month)
);
if (config != null && config.getTargetScore() != null) {
return config.getTargetScore();
}
// 查找部门默认配置(没有指定月份)
config = designerTargetScoreMapper.selectOne(
new LambdaQueryWrapper<DesignerTargetScore>()
.eq(DesignerTargetScore::getDeptId, deptId)
.isNull(DesignerTargetScore::getUserId)
.isNull(DesignerTargetScore::getEffectiveMonth)
);
if (config != null && config.getTargetScore() != null) {
return config.getTargetScore();
BigDecimal targetScore = findDeptTargetScore(deptId, month);
if (targetScore != null && targetScore.compareTo(BigDecimal.ZERO) > 0) {
return targetScore;
}
}
} catch (Exception e) {
@ -1216,5 +1220,46 @@ public class AnalyticsService {
return BigDecimal.ZERO; // 默认0
}
/**
* 递归查找部门目标积分(向上查找父部门配置)
*/
private BigDecimal findDeptTargetScore(Long deptId, String month) {
if (deptId == null || deptId == 0) {
return null;
}
// 先查找当前部门的配置(指定月份)
DesignerTargetScore config = designerTargetScoreMapper.selectOne(
new LambdaQueryWrapper<DesignerTargetScore>()
.eq(DesignerTargetScore::getDeptId, deptId)
.isNull(DesignerTargetScore::getUserId)
.eq(DesignerTargetScore::getEffectiveMonth, month)
);
if (config != null && config.getTargetScore() != null) {
return config.getTargetScore();
}
// 查找当前部门的默认配置(没有指定月份)
config = designerTargetScoreMapper.selectOne(
new LambdaQueryWrapper<DesignerTargetScore>()
.eq(DesignerTargetScore::getDeptId, deptId)
.isNull(DesignerTargetScore::getUserId)
.isNull(DesignerTargetScore::getEffectiveMonth)
);
if (config != null && config.getTargetScore() != null) {
return config.getTargetScore();
}
// 当前部门没有配置,向上查找父部门
Department dept = departmentMapper.selectById(deptId);
if (dept != null && dept.getParentId() != null && dept.getParentId() > 0) {
return findDeptTargetScore(dept.getParentId(), month);
}
return null;
}
}

View File

@ -144,15 +144,39 @@ public class DesignerTargetScoreService {
}
/**
* 获取所有接单部门
* 获取二级接单部门(用于目标积分配置,三级部门自动继承二级部门的目标)
*/
public List<Department> getReceivingDepartments() {
return departmentMapper.selectList(
// 获取所有接单部门
List<Department> allDepts = departmentMapper.selectList(
new LambdaQueryWrapper<Department>()
.eq(Department::getDeptType, "receiving")
.eq(Department::getStatus, 1)
.orderByAsc(Department::getSortOrder)
);
// 构建部门ID到部门的映射
Map<Long, Department> deptMap = allDepts.stream()
.collect(Collectors.toMap(Department::getId, d -> d));
// 过滤出二级部门:有父部门,且父部门是一级部门(父部门的parentId为0或null)
return allDepts.stream()
.filter(dept -> {
Long parentId = dept.getParentId();
if (parentId == null || parentId == 0) {
// 一级部门,不选
return false;
}
Department parent = deptMap.get(parentId);
if (parent == null) {
// 父部门不存在,可能是二级部门(父部门可能是其他类型)
// 尝试从数据库查询父部门
parent = departmentMapper.selectById(parentId);
}
// 如果父部门存在且父部门是一级部门(parentId为0或null),则当前是二级部门
return parent != null && (parent.getParentId() == null || parent.getParentId() == 0);
})
.collect(Collectors.toList());
}
}