Commit 9d8b385d authored by nie'hong's avatar nie'hong

完善人员工时统计

parent 5e632cd5
......@@ -94,7 +94,7 @@ public interface WorkTimeOrderMapper extends BaseMapper<WorkTimeOrder> {
/**
* 获取人员项目工时
*/
List<UserWorkTimeStatisticsByProject> getUserProjectWorkTimeStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projectIds") List<Integer> projectIds, @Param("isAll") Boolean isAll);
List<UserWorkTimeStatisticsByProject> getUserProjectWorkTimeStatistics(Map<String, Object> map);
/**
* 根据工单状态获取填报条数
......
......@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -21,7 +22,7 @@ public interface WorkUserProjectMapper extends BaseMapper<WorkUserProject> {
int deleteByProjectId(Integer projectId);
int insertBatch(@Param("userIds") List<Integer> userIds,@Param("projectId") Integer projectId);
int insertBatch(@Param("userIds") List<Integer> userIds, @Param("projectId") Integer projectId);
List<Integer> selectUserIdByProjectIds(@Param("projectIds") List<Integer> projectIds);
List<Integer> selectUserIdByProjectIds(Map<String,Object> map);
}
......@@ -61,6 +61,7 @@
<where>
<include refid="criteria"/>
</where>
order by sort
</select>
<select id="getAllDeptByAllCentre" resultMap="CentreDeptMap">
......
......@@ -28,9 +28,8 @@
<result property="projectId" column="project_id"/>
<result property="projectType" column="project_type"/>
<result property="projectName" column="project_name"/>
<result property="projectTypeName" column="type_name"/>
<result property="isOvertime" column="is_overtime"/>
<result property="workTime" column="work_time"/>
<result property="overtime" column="over_time"/>
<result property="normalTime" column="normal_time"/>
</collection>
</resultMap>
......@@ -313,7 +312,7 @@
<select id="getUserProjectWorkTimeStatistics" resultMap="userWorkTimeStatisticsByProject">
SELECT <if test="isAll"> u.id AS user_id, u.`name` AS user_name,</if> <if test="!isAll">'合计' AS user_name ,</if> t.project_id AS project_id, t.type AS project_type, p.project_name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,SUM(t.work_time) 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> t.project_id AS project_id, t.type AS project_type, p.project_name AS project_name,IF(t.is_overtime = 0, 0, sum(t.work_time)) AS over_time, if(t.is_overtime=1, 0, sum(t.work_time)) AS normal_time
from work_time_order t left join work_project p on t.project_id = p.id join work_user u on t.user_id = u.id
where
t.status in (2,5) AND
......@@ -321,10 +320,17 @@
<if test="startDate != null">
AND t.work_day >= #{startDate}
</if>
AND project_id in
<foreach collection="projectIds" item="projectId" open="(" close=")" separator=",">
#{projectId}
</foreach>
<if test="isConclusion != null">
AND p.is_conclusion = #{isConclusion}
</if>
<if test="deptId != null">
AND p.dept_id = #{deptId}
</if>
<if test="managerId != null">
AND p.manager_id = #{managerId}
</if>
GROUP BY <if test="isAll"> u.id,u.`name`,</if>t.project_id,t.type,p.project_name, t.is_overtime
</select>
......@@ -339,7 +345,7 @@
</select>
<select id="selectListByType" resultMap="userWorkTimeStatisticsByProject">
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
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,IF(t.is_overtime = 0, 0,sum(t.work_time)) AS over_time, if(t.is_overtime=1, 0, sum(t.work_time)) AS normal_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)
......
......@@ -39,12 +39,16 @@
</select>
<select id="selectUserIdByProjectIds" resultType="java.lang.Integer">
select user_id
from work_user_project
where project_id in
<foreach collection="projectIds" item="projectId" open="(" close=")" separator=",">
#{projectId}
</foreach>
select distinct user_id
from work_user_project up join work_project p on up.project_id = p.id
<where>
<if test="deptId != null">
p.dept_id = #{deptId}
</if>
<if test="managerId != null">
p.manager_id = #{managerId}
</if>
</where>
</select>
</mapper>
......@@ -25,22 +25,18 @@ public class ProjectWorkTimeAndType{
@ApiModelProperty(name = "projectType", value = "项目类型")
private Integer projectType;
/**
* 项目类型
*/
@ApiModelProperty(name = "projectTypeName", value = "项目类型名称")
private String projectTypeName;
/**
* 是否加班
* 加班工时
*/
@ApiModelProperty(name = "isOvertime", value = "是否加班")
private String isOvertime;
@ApiModelProperty(name = "isOvertime", value = "加班工时")
private Integer overtime;
/**
* 工时
* 加班工时
*/
@ApiModelProperty(name = "workTime", value = "总工时")
private Integer workTime;
@ApiModelProperty(name = "normalTime", value = "正常工时")
private Integer normalTime;
}
\ No newline at end of file
......@@ -31,17 +31,19 @@ public class UserWorkTimeStatisticsByProject implements Serializable{
@ApiModelProperty(name = "userName", value = "用户名")
private String userName;
/**
* 总工时
*/
@ApiModelProperty(name = "totalTime", value = "总工时")
private Integer totalTime;
/**
* 项目工时列表
*/
@ApiModelProperty(name = "projectWorkTimeAndType", value = "项目工时列表")
private List<ProjectWorkTimeAndType> projectWorkTimeAndType;
/**
* 总工时
*/
@ApiModelProperty(name = "totalTime", value = "总工时")
private Integer totalTime;
@Override
public boolean equals(Object obj) {
......
......@@ -525,6 +525,7 @@ public class StatisticsServiceImpl implements StatisticsService {
List<Integer> list = UserRoleLevelUtils.getlevelIds(role);
List<WorkLevel> workLevels = UserRoleLevelUtils.getlevelByIds(list);
List<Integer> rank = this.getUserRank(workLevels, LevelEnum.USER_STATISTICS.getLevelName());
// 不是中心级不能选择部门
if (!rank.contains(LevelRankEnum.CENTRAL_LEVEL.getRank()) && deptId != null) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.NO_AUTHORITY);
......@@ -539,32 +540,39 @@ public class StatisticsServiceImpl implements StatisticsService {
Date date = new Date();
endDate = DateUtil.convertDateToYMDStr(date);
}
// 查询条件
Map<String, Object> map = new HashMap<>();
map.put("isConclusion", isConclusion);
List<WorkProject> userManageProjects;
map.put("startDate", startDate);
map.put("endDate", endDate);
// 查询所有项目的工加班工时和正常工时
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics;
// 查询各个项目下所有人的加班工时和平常工时
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics1;
// 当前权限最高为中心级别权限
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);
} else {
// 项目/商机级别,以项目管理查询
map.put("managerId", user.getId());
userManageProjects = workProjectMapper.getListByCriteria(map);
}
// 管理项目为空则提前结束
if (CollectionUtil.isEmpty(userManageProjects)) {
return null;
}
// 提取项目主键
List<Integer> projectIds = userManageProjects.stream().map(WorkProject::getId).collect(Collectors.toList());
// 所有项目的统计
map.put("isAll", false);
userProjectWorkTimeStatistics = workTimeOrderMapper.getUserProjectWorkTimeStatistics(map);
// 所有项目下所有人员的统计
map.replace("isAll", true);
userProjectWorkTimeStatistics1 = workTimeOrderMapper.getUserProjectWorkTimeStatistics(map);
// 查询各个项目正常工时和加班工时统计总计
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics = workTimeOrderMapper.getUserProjectWorkTimeStatistics(startDate, endDate, projectIds, false);
// 查询结果为空,新建一个“合计”对象添加到集合
if (CollectionUtils.isEmpty(userProjectWorkTimeStatistics)) {
UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject = new UserWorkTimeStatisticsByProject();
......@@ -573,6 +581,7 @@ public class StatisticsServiceImpl implements StatisticsService {
userWorkTimeStatisticsByProject.setProjectWorkTimeAndType(projectWorkTimeAndTypes);
userProjectWorkTimeStatistics.add(userWorkTimeStatisticsByProject);
}
// 查询除开项目于、商机、请假、调休这几种类型的工单
List<WorkType> types = workTypeMapper.getAll();
List<Integer> queryType = new ArrayList<>();
......@@ -581,11 +590,9 @@ public class StatisticsServiceImpl implements StatisticsService {
queryType.add(type.getId());
}
}
// 查询各个项目下所有人的加班工时和平常工时
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics1 = workTimeOrderMapper.getUserProjectWorkTimeStatistics(startDate, endDate, projectIds, true);
// 部门级别以上的用户可以查询所管理项目的成员所填的其他类型的工单
List<Integer> userIds = workUserProjectMapper.selectUserIdByProjectIds(projectIds);
List<Integer> userIds = workUserProjectMapper.selectUserIdByProjectIds(map);
if (rank.contains(LevelRankEnum.DEPARTMENT_LEVEL.getRank()) || rank.contains(LevelRankEnum.CENTRAL_LEVEL.getRank())) {
// 获取其他类型统计信息
List<UserWorkTimeStatisticsByProject> userWorkTimeStatisticsByProjectList = workTimeOrderMapper.selectListByType(startDate, endDate, queryType, userIds, false);
......@@ -603,7 +610,8 @@ public class StatisticsServiceImpl implements StatisticsService {
for (int i = 4; i < types.size(); i++) {
if (!collect.contains(types.get(i).getId())) {
ProjectWorkTimeAndType projectWorkTimeAndType = new ProjectWorkTimeAndType();
projectWorkTimeAndType.setWorkTime(0);
projectWorkTimeAndType.setNormalTime(0);
projectWorkTimeAndType.setOvertime(0);
projectWorkTimeAndType.setProjectType(types.get(i).getId());
projectWorkTimeAndType.setProjectName(types.get(i).getName());
projectWorkTimeAndTypes.add(projectWorkTimeAndType);
......@@ -616,7 +624,6 @@ public class StatisticsServiceImpl implements StatisticsService {
userProjectWorkTimeStatistics.get(0).getProjectWorkTimeAndType().addAll(userWorkTimeStatisticsByProjectList.get(0).getProjectWorkTimeAndType());
// 查询各个项目下所有人的其他除了项目、商机、请假、调休类型的加班工时和平常工时
if (CollectionUtil.isNotEmpty(userWorkTimeStatisticsByProjectList)) {
List<UserWorkTimeStatisticsByProject> userWorkTimeStatisticsByProjects = workTimeOrderMapper.selectListByType(startDate, endDate, queryType, userIds, true);
for (UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject : userWorkTimeStatisticsByProjects) {
for (UserWorkTimeStatisticsByProject workTimeStatisticsByProject : userProjectWorkTimeStatistics1) {
......@@ -626,18 +633,27 @@ public class StatisticsServiceImpl implements StatisticsService {
}
}
}
}
userProjectWorkTimeStatistics.addAll(userProjectWorkTimeStatistics1);
userProjectWorkTimeStatistics.addAll(0, userProjectWorkTimeStatistics1);
// 取出单人的项目工时统计
for (UserWorkTimeStatisticsByProject userProjectWorkTimeStatistic : userProjectWorkTimeStatistics) {
int totalTime = 0;
List<ProjectWorkTimeAndType> projectWorkTimeAndType1 = userProjectWorkTimeStatistic.getProjectWorkTimeAndType();
// 遍历一个人所有项目统计,计算所有项目所有工时总和
for (ProjectWorkTimeAndType projectWorkTimeAndType : projectWorkTimeAndType1) {
projectWorkTimeAndType.setProjectTypeName(types.get(projectWorkTimeAndType.getProjectType() - 1).getName());
totalTime += projectWorkTimeAndType.getWorkTime();
}
// 将相同项目的加班工时和平常工时放在前一个对象,将后一个对象删除
for (int i = 1; i < projectWorkTimeAndType1.size(); i++) {
ProjectWorkTimeAndType projectWorkTimeAndType2 = projectWorkTimeAndType1.get(i);
String projectName = projectWorkTimeAndType2.getProjectName();
ProjectWorkTimeAndType projectWorkTimeAndType3 = projectWorkTimeAndType1.get(i - 1);
String projectName1 = projectWorkTimeAndType3.getProjectName();
if (projectName.equals(projectName1)) {
projectWorkTimeAndType1.get(i - 1).setOvertime(projectWorkTimeAndType2.getOvertime());
projectWorkTimeAndType1.remove(i);
}
ProjectWorkTimeAndType projectWorkTimeAndTypes = projectWorkTimeAndType1.get(i-1);
totalTime += projectWorkTimeAndTypes.getNormalTime() + projectWorkTimeAndTypes.getOvertime();
}
totalTime += projectWorkTimeAndType1.get(projectWorkTimeAndType1.size() - 1).getOvertime() + projectWorkTimeAndType1.get(projectWorkTimeAndType1.size() - 1).getNormalTime();
userProjectWorkTimeStatistic.setTotalTime(totalTime);
}
......@@ -693,20 +709,17 @@ public class StatisticsServiceImpl implements StatisticsService {
}
// 将查询结果封装在一起,部门主键为空,项目总计在前,否则在后
List<ProjectStatisticsByMonth> projectStatistics = new ArrayList<>();
if (deptId == null) {
projectStatistics.addAll(projectStatisticsByMonths);
projectStatistics.addAll(projectStatisticsByMonths1);
projectStatisticsByMonths.addAll(projectStatisticsByMonths1);
} else {
projectStatistics.addAll(projectStatisticsByMonths1);
projectStatistics.addAll(projectStatisticsByMonths);
projectStatisticsByMonths.addAll(0,projectStatisticsByMonths1);
}
// 部门主键不为空时,日期格式只有某月。为空时,日期格式为某年统计的第一个月为某年某月,其余为某月
this.conversionDateFormat(projectStatistics, deptId);
this.conversionDateFormat(projectStatisticsByMonths, deptId);
// 计算项目工时和成本合计
for (ProjectStatisticsByMonth projectStatisticsByMonth : projectStatistics) {
for (ProjectStatisticsByMonth projectStatisticsByMonth : projectStatisticsByMonths) {
// 一条统计的
List<ProjectStatisticsByMonth.StatisticsDateAndWorkTime> statisticsDateAndWorkTimes = projectStatisticsByMonth.getStatisticsDateAndWorkTimes();
// 项目合计对象
......@@ -724,7 +737,7 @@ public class StatisticsServiceImpl implements StatisticsService {
statisticsDateAndWorkTime1.setCost(cost);
statisticsDateAndWorkTimes.add(statisticsDateAndWorkTime1);
}
return projectStatistics;
return projectStatisticsByMonths;
}
//获取一个月应上班日期,如果是当月,时间截至到当天
......
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