浏览代码

增加工时报告审核的批量审核, 增加项目挣值报告

seyason 4 年之前
父节点
当前提交
a7a873b651
共有 21 个文件被更改,包括 748 次插入114 次删除
  1. 56 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/EarningSnapshotController.java
  2. 20 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  3. 17 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  4. 120 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/EarningSnapshot.java
  5. 44 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  6. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/EarningSnapshotMapper.java
  7. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/EarningSnapshotService.java
  8. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  9. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  10. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/EarningSnapshotServiceImpl.java
  11. 57 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  12. 54 15
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  13. 28 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/EarningSnapshotMapper.xml
  14. 10 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  15. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  16. 1 1
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  17. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/routes.js
  18. 103 19
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  19. 3 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  20. 150 44
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  21. 16 11
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/msg/index.vue

+ 56 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/EarningSnapshotController.java

@@ -0,0 +1,56 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.EarningSnapshot;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.EarningSnapshotService;
+import com.management.platform.service.FinanceService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-15
+ */
+@RestController
+@RequestMapping("/earning-snapshot")
+public class EarningSnapshotController {
+    @Resource
+    private HttpServletRequest request;
+
+    @Resource
+    private EarningSnapshotService earningSnapshotService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer projectId) {
+        String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+        HttpRespMsg msg = new HttpRespMsg();
+        Project project = projectMapper.selectById(projectId);
+        if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId())) {
+            msg.data = earningSnapshotService.list(new QueryWrapper<EarningSnapshot>().eq("project_id", projectId).orderByDesc("id"));
+        } else {
+            msg.setError("无权查看");
+        }
+
+        return msg;
+    }
+}
+

+ 20 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -61,11 +61,30 @@ public class ProjectController {
                                    String planStartDate,
                                    String planStartDate,
                                    String planEndDate,
                                    String planEndDate,
                                    Integer level,
                                    Integer level,
+                                   Integer contractAmount,
+                                   Integer baseMan,
+                                   Integer baseFee,
+                                   Integer baseOutsourcing,
+                                   Integer baseRisk1,
+                                   Integer baseRisk2,
                                    Integer budget
                                    Integer budget
                                    ) {
                                    ) {
-        return projectService.editProject(id, name, code, userId, inchargerId, planStartDate, planEndDate, level, budget,request);
+        return projectService.editProject(id, name, code, userId, inchargerId, planStartDate, planEndDate, level, contractAmount,
+                 baseMan,
+                 baseFee,
+                 baseOutsourcing,
+                 baseRisk1,
+                 baseRisk2,
+                 budget,request);
     }
     }
 
 
+    @RequestMapping("/adjustBase")
+    public HttpRespMsg adjustBase(Project project
+    ) {
+        return projectService.adjustBase(project,request);
+    }
+
+
     /**
     /**
      * 更新项目进度
      * 更新项目进度
      * @param id
      * @param id

+ 17 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -161,18 +161,25 @@ public class ReportController {
      * state 筛选状态 0-未审核 1-已通过 2-未通过
      * state 筛选状态 0-未审核 1-已通过 2-未通过
      */
      */
     @RequestMapping("/listByState")
     @RequestMapping("/listByState")
-    public HttpRespMsg getListByState(@RequestParam Integer state, HttpServletRequest request) {
-        return reportService.getListByState(state, request);
+    public HttpRespMsg getListByState(@RequestParam Integer state,
+                                      Integer departmentId,
+                                      Integer projectId,
+                                      String date,
+                                      HttpServletRequest request) {
+        System.out.println("departmentId========="+departmentId);
+        return reportService.getListByState(state, departmentId,
+                projectId,
+                date,request);
     }
     }
 
 
     /**
     /**
      * 按某人某日期审批通过报告
      * 按某人某日期审批通过报告
      * id 要通过的报告的用户id
      * id 要通过的报告的用户id
-     * date 日期 格式yyyy-mm-dd
+     * reportIds 报告id
      */
      */
     @RequestMapping("/approve")
     @RequestMapping("/approve")
-    public HttpRespMsg approveReport(@RequestParam String id, @RequestParam String date, @RequestParam String reportIds,HttpServletRequest request) {
-        return reportService.approveReport(id, date,reportIds, request);
+    public HttpRespMsg approveReport(@RequestParam String id, @RequestParam String reportIds,HttpServletRequest request) {
+        return reportService.approveReport(id, reportIds, request);
     }
     }
 
 
     /**
     /**
@@ -227,5 +234,10 @@ public class ReportController {
     public HttpRespMsg batchApproveReport(@RequestParam String ids, HttpServletRequest request) {
     public HttpRespMsg batchApproveReport(@RequestParam String ids, HttpServletRequest request) {
         return reportService.batchApproveReport(ids, request);
         return reportService.batchApproveReport(ids, request);
     }
     }
+
+    @RequestMapping("/batchDenyReport")
+    public HttpRespMsg batchDenyReport(@RequestParam String ids, HttpServletRequest request) {
+        return reportService.batchDenyReport(ids, request);
+    }
 }
 }
 
 

+ 120 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/EarningSnapshot.java

@@ -0,0 +1,120 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class EarningSnapshot extends Model<EarningSnapshot> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目id
+     */
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 发生时间
+     */
+    @TableField("indate")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime indate;
+
+    /**
+     * 变更人id
+     */
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * 变更人姓名
+     */
+    @TableField("creator_name")
+    private String creatorName;
+
+    /**
+     * 项目金额
+     */
+    @TableField("contract_amount")
+    private Integer contractAmount;
+
+    /**
+     * 人员成本
+     */
+    @TableField("base_man")
+    private Integer baseMan;
+
+    /**
+     * 费用
+     */
+    @TableField("base_fee")
+    private Integer baseFee;
+
+    /**
+     * 外包费用
+     */
+    @TableField("base_outsourcing")
+    private Integer baseOutsourcing;
+
+    /**
+     * 风险预留金额1
+     */
+    @TableField("base_risk1")
+    private Integer baseRisk1;
+
+    /**
+     * 风险预留金额2
+     */
+    @TableField("base_risk2")
+    private Integer baseRisk2;
+
+    /**
+     * 利润率A
+     */
+    @TableField("profit_a")
+    private Double profitA;
+
+    /**
+     * 利润率B
+     */
+    @TableField("profit_b")
+    private Double profitB;
+
+    /**
+     * 利润率C
+     */
+    @TableField("profit_c")
+    private Double profitC;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 44 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -19,7 +19,7 @@ import lombok.experimental.Accessors;
  * </p>
  * </p>
  *
  *
  * @author Seyason
  * @author Seyason
- * @since 2021-04-30
+ * @since 2021-05-15
  */
  */
 @Data
 @Data
 @EqualsAndHashCode(callSuper = false)
 @EqualsAndHashCode(callSuper = false)
@@ -94,12 +94,6 @@ public class Project extends Model<Project> {
     @TableField("finish_date")
     @TableField("finish_date")
     private LocalDate finishDate;
     private LocalDate finishDate;
 
 
-    /**
-     * 预算:单位元
-     */
-    @TableField("budget")
-    private Integer budget;
-
     /**
     /**
      * 创建人id
      * 创建人id
      */
      */
@@ -118,12 +112,55 @@ public class Project extends Model<Project> {
     @TableField("create_date")
     @TableField("create_date")
     private LocalDate createDate;
     private LocalDate createDate;
 
 
+    /**
+     * 项目金额:单位元
+     */
+    @TableField("contract_amount")
+    private Integer contractAmount;
+
+    /**
+     * 基线总成本:单位元
+     */
+    @TableField("budget")
+    private Integer budget;
+
+    /**
+     * 人员成本:单位元
+     */
+    @TableField("base_man")
+    private Integer baseMan;
+
+    /**
+     * 外包费用
+     */
+    @TableField("base_outsourcing")
+    private Integer baseOutsourcing;
+
+    /**
+     * 风险预留资金1
+     */
+    @TableField("base_risk1")
+    private Integer baseRisk1;
+
+    /**
+     * 风险预留资金1
+     */
+    @TableField("base_risk2")
+    private Integer baseRisk2;
+
+    /**
+     * 基线费用
+     */
+    @TableField("base_fee")
+    private Integer baseFee;
+
 
 
     @TableField(exist = false)
     @TableField(exist = false)
     private String inchargerName;
     private String inchargerName;
 
 
     @TableField(exist = false)
     @TableField(exist = false)
     private List<Map<String, Object>> participationList;
     private List<Map<String, Object>> participationList;
+
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {
         return this.id;
         return this.id;

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/EarningSnapshotMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.EarningSnapshot;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-15
+ */
+public interface EarningSnapshotMapper extends BaseMapper<EarningSnapshot> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/EarningSnapshotService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.EarningSnapshot;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-15
+ */
+public interface EarningSnapshotService extends IService<EarningSnapshot> {
+
+}

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

@@ -24,6 +24,12 @@ public interface ProjectService extends IService<Project> {
                             String planStartDate,
                             String planStartDate,
                             String planEndDate,
                             String planEndDate,
                             Integer level,
                             Integer level,
+                            Integer contractAmount,
+                            Integer baseMan,
+                            Integer baseFee,
+                            Integer baseOutsourcing,
+                            Integer baseRisk1,
+                            Integer baseRisk2,
                             Integer budget,
                             Integer budget,
                             HttpServletRequest request);
                             HttpServletRequest request);
 
 
@@ -46,4 +52,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg restartProject(Integer id);
     HttpRespMsg restartProject(Integer id);
 
 
     HttpRespMsg addMemb(Integer id, String[] userId);
     HttpRespMsg addMemb(Integer id, String[] userId);
+
+    HttpRespMsg adjustBase(Project project, HttpServletRequest request);
 }
 }

+ 5 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -27,9 +27,11 @@ public interface ReportService extends IService<Report> {
 
 
     HttpRespMsg deleteReport(String userId, String date);
     HttpRespMsg deleteReport(String userId, String date);
 
 
-    HttpRespMsg getListByState(Integer state, HttpServletRequest request);
+    HttpRespMsg getListByState(Integer state, Integer departmentId,
+                               Integer projectId,
+                               String date,HttpServletRequest request);
 
 
-    HttpRespMsg approveReport(String id, String date, String reportIds, HttpServletRequest request);
+    HttpRespMsg approveReport(String id, String reportIds, HttpServletRequest request);
 
 
     HttpRespMsg denyReport(String id, String date, String reportIds,HttpServletRequest request);
     HttpRespMsg denyReport(String id, String date, String reportIds,HttpServletRequest request);
 
 
@@ -40,6 +42,7 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getMembList(String date, Integer manageDeptId, HttpServletRequest request);
     HttpRespMsg getMembList(String date, Integer manageDeptId, HttpServletRequest request);
 
 
     HttpRespMsg batchApproveReport(String ids, HttpServletRequest request);
     HttpRespMsg batchApproveReport(String ids, HttpServletRequest request);
+    HttpRespMsg batchDenyReport(String ids, HttpServletRequest request);
 
 
     HttpRespMsg cancelReport(String userId, String reportIds, HttpServletRequest request);
     HttpRespMsg cancelReport(String userId, String reportIds, HttpServletRequest request);
 }
 }

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/EarningSnapshotServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.EarningSnapshot;
+import com.management.platform.mapper.EarningSnapshotMapper;
+import com.management.platform.service.EarningSnapshotService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-15
+ */
+@Service
+public class EarningSnapshotServiceImpl extends ServiceImpl<EarningSnapshotMapper, EarningSnapshot> implements EarningSnapshotService {
+
+}

+ 57 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -16,6 +16,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.util.StringUtils;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
@@ -40,6 +41,7 @@ import java.util.stream.Collectors;
  * @since 2020-01-03
  * @since 2020-01-03
  */
  */
 @Service
 @Service
+@Transactional
 public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements ProjectService {
 public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements ProjectService {
     @Resource
     @Resource
     private ProjectMapper projectMapper;
     private ProjectMapper projectMapper;
@@ -54,6 +56,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     @Resource
     private TaskMapper taskMapper;
     private TaskMapper taskMapper;
     @Resource
     @Resource
+    private EarningSnapshotMapper earningSnapshotMapper;
+    @Resource
     private TimeTypeMapper timeTypeMapper;
     private TimeTypeMapper timeTypeMapper;
     @Resource
     @Resource
     private HttpServletResponse response;
     private HttpServletResponse response;
@@ -149,6 +153,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                    String planStartDate,
                                    String planStartDate,
                                    String planEndDate,
                                    String planEndDate,
                                    Integer level,
                                    Integer level,
+                                   Integer contractAmount,
+                                   Integer baseMan,
+                                   Integer baseFee,
+                                   Integer baseOutsourcing,
+                                   Integer baseRisk1,
+                                   Integer baseRisk2,
                                    Integer budget,
                                    Integer budget,
                                    HttpServletRequest request) {
                                    HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
@@ -170,7 +180,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 .setCreatorId(user.getId())
                                 .setCreatorId(user.getId())
                                 .setCreatorName(user.getName())
                                 .setCreatorName(user.getName())
                                 .setCreateDate(LocalDate.now())
                                 .setCreateDate(LocalDate.now())
-                                .setBudget(budget);
+                                .setContractAmount(contractAmount)
+                                .setBudget(budget)
+                                .setBaseFee(baseFee)
+                                .setBaseMan(baseMan)
+                                .setBaseOutsourcing(baseOutsourcing)
+                                .setBaseRisk1(baseRisk1)
+                                .setBaseRisk2(baseRisk2);
                         if (!StringUtils.isEmpty(planStartDate)) {
                         if (!StringUtils.isEmpty(planStartDate)) {
                             project.setPlanStartDate(LocalDate.parse(planStartDate));
                             project.setPlanStartDate(LocalDate.parse(planStartDate));
                         }
                         }
@@ -197,7 +213,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     Project p = new Project();
                     Project p = new Project();
                     p.setProjectName(name).setId(id).setCompanyId(companyId).setProjectCode(code).setInchargerId(inchargerId)
                     p.setProjectName(name).setId(id).setCompanyId(companyId).setProjectCode(code).setInchargerId(inchargerId)
                             .setLevel(level)
                             .setLevel(level)
-                            .setBudget(budget);
+                            .setContractAmount(contractAmount)
+                            .setBudget(budget)
+                            .setBaseFee(baseFee)
+                            .setBaseMan(baseMan)
+                            .setBaseOutsourcing(baseOutsourcing)
+                            .setBaseRisk1(baseRisk1)
+                            .setBaseRisk2(baseRisk2);;
                     if (!StringUtils.isEmpty(planStartDate)) {
                     if (!StringUtils.isEmpty(planStartDate)) {
                         p.setPlanStartDate(LocalDate.parse(planStartDate));
                         p.setPlanStartDate(LocalDate.parse(planStartDate));
                     }
                     }
@@ -451,6 +473,39 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return new HttpRespMsg();
         return new HttpRespMsg();
     }
     }
 
 
+    @Override
+    public HttpRespMsg adjustBase(Project project, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (project.getContractAmount() == 0) {
+            msg.setError("项目金额不能为0");
+            return msg;
+        }
+        //计算项目总成本
+        project.setBudget(project.getBaseFee()+project.getBaseMan()
+                    +project.getBaseOutsourcing()+project.getBaseRisk1()+project.getBaseRisk2());
+        projectMapper.updateById(project);
+        //增加基线快照
+        User user = userMapper.selectById(request.getHeader("Token"));
+        EarningSnapshot record = new EarningSnapshot();
+        record.setProjectId(project.getId());
+        record.setCreatorId(user.getId());
+        record.setCreatorName(user.getName());
+        record.setContractAmount(project.getContractAmount());
+        record.setBaseFee(project.getBaseFee());
+        record.setBaseMan(project.getBaseMan());
+        record.setBaseOutsourcing(project.getBaseOutsourcing());
+        record.setBaseRisk1(project.getBaseRisk1());
+        record.setBaseRisk2(project.getBaseRisk2());
+        int total = project.getBaseFee()+project.getBaseMan()+project.getBaseOutsourcing()+project.getBaseRisk1()+project.getBaseRisk2();
+
+        record.setProfitA(100.0*(project.getContractAmount() - total)/project.getContractAmount());
+        record.setProfitB(100.0*(project.getContractAmount() - total-project.getBaseRisk1())/project.getContractAmount());
+        record.setProfitC(100.0*(project.getContractAmount() - total-project.getBaseRisk1() - project.getBaseRisk2())/project.getContractAmount());
+        earningSnapshotMapper.insert(record);
+
+        return new HttpRespMsg();
+    }
+
     //获取某个项目每个人分别需要的工时
     //获取某个项目每个人分别需要的工时
     @Override
     @Override
     public HttpRespMsg getProjectCost(String startDate, String endDate, Integer projectId, HttpServletRequest request) {
     public HttpRespMsg getProjectCost(String startDate, String endDate, Integer projectId, HttpServletRequest request) {

+ 54 - 15
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -12,6 +12,7 @@ import com.management.platform.util.ListUtil;
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.hssf.usermodel.*;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
@@ -392,9 +393,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
 
     //按状态获取报告列表
     //按状态获取报告列表
     @Override
     @Override
-    public HttpRespMsg getListByState(Integer state, HttpServletRequest request) {
+    public HttpRespMsg getListByState(Integer state, Integer departmentId,
+                                      Integer projectId,
+                                      String date,HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
         try {
+            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
             User curUser = userMapper.selectById(request.getHeader("Token"));
             User curUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId = curUser.getCompanyId();
             Integer companyId = curUser.getCompanyId();
             String leaderId = null;
             String leaderId = null;
@@ -403,9 +407,22 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             }
             //根据权限,管理员查看全部人员的,各个项目负责人只看自己负责的项目参与人员的日报
             //根据权限,管理员查看全部人员的,各个项目负责人只看自己负责的项目参与人员的日报
             List<Map<String, Object>> nameList = reportMapper.getDetailByState(state, companyId, leaderId);
             List<Map<String, Object>> nameList = reportMapper.getDetailByState(state, companyId, leaderId);
+            //按部门过滤
+            if (departmentId != null) {
+                nameList = nameList.stream().filter(map->((Long)map.get("departmentId")) == departmentId.longValue()).collect(Collectors.toList());
+            }
+            //按日期过滤
+            if (!StringUtils.isEmpty(date)) {
+                nameList = nameList.stream().filter(map->{
+                    System.out.println("已有数据日期=="+sdf.format((java.sql.Date)map.get("date"))+", 参数date="+date);
+                    return (sdf.format((java.sql.Date)map.get("date"))).equals(date);
+                }).collect(Collectors.toList());
+            }
+
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
 
 
-            for (Map<String, Object> map2 : nameList) {
+            for (int index=0;index<nameList.size(); index++) {
+                Map<String, Object> map2 = nameList.get(index);
                 java.sql.Date createDate = (java.sql.Date)map2.get("date");
                 java.sql.Date createDate = (java.sql.Date)map2.get("date");
                 List<Map<String, Object>> list2 = null;
                 List<Map<String, Object>> list2 = null;
                 if (leaderId == null) {
                 if (leaderId == null) {
@@ -417,19 +434,28 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     list2 =
                     list2 =
                             inchargeReportList.stream().filter(i->i.get("creatorId").equals(map2.get("id"))).collect(Collectors.toList());
                             inchargeReportList.stream().filter(i->i.get("creatorId").equals(map2.get("id"))).collect(Collectors.toList());
                 }
                 }
-
-                map2.put("data", list2);
-                double reportTime = 0;
-                BigDecimal total = new BigDecimal(0);
-                for (Map<String, Object> m : list2) {
-                    double t = (double) m.get("time");
-                    reportTime += t;
-                    total = total.add((BigDecimal)m.get("cost"));
+                //按项目过滤
+                if (projectId != null) {
+                    list2 = list2.stream().filter(report->(((Integer)report.get("projectId")).equals(projectId))).collect(Collectors.toList());
+                }
+                if (list2.size() == 0) {
+                    //被项目过滤掉了,没有数据。
+                    nameList.remove(index);
+                    index--;
+                } else {
+                    map2.put("data", list2);
+                    double reportTime = 0;
+                    BigDecimal total = new BigDecimal(0);
+                    for (Map<String, Object> m : list2) {
+                        double t = (double) m.get("time");
+                        reportTime += t;
+                        total = total.add((BigDecimal)m.get("cost"));
+                    }
+                    DecimalFormat df = new DecimalFormat("0.00");
+                    map2.put("reportTime", df.format(reportTime));
+                    map2.put("cost", total);
+                    map2.put("state", list2.get(0).get("state"));
                 }
                 }
-                DecimalFormat df = new DecimalFormat("0.00");
-                map2.put("reportTime", df.format(reportTime));
-                map2.put("cost", total);
-                map2.put("state", list2.get(0).get("state"));
             }
             }
 //            for (Map<String, Object> map : nameList) {
 //            for (Map<String, Object> map : nameList) {
 //                //再根据人分别获取当天的报告
 //                //再根据人分别获取当天的报告
@@ -462,7 +488,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
 
     //审核通过某天某人的某报告
     //审核通过某天某人的某报告
     @Override
     @Override
-    public HttpRespMsg approveReport(String id, String date, String reportIds, HttpServletRequest request) {
+    public HttpRespMsg approveReport(String id, String reportIds, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
         try {
             User user = userMapper.selectById(request.getHeader("Token"));
             User user = userMapper.selectById(request.getHeader("Token"));
@@ -597,6 +623,19 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
         return msg;
     }
     }
 
 
+
+    @Override
+    public HttpRespMsg batchDenyReport(String ids, HttpServletRequest request) {
+        Report report = new Report();
+        report.setState(2);
+        int num = reportMapper.update(report, new QueryWrapper<Report>().in("id", ListUtil.convertIdsArrayToList(ids)));
+        HttpRespMsg msg = new HttpRespMsg();
+        if (num <= 0) {
+            msg.setError("无数据更新");
+        }
+        return msg;
+    }
+
     @Override
     @Override
     public HttpRespMsg cancelReport(String userId, String reportIds, HttpServletRequest request) {
     public HttpRespMsg cancelReport(String userId, String reportIds, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         HttpRespMsg msg = new HttpRespMsg();

+ 28 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/EarningSnapshotMapper.xml

@@ -0,0 +1,28 @@
+<?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="com.management.platform.mapper.EarningSnapshotMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.EarningSnapshot">
+        <id column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="indate" property="indate" />
+        <result column="creator_id" property="creatorId" />
+        <result column="creator_name" property="creatorName" />
+        <result column="contract_amount" property="contractAmount" />
+        <result column="base_man" property="baseMan" />
+        <result column="base_fee" property="baseFee" />
+        <result column="base_outsourcing" property="baseOutsourcing" />
+        <result column="base_risk1" property="baseRisk1" />
+        <result column="base_risk2" property="baseRisk2" />
+        <result column="profit_a" property="profitA" />
+        <result column="profit_b" property="profitB" />
+        <result column="profit_c" property="profitC" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_id, indate, creator_id, creator_name, contract_amount, base_man, base_fee, base_outsourcing, base_risk1, base_risk2, profit_a, profit_b, profit_c
+    </sql>
+
+</mapper>

+ 10 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -15,15 +15,21 @@
         <result column="level" property="level" />
         <result column="level" property="level" />
         <result column="status" property="status" />
         <result column="status" property="status" />
         <result column="finish_date" property="finishDate" />
         <result column="finish_date" property="finishDate" />
-        <result column="budget" property="budget" />
         <result column="creator_id" property="creatorId" />
         <result column="creator_id" property="creatorId" />
         <result column="creator_name" property="creatorName" />
         <result column="creator_name" property="creatorName" />
         <result column="create_date" property="createDate" />
         <result column="create_date" property="createDate" />
+        <result column="contract_amount" property="contractAmount" />
+        <result column="budget" property="budget" />
+        <result column="base_man" property="baseMan" />
+        <result column="base_outsourcing" property="baseOutsourcing" />
+        <result column="base_risk1" property="baseRisk1" />
+        <result column="base_risk2" property="baseRisk2" />
+        <result column="base_fee" property="baseFee" />
     </resultMap>
     </resultMap>
 
 
     <!-- 通用查询结果列 -->
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
-        id, project_name, company_id, project_code, incharger_id, plan_start_date, plan_end_date, progress, level, status, finish_date, budget, creator_id, creator_name, create_date
+        id, project_name, company_id, project_code, incharger_id, plan_start_date, plan_end_date, progress, level, status, finish_date, creator_id, creator_name, create_date, contract_amount, budget, base_man, base_outsourcing, base_risk1, base_risk2, base_fee
     </sql>
     </sql>
 
 
 
 
@@ -35,7 +41,8 @@
             SELECT project_id
             SELECT project_id
             FROM participation
             FROM participation
             WHERE user_id = #{userId}
             WHERE user_id = #{userId}
-        )
+        ) or incharger_id = #{userId}
+        or creator_id = #{userId}
         ORDER BY id DESC
         ORDER BY id DESC
     </select>
     </select>
 
 

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

@@ -51,7 +51,7 @@
 
 
     <!--根据员工id,日期获取当天全部报告信息-->
     <!--根据员工id,日期获取当天全部报告信息-->
     <select id="getReportByDate" resultType="java.util.Map">
     <select id="getReportByDate" resultType="java.util.Map">
-        SELECT a.id, 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,
+        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.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.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime
         FROM report AS a
         FROM report AS a
@@ -68,7 +68,7 @@
 
 
     <!--根据项目经理id,日期获取相关项目的全部报告信息-->
     <!--根据项目经理id,日期获取相关项目的全部报告信息-->
     <select id="getInchargeReportByDate" resultType="java.util.Map">
     <select id="getInchargeReportByDate" resultType="java.util.Map">
-        SELECT a.id, b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType,
+        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.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, b.incharger_id as inchargerId,
         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.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime
@@ -148,7 +148,7 @@
 
 
     <!--报告列表-->
     <!--报告列表-->
     <select id="getDetailByState" resultType="java.util.Map">
     <select id="getDetailByState" resultType="java.util.Map">
-        SELECT DISTINCT b.id, b.name, a.create_date AS date
+        SELECT DISTINCT b.id, b.name, cast(b.department_id as SIGNED) as departmentId,a.create_date AS date
         FROM report AS a
         FROM report AS a
         JOIN user AS b ON a.creator_id=b.id
         JOIN user AS b ON a.creator_id=b.id
         WHERE a.state = #{state} AND b.company_id=#{companyId}
         WHERE a.state = #{state} AND b.company_id=#{companyId}

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/config/index.js

@@ -1,6 +1,6 @@
 var path = require('path')
 var path = require('path')
 
 
-var ip = '192.168.2.2'
+var ip = '127.0.0.1'
 
 
 // var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
 // var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
 // for (var i in ifaces) {
 // for (var i in ifaces) {

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/routes.js

@@ -69,6 +69,7 @@ export const fixedRouter = [
             { path: '/files/:id', component: projectInside, name: '任务看板' },
             { path: '/files/:id', component: projectInside, name: '任务看板' },
             { path: '/info/:id', component: projectInside, name: '项目概览' },
             { path: '/info/:id', component: projectInside, name: '项目概览' },
             { path: '/summary/:id', component: projectInside, name: '数据统计' },
             { path: '/summary/:id', component: projectInside, name: '数据统计' },
+            { path: '/earning/:id', component: projectInside, name: '挣值分析' },
         ]
         ]
     },
     },
     {
     {

+ 103 - 19
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -15,8 +15,8 @@
                     </el-row>
                     </el-row>
                     <el-row :gutter="10">
                     <el-row :gutter="10">
                         <el-col :span="5" ><span class="gray_label">项目编码: </span></el-col><el-col :span="7" ><span >{{project.projectCode}}</span></el-col>
                         <el-col :span="5" ><span class="gray_label">项目编码: </span></el-col><el-col :span="7" ><span >{{project.projectCode}}</span></el-col>
-                        <el-col :span="5" ><span class="gray_label">项目预算:</span></el-col><el-col :span="7" >
-                        <span >{{project.budget == null?'-':project.budget}} 元</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">项目金额:</span></el-col><el-col :span="7" >
+                        <span >{{project.contractAmount == null?'-':project.contractAmount}} 元</span></el-col>
                     </el-row>
                     </el-row>
                     <el-row :gutter="10">
                     <el-row :gutter="10">
                         <el-col :span="5" ><span class="gray_label">项目级别: </span></el-col><el-col :span="7" ><span >{{levelTxt[project.level]}}</span></el-col>
                         <el-col :span="5" ><span class="gray_label">项目级别: </span></el-col><el-col :span="7" ><span >{{levelTxt[project.level]}}</span></el-col>
@@ -33,17 +33,23 @@
                             {{project.finishDate==null?'-':project.finishDate}}</span></el-col>
                             {{project.finishDate==null?'-':project.finishDate}}</span></el-col>
                     </el-row>
                     </el-row>
                 </div>
                 </div>
-
-                <div class="box" style="margin-top:10px;">
-                    <div><label>相关人员</label>
-                    <el-link v-if="user.id == project.creatorId || user.id == project.inchargerId" @click="showEditPar" style="float:right;"><i class="el-icon-edit"  ></i></el-link>
-                    </div>
-                    <div style="margin-top:10px;color:#999;">负责人</div>
-                    <div><el-link style="margin:10px" @click="showUser(project.inchargerId)">{{project.inchargerName}}</el-link></div>
-                    <div style="color:#999;">参与人</div>
-                    <div>
-                        <el-link v-for="item in project.participationList" :key="item.id" style="margin:10px;" @click="showUser(item.id)">{{item.name}}</el-link>
-                        <el-button class="el-icon-plus" @click="addMembVisible=true" size="mini"></el-button>
+                
+                <div class="box info" style="margin-top:10px;">
+                    <div><label>成本基线<el-link v-if="user.id == project.creatorId || user.id == project.inchargerId" @click="showEditBase" style="float:right;"><i class="el-icon-edit"  ></i></el-link></label>
+                    <el-row :gutter="10">
+                        <el-col :span="5" ><span class="gray_label">人工成本:</span></el-col><el-col :span="7" ><span>
+                            ¥{{project.baseMan==null?'-':project.baseMan}}</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">费用:</span></el-col><el-col :span="7" ><span>
+                        ¥{{project.baseFee==null?'-':project.baseFee}}</span></el-col></el-row>
+                        <el-row :gutter="10"><el-col :span="5" ><span class="gray_label">外包费用:</span></el-col><el-col :span="7" ><span>
+                        ¥{{project.baseOutsourcing==null?'-':project.baseOutsourcing}}</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">风险预留金额1:</span></el-col><el-col :span="7" ><span>
+                        ¥{{project.baseRisk1==null?'-':project.baseRisk1}}</span></el-col></el-row>
+                        <el-row :gutter="10"><el-col :span="5" ><span class="gray_label">风险预留金额2:</span></el-col><el-col :span="7" ><span>
+                        ¥{{project.baseRisk2==null?'-':project.baseRisk2}}</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">总成本:</span></el-col><el-col :span="7" ><span>
+                        ¥{{project.budget==null?'-':project.budget}}</span></el-col>
+                    </el-row>
                     </div>
                     </div>
                 </div>
                 </div>
                 <div class="box" style="margin-top:10px;">
                 <div class="box" style="margin-top:10px;">
@@ -122,8 +128,8 @@
                     <el-select v-model="addForm.level"  placeholder="请选择级别" style="width:32%;" >
                     <el-select v-model="addForm.level"  placeholder="请选择级别" style="width:32%;" >
                         <el-option v-for="item in importanceList" :key="item.id" :label="item.label" :value="item.id"></el-option>
                         <el-option v-for="item in importanceList" :key="item.id" :label="item.label" :value="item.id"></el-option>
                     </el-select>
                     </el-select>
-                    <span style="margin-left:50px;margin-right:10px;">项目预算</span>
-                    <el-input v-model="addForm.budget"    style="width:32%;"
+                    <span style="margin-left:50px;margin-right:10px;">项目金额</span>
+                    <el-input v-model="addForm.contractAmount"    style="width:32%;"
                     placeholder="整数" clearable @keyup.native="number"></el-input><span style="margin-left:10px;">元</span>
                     placeholder="整数" clearable @keyup.native="number"></el-input><span style="margin-left:10px;">元</span>
                 </el-form-item>
                 </el-form-item>
                 <el-form-item label="开始日期" prop="planStartDate">
                 <el-form-item label="开始日期" prop="planStartDate">
@@ -150,6 +156,30 @@
             </div>
             </div>
         </el-dialog>
         </el-dialog>
 
 
+        <el-dialog title="校准成本基线" v-if="addBaseFormVisible" :visible.sync="addBaseFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
+            <el-form ref="basicInfoForm" :model="addForm" :rules="rules" label-width="120px">
+                <el-form-item label="人工成本" >
+                    <el-input v-model="addForm.baseMan"  placeholder="请输入" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="费用" prop="baseFee">
+                    <el-input v-model="addForm.baseFee"  placeholder="请输入" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="外包费用" prop="baseOutsourcing">
+                    <el-input v-model="addForm.baseOutsourcing"  placeholder="请输入" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="风险预留金额1" prop="baseRisk1">
+                    <el-input v-model="addForm.baseRisk1"  placeholder="请输入" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="风险预留金额2" prop="baseRisk2">
+                    <el-input v-model="addForm.baseRisk2"  placeholder="请输入" clearable></el-input>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button @click.native="addBaseFormVisible = false">取消</el-button>
+                <el-button type="primary" @click="adjustBase" :loading="addLoading">提交</el-button>
+            </div>
+        </el-dialog>
+
         <!--编辑参与人界面-->
         <!--编辑参与人界面-->
         <el-dialog :title="title" v-if="pVisible" :visible.sync="pVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
         <el-dialog :title="title" v-if="pVisible" :visible.sync="pVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="participForm" :model="addForm" :rules="rules" label-width="120px">
             <el-form ref="participForm" :model="addForm" :rules="rules" label-width="120px">
@@ -219,6 +249,7 @@
     export default {
     export default {
         data() {
         data() {
             return {
             return {
+                addBaseFormVisible:false,
                 addMembVisible:false,
                 addMembVisible:false,
                 addMembForm:{},
                 addMembForm:{},
                 pVisible:false,
                 pVisible:false,
@@ -251,6 +282,47 @@
             };
             };
         },
         },
         methods: {
         methods: {
+            adjustBase() {
+                //如果没有做修改,不提交数据
+                if (this.addForm.baseMan == this.project.baseMan 
+                        && this.addForm.baseFee == this.project.baseFee
+                        && this.addForm.baseOutsourcing == this.project.baseOutsourcing
+                        && this.addForm.baseRisk1 == this.project.baseRisk1
+                        && this.addForm.baseRisk2 == this.project.baseRisk2) {
+                    this.addBaseFormVisible = false;
+                    return;
+                }
+                this.http.post('/project/adjustBase', {
+                    id: this.addForm.id,
+                    contractAmount: this.addForm.contractAmount,
+                    baseMan: this.addForm.baseMan,
+                    baseFee:this.addForm.baseFee,
+                    baseOutsourcing:this.addForm.baseOutsourcing,
+                    baseRisk1:this.addForm.baseRisk1,
+                    baseRisk2: this.addForm.baseRisk2
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.getProjectInfo();
+                        this.addBaseFormVisible = false;
+                        this.$message({
+                            message: '校准成功',
+                            type: "success"
+                        });
+                    } else {
+                        this.$message({
+                        message: res.msg,
+                        type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             //提交添加参与人的请求
             //提交添加参与人的请求
             submitAddMemb() {
             submitAddMemb() {
                 this.addLoading = true;
                 this.addLoading = true;
@@ -315,8 +387,8 @@
                 });
                 });
             },
             },
             number(){  
             number(){  
-             this.addForm.budget = this.addForm.budget.replace(/[^\.\d]/g,'');
-                this.addForm.budget = this.addForm.budget.replace('.','');
+             this.addForm.contractAmount = this.addForm.contractAmount.replace(/[^\.\d]/g,'');
+                this.addForm.contractAmount = this.addForm.contractAmount.replace('.','');
           },
           },
             //选择参与人
             //选择参与人
             changeParticipator() {
             changeParticipator() {
@@ -423,8 +495,8 @@
                         if(this.addForm.level != null) {
                         if(this.addForm.level != null) {
                             formData.append("level", this.addForm.level);
                             formData.append("level", this.addForm.level);
                         }
                         }
-                        if(this.addForm.budget != null) {
-                            formData.append("budget", this.addForm.budget);
+                        if(this.addForm.contractAmount != null) {
+                            formData.append("contractAmount", this.addForm.contractAmount);
                         }
                         }
                         
                         
                         this.http.uploadFile(this.port.project.add,formData,
                         this.http.uploadFile(this.port.project.add,formData,
@@ -454,6 +526,18 @@
                         }
                         }
                 });
                 });
             },
             },
+            showEditBase() {
+                this.addForm = JSON.parse(JSON.stringify(this.project));
+                var list = this.project.participationList , arr = [];
+                for(var j in list) {
+                    arr.push(list[j].id)
+                }
+                this.addForm.userId = arr;
+                this.addForm.code = this.addForm.projectCode;
+                this.addForm.name = this.addForm.projectName;
+                this.addBaseFormVisible = true;
+
+            },
             showEdit() {
             showEdit() {
                 this.addForm = JSON.parse(JSON.stringify(this.project));
                 this.addForm = JSON.parse(JSON.stringify(this.project));
                 console.log('---'+this.addForm);
                 console.log('---'+this.addForm);

+ 3 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -214,7 +214,7 @@
             <el-tab-pane label="文件中心" name="files"><FileCenter ref="fileCenter"></FileCenter></el-tab-pane>
             <el-tab-pane label="文件中心" name="files"><FileCenter ref="fileCenter"></FileCenter></el-tab-pane>
             <el-tab-pane label="项目概览" name="info"><ProjectInfo ref="projectInfo"></ProjectInfo></el-tab-pane>
             <el-tab-pane label="项目概览" name="info"><ProjectInfo ref="projectInfo"></ProjectInfo></el-tab-pane>
             <el-tab-pane label="数据统计" name="summary"><Summary ref="summary"></Summary></el-tab-pane>
             <el-tab-pane label="数据统计" name="summary"><Summary ref="summary"></Summary></el-tab-pane>
-            
+            <el-tab-pane label="挣值分析" name="earning"><Earning ref="earning"></Earning></el-tab-pane>
         </el-tabs>
         </el-tabs>
 
 
         <!--新增任务界面-->
         <!--新增任务界面-->
@@ -462,6 +462,7 @@
     import FileCenter from './fileCenter.vue';
     import FileCenter from './fileCenter.vue';
     import ProjectInfo from './info.vue';
     import ProjectInfo from './info.vue';
     import Summary from './summary.vue';
     import Summary from './summary.vue';
+    import Earning from './earning.vue';
     // import editor from '@tinymce/tinymce-vue'
     // import editor from '@tinymce/tinymce-vue'
     // 富文本样式
     // 富文本样式
     import 'quill/dist/quill.core.css'
     import 'quill/dist/quill.core.css'
@@ -480,6 +481,7 @@
             FileCenter,
             FileCenter,
             ProjectInfo,
             ProjectInfo,
             Summary,
             Summary,
+            Earning,
             quillEditor // 富文本
             quillEditor // 富文本
         },
         },
         
         

+ 150 - 44
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -1,25 +1,34 @@
 <template>
 <template>
     <section>
     <section>
         <!--工具条-->
         <!--工具条-->
-        <!-- <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
+        <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
             <el-form :inline="true">
-                <el-form-item label="类型:">
-                    <el-select v-model="search.value" placeholder="请选择类型" @change="getList()">
-                        <el-option label="全部" value="-1"></el-option>
-                        <el-option label="待审核" value="0"></el-option>
-                        <el-option label="已通过" value="1"></el-option>
-                        <el-option label="已驳回" value="2"></el-option>
+                <el-form-item label="项目:">
+                    <el-select v-model="search.projectId" placeholder="请选择" clearable @change="getList()">
+                        <el-option v-for="item in projectList" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
                     </el-select>
                     </el-select>
                 </el-form-item>
                 </el-form-item>
-                <el-form-item v-if="search.value == -1" label="日期:" style="margin-left:20px;">
+                <el-form-item label="部门:">
+                    <el-cascader v-model="search.departmentIdArray" placeholder="请选择部门" style="width: 100%"
+                    :options="option" :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable
+                    @change="getList()"
+                    ></el-cascader>
+                </el-form-item>
+                <el-form-item label="日期:" style="margin-left:20px;">
                     <el-date-picker v-model="search.date" :editable="false" format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
                     <el-date-picker v-model="search.date" :editable="false" format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
                     @change="getList()" :clearable="true" type="date" placeholder="选择工作日期"></el-date-picker>
                     @change="getList()" :clearable="true" type="date" placeholder="选择工作日期"></el-date-picker>
                 </el-form-item>
                 </el-form-item>
+                <el-form-item   style="margin-left:20px;">
+                    <el-button @click="batchApprove(true)" style="margin-left:10px;" :disabled="multipleSelection.length==0">批量通过</el-button>
+                <el-button @click="batchApprove(false)"  :disabled="multipleSelection.length==0">批量驳回</el-button>
+                </el-form-item>
+                
             </el-form>
             </el-form>
-        </el-col> -->
-
+        </el-col>
         <!--列表-->
         <!--列表-->
-        <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+        <el-table :data="list" ref="multipleTable" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;"
+            @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="55"></el-table-column>
             <el-table-column type="expand">
             <el-table-column type="expand">
                 <template slot-scope="props">
                 <template slot-scope="props">
                     <el-timeline>
                     <el-timeline>
@@ -34,16 +43,11 @@
                     </el-timeline>
                     </el-timeline>
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
-            <el-table-column type="index" width="60"></el-table-column>
+            
             <el-table-column prop="name" label="姓名" sortable></el-table-column>
             <el-table-column prop="name" label="姓名" sortable></el-table-column>
             <el-table-column prop="date" label="日期" sortable>
             <el-table-column prop="date" label="日期" sortable>
-                <template slot-scope="scope">
-                    <span v-if="search.value == -1">{{search.date}}</span>
-                    <span v-else>{{scope.row.date}}</span>
-                </template>
             </el-table-column>
             </el-table-column>
             <el-table-column prop="reportTime" label="工作时长(h)" >
             <el-table-column prop="reportTime" label="工作时长(h)" >
-
             </el-table-column>
             </el-table-column>
             <el-table-column prop="state" label="状态" sortable>
             <el-table-column prop="state" label="状态" sortable>
                 <template slot-scope="scope">
                 <template slot-scope="scope">
@@ -60,7 +64,7 @@
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
         </el-table>
         </el-table>
-
+        
         <!--工具条-->
         <!--工具条-->
         <!-- <el-col v-if="search.value != -1" :span="24" class="toolbar">
         <!-- <el-col v-if="search.value != -1" :span="24" class="toolbar">
             <el-pagination
             <el-pagination
@@ -82,15 +86,19 @@
     export default {
     export default {
         data() {
         data() {
             return {
             return {
+                isAllSelect:false,
                 user: JSON.parse(sessionStorage.getItem("user")),
                 user: JSON.parse(sessionStorage.getItem("user")),
 
 
                 search: {
                 search: {
-                    value: 0,
-                    date: util.formatDate.format(new Date(new Date()), "yyyy-MM-dd"),
+                    projectId:null,
+                    departmentIdArray: null,
+                    departmentId:null,
+                    date: null,
+                    state:0,
                 },
                 },
 
 
                 users: [],
                 users: [],
-
+                option:[],
                 tableHeight: 0,
                 tableHeight: 0,
                 listLoading: false,
                 listLoading: false,
                 total: 0,
                 total: 0,
@@ -98,10 +106,69 @@
                 size: 20,
                 size: 20,
                 list: [],
                 list: [],
                 logining: false,
                 logining: false,
-
+                multipleSelection: [],
             };
             };
         },
         },
         methods: {
         methods: {
+            // 获取部门列表
+            getDepartment() {
+                this.http.post( this.port.manage.depList, {},
+                res => {
+                    if (res.code == "ok") {
+                        var list1 = JSON.parse(JSON.stringify(res.data));
+                        
+                        this.option = this.changeArr(list1);
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
+
+            handleSelectionChange(val) {
+                this.multipleSelection = val;
+            },
+            batchApprove(isPass) {
+                console.log(this.multipleSelection);
+                var ids = '';
+                for (var i=0;i<this.multipleSelection.length; i++) {
+                    var line = this.multipleSelection[i];
+                    var array = line.data;
+                    for (var m=0;m<array.length; m++) {
+                        ids += array[m].id+',';
+                    }
+                }
+                if (ids.length > 0) {
+                    ids = ids.substring(0, ids.length-1);
+                }
+                this.http.post(isPass?'/report/batchApproveReport':'/report/batchDenyReport', {ids: ids},
+                res => {
+                    this.listLoading = false;
+                    if (res.code == "ok") {
+                        this.getList();
+                    } else {
+                        this.$message({
+                        message: res.msg,
+                        type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.listLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             //分页
             //分页
             handleCurrentChange(val) {
             handleCurrentChange(val) {
                 this.page = val;
                 this.page = val;
@@ -113,16 +180,22 @@
                 this.getList();
                 this.getList();
             },
             },
 
 
-            //获取项目列表
+            //获取待审核的数据列表
             getList() {
             getList() {
                 this.listLoading = true;
                 this.listLoading = true;
-                let form = {}
-                if(this.search.value==-1) {
-                    form.date = this.search.date
+                // let form = {}
+                // if(this.search.value==-1) {
+                //     form.date = this.search.date
+                // } else {
+                //     form.state = this.search.value;
+                // }
+                if (this.search.departmentIdArray == null) {
+                    this.search.departmentId = null;
                 } else {
                 } else {
-                    form.state = this.search.value;
+                    var length = this.search.departmentIdArray.length;
+                    this.search.departmentId = this.search.departmentIdArray[length-1];
                 }
                 }
-                this.http.post(this.search.value==-1?this.port.report.list:this.port.report.portList, form,
+                this.http.post(this.port.report.portList, this.search,
                 res => {
                 res => {
                     this.listLoading = false;
                     this.listLoading = false;
                     if (res.code == "ok") {
                     if (res.code == "ok") {
@@ -147,19 +220,14 @@
             approve(id,date, item) {
             approve(id,date, item) {
                 console.log(item);
                 console.log(item);
                 this.logining = true;
                 this.logining = true;
-                var time = "";
-                if(this.search.value == -1) {
-                    time = this.search.date;
-                } else {
-                    time = date;
-                }
+                
                 var ids = '';
                 var ids = '';
                 var data = item.data;
                 var data = item.data;
                 data.forEach(element => {
                 data.forEach(element => {
                     ids +=(element.id+',');
                     ids +=(element.id+',');
                 });
                 });
 
 
-                this.http.post( this.port.report.approve, {id: id , date: time, reportIds: ids},
+                this.http.post(this.port.report.approve, {id: id ,reportIds: ids},
                 res => {
                 res => {
                     this.logining = false;
                     this.logining = false;
                     if (res.code == "ok") {
                     if (res.code == "ok") {
@@ -183,16 +251,52 @@
                     });
                     });
                 });
                 });
             },
             },
-
+// 修改数组
+            changeArr(arr) {
+                for (var i = 0; i < arr.length; i++) {
+                    if(arr[i].id != -1 && arr[i].id != 0) {
+                        if (arr[i].children != null && arr[i].children.length>0) {
+                            arr[i].children = this.changeArr(arr[i].children);
+                        }
+                        arr[i].id && (arr[i].value = arr[i].id);
+                        delete arr[i].id;
+                    }
+                }
+                for(var i in arr) {
+                    if(arr[i].id == -1 || arr[i].id == 0) {
+                        arr.splice(i,1)
+                    }    
+                }
+                return arr;
+            },
+            
+            //获取项目列表
+            getProjectList() {
+                this.listLoading = true;
+                this.http.post( this.port.project.list, {},
+                res => {
+                    this.listLoading = false;
+                    if (res.code == "ok") {
+                        this.projectList = res.data;
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.listLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             // 未通过日报
             // 未通过日报
             deny(id,i,date, item) {
             deny(id,i,date, item) {
                 this.logining = true;
                 this.logining = true;
-                var time = "";
-                if(this.search.value == -1) {
-                    time = this.search.date;
-                } else {
-                    time = date;
-                }
+                var time = date;
                 var ids = '';
                 var ids = '';
                 var data = item.data;
                 var data = item.data;
                 data.forEach(element => {
                 data.forEach(element => {
@@ -225,14 +329,16 @@
         },
         },
         created() {
         created() {
             let height = window.innerHeight;
             let height = window.innerHeight;
-            this.tableHeight = height - 85;
+            this.tableHeight = height - 125;
             const that = this;
             const that = this;
             window.onresize = function temp() {
             window.onresize = function temp() {
-                that.tableHeight = window.innerHeight - 85;
+                that.tableHeight = window.innerHeight - 125;
             };
             };
         },
         },
         mounted() {
         mounted() {
             this.getList();
             this.getList();
+            this.getDepartment();
+            this.getProjectList();
         }
         }
     };
     };
 </script>
 </script>

+ 16 - 11
fhKeeper/formulahousekeeper/timesheet_h5/src/views/msg/index.vue

@@ -4,7 +4,7 @@
         
         
         <div class="login_form">
         <div class="login_form">
             <van-list v-model="loading" :finished="finished" finished-text="没有更多了" :error.sync="error" error-text="请求失败,点击重新加载" @load="getMessage">
             <van-list v-model="loading" :finished="finished" finished-text="没有更多了" :error.sync="error" error-text="请求失败,点击重新加载" @load="getMessage">
-                <van-cell @click="readMsg(index)" v-for="(item,index) in list" :key="index" :title="item.type==0?'审批未通过':''" :label="item.time.replace('T', ' ')" >
+                <van-cell @click="readMsg(index)" v-for="(item,index) in list" :key="index" :title="msgType[item.type]" :label="item.time.replace('T', ' ')" >
                     <span v-if="item.checked == 1" style="color:green">已读</span>
                     <span v-if="item.checked == 1" style="color:green">已读</span>
                     <span v-if="item.checked == 0" style="color:red">未读</span>
                     <span v-if="item.checked == 0" style="color:red">未读</span>
                 </van-cell>
                 </van-cell>
@@ -17,6 +17,7 @@
     export default {
     export default {
         data() {
         data() {
             return {
             return {
+                msgType:["日报审核未通过","有新任务"],
                 user: JSON.parse(localStorage.userInfo),
                 user: JSON.parse(localStorage.userInfo),
                 
                 
                 total: 0,
                 total: 0,
@@ -44,16 +45,20 @@
 
 
             readMsg(index) {
             readMsg(index) {
                 var item = this.list[index];
                 var item = this.list[index];
-                var date = item.content;
-                this.$axios.post("/information/check", {id:item.id
-                })
-                .then(res => {
-                    if(res.code == "ok") {
-                        //跳转到对应的日报上进行修改
-                        this.getMessage();
-                        this.$router.push('/edit?date='+date);
-                    } 
-                }).catch(err=> {toast.clear();});
+                if (item.type == 0) {
+                    //日报
+                    var date = item.content;
+                    this.$axios.post("/information/check", {id:item.id
+                    })
+                    .then(res => {
+                        if(res.code == "ok") {
+                            //跳转到对应的日报上进行修改
+                            this.getMessage();
+                            this.$router.push('/edit?date='+date);
+                        } 
+                    }).catch(err=> {toast.clear();});
+                }
+                
             },
             },
             
             
             //获取消息
             //获取消息