浏览代码

工时按阶段统计

seyason 3 年之前
父节点
当前提交
e41d84c947
共有 21 个文件被更改,包括 338 次插入51 次删除
  1. 22 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 6 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  3. 10 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  4. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProjectWithStage.java
  5. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/StageCost.java
  6. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  7. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  8. 102 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  9. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  10. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java
  11. 35 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  12. 8 7
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  13. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  14. 二进制
      fhKeeper/formulahousekeeper/management-platform/成都项目导入模板 (1).xlsx
  15. 60 7
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  16. 10 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue
  17. 16 6
      fhKeeper/formulahousekeeper/timesheet/src/views/project/earning.vue
  18. 11 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  19. 4 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  20. 4 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_department.vue
  21. 4 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_profession.vue

+ 22 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -136,6 +136,18 @@ public class ProjectController {
         return projectService.getProjectCost(startDate, endDate, id, request);
     }
 
+    /**
+     * 获取项目内的阶段汇总统计工时成本
+     * @param startDate
+     * @param endDate
+     * @param id 项目id
+     * @return
+     */
+    @RequestMapping("/getCostInStage")
+    public HttpRespMsg getCostInStage(String startDate, String endDate, @RequestParam Integer id) {
+        return projectService.getCostInStage(startDate, endDate, id, request);
+    }
+
     @RequestMapping("/getAllMembCost")
     public HttpRespMsg getAllMembCost(String startDate, String endDate, Integer id) {
         return projectService.getAllMembCost(startDate, endDate, id, request);
@@ -214,6 +226,16 @@ public class ProjectController {
     public HttpRespMsg getProjectTask(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
         return projectService.getProjectTask(pageIndex, pageSize, request);
     }
+
+    //分页查询项目各个阶段的汇总工时成本
+    @RequestMapping("/getProjectStagesCost")
+    public HttpRespMsg getProjectStagesCost(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return projectService.getProjectStagesCost(pageIndex, pageSize, request);
+    }
+    @RequestMapping("/exportProjectStagesCost")
+    public HttpRespMsg exportProjectStagesCost() {
+        return projectService.exportProjectStagesCost(request);
+    }
     //导出项目任务报表
     @RequestMapping("/exportProjectTask")
     public HttpRespMsg exportProjectTask() {

+ 6 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -125,27 +125,20 @@ public class ReportController {
                                   Integer[] isOvertime,
                                   Integer[] progress,
                                   String[] targetUids,
-                                  String[] professionProgress
+                                  String[] professionProgress,
+                                  String[] stage
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
         List<String> targetUidList = null;
         List<User> targetUserList = null;
-        if (professionProgress != null) {
-            System.out.println("professionProgress.length=="+professionProgress.length);
-            for (int i=0;i<professionProgress.length; i++) {
-                System.out.println(professionProgress[i]);
-            }
-        }
         //代填
         if (targetUids != null && targetUids.length > 0) {
             String val = targetUids[0];
-            System.out.println("val===="+val);
             String[] ids = val.split("@");
             targetUidList = new ArrayList<>();
             for (int i = 0; i < ids.length; i++) {
                 targetUidList.add(ids[i]);
-                System.out.println("用户ID=="+ids[i]);
             }
             targetUserList = userService.list(new QueryWrapper<User>().in("id", targetUidList));
         }
@@ -202,7 +195,6 @@ public class ReportController {
                     tempCost = new BigDecimal(0);
                 }
                 //设置好时薪
-                System.out.println(subsUser.getName()+"的时薪是"+tempCost);
                 subsUser.setCost(tempCost);
             }
         }
@@ -250,6 +242,7 @@ public class ReportController {
                                         .setReportTimeType(reportTimeType[i])
                                         .setContent(content[i])
                                         .setState(0)
+                                        .setStage(stage != null && stage.length > 0 && !StringUtil.isEmpty(stage[i])?stage[i]:null)
                                         .setCreateDate(localStartDate)
                                         .setCreatorId(token);
                                 if (taskId != null && taskId[i] != null && taskId[i] != 0) {
@@ -297,6 +290,7 @@ public class ReportController {
                                             .setSubProjectId(subProjectId[i] == 0?null:subProjectId[i])
                                             .setReportTimeType(reportTimeType[i])
                                             .setContent(content[i])
+                                            .setStage(stage!=null && stage.length > 0  && !StringUtil.isEmpty(stage[i])?stage[i]:null)
                                             .setState(1)//代填,直接是审核通过状态
                                             .setCreateDate(localStartDate)
                                             .setCreatorId(subsUser.getId());
@@ -355,6 +349,7 @@ public class ReportController {
                                 .setSubProjectId(subProjectId[i] == 0?null:subProjectId[i])
                                 .setReportTimeType(reportTimeType[i])
                                 .setContent(content[i])
+                                .setStage(stage!=null && stage.length > 0  && !StringUtil.isEmpty(stage[i])?stage[i]:null)
                                 .setState(0)
                                 .setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                                 .setCreatorId(token);
@@ -409,6 +404,7 @@ public class ReportController {
                                     .setSubProjectId(subProjectId[i] == 0?null:subProjectId[i])
                                     .setReportTimeType(reportTimeType[i])
                                     .setContent(content[i])
+                                    .setStage(stage!=null && stage.length > 0  && !StringUtil.isEmpty(stage[i])?stage[i]:null)
                                     .setState(1)//代填的就直接审核通过了
                                     .setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                                     .setCreatorId(subsUser.getId());

+ 10 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java

@@ -20,13 +20,12 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-31
+ * @since 2021-10-18
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 public class Report extends Model<Report> {
-
     private static final long serialVersionUID=1L;
 
     /**
@@ -138,6 +137,8 @@ public class Report extends Model<Report> {
     private List<UserRecentTask> taskList;
     @TableField(exist = false)
     private List<ReportProfessionProgress> professionProgressList;
+    @TableField(exist = false)
+    private List<String> stages;
 
     /**
      * 部门审核状态: -1 专业未审核,0-部门未审核,1-已通过,2-未通过
@@ -146,6 +147,13 @@ public class Report extends Model<Report> {
     private Integer departmentAuditState;
 
 
+    /**
+     * 阶段/岗位/工序
+     */
+    @TableField("stage")
+    private String stage;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProjectWithStage.java

@@ -0,0 +1,18 @@
+package com.management.platform.entity.vo;
+
+import com.management.platform.entity.Project;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectWithStage {
+    public Integer id;
+    public String projectName;
+    public String projectCode;
+    //阶段的成本
+    public List<StageCost> stageCostList;
+}

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/StageCost.java

@@ -0,0 +1,7 @@
+package com.management.platform.entity.vo;
+
+public class StageCost {
+    public String stageName;
+    public Double cost;
+    public Double workingTime;
+}

+ 5 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java

@@ -3,6 +3,7 @@ package com.management.platform.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.vo.CustomerProject;
+import com.management.platform.entity.vo.ProjectWithStage;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
@@ -20,7 +21,7 @@ import java.util.Map;
  * @since 2020-01-03
  */
 public interface ProjectMapper extends BaseMapper<Project> {
-    List<Map<String, Object>> getParticipatedProject(@Param("userId") String userId);
+    List<Map<String, Object>> getParticipatedProject(@Param("userId") String userId, @Param("companyId") Integer companyId);
 
     List<Map<String, Object>> getTimeCost(@Param("companyId") Integer companyId, @Param("startDate") String startDate, @Param("endDate") String endDate,
         @Param("projectId") Integer projectId);
@@ -29,6 +30,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
     @Update("update project set status = 1, finish_date = null where id = #{id}")
     void restartProject(Integer id);
 
+    List<Map<String, Object>> getCostInStage(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projectId") Integer projectId);
     //获取全部人员成本
     List<Map<String, Object>> getAllMembCost(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projectId") Integer projectId,
                                              @Param("companyId") Integer companyId);
@@ -44,4 +46,6 @@ public interface ProjectMapper extends BaseMapper<Project> {
     List<CustomerProject> getProjectInAndOutByRange(Integer companyId, List<Integer> ids);
 
     List<Map> getGanttData(@Param("userIds") List<String> userIds);
+
+    List<ProjectWithStage> selectWithStage(Integer companyId, Integer startIndex, Integer endIndex);
 }

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -39,6 +39,8 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg getProjectCost(String startDate, String endDate, Integer projectId, HttpServletRequest request);
 
+    HttpRespMsg getCostInStage(String startDate, String endDate, Integer projectId, HttpServletRequest request);
+
     HttpRespMsg getAllMembCost(String startDate, String endDate, Integer projectId, HttpServletRequest request);
 
     HttpRespMsg exportTimeCost(String startDate, String endDate, Integer projectId, HttpServletRequest request);
@@ -80,4 +82,8 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg exportCustomerProjectInAndOut(HttpServletRequest request);
 
     HttpRespMsg getGanttData(HttpServletRequest request);
+
+    HttpRespMsg getProjectStagesCost(Integer pageIndex, Integer pageSize, HttpServletRequest request);
+
+    HttpRespMsg exportProjectStagesCost( HttpServletRequest request);
 }

+ 102 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -7,9 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
-import com.management.platform.entity.vo.CustomerProject;
-import com.management.platform.entity.vo.GanttDataItem;
-import com.management.platform.entity.vo.ProjectVO;
+import com.management.platform.entity.vo.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.ProjectNotifyUserService;
 import com.management.platform.service.ProjectService;
@@ -39,6 +37,7 @@ import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 
 /**
@@ -80,6 +79,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     CompanyMapper companyMapper;
     @Resource
+    StagesMapper stagesMapper;
+    @Resource
     private HttpServletResponse response;
 
     @Value(value = "${upload.path}")
@@ -92,7 +93,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             User user = userMapper.selectById(request.getHeader("Token"));
             if (user.getRole() == 0) {
                 //普通员工只能看本人相关的项目列表
-                httpRespMsg.data = projectMapper.getParticipatedProject(user.getId());
+                httpRespMsg.data = projectMapper.getParticipatedProject(user.getId(), user.getCompanyId());
             } else {
                 //其他的管理员,都可以看全部的
                 httpRespMsg.data = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()));
@@ -675,6 +676,36 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg getCostInStage(String startDate, String endDate, Integer projectId, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        try {
+            Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+            //首先查看有无浏览权限
+            if (!projectMapper.selectById(projectId).getCompanyId().equals(companyId)) {
+                httpRespMsg.setError("无权查看其他公司的项目详情");
+            } else {
+                Map<String, Object> resultMap = new HashMap<>();
+                List<Map<String, Object>> list = projectMapper.getCostInStage(startDate, endDate, projectId);
+                BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+                for (Map<String, Object> map : list) {
+                    if (!map.containsKey("costMoney")) {
+                        map.put("costMoney", 0);
+                    } else {
+                        totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
+                    }
+                }
+                resultMap.put("costList", list);
+                resultMap.put("totalMoneyCost", totalMoneyCost);
+                httpRespMsg.data = resultMap;
+            }
+        } catch (NullPointerException e) {
+            httpRespMsg.setError("验证失败");
+            return httpRespMsg;
+        }
+        return httpRespMsg;
+    }
+
     //获取人员工时成本,可指定项目
     @Override
     public HttpRespMsg getAllMembCost(String startDate, String endDate, Integer projectId, HttpServletRequest request) {
@@ -1115,6 +1146,68 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    @Override
+    public HttpRespMsg getProjectStagesCost(Integer pageIndex, Integer pageSize, HttpServletRequest request) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        int startIndex = (pageIndex-1)*pageSize;
+        int endIndex = pageSize*pageIndex;
+        HttpRespMsg msg = new HttpRespMsg();
+        Integer total = projectMapper.selectCount(new QueryWrapper<Project>().eq("company_id", companyId));
+        List<ProjectWithStage> record = projectMapper.selectWithStage(companyId, startIndex, endIndex);
+        //获取全部的列
+        List<Integer> collect = record.stream().map(ProjectWithStage::getId).collect(Collectors.toList());
+        List<Stages> stagesList = stagesMapper.selectList(new QueryWrapper<Stages>().in("project_id", collect));
+        List<String> stageList = stagesList.stream().map(Stages::getStagesName).distinct().collect(Collectors.toList());
+
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("records", record);
+        map.put("total", total);
+        map.put("stages", stageList);
+        msg.data = map;
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg exportProjectStagesCost(HttpServletRequest request) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectWithStage> record = projectMapper.selectWithStage(companyId, null, null);
+        //获取全部的列
+        List<Integer> collect = record.stream().map(ProjectWithStage::getId).collect(Collectors.toList());
+        List<Stages> stagesList = stagesMapper.selectList(new QueryWrapper<Stages>().select("distinct stages_name").in("project_id", collect));
+        List<String> stageList = stagesList.stream().map(Stages::getStagesName).distinct().collect(Collectors.toList());
+        List<String> titleList = new ArrayList<>();
+        titleList.add("项目编号");
+        titleList.add("项目名称");
+        titleList.addAll(stageList);
+        List<List<String>> dataList = new ArrayList<>();
+        dataList.add(titleList);
+        //加完标题再增加数据行
+        record.forEach(r->{
+            List<String> data = new ArrayList<>();
+            data.add(r.projectCode);
+            data.add(r.projectName);
+            for (int i=0;i<stageList.size(); i++) {
+                String curStage = stageList.get(i);
+                //找匹配的记录
+                List<StageCost> stageCostList = r.stageCostList;
+                Optional<StageCost> first = stageCostList.stream().filter(s -> s.stageName.equals(curStage)).findFirst();
+                if (first.isPresent()) {
+                    data.add(first.get().workingTime+"");
+                } else {
+                    data.add("0");
+                }
+            }
+            dataList.add(data);
+        });
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        String fileName = "项目阶段工时报表_"+System.currentTimeMillis();
+        ExcelUtil.exportGeneralExcelByTitleAndList(fileName, dataList, path);
+        httpRespMsg.data =  pathPrefix + fileName+".xls";
+        return httpRespMsg;
+    }
 
 
     @Override
@@ -1160,7 +1253,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (ExcelUtil.isRowEmpty(row)) {
                     continue;
                 }
-                System.out.println("当前行="+rowIndex);
                 //项目编号	项目名称 参与人 负责人 级别 开始日期 截止日期 合同金额
                 XSSFCell codeCell = row.getCell(0);
                 XSSFCell nameCell = row.getCell(1);
@@ -1170,7 +1262,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 XSSFCell startDateCell = row.getCell(5);
                 XSSFCell endDateCell = row.getCell(6);
                 XSSFCell amountCell = row.getCell(7);
-
+                XSSFCell isPublicCell = row.getCell(8);
 
                 if (codeCell != null)codeCell.setCellType(CellType.STRING);
                 if (nameCell != null)nameCell.setCellType(CellType.STRING);
@@ -1180,6 +1272,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (startDateCell != null)startDateCell.setCellType(CellType.NUMERIC);
                 if (endDateCell != null)endDateCell.setCellType(CellType.NUMERIC);
                 if (amountCell != null)amountCell.setCellType(CellType.STRING);
+                if (isPublicCell != null)isPublicCell.setCellType(CellType.STRING);
                 if (nameCell == null) {//项目名称为空的直接跳过
                     throw new Exception("项目名称不能为空");
                 }
@@ -1238,7 +1331,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (amountCell !=null && !StringUtils.isEmpty(amountCell.getStringCellValue())) {
                     project.setContractAmount(Double.parseDouble(amountCell.getStringCellValue()));
                 }
-
+                if (isPublicCell != null && !StringUtils.isEmpty(isPublicCell.getStringCellValue())) {
+                    project.setIsPublic("是".equals(isPublicCell.getStringCellValue())?1:0);
+                }
                 projectMapper.insert(project);
                 //参与人
                 if (participatorCell != null) {

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -99,6 +99,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private UserRecentTaskMapper userRecentTaskMapper;
     @Resource
     private PpMembsMapper ppMembsMapper;
+    @Resource
+    private StagesMapper stagesMapper;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -336,6 +338,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         try {
             String userId = request.getHeader("Token");
             Integer companyId = userMapper.selectById(userId).getCompanyId();
+            Company company = companyMapper.selectById(companyId);
             Map<String, Object> resultMap = new HashMap<>();
             //获取某日本人的所有日志
             List<Report> reports = reportMapper.selectList(new QueryWrapper<Report>()
@@ -358,6 +361,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     p.setProfessionName(professions.stream().filter(m->m.getId().equals(p.getProfessionId())).findFirst().get().getName());
                 });
                 r.setProfessionProgressList(progressList);
+                //获取任务阶段列表
+                if (company.getPackageProject() == 1) {
+                    r.setStages(stagesMapper.getProjectStages(r.getProjectId()));
+                }
             });
             resultMap.put("report", reports);
             //顺便再获取一下可分配时间

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java

@@ -154,8 +154,8 @@ public class ExcelUtil {
     public static boolean isRowEmpty(Row row){
         for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
             Cell cell = row.getCell(i);
-            if (cell != null && !StringUtils.isEmpty(cell.getStringCellValue())){
-                System.out.println(i+":"+cell.getStringCellValue());
+            if (cell != null && cell.getCellTypeEnum() != CellType.BLANK){
+                System.out.println(i+":"+cell.getCellTypeEnum());
                 return false;
             }
         }

+ 35 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -33,6 +33,14 @@
         <result column="customer_name" property="customerName" />
         <result column="is_public" property="isPublic" />
     </resultMap>
+    <resultMap id="BaseResultMap2" type="com.management.platform.entity.vo.ProjectWithStage">
+        <result column="id" property="id" />
+        <result column="project_name" property="projectName" />
+        <result column="project_code" property="projectCode" />
+        <collection property="stageCostList"  javaType="java.util.ArrayList"
+                    ofType="com.management.platform.entity.vo.StageCost"
+                    select="selectStageSum" column="projectId=id"></collection>
+    </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
@@ -50,7 +58,19 @@
         <result column="project_ids" property="projectIds" />
         <result column="project_names" property="projectNames" />
     </resultMap>
-
+    <select id="selectWithStage" resultMap="BaseResultMap2" >
+        select id, project_code, project_name from project
+        where company_id = #{companyId} order by id asc
+        <if test="startIndex != null">
+            limit ${startIndex}, ${endIndex}
+        </if>
+    </select>
+    <select id="selectStageSum" resultType="com.management.platform.entity.vo.StageCost">
+        select IFNULL(report.stage, '-') AS stage_name, IFNULL(SUM(report.`cost`),0) AS cost,
+        IFNULL(SUM(report.`working_time`), 0) AS working_time
+        FROM report where report.state = 1 and report.`project_id` = #{projectId}
+        GROUP BY report.stage
+    </select>
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getParticipatedProject" resultType="java.util.Map">
         SELECT id, project_name AS projectName
@@ -61,7 +81,7 @@
             WHERE user_id = #{userId}
         ) or incharger_id = #{userId}
         or creator_id = #{userId}
-        or is_public = 1
+        or (is_public = 1 and company_id = #{companyId})
         ORDER BY id DESC
     </select>
 
@@ -97,6 +117,19 @@
         ORDER BY b.id ASC
     </select>
 
+    <!--按照项目内的阶段名称分组统计工时-->
+    <select id="getCostInStage" resultType="java.util.Map">
+        SELECT IFNULL(a.stage, "未分配") as name, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
+        FROM report AS a
+        WHERE a.project_id = #{projectId}
+        AND a.state = 1
+        <if test="startDate != null and endDate != null">
+            AND a.create_date between #{startDate} and #{endDate}
+        </if>
+        GROUP BY a.stage
+        ORDER BY a.stage ASC
+    </select>
+
     <!--获取全部人员工时 -->
     <select id="getAllMembCost" resultType="java.util.Map">
         SELECT b.name, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney

+ 8 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -22,11 +22,12 @@
         <result column="is_overtime" property="isOvertime" />
         <result column="progress" property="progress" />
         <result column="department_audit_state" property="departmentAuditState" />
+        <result column="stage" property="stage" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, creator_id, project_id, create_date, working_time, content, state, create_time, time_type, cost, start_time, end_time, report_time_type, sub_project_id, task_id, is_overtime, progress, department_audit_state
+        id, creator_id, project_id, create_date, working_time, content, state, create_time, time_type, cost, start_time, end_time, report_time_type, sub_project_id, task_id, is_overtime, progress, department_audit_state, stage
     </sql>
     <!--根据日期获取全部报告信息-->
     <select id="getAllReportByDate" resultType="java.util.Map">
@@ -60,7 +61,7 @@
         SELECT a.id, a.project_id as projectId,b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, b.incharger_id as inchargerId,
         a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
-        a.department_audit_state as departmentAuditState
+        a.department_audit_state as departmentAuditState, a.stage
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -79,7 +80,7 @@
         a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, b.incharger_id as inchargerId,
         a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
-        a.department_audit_state as departmentAuditState
+        a.department_audit_state as departmentAuditState, a.stage
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -100,7 +101,7 @@
         SELECT a.id, a.project_id as projectId, b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType,
         a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, b.incharger_id as inchargerId,
-        a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress
+        a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress, a.stage
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -122,7 +123,7 @@
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName,
         b.incharger_id as inchargerId,
         a.is_overtime as isOvertime,a.progress as progress,
-        a.department_audit_state as departmentAuditState
+        a.department_audit_state as departmentAuditState, a.stage
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -249,8 +250,8 @@
         and user.company_id = #{companyId}
         <if test="deptIds != null">
             AND user.department_id in <foreach collection="deptIds" separator="," index="index" item="item" close=")" open="(">
-                item
-            </foreach>
+            item
+        </foreach>
         </if>
         <if test="startDate != null">
             AND report.create_date &gt;= #{startDate}

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml

@@ -113,7 +113,7 @@
     </select>
 
     <select id="getProjectTask" resultType="java.util.Map">
-        SELECT task.id, task.`name`, task.`end_date`, task.`plan_hours`,
+        SELECT task.id, task.`name`, DATE_FORMAT(task.`end_date`, '%Y-%m-%d') as end_date, task.`plan_hours`,
         (SELECT IFNULL(SUM(working_time),0) FROM report WHERE report.`task_id` = task.id AND report.`state` = 1) AS real_hours,
         task.`task_status`, task.`task_type`,
         project.`project_code`, project.`project_name` FROM task LEFT JOIN project ON project.id = task.`project_id`

二进制
fhKeeper/formulahousekeeper/management-platform/成都项目导入模板 (1).xlsx


+ 60 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -21,6 +21,7 @@
               <el-menu-item index="1-3"><p @click="ssl(2)">项目成本报表</p></el-menu-item>
               <el-menu-item index="1-4"><p @click="ssl(3)">项目收支平衡表</p></el-menu-item>
               <el-menu-item index="1-5" v-if="user.company.packageCustomer == 1"><p @click="ssl(4)">客户项目利润表</p></el-menu-item>
+              <el-menu-item index="1-6"><p @click="ssl(5)">项目阶段工时表</p></el-menu-item>
             </el-submenu>
           </el-menu>
       </el-col>
@@ -38,7 +39,7 @@
     <div ref="staff" style="margin: 5px 0px 0px 200px; width: 84%">
         <div class="staff">
             <!--项目报表 -->
-            <el-table v-if="ins == 0" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table v-if="ins == 0" :key="ins" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
                 <el-table-column  prop="projectCode" label="项目编码"  width="120"></el-table-column>
                 <el-table-column  prop="projectName" label="项目名称" >
                   <template slot-scope="scope" >
@@ -78,7 +79,7 @@
             </el-table>
 
             <!-- 项目任务报表 -->
-            <el-table v-if="ins == 1" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table v-if="ins == 1" :key="ins" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
                 <el-table-column  prop="project_code" label="项目编码"  width="120"></el-table-column>
                 <el-table-column  prop="project_name" label="项目名称" width="200">
                   <template slot-scope="scope" >
@@ -118,7 +119,7 @@
             </el-table>
 
             <!--项目成本报表 -->
-            <el-table v-if="ins == 2" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table v-if="ins == 2"  :key="ins" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
                 <el-table-column  prop="projectCode" label="项目编码"  width="120"></el-table-column>
                 <el-table-column  prop="projectName" label="项目名称" >
                   <template slot-scope="scope" >
@@ -152,7 +153,7 @@
                 </el-table-column>
             </el-table>
             <!--项目收支平衡表 -->
-            <el-table v-if="ins == 3" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table v-if="ins == 3"  :key="ins" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
                 <el-table-column prop="projectCode" label="项目编码"  width="120"></el-table-column>
                 <el-table-column prop="projectName" label="项目名称" >
                   <template slot-scope="scope" >
@@ -201,7 +202,7 @@
                 </el-table-column>
             </el-table>
             <!--客户项目报表 -->
-            <el-table v-if="ins == 4" border :data="list"
+            <el-table v-if="ins == 4" border :data="list"  :key="ins"
             highlight-current-row v-loading="listLoading" :height="tableHeight" 
              style="width: 100%;">
                 <el-table-column prop="customerName" label="客户名称" ></el-table-column>
@@ -251,7 +252,23 @@
                     </template>
                 </el-table-column>
             </el-table>
-            
+            <!--项目阶段汇总工时报表 -->
+            <el-table v-if="ins == 5" border :data="list" :key="ins"
+            highlight-current-row v-loading="listLoading" :height="tableHeight" 
+             style="width: 100%;">
+                <el-table-column prop="projectCode" label="项目编码"  width="120" fixed ></el-table-column>
+                <el-table-column prop="projectName" label="项目名称" width="450" fixed  >
+                  <template slot-scope="scope" >
+                    {{scope.row.projectName}}
+                  </template>
+                </el-table-column>
+                <el-table-column v-for="item in stages" :label="item" min-width="150" :key="item" align="right" show-overflow-tooltip="true" >
+                  <template slot-scope="scope" >
+                    {{scope.row.stageCostList.filter(s=>s.stageName == item).length == 0?'0':scope.row.stageCostList.filter(s=>s.stageName == item)[0].workingTime.toFixed(1)}}
+                  </template>
+                 
+                </el-table-column>
+            </el-table>
         <!--工具条-->
         <el-col :span="24" class="toolbar">
             <el-pagination
@@ -332,6 +349,7 @@ export default {
   props: {},
   data() {
     return {
+      stages:[],
       addFormVisible:false,
       title:'',
       childrenList:[],
@@ -352,7 +370,7 @@ export default {
       z   : null,
       value: null,
       dialog: false, // 单据查看展示
-      shuz: ["项目报表","项目任务报表","项目成本报表","项目收支平衡表(利润表)","客户项目利润报表"],
+      shuz: ["项目报表","项目任务报表","项目成本报表","项目收支平衡表(利润表)","客户项目利润报表","项目阶段工时表"],
       ins: 0,
       user: JSON.parse(sessionStorage.user)
     };
@@ -440,6 +458,8 @@ export default {
                     this.getProjectInAndOut();
                 } else if (this.ins == 4) {
                     this.getCustomerProjectInAndOut();
+                } else if (this.ins == 5) {
+                    this.getProjectStages();
                 }
             },
       exportExcel() {
@@ -460,6 +480,9 @@ export default {
         } else if (this.ins == 4) {
           fName = "客户项目利润报表.xls";
           url += "/exportCustomerProjectInAndOut";
+        } else if (this.ins == 5) {
+          fName = "项目阶段工时报表.xls";
+          url += "/exportProjectStagesCost";
         }
           this.http.post(url, {},
             res => {
@@ -592,6 +615,36 @@ export default {
             });
         });
     },
+    //获取项目阶段的汇总工时
+    getProjectStages() {
+      this.listLoading = true;
+      this.http.post('/project/getProjectStagesCost', {
+                    pageIndex: this.page,
+                    pageSize: this.size,
+                    },
+        res => {
+            if (res.code == "ok") {
+                this.list = res.data.records;
+                console.log(this.list);
+                this.total = res.data.total;
+                this.stages = res.data.stages;
+                this.listLoading = false; 
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
+
+    
     getProjectList() {
         this.listLoading = true;
       this.http.post('/project/getProjectPage', {

+ 10 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue

@@ -19,6 +19,7 @@
             <el-radio-group v-model="radio" @change="getList">
                 <el-radio-button label="人员"></el-radio-button>
                 <el-radio-button label="子项目"></el-radio-button>
+                <el-radio-button label="阶段"></el-radio-button>
             </el-radio-group>
         </el-col>
         
@@ -59,8 +60,15 @@
             //获取项目列表
             getList() {
                 this.listLoading = true;
-                this.http.post(this.radio=='人员'?this.port.project.projectCost:'/sub-project/getTimeCost'
-                , {
+                var url = "";
+                if (this.radio=='人员') {
+                    url = this.port.project.projectCost;
+                } else if (this.radio=='子项目') {
+                    url = '/sub-project/getTimeCost';
+                } else {
+                    url = "/project/getCostInStage";
+                }
+                this.http.post(url, {
                     id: this.detailId,
                     startDate: this.startDate,
                     endDate: this.endDate,

+ 16 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/project/earning.vue

@@ -13,7 +13,7 @@
                         <el-table-column prop="profit" align="right" >
                             <template slot="header">
                                <span>利润</span>
-                               <el-popover placement="top" width="250" trigger="hover" content="利润 = (合同金额 - 总成本)">
+                               <el-popover placement="top" width="200" trigger="hover" content="利润 = (合同金额 - 总成本)">
                                    <i class="el-icon-question" slot="reference" />
                                </el-popover>
                             </template>
@@ -33,7 +33,7 @@
                             </template>
                         </el-table-column>
                         
-                        <el-table-column prop="contractAmount" label="合同金额" width="110" >
+                        <el-table-column prop="contractAmount" label="合同金额" width="150" align="right">
                             <template slot-scope="scope">
                                <span >¥{{scope.row.contractAmount | numberToCurrency}}</span>
                             </template>
@@ -70,12 +70,22 @@
                                 ¥{{scope.row.baseRisk2 | numberToCurrency}}
                                 </template>
                             </el-table-column> -->
-                            <el-table-column  label="备注"  prop="remark">
+                            
+                            
+                        </el-table-column>
+                        <el-table-column  label="备注"  prop="remark">
+                            <template slot-scope="scope">
                                 
-                            </el-table-column>
-                            <el-table-column  label="选择" width="55" type="selection" v-if="deleteTxt == '确认删除'">
+                                    <div style="font-size:10px;overflow:hidden;width:100px;height:25px;">
+                                        <el-tooltip class="item" effect="dark" :content="scope.row.remark" placement="top-start">
+                                        <span>{{scope.row.remark}}</span>
+                                        </el-tooltip>
+                                    </div>
+                                
+                            </template>
+                        </el-table-column>
+                        <el-table-column  label="选择" width="55" type="selection" v-if="deleteTxt == '确认删除'">
                                 
-                            </el-table-column>
                         </el-table-column>
                     </el-table>
 

+ 11 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -113,6 +113,7 @@
                                     <el-timeline-item v-for="(item2,index2) in item1.data" :key="index2">
                                         <el-card shadow="never">
                                             <p>项目:<b>{{item2.project}}</b><span v-if="item2.subProjectName != null"> / {{item2.subProjectName}}</span>
+                                            
                                             <span v-if="user.company.packageEngineering == 0">
                                             <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0">[ 待审核 ]</span>
                                             <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">[ 已通过 ]</span>
@@ -149,6 +150,8 @@
                                                 <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{item2.startTime+'-'+item2.endTime}}</span>
                                             {{item2.time.toFixed(1)}}h  
                                             <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">加班</el-tag>
+                                            <!-- 阶段 -->
+                                            <span v-if="item2.stage != null" style="margin-left:10px;"> 投入阶段:{{item2.stage}}</span>
                                             </p>
                                             
                                             <p>事项:<span v-html="item2.content"></span></p>
@@ -1508,7 +1511,9 @@
                                     endTime: list.report[i].endTime,
                                     isOvertime: flg,
                                     progress:list.report[i].progress,
-                                    professionProgress: list.report[i].professionProgressList
+                                    professionProgress: list.report[i].professionProgressList,
+                                    stages:list.report[i].stages,
+                                    stage:list.report[i].stage
                                 })
                                 if (list.report[i].state >= 2) {
                                     this.canEdit = true;
@@ -1787,6 +1792,11 @@
                             } else {
                                 formData.append("professionProgress", "[]");
                             }
+                            if (this.workForm.domains[i].stage != null) {
+                                formData.append("stage", this.workForm.domains[i].stage);
+                            } else {
+                                formData.append("stage", "");
+                            }
                         }
                         this.http.uploadFile( this.port.report.editPort, formData,
                         res => {

+ 4 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -52,7 +52,10 @@
                                 </p>
                                 <p v-if="item.taskId != null">任务:{{item.taskName}}</p>
                                 <p>时长:{{item.time}}h <span class="propsbtn" v-if="item.isOvertime === 1">
-                                    <el-tag type="danger" size="mini" style="margin-left: 65px">加班</el-tag></span></p>
+                                    <el-tag type="danger" size="mini" style="margin-left: 65px">加班</el-tag></span>
+                                    <!-- 阶段 -->
+                                    <span v-if="item.stage != null" style="margin-left:10px;"> 投入阶段:{{item.stage}}</span>
+                                </p>
                                 <p v-if="user.role>=1&&user.role<=3">成本:{{item.cost}}元</p>
                                 <p>事项:<span v-html="item.content"></span></p>
                             </el-card>

+ 4 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_department.vue

@@ -45,7 +45,10 @@
                                 </p>
                                 <p v-if="item.taskId != null">任务:{{item.taskName}}</p>
                                 <p>时长:{{item.time}}h <span class="propsbtn" v-if="item.isOvertime === 1">
-                                    <el-tag type="danger" size="mini" style="margin-left: 65px">加班</el-tag></span></p>
+                                    <el-tag type="danger" size="mini" style="margin-left: 65px">加班</el-tag></span>
+                                    <!-- 阶段 -->
+                                    <span v-if="item.stage != null" style="margin-left:10px;"> 投入阶段:{{item.stage}}</span>
+                                </p>
                                 <p v-if="user.role>=1&&user.role<=3">成本:{{item.cost}}元</p>
                                 <p>事项:<span v-html="item.content"></span></p>
                             </el-card>

+ 4 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_profession.vue

@@ -51,7 +51,10 @@
                                 </p>
                                 <p v-if="item.taskId != null">任务:{{item.taskName}}</p>
                                 <p>时长:{{item.time}}h <span class="propsbtn" v-if="item.isOvertime === 1">
-                                    <el-tag type="danger" size="mini" style="margin-left: 65px">加班</el-tag></span></p>
+                                    <el-tag type="danger" size="mini" style="margin-left: 65px">加班</el-tag></span>
+                                    <!-- 阶段 -->
+                                    <span v-if="item.stage != null" style="margin-left:10px;"> 投入阶段:{{item.stage}}</span>
+                                </p>
                                 <p v-if="user.role>=1&&user.role<=3">成本:{{item.cost}}元</p>
                                 <p>事项:<span v-html="item.content"></span></p>
                             </el-card>