Commit dee443dd authored by nie'hong's avatar nie'hong

完善工时统计

parent e31e92a8
package cn.wisenergy.mapper;
import cn.wisenergy.model.dto.WorkTimeAndCostCollect;
import java.util.List;
import java.util.Map;
/**
* @description:
* @author: nh
* @create: 2021-02-07 11:09
**/
public interface WorkProjectTimeCostMapper {
/**
* 根据添加查询项目统计信息
*/
void statisticsTimeOrderByMonth();
/**
* 统计项目总工时和成本,按月统计
* @param map
*/
List<WorkTimeAndCostCollect> selectList(Map<String, Object> map);
}
......@@ -72,11 +72,10 @@ public interface WorkTimeOrderMapper extends BaseMapper<WorkTimeOrder> {
/**
* 获取项目或商机的成本
*
* @param projectIds
* @param firstDayOfMonth
* @param map
* @return
*/
List<WorkTimeAndCostCollect> getWorkTimeAndCostCollect(@Param("projectIds") List<Integer> projectIds, @Param("firstDayOfMonth") String firstDayOfMonth);
List<WorkTimeAndCostCollect> getWorkTimeAndCostCollect(Map<String, Object> map);
/**
* 获取上班日期集合
......@@ -95,4 +94,5 @@ public interface WorkTimeOrderMapper extends BaseMapper<WorkTimeOrder> {
* 获取人员项目工时
*/
List<UserWorkTimeStatisticsByProject> getUserProjectWorkTimeStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("status") Integer status, @Param("projectIds") List<Integer> projectIds);
}
......@@ -47,15 +47,13 @@
<select id="getProjectsByCriteria" resultMap="BaseResultMap" parameterType="map">
select <include refid="Base_Column_List"/>
from <include refid="table"/>
<where>
<include refid="criteria"/>
where manager_id = #{managerId} OR dept_id = #{deptId}
<if test="deptIds != null">
AND dept_id IN
OR dept_id IN
<foreach collection="deptIds" item="deptId" separator="," open="(" close=")">
#{deptId}
</foreach>
</if>
</where>
</select>
<select id="getProjectsByIds" resultType="cn.wisenergy.model.app.WorkProject">
select <include refid="Base_Column_List"/>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wisenergy.mapper.WorkProjectTimeCostMapper">
<resultMap id="workProjectTimeCost" type="cn.wisenergy.model.app.WorkProjectTimeCost">
<id column="id" property="id"/>
<result property="projectId" column="project_id"/>
<result property="statisticsStart" column="statistics_start"/>
<result property="statisticsEnd" column="statistics_end"/>
<result property="totalTime" column="total_time"/>
<result property="cost" column="cost"/>
</resultMap>
<resultMap id="workTimeAndCostCollect" type="cn.wisenergy.model.dto.WorkTimeAndCostCollect">
<result property="type" column="type"/>
<collection property="deptProjectWorkTimeAndCosts" resultMap="deptProjectWorkTimeAndCost"/>
</resultMap>
<resultMap id="deptProjectWorkTimeAndCost" type="cn.wisenergy.model.dto.DeptProjectWorkTimeAndCost">
<result property="deptId" column="dept_id"/>
<result property="deptName" column="dept_name"/>
<collection property="projectWorkTimeAndCostStatistics"
ofType="cn.wisenergy.model.dto.ProjectWorkTimeAndCostStatistics">
<result property="projectId" column="project_id"/>
<result property="projectName" column="project_name"/>
<result property="firstTime" column="statistics_start"/>
<result property="lastTime" column="statistics_end"/>
<result property="totalTime" column="total_time"/>
<result property="cost" column="cost"/>
</collection>
</resultMap>
<insert id="statisticsTimeOrderByMonth">
INSERT into work_project_time_cost(project_id,statistics_start,statistics_end,total_time,cost)
SELECT
project_id,
min(work_day) AS statistics_start,
max(work_day),
sum(work_time/8),
-- 加班和不加班成本结算不同
sum(if(is_overtime=0,work_time/8*s.day_salary,work_time/8*s.day_salary*1.5)) AS cost
FROM
work_time_order t join work_user_salary s on t.user_id = s.user_id
WHERE status in (2,5) AND s.create_time &lt; work_day AND s.end_time>work_day AND
GROUP BY
project_id,
YEAR (work_day),
MONTH (work_day)
ON DUPLICATE key UPDATE statistics_end = VALUES(statistics_end),total_time = VALUES(total_time),cost= VALUES(cost)
</insert>
<select id="selectList" resultMap="workTimeAndCostCollect">
SELECT case `type` when 1 then "项目" else "商机" end AS type ,dept_name,dept_id,ptc.project_id AS
project_id,project_name,min(statistics_start) AS statistics_start,max(statistics_end) AS
statistics_end,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
<foreach collection="projectIds" open="(" close=")" separator="," item="projectId">
#{projectId}
</foreach>
<if test="deptId != null">
AND dept_id = #{deptId}
</if>
AND type in
<foreach collection="types" open="(" close=")" separator="," item="type">
#{type}
</foreach>
<if test="firstDayOfMonth != null">
AND statistics_start >= #{firstDayOfMonth}
</if>
GROUP BY type,dept_name,dept_id,ptc.project_id,project_name
</select>
</mapper>
\ No newline at end of file
......@@ -33,6 +33,25 @@
</collection>
</resultMap>
<resultMap id="workTimeAndCostCollect" type="cn.wisenergy.model.dto.WorkTimeAndCostCollect" >
<result property="type" column="type"/>
<collection property="deptProjectWorkTimeAndCosts" resultMap="deptProjectWorkTimeAndCosts" >
</collection>
</resultMap>
<resultMap id="deptProjectWorkTimeAndCosts" type="cn.wisenergy.model.dto.DeptProjectWorkTimeAndCost">
<result property="deptId" column="dept_id"/>
<result property="deptName" column="dept_name"/>
<collection property="projectWorkTimeAndCostStatistics" ofType="cn.wisenergy.model.dto.ProjectWorkTimeAndCostStatistics">
<result property="projectId" column="project_id"/>
<result property="projectName" column="project_name"/>
<result property="firstTime" column="first_time"/>
<result property="lastTime" column="last_time"/>
<result property="totalTime" column="total_time"/>
<result property="cost" column="cost"/>
</collection>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="vals">
......@@ -209,21 +228,31 @@
</where>
</select>
<select id="getWorkTimeAndCostCollect" resultType="cn.wisenergy.model.dto.WorkTimeAndCostCollect"
parameterType="integer">
select CASE WHEN t.type= 1 THEN "项目" WHEN t.type= 2 THEN "商机" END AS type,t.dept_id,
t.project_id,MIN(t.work_day) AS firstTime,MAX(t.work_day) AS lastTime,SUM(t.work_time)/8 AS
totalTime,(SUM(t.work_time))/8*10 AS cost,dept_name AS deptName,project_name AS projectName
from work_time_order t JOIN work_dept d ON t.dept_id=d.id
JOIN work_project p ON t.project_id=p.id
where status IN (2,5) AND t.type IN (1,2) AND project_id IN
<foreach collection="projectIds" item="projectId" open="(" close=")" separator=",">
#{projectId}
</foreach>
<if test="firstDayOfMonth != null">
AND work_day >= #{firstDayOfMonth}
<select id="getWorkTimeAndCostCollect" resultMap="workTimeAndCostCollect" >
SELECT CASE t.type WHEN 1 THEN "项目" WHEN 2 THEN "商机" WHEN 5 THEN "外部商务" WHEN 6 THEN "内部培训、技术准备、管理" WHEN 7 THEN "其他非项目/商机工作" END AS type,p.dept_id AS dept_id,
t.project_id AS project_id,MIN(t.work_day) AS first_time,MAX(t.work_day) AS last_time,ROUND(SUM(t.work_time)/8,2) AS
total_time,ROUND((SUM(t.work_time))/8*10,2) AS cost,dept_name AS dept_name,project_name
FROM work_time_order t LEFT JOIN work_project p ON t.project_id=p.id LEFT JOIN work_dept d ON p.dept_id=d.id
WHERE status IN (2,5)
<if test="projectIds != null">
AND (t.project_id IN
<foreach collection="projectIds" item="projectId" open="(" close=")" separator=",">
#{projectId}
</foreach>
OR t.project_id IS null)
</if>
<if test="startTime != null">
AND work_day >= #{startTime}
</if>
group by t.type,dept_id, project_id,dept_name,project_name
<if test="deptId != null">
AND t.dept_id = #{deptId}
</if>
AND t.type in
<foreach collection="types" item="type" open="(" close=")" separator=",">
#{type}
</foreach>
group by t.type,t.dept_id, t.project_id,dept_name,p.project_name
order by t.dept_id
</select>
<select id="getDaysByDateAndStatus" resultType="date">
......
package cn.wisenergy.model.app;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @description:
* @author: nh
* @create: 2021-02-07 11:02
**/
@ApiModel
@Data
public class WorkProjectTimeCost implements Serializable {
private static final long serialVersionUID = -1233065911955324813L;
@ApiModelProperty(name = "id", value = "主键")
private Integer id;
@ApiModelProperty(name = "projectId", value = "项目主键")
private Integer projectId;
@ApiModelProperty(name = "statisticsStart", value = "当月第一次统计的时间")
private Date statisticsStart;
@ApiModelProperty(name = "statisticsEnd", value = "当月最后一次统计的时间")
private Date statisticsEnd;
@ApiModelProperty(name = "totalTime", value = "当月统计总工时,单位:人/天")
private Integer totalTime;
@ApiModelProperty(name = "cost", value = "成本")
private BigDecimal cost;
}
package cn.wisenergy.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @description:
* @author: nh
* @create: 2021-02-05 11:54
**/
@Data
@ApiModel(value = "DeptProjectWorkTimeAndCost", description = "部门项目工时及成本")
public class DeptProjectWorkTimeAndCost implements Serializable {
private static final long serialVersionUID = -4607187953621906522L;
/**
* 部门名称
*/
@ApiModelProperty(name = "deptName", value = "部门名称")
private String deptName;
/**
* 部门主键
*/
@ApiModelProperty(name = "deptId", value = "部门主键")
private Integer deptId;
List<ProjectWorkTimeAndCostStatistics> projectWorkTimeAndCostStatistics;
}
package cn.wisenergy.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @description:
* @author: nh
* @create: 2021-02-05 11:47
**/
@Data
@ApiModel(value = "ProjectWorkTimeAndCostStatistics", description = "项目的工时及成本统计")
public class ProjectWorkTimeAndCostStatistics implements Serializable {
private static final long serialVersionUID = -4314814033869080027L;
/**
* 项目主键
*/
@ApiModelProperty(name = "projectId", value = "项目主键")
private Integer projectId;
/**
* 项目名称
*/
@ApiModelProperty(name = "projectName", value = "项目名称")
private String projectName;
/**
* 开始统计日期
*/
@ApiModelProperty(name = "firstTime", value = "开始统计的日期")
private String firstTime;
/**
*最后统计日期
*/
@ApiModelProperty(name = "lastTime", value = "最后统计的日期")
private String lastTime;
/**
* 工时总计:人/天
*/
@ApiModelProperty(name = "totalTime", value = "工时总计")
private BigDecimal totalTime;
/**
* 工时成本
*/
@ApiModelProperty(name = "cost", value = "工时成本")
private BigDecimal cost;
}
......@@ -6,6 +6,7 @@ import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* @description: 项目的工时和工时成本统计
......@@ -18,57 +19,21 @@ public class WorkTimeAndCostCollect implements Serializable {
private static final long serialVersionUID = 7207732278277982917L;
/**
* 类型:项目/商机
* 工时类型
*/
@ApiModelProperty(name = "type", value = "类型:商机/项目")
@ApiModelProperty(name = "type", value = "工时类型")
private String type;
/**
* 部门名称
* 部门工时统计
*/
@ApiModelProperty(name = "deptName", value = "部门名称")
private String deptName;
@ApiModelProperty(name = "deptProjectWorkTimeAndCosts", value = "部门工时统计")
private List<DeptProjectWorkTimeAndCost> deptProjectWorkTimeAndCosts;
/**
* 部门主键
* 工时总计
*/
@ApiModelProperty(name = "deptId", value = "部门主键")
private Integer deptId;
/**
* 项目主键
*/
@ApiModelProperty(name = "projectId", value = "项目主键")
private Integer projectId;
/**
* 项目名称
*/
@ApiModelProperty(name = "projectName", value = "项目名称")
private String projectName;
/**
* 开始统计日期
*/
@ApiModelProperty(name = "firstTime", value = "开始统计的日期")
private String firstTime;
/**
*最后统计日期
*/
@ApiModelProperty(name = "lastTime", value = "最后统计的日期")
private String lastTime;
/**
* 工时总计:人/天
*/
@ApiModelProperty(name = "totalTime", value = "工时总计")
private BigDecimal totalTime;
/**
* 工时成本
*/
@ApiModelProperty(name = "cost", value = "工时成本")
private Integer cost;
@ApiModelProperty(name = "workTime", value = "工时总计")
private BigDecimal workTime;
}
......@@ -128,17 +128,16 @@ public class WorkProjectServiceImpl implements WorkProjectService {
}
WorkUser user = workUserService.getById(userId);
//普通用户
if (user.getLevel().equals(ManagerEnum.NOT_MANAGER.getCode())) {
if (user.getLevel().equals(ManagerEnum.NOT_MANAGER)) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.THE_USER_NOT_MANAGER_PLASE_MANAGER_LOGIN);
}
//存放项目列表
List<WorkProject> workProjects;
//存放查询条件
HashMap<String, Object> map = new HashMap<>(10);
//项目级别查询项目管理员为用户的项目
if (user.getLevel().equals(ManagerEnum.IS_PROJECT_DIRECTOR.getCode())) {
HashMap<String, Object> map = new HashMap<>();
// 查询项目表中管理为用户的项目集合,用户为项目经理,但level可能不为1
map.put("managerId", userId);
}
//用户是部门级别,查询该部门下的所有项目
if (user.getLevel().equals(ManagerEnum.IS_DEPARTMENT_DIRECTOR.getCode())) {
map.put("deptId", user.getDeptId());
......@@ -150,7 +149,7 @@ public class WorkProjectServiceImpl implements WorkProjectService {
if (workCentre == null) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.CENTRE_NOT_FOUND);
}
map.put("centreId", workCentre.getId());
map.put("centreId",workCentre.getId());
//获取中心下的部门信息
List<WorkDept> workDepts = workDeptMapper.getDeptByCondition(map);
if (CollectionUtils.isEmpty(workDepts)) {
......
......@@ -42,6 +42,8 @@ public class StatisticsController extends BaseController {
@Autowired
WorkDeptService workDeptService;
@ApiOperation(value = "获取部门员工一个月每天的工时", notes = "获取部门员工一个月每天的工时")
@GetMapping("/getMonthlyCollect")
public PageInfo getMonthlyCollect(GetMonthlyCollectParam param) {
......@@ -119,5 +121,4 @@ public class StatisticsController extends BaseController {
return getResult(userWorkTimeStatisticsByProjects);
}
}
\ No newline at end of file
......@@ -30,7 +30,6 @@ public class Trigger implements SchedulingConfigurer {
@Autowired
private WorkTimeOrderMapper workTimeOrderMapper;
@Autowired
private WorkCollectService workCollectService;
......
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