Commit 041f9e52 authored by nie'hong's avatar nie'hong

完善项目工时统计权限

parent 29d1dde2
......@@ -25,6 +25,5 @@ public interface WorkDeptMapper extends BaseMapper<WorkDept> {
int updateManagerIdISNullById(Integer id);
List<WorkDept> getDeptByManagerId(Integer userId);
}
......@@ -50,7 +50,9 @@ public interface WorkProjectMapper extends BaseMapper<WorkProject> {
int updateProject(ModifyProjectVo modifyProjectVo);
List<WorkProject> getListByDeptAndIsConclusion(@Param("deptId") Integer deptId,@Param("isConclusion") Integer isConclusion);
List<WorkProject> getListByCriteria(Map<String,Object> map);
List<Integer> getProjectIdByManager(Integer userId);
List<WorkProject> getListByCentreIdAndIsConclusion(@Param("centreId") Integer centreId,@Param("isConclusion") Integer isConclusion);
}
......@@ -37,7 +37,7 @@
<if test="deptId != null">and dept_id = #{deptId}</if>
<if test="workTime != null">and work_time =#{workTime}</if>
<if test="costBudget != null">and cost_budget = #{costBudget}</if>
<if test="isConclusion != null">and is_conlusion =#{isConclusion}</if>
<if test="isConclusion != null">and is_conclusion =#{isConclusion}</if>
<if test="startTime != null">and start_time =#{startTime}</if>
<if test="endTime != null">and end_time =#{endTime}</if>
<if test="createTime != null">and create_time &gt;= #{createTime}</if>
......@@ -161,11 +161,12 @@ ORDER BY p.is_conclusion DESC
</select>
<select id="getListByDeptAndIsConclusion" resultType="cn.wisenergy.model.app.WorkProject">
<select id="getListByCriteria" resultType="cn.wisenergy.model.app.WorkProject">
select <include refid="Base_Column_List"/>
from <include refid="table"/>
where dept_id = #{deptId}
<if test="isConclusion !=null ">AND is_conclusion=#{isConclusion}</if>
<where>
<include refid="criteria"/>
</where>
</select>
<select id="getProjectIdByManager" resultType="java.lang.Integer">
......@@ -174,5 +175,14 @@ ORDER BY p.is_conclusion DESC
where manager_id = #{userId}
</select>
<select id="getListByCentreIdAndIsConclusion" resultType="cn.wisenergy.model.app.WorkProject">
select <include refid="Base_Column_List"/>
from work_project p join work_dept d on p.dept_id = d.id
where centre_id = #{centreId}
<if test="isConclusion != null">
AND is_conclusion = #{isConclusion}
</if>
</select>
</mapper>
......@@ -63,8 +63,8 @@
t.dept_id,
min(work_day),
max(work_day),
sum(work_time / 8),
sum(work_time / 8 * s.day_salary),
sum(work_time)/ 8,
sum(work_time * s.day_salary)/ 8,
now() AS create_time
FROM
work_time_order t
......@@ -86,10 +86,13 @@
SELECT type ,<if test="centreId == null">'汇总' AS dept_name,</if> <if test="centreId != null"> dept_name,p.dept_id,</if>p.id AS
project_id,project_name,concat(min(statistics_start),'~' ,max(statistics_end)) AS statistics_time ,sum(total_time) AS total_time,sum(cost) AS cost
from work_project_time_cost ptc join work_project p on ptc.project_id=p.id join work_dept d on p.dept_id=d.id
where project_id in
<where>
<if test="projectIds != null">
project_id in
<foreach collection="projectIds" open="(" close=")" separator="," item="projectId">
#{projectId}
</foreach>
</if>
<if test="deptId != null">
AND dept_id = #{deptId}
</if>
......@@ -105,6 +108,7 @@
<if test="firstDayOfMonth != null">
AND statistics_start >= #{firstDayOfMonth}
</if>
</where>
GROUP BY type, <if test="centreId == null"> dept_name,</if> <if test="centreId != null"> dept_name,p.dept_id,</if>p.id,project_name
<if test="centreId != null"> ORDER BY p.dept_id</if>
</select>
......
......@@ -260,6 +260,9 @@
<foreach collection="types" item="type" open="(" close=")" separator=",">
#{type}
</foreach>
<if test="centreId != null">
AND centre_id = #{centreId}
</if>
group by t.type,t.dept_id, dept_name, t.project_id,p.project_name, if(YEAR (work_day) = YEAR(NOW()),',month(work_day)','')
order by t.dept_id,work_day
</select>
......@@ -331,7 +334,7 @@
</select>
<select id="selectListByType" resultMap="userWorkTimeStatisticsByProject">
SELECT <if test="isAll == true"> u.id AS user_id, u.`name` AS user_name,</if> <if test="isAll == false"> '合计' AS user_name,</if> ty.id AS project_type, ty.name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,IFNULL(SUM(t.work_time),0) AS work_time
SELECT <if test="isAll"> u.id AS user_id, u.`name` AS user_name,</if> <if test="!isAll"> '合计' AS user_name,</if> ty.id AS project_type, ty.name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,IFNULL(SUM(t.work_time),0) AS work_time
from work_type ty left join work_time_order t on t.type = ty.id left join work_user u on t.user_id = u.id
where
(t.work_day &lt;= #{endDate} or t.work_day is null) AND (t.status IN (2, 5) or t.status is null)
......@@ -342,11 +345,13 @@
<foreach collection="queryType" item="type" open="(" close=")" separator=",">
#{type}
</foreach>
AND (t.user_id in
AND (<if test="userIds.size != 0"> t.user_id in
<foreach collection="userIds" item="userId" open="(" close=")" separator=",">
#{userId}
</foreach>
or t.user_id is null)
GROUP BY <if test="isAll == true">u.id,u.`name`,</if> ty.id,ty.name, t.is_overtime
OR
</if>
t.user_id is null)
GROUP BY <if test="isAll">u.id,u.`name`,</if> ty.id,ty.name, t.is_overtime
</select>
</mapper>
......@@ -268,7 +268,7 @@ public class StatisticsServiceImpl implements StatisticsService {
List<Integer> role = UserRoleLevelUtils.getRole(userId);
// 用户权限
List<String> userAuthority = this.getUserAuthority(userId);
// 没有小程序工时汇总权限
// 没有审批权限
if (!userAuthority.contains(LevelEnum.EXAMINE.getLevelName())) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.THE_USER_NOT_MANAGER_PLASE_MANAGER_LOGIN);
}
......@@ -279,88 +279,84 @@ public class StatisticsServiceImpl implements StatisticsService {
Date currentFirstDayOfMonth = DateUtil.getCurrentFirstDayOfMonth();
startTime = DateUtil.convertDateToYMDStr(currentFirstDayOfMonth);
}
// 获取角色
List<Integer> list = UserRoleLevelUtils.getlevelIds(role);
// 获取角色对应的权限
List<WorkLevel> workLevels = UserRoleLevelUtils.getlevelByIds(list);
List<Integer> rank = getUserRank(workLevels);
// 查询用户管理的项目
List<WorkProject> userManageProjects = workProjectService.getUserManageProjects(userId);
if (CollectionUtil.isEmpty(userManageProjects)) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.MANAGER_NOT_PROJECT);
// 获取所有的类型
List<WorkType> workTypes = workTypeMapper.getAll();
// 存储所有查询的类型
List<Integer> types = new ArrayList<>();
// 只存储项目和商机之外的类型
for (WorkType workType : workTypes) {
if (workType.getId() != 1 && workType.getId() != 2) {
types.add(workType.getId());
}
}
// 获取项目集合中所有项目的项目主键
List<Integer> projectIds = userManageProjects.stream().map(WorkProject::getId).collect(Collectors.toList());
// 查询条件
Map<String, Object> map = new HashMap<>();
map.put("projectIds", projectIds);
// 起始时间为空时不以时间作为查询条件
if (StringUtil.isNotEmpty(startTime)) {
List<WorkTimeAndCostCollect> workTimeAndCostCollects = null;
// 中心级审批权限
if (rank.contains(LevelRankEnum.CENTRAL_LEVEL.getRank())) {
// 获取用户所在中心
WorkDept userDept = workDeptMapper.getById(user.getDeptId());
// 获取中心下的所有项目和商机工单统计
Map<String, Object> map = new HashMap<>();
map.put("centreId", userDept.getCentreId());
map.put("firstDayOfMonth", startTime);
}
// 查询所有类型
List<WorkType> workTypes = workTypeMapper.getAll();
workTimeAndCostCollects = workProjectTimeCostMapper.selectList(map);
if (role.contains(ManagerEnum.IS_CENTRE_DIRECTOR.getCode())) {
WorkDept workDept = workDeptMapper.getById(user.getDeptId());
map.put("centreId", workDept.getCentreId());
}
// 查询项目和商机的工时统计
List<WorkTimeAndCostCollect> collect = workProjectTimeCostMapper.selectList(map);
// 获取查询出的类型
List<Integer> queryType = collect.stream().map(WorkTimeAndCostCollect::getType).collect(Collectors.toList());
// 除项目和项目的类型
map.put("types",types);
// 获取这些类型的所有工单
List<WorkTimeAndCostCollect> workTimeAndCostCollect = workTimeOrderMapper.getWorkTimeAndCostCollect(map);
workTimeAndCostCollects.addAll(workTimeAndCostCollect);
// 商机和项目
List<Integer> types = new ArrayList<>();
types.add(workTypes.get(0).getId());
types.add(workTypes.get(1).getId());
// 如果查询出的结果中不包含项目和商机中的类型,造对象传前端
types.removeAll(queryType);
if (CollectionUtil.isNotEmpty(types)) {
for (Integer type : types) {
WorkTimeAndCostCollect workTimeAndCostCollect = new WorkTimeAndCostCollect();
workTimeAndCostCollect.setType(type);
workTimeAndCostCollect.setWorkTime(new BigDecimal("0.0000"));
collect.add(workTimeAndCostCollect);
}
}
// 用户不为项目级别或不仅为项目级别
if (!role.contains(ManagerEnum.IS_PROJECT_DIRECTOR.getCode()) || role.size() != 1) {
// 如果用户的审批权限的级别最高为部门级别
if (rank.contains(LevelRankEnum.DEPARTMENT_LEVEL.getRank()) && !rank.contains(LevelRankEnum.CENTRAL_LEVEL.getRank())) {
// 获取部门下的所有项目和商机的工时统计
Map<String, Object> map = new HashMap<>();
map.put("deptId", user.getDeptId());
map.put("firstDayOfMonth", startTime);
workTimeAndCostCollects = workProjectTimeCostMapper.selectList(map);
// 清除查询条件
map.remove("projectIds");
map.remove("centreId");
types.clear();
// 除项目和项目的类型
map.put("types",types);
// 获取这些类型的所有工单
List<WorkTimeAndCostCollect> workTimeAndCostCollect = workTimeOrderMapper.getWorkTimeAndCostCollect(map);
workTimeAndCostCollects.addAll(workTimeAndCostCollect);
// 查询类型排除项目和商机
for (WorkType workType : workTypes) {
if (!workType.getName().equals(workTypes.get(0).getName()) && !workType.getName().equals(workTypes.get(1).getName())) {
types.add(workType.getId());
}
}
map.put("types", types);
}
// 用户不为中心级别
if (!role.contains(ManagerEnum.IS_CENTRE_DIRECTOR.getCode())) {
map.put("deptId", user.getDeptId());
}
List<WorkTimeAndCostCollect> workTimeAndCostCollect = workTimeOrderMapper.getWorkTimeAndCostCollect(map);
// 如果用户的审批权限的级别最高为项目/商机级别,与其他两种级别不同的是只汇总项目和商机类型的工单
if (rank.contains(LevelRankEnum.PROJECT_LEVEL.getRank()) && !rank.contains(LevelRankEnum.DEPARTMENT_LEVEL.getRank())) {
// 获取部门下的所有项目和商机的工时统计
Map<String, Object> map = new HashMap<>();
// 获取用户负责项目和商机id
List<Integer> projectIdByManager = workProjectMapper.getProjectIdByManager(userId);
map.put("projectIds", projectIdByManager);
map.put("firstDayOfMonth", startTime);
workTimeAndCostCollects = workProjectTimeCostMapper.selectList(map);
// 将查询结果封装在一起
collect.addAll(workTimeAndCostCollect);
}
// 获取查询结果中的类型
List<Integer> typeList = collect.stream().map(WorkTimeAndCostCollect::getType).collect(Collectors.toList());
// 如果查询结果不包含查询条件中的类型,造对象传前端
for (WorkType workType : workTypes) {
if (!typeList.contains(workType.getId())) {
WorkTimeAndCostCollect workTimeAndCostCollect1 = new WorkTimeAndCostCollect();
workTimeAndCostCollect1.setType(workType.getId());
workTimeAndCostCollect1.setTypeName(workType.getName());
collect.add(workTimeAndCostCollect1);
}
// 获取查询结果中的类型
List<Integer> typeList = workTimeAndCostCollects.stream().map(WorkTimeAndCostCollect::getType).collect(Collectors.toList());
// 如果查询结果不包含查询条件中的类型,造对象传前端
for (WorkType workType : workTypes) {
if (!typeList.contains(workType.getId())) {
WorkTimeAndCostCollect workTimeAndCostCollect1 = new WorkTimeAndCostCollect();
workTimeAndCostCollect1.setType(workType.getId());
workTimeAndCostCollect1.setTypeName(workType.getName());
workTimeAndCostCollects.add(workTimeAndCostCollect1);
}
}
// 给类型赋值类型名称
for (WorkTimeAndCostCollect timeAndCostCollect : collect) {
for (WorkTimeAndCostCollect timeAndCostCollect : workTimeAndCostCollects) {
for (WorkType workType : workTypes) {
if (timeAndCostCollect.getType().equals(workType.getId())) {
timeAndCostCollect.setTypeName(workType.getName());
......@@ -368,7 +364,7 @@ public class StatisticsServiceImpl implements StatisticsService {
}
}
// 类型总工时
for (WorkTimeAndCostCollect workTimeAndCostCollect1 : collect) {
for (WorkTimeAndCostCollect workTimeAndCostCollect1 : workTimeAndCostCollects) {
// 类型的总工时
BigDecimal typeTotalTime = new BigDecimal("0.000");
List<DeptProjectWorkTimeAndCost> deptProjectWorkTimeAndCosts = workTimeAndCostCollect1.getDeptProjectWorkTimeAndCosts();
......@@ -383,8 +379,9 @@ public class StatisticsServiceImpl implements StatisticsService {
workTimeAndCostCollect1.setWorkTime(typeTotalTime);
}
Collections.sort(collect);
return collect;
// 排序
Collections.sort(workTimeAndCostCollects);
return workTimeAndCostCollects;
}
@Override
......@@ -511,32 +508,47 @@ public class StatisticsServiceImpl implements StatisticsService {
@Override
public List<UserWorkTimeStatisticsByProject> getUserWorkTimeStatisticsReport(Integer userId, Integer deptId, String startDate, String endDate, Integer isConclusion) {
log.info("StatisticsServiceImpl[]getUserWorkTimeStatisticsReport[]" + userId + deptId + startDate + endDate + isConclusion);
List<Integer> role = userRoleLevelUtils.getRole(userId);
List<String> userAuthority = this.getUserAuthority(userId);
if (!userAuthority.contains(LevelEnum.EXAMINE.getLevelName())) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.THE_USER_NOT_MANAGER_PLASE_MANAGER_LOGIN);
}
List<Integer> role = UserRoleLevelUtils.getRole(userId);
// 判断是否有该权限
UserRoleLevelUtils.isManagerLevel(userId,LevelEnum.PROJECT_STATITSTICS.getLevelName());
// 获取用户信息
WorkUser user = workUserService.getById(userId);
// 获取用户权限的级别
List<Integer> list = UserRoleLevelUtils.getlevelIds(role);
List<WorkLevel> workLevels = UserRoleLevelUtils.getlevelByIds(list);
List<Integer> rank = this.getUserRank(workLevels);
// 不是中心级不能选择部门
if (!role.contains(ManagerEnum.IS_CENTRE_DIRECTOR.getCode()) && deptId != null) {
if (!rank.contains(LevelRankEnum.CENTRAL_LEVEL.getRank()) && deptId != null) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.NO_AUTHORITY);
}
// 中心级权限默认查询部门
if (role.contains(ManagerEnum.IS_CENTRE_DIRECTOR.getCode()) && deptId == null) {
if (rank.contains(LevelRankEnum.CENTRAL_LEVEL.getRank()) && deptId == null) {
deptId = DEFAULT_DEPT_ID;
}
// 默认统计截至时间为前一天
if (StringUtil.isEmpty(endDate)) {
Date date = new Date();
Date yesterday = DateUtil.add(date, Calendar.DAY_OF_MONTH, -1);
endDate = DateUtil.convertDateToYMDStr(yesterday);
}
// 获取用户负责项目主键集合
List<WorkProject> userManageProjects;
if (deptId != null) {
userManageProjects = workProjectMapper.getListByDeptAndIsConclusion(deptId, isConclusion);
} else {
userManageProjects = workProjectService.getUserManageProjects(userId);
Map<String, Object> map = new HashMap<>();
map.put("isConclusion", isConclusion);
List<WorkProject> userManageProjects = null;
// 当前权限最高为中心级别权限
if (rank.contains(LevelRankEnum.CENTRAL_LEVEL.getRank())) {
// 查询部门下所有项目,部门主键为空时是默认部门
map.put("deptId", deptId);
userManageProjects = workProjectMapper.getListByCriteria(map);
}else if(rank.contains(LevelRankEnum.DEPARTMENT_LEVEL.getRank())){
// 查询部门下所有项目,部门主键是用户的部门主键,当前权限最高级别为部门级别
map.put("deptId", user.getDeptId());
userManageProjects = workProjectMapper.getListByCriteria(map);
map.put("managerId", user.getId());
workProjectMapper.getListByCriteria(map);
}
// 管理项目为空则提前结束
if (CollectionUtil.isEmpty(userManageProjects)) {
return null;
......@@ -544,7 +556,7 @@ public class StatisticsServiceImpl implements StatisticsService {
// 提取项目主键
List<Integer> projectIds = userManageProjects.stream().map(WorkProject::getId).collect(Collectors.toList());
// 查询各个项目正常工时和加班工时统计
// 查询各个项目正常工时和加班工时统计总计
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics = workTimeOrderMapper.getUserProjectWorkTimeStatistics(startDate, endDate, projectIds, false);
// 查询除开项目于、商机、请假、调休这几种类型的工单
......@@ -557,7 +569,7 @@ public class StatisticsServiceImpl implements StatisticsService {
}
// 部门级别以上的用户可以查询所管理项目的成员所填的其他类型的工单
List<Integer> userIds = workUserProjectMapper.selectUserIdByProjectIds(projectIds);
if (role.contains(ManagerEnum.IS_DEPARTMENT_DIRECTOR.getCode()) || role.contains(ManagerEnum.IS_CENTRE_DIRECTOR.getCode())) {
if (rank.contains(LevelRankEnum.DEPARTMENT_LEVEL.getRank()) || rank.contains(LevelRankEnum.CENTRAL_LEVEL.getRank())) {
List<UserWorkTimeStatisticsByProject> userWorkTimeStatisticsByProjectList = workTimeOrderMapper.selectListByType(startDate, endDate, queryType, userIds, false);
if (CollectionUtil.isNotEmpty(userWorkTimeStatisticsByProjectList)) {
userProjectWorkTimeStatistics.get(0).getProjectWorkTimeAndType().addAll(userWorkTimeStatisticsByProjectList.get(0).getProjectWorkTimeAndType());
......@@ -595,10 +607,7 @@ public class StatisticsServiceImpl implements StatisticsService {
public List<ProjectStatisticsByMonth> getProjectStatistics(Integer userId, Integer deptId, Integer year, Integer projectId) {
log.info("StatisticsServiceImpl[]getProjectStatistics[]input.param" + userId + deptId + year + projectId);
// 获取权限
List<String> userAuthority = this.getUserAuthority(userId);
if (!userAuthority.contains(LevelEnum.PROJECT_STATITSTICS.getLevelName())) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.NO_AUTHORITY);
}
UserRoleLevelUtils.isManagerLevel(userId, LevelEnum.PROJECT_STATITSTICS.getLevelName());
// 默认查询时间为当前
if (year == null) {
year = DateUtil.getYear(new Date());
......@@ -769,4 +778,16 @@ public class StatisticsServiceImpl implements StatisticsService {
List<String> collect = workLevels.stream().map(WorkLevel::getName).collect(Collectors.toList());
return collect;
}
// 获取用户当前权限对应的级别
public List<Integer> getUserRank(List<WorkLevel> workLevels){
List<Integer> rank = new ArrayList<>();
for (WorkLevel workLevel : workLevels) {
if (workLevel.getName().equals(LevelEnum.EXAMINE.getLevelName())) {
rank.add(workLevel.getRank());
}
}
return rank;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment