Преглед изворни кода

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
yusm пре 1 година
родитељ
комит
9bf7c6a44e
18 измењених фајлова са 380 додато и 28 уклоњено
  1. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 52 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  3. 38 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  4. 8 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskGroup.java
  5. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  6. 13 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  7. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  8. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskGroupMapper.xml
  9. 2 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanProcedureTotalController.java
  10. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/PlanProcedureTotalService.java
  11. 28 3
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanProcedureTotalServiceImpl.java
  12. 109 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application-devlew.yml
  13. 7 3
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/fillReport.vue
  14. 4 2
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/workView.vue
  15. 6 3
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/workReport/daily.vue
  16. 27 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  17. 52 4
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  18. 7 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

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

@@ -1239,6 +1239,11 @@ public class ProjectController {
         return projectService.timeCostAndExpenseByProject(request,startDate,endDate,projectId);
     }
 
+    @RequestMapping("/getProjectFillTime")
+    public HttpRespMsg getProjectFillTime(HttpServletRequest request,Integer projectId){
+        return projectService.getProjectFillTime(request,projectId);
+    }
+
     /**
      * 获取最近填写的三个项目
      * @param request

+ 52 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -83,6 +83,8 @@ public class ReportController {
     @Resource
     private TimeTypeMapper timeTypeMapper;
     @Resource
+    private TaskGroupService taskGroupService;
+    @Resource
     private ReportMapper reportMapper;
     @Resource
     private ProjectMapper projectMapper;
@@ -1151,6 +1153,8 @@ public class ReportController {
         //如果开启了项目人天
         String warningPercentProjects = "";
         String warningLackProjects = "";
+        String warningGroupPercent = "";
+        String warningGroupLack = "";
         EstimateTimeSetting estimateTimeSetting = null;
         if(comTimeType.getProjectManDay()==1){
             Collection<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
@@ -1192,12 +1196,44 @@ public class ReportController {
                             if (hasReport.divide(multiply, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).compareTo(new BigDecimal(100-estimateTimeSetting.getProjectWarningPercent()))>0) {
                                 warningPercentProjects += first.get().getProjectName() + ",";
                             }
+                            //检查分组工时
+                            Integer targetGpId = report.getGroupId();
+                            if (targetGpId != null) {
+                                double groupSum = 0;
+                                if(first.get().getManDayStartDate()!=null){
+                                    groupSum = needCheckReportList.stream().filter(npl -> npl.getGroupId().equals(targetGpId) &&(npl.getCreateDate().isAfter(first.get().getManDayStartDate())||npl.getCreateDate().isEqual(first.get().getManDayStartDate()))&& (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
+                                }else {
+                                    groupSum = needCheckReportList.stream().filter(npl -> npl.getGroupId().equals(targetGpId) && (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
+                                }
+                                System.out.println("groupSum:"+groupSum);
+                                nowReport = reportList.stream().filter(rl -> rl.getCreateDate().equals(report.getCreateDate()) && rl.getCreatorId().equals(report.getCreatorId()) && targetGpId.equals(rl.getGroupId())).mapToDouble(Report::getWorkingTime).sum();
+                                hasReport = new BigDecimal(groupSum).add(new BigDecimal(nowReport));
+                                TaskGroup tgp = taskGroupService.getById(targetGpId);
+                                //设置的数值大于0时检查是否超额
+                                if (tgp.getManDay() != null && tgp.getManDay() > 0) {
+                                    multiply = new BigDecimal(tgp.getManDay()).multiply(new BigDecimal(comTimeType.getAllday()));
+                                    System.out.println("hasReport:"+hasReport+" multiply:"+multiply);
+                                    if (hasReport.doubleValue() > multiply.doubleValue()) {
+                                        if (estimateTimeSetting.getGroupFronzeOnLack() == 1) {
+                                            httpRespMsg.setError("超过当前项目["+first.get().getProjectName()+"]分组["+tgp.getName()+"]预算工时,无法继续提交工时");
+                                            return httpRespMsg;
+                                        } else {
+                                            //仅提醒
+                                            warningGroupLack += (tgp.getTaskGroupCode() != null?tgp.getTaskGroupCode():"")+"-"+tgp.getName() + ",";
+                                        }
+                                    } else {
+                                        //检查是否超过预设的提醒百分比;设置的数值是剩余的百分比
+                                        if (hasReport.divide(multiply, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).compareTo(new BigDecimal(100 - estimateTimeSetting.getGroupWarningPercent())) > 0) {
+                                            warningGroupPercent += (tgp.getTaskGroupCode() != null?tgp.getTaskGroupCode():"")+"-"+tgp.getName() + ",";
+                                        }
+                                    }
+                                }
+                            }
+
                         }
                     }
                 }
             }
-
-
         }
 
         //如果锁定工作时长上限的话,需要校验每日的合计工作时长
@@ -1562,6 +1598,20 @@ public class ReportController {
                 warningPercentProjects = warningPercentProjects.substring(0, warningPercentProjects.length() -1);
                 estimateWarningMsg += "提交成功,项目["+warningPercentProjects+"]预估工时剩余小于"+estimateTimeSetting.getProjectWarningPercent()+"%,请联系项目经理。";
             }
+            if (!StringUtils.isEmpty(warningGroupLack)) {
+                warningGroupLack = warningGroupLack.substring(0, warningGroupLack.length() -1);
+                if (estimateWarningMsg.length() > 0) {
+                    estimateWarningMsg += "<br/>";
+                }
+                estimateWarningMsg += "提交成功,项目分组["+warningGroupLack+"]预估工时不足,请联系项目经理。";
+            }
+            if (!StringUtils.isEmpty(warningGroupPercent)) {
+                warningGroupPercent = warningGroupPercent.substring(0, warningGroupPercent.length() -1);
+                if (estimateWarningMsg.length() > 0) {
+                    estimateWarningMsg += "<br/>";
+                }
+                estimateWarningMsg += "提交成功,项目分组["+warningGroupPercent+"]预估工时剩余小于"+estimateTimeSetting.getGroupWarningPercent()+"%,请联系项目经理。";
+            }
             if (!StringUtils.isEmpty(estimateWarningMsg)) {
                 httpRespMsg.setMsg(estimateWarningMsg);
             }

+ 38 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -124,6 +124,43 @@ public class TaskGroupController {
         return msg;
     }
 
+    @RequestMapping("saveManDay")
+    public HttpRespMsg saveManDay(String data) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<TaskGroup> groupList = JSON.parseArray(data, TaskGroup.class);
+        List<TaskGroup> addList = new ArrayList<>();
+        int totalManDay = 0;
+        for (TaskGroup taskGroup : groupList) {
+            TaskGroup item = new TaskGroup();
+            item.setId(taskGroup.getId());
+            if (taskGroup.getManDay() == null) {
+                item.setManDay(0);
+            } else {
+                item.setManDay(taskGroup.getManDay());
+                totalManDay += taskGroup.getManDay();
+            }
+            addList.add(item);
+        }
+        //校验,任务分组总预估工时不得超过项目预估工时
+        TaskGroup taskGroup = groupList.get(0);
+        Project project = projectMapper.selectById(taskGroup.getProjectId());
+        if (project.getManDay() == null || project.getManDay() == 0) {
+            msg.setError("请返回编辑项目,并设置项目预估工时");
+            return msg;
+        }
+        if (totalManDay > project.getManDay()) {
+            msg.setError("任务分组总预估工时不得超过项目预估工时");
+            return msg;
+        }
+        if (addList.size() > 0) {
+            taskGroupService.updateBatchById(addList);
+        }
+
+        msg.data = taskGroupService.list(new QueryWrapper<TaskGroup>().eq("project_id", groupList.get(0).getProjectId()));
+        return msg;
+    }
+
+
     @RequestMapping("/batchSaveTaskGroup")
     public HttpRespMsg batchSaveTaskGroup(String projectIds,String taskGroupName){
         HttpRespMsg msg=new HttpRespMsg();
@@ -481,6 +518,7 @@ public class TaskGroupController {
         }
         map.put("participators",participatorList);
         map.put("wbsCode",taskGroup.getWbsCode());
+        map.put("manDay",taskGroup.getManDay());
         httpRespMsg.data=map;
         return httpRespMsg;
     }

+ 8 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskGroup.java

@@ -9,15 +9,13 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
-import java.io.Serializable;
-
 /**
  * <p>
  * 
  * </p>
  *
  * @author Seyason
- * @since 2022-10-13
+ * @since 2023-11-21
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -60,6 +58,13 @@ public class TaskGroup extends Model<TaskGroup> {
     @TableField(exist = false)
     private String inchargerName;
 
+    /**
+     * 预估工时:人天
+     */
+    @TableField("man_day")
+    private Integer manDay;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -266,4 +266,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg getEffectiveLaborHourRate(String startDate, String endDate);
 
     HttpRespMsg getProjectEstimatedWork(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg getProjectFillTime(HttpServletRequest request, Integer projectId);
 }

+ 13 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -11412,6 +11412,19 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    @Override
+    public HttpRespMsg getProjectFillTime(HttpServletRequest request, Integer projectId) {
+        //待审核和已通过的总工时
+        Report report = reportMapper.selectOne(new QueryWrapper<Report>().select("sum(working_time) as working_time").eq("project_id", projectId).and(i->i.eq("state", 0).or().eq("state", 1)));
+        Report waiting = reportMapper.selectOne(new QueryWrapper<Report>().select("sum(working_time) as working_time").eq("project_id", projectId).eq("state", 0));
+        HashMap map = new HashMap();
+        map.put("total",report.getWorkingTime());
+        map.put("waiting",waiting.getWorkingTime());
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(map);
+        return msg;
+    }
+
 
 //    public void setDeptIdList(Integer departmentId,List<Integer> deptIds){
 //        LambdaQueryWrapper<Department> lqw = new LambdaQueryWrapper<>();

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

@@ -6952,6 +6952,23 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
             //获取日报详情
             List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", userId).between("create_date", startDate, endDate).orderByAsc("create_date"));
+            //已填日报设置审核人姓名
+            if (reportList.size() > 0) {
+                List<String> collect = reportList.stream().map(Report::getProjectAuditorId).distinct().collect(Collectors.toList());
+                if (collect.size() > 0) {
+                    List<User> auditorUserList = userMapper.selectList(new QueryWrapper<User>().in("id", collect));
+                    reportList.forEach(r->{
+                        if (r.getProjectAuditorId() != null) {
+                            Optional<User> first = auditorUserList.stream().filter(au -> au.getId().equals(r.getProjectAuditorId())).findFirst();
+                            if (first.isPresent()) {
+                                r.setProjectAuditorName(first.get().getName());
+                            }
+                        }
+                    });
+                }
+            }
+
+
             List<Integer> collect = reportList.stream().map(Report::getProjectId).collect(Collectors.toList());
             //加载这段时间内已填报过的项目
             List<Project> projectList = new ArrayList<>();

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

@@ -10,11 +10,12 @@
         <result column="name" property="name" />
         <result column="incharger_id" property="inchargerId" />
         <result column="wbs_code" property="wbsCode" />
+        <result column="man_day" property="manDay" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, project_id, task_group_code, name, incharger_id, wbs_code
+        id, project_id, task_group_code, name, incharger_id, wbs_code, man_day
     </sql>
 
 </mapper>

+ 2 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanProcedureTotalController.java

@@ -31,8 +31,8 @@ public class PlanProcedureTotalController {
     }
 
     @RequestMapping("/getFillProcedureDetail")
-    public HttpRespMsg getFillProcedureDetail(Integer id){
-        return planProcedureTotalService.getFillProcedureDetail(id);
+    public HttpRespMsg getFillProcedureDetail(Integer id, String createDate){
+        return planProcedureTotalService.getFillProcedureDetail(id, createDate);
     }
 }
 

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/PlanProcedureTotalService.java

@@ -16,5 +16,5 @@ public interface PlanProcedureTotalService extends IService<PlanProcedureTotal>
 
     HttpRespMsg getReportForWorkList(String vehicleNum);
 
-    HttpRespMsg getFillProcedureDetail(Integer id);
+    HttpRespMsg getFillProcedureDetail(Integer id, String createDate);
 }

+ 28 - 3
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanProcedureTotalServiceImpl.java

@@ -6,14 +6,16 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.PlanProcedureTotalService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.HttpRespMsg;
-import org.apache.logging.log4j.util.Chars;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * <p>
@@ -42,6 +44,8 @@ public class PlanProcedureTotalServiceImpl extends ServiceImpl<PlanProcedureTota
     private ProdProcedureTeamMapper prodProcedureTeamMapper;
     @Resource
     private PlanSteelStampNumberMapper planSteelStampNumberMapper;
+    @Resource
+    private ReportMapper reportMapper;
 
     @Override
     public HttpRespMsg getReportForWorkList(String vehicleNum) {
@@ -98,8 +102,11 @@ public class PlanProcedureTotalServiceImpl extends ServiceImpl<PlanProcedureTota
     }
 
     @Override
-    public HttpRespMsg getFillProcedureDetail(Integer id) {
+    public HttpRespMsg getFillProcedureDetail(Integer id, String createDate) {
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        if (createDate == null) createDate = LocalDate.now().format(dtf);
         HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
         HashMap prodProcedureTeam = prodProcedureTeamMapper.getFillProcedureDetail(id);
         Integer planId = Integer.valueOf(String.valueOf(prodProcedureTeam.get("plan_id")));
         List<PlanSteelStampNumber> planSteelStampNumberList = planSteelStampNumberMapper.selectList(new QueryWrapper<PlanSteelStampNumber>().eq("plan_id", planId));
@@ -152,10 +159,28 @@ public class PlanProcedureTotalServiceImpl extends ServiceImpl<PlanProcedureTota
                 }
             }
         }
-        prodProcedureTeam.put("planSteelStampNumberList",list.stream().distinct().sorted());
+
         if (prodProcedureTeam == null) {
             msg.setError("找不到该数据");
         } else {
+            Stream<String> sorted = list.stream().distinct().sorted();
+            List<String> collect = sorted.collect(Collectors.toList());
+            //如果钢印号有其他人已经填过了,就不显示
+            List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id", "steel_num_array").eq("plan_id", planId));
+            List<String> filledSteelNumList=new ArrayList<>();
+
+            for (Report report : reportList) {
+                //自己当天填的不算
+                if(dtf.format(report.getCreateDate()).equals(createDate)&&report.getCreatorId().equals(token)){
+                    continue;
+                }
+                if(!StringUtils.isEmpty(report.getSteelNumArray())){
+                    String[] split = report.getSteelNumArray().split(",");
+                    filledSteelNumList.addAll(Arrays.asList(split));
+                }
+            }
+            List<String> collect1 = collect.stream().filter(item -> !filledSteelNumList.contains(item)).collect(Collectors.toList());
+            prodProcedureTeam.put("planSteelStampNumberList",collect1);
             msg.setData(prodProcedureTeam);
         }
         return msg;

+ 109 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application-devlew.yml

@@ -0,0 +1,109 @@
+server:
+  port: 10090
+  tomcat:
+    uri-encoding: utf-8
+    max-http-form-post-size: -1
+    connection-timeout: 18000000s
+spring:
+  servlet:
+    multipart:
+      # 配置上传文件的大小设置
+      # Single file max size  即单个文件大小
+      max-file-size: 100MB
+      max-request-size: 100MB
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://47.101.180.183:17089/man_workshop_lew?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    username: root
+    password: P011430@Huoshi*
+    hikari:
+      maximum-pool-size: 10
+      minimum-idle: 3
+      max-lifetime: 30000
+      connection-test-query: SELECT 1
+    #######redis配置######
+    # redis
+    redis:
+      host: 127.0.0.1
+      port: 6479
+      timeout: 3
+      # password:
+      pool:
+        minIdle: 1
+        maxIdle: 10
+        maxWait: 3
+        maxActive: 8
+    ####全局配置时间返回格式#####
+  jackson:
+    #参数意义:
+    #JsonInclude.Include.ALWAYS       默认
+    #JsonInclude.Include.NON_DEFAULT   属性为默认值不序列化
+    #JsonInclude.Include.NON_EMPTY     属性为 空(””) 或者为 NULL 都不序列化
+    #JsonInclude.Include.NON_NULL      属性为NULL  不序列化
+    default-property-inclusion: ALWAYS
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+
+##########日志配置
+logging:
+  level:
+    root: info
+    org.mybatis: error
+    java.sql: error
+    org.springframework.web: error
+    #打印sql语句
+    com.management.platform.mapper: error
+  path: /log/
+  file: workshop.log
+##########
+mybatis-plus:
+  #  mapper-locations: classpath:mapper/*/*.xml
+  #  #实体扫描,多个package用逗号或者分号分隔
+  #  typeAliasesPackage: com.hssx.cloudmodel
+  global-config:
+    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
+    id-type: 0
+    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
+    field-strategy: 2
+    db-column-underline: true
+    refresh-mapper:
+    #################插入和更新非null判断
+    db-config:
+      insert-strategy: not_null
+      update-strategy: not_null
+  configuration:
+    map-underscore-to-camel-case: true
+    cache-enabled: false
+######mybstis配置#######
+mybatis:
+  type-aliases-package: com.management.platform.entity
+  mapper-locations: mappers/*Mapper.xml
+#####配置图片上传路径####
+upload:
+  path: /www/staticproject/leworkshop/upload/
+
+
+##actuator健康检查配置
+management:
+  security:
+    enabled:false:
+  server:
+    port: 10091
+  #  endpoints:
+  #    web:
+  #      exposure:
+  #        include: "*"
+
+  health:
+    redis:
+      enabled: false
+
+configEnv:
+  isDev: false
+  # 是否是私有化部署,企业内部应用
+  isPrivateDeploy: true
+
+privateDeployURL:
+  pcUrl: http://devworkshop.ttkuaiban.com
+  mobUrl: http://mobdevworkshop.ttkuaiban.com
+  authUrl: http://devworkshop.ttkuaiban.com/api/corpInsideWXAuth

+ 7 - 3
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/fillReport.vue

@@ -163,11 +163,15 @@ export default {
       console.log(this.reportForm.checkedSteelNum);
     },
     getMyPlanProcedureList() {
-      const { id, reportBoolean } = this.$route.query;
-      this.$axios.post("/plan-procedure-total/getFillProcedureDetail", { 
+      const { id, reportBoolean, date } = this.$route.query;
+      let params = {
         id: id,
         inputSteelNum:this.inputSteelNum
-      })
+      }
+      if(reportBoolean == 'true') {
+        params.createDate = date
+      }
+      this.$axios.post("/plan-procedure-total/getFillProcedureDetail", params)
         .then(res => {
           if (res.code == "ok") {
             this.reportForm = res.data;

+ 4 - 2
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/workView.vue

@@ -250,7 +250,8 @@ export default {
             finishNum: item.finishNum,
             id: item.id,
             userProcedureTeamId: item.userProcedureTeamId,
-            status: item.status
+            status: item.status,
+            createDate: item.createDate
           })
         }
         obj.procedureList = arr
@@ -270,7 +271,8 @@ export default {
         query: {
           id: this.reportBoolean ? item.userProcedureTeamId : item.id,
           reportBoolean: this.reportBoolean,
-          ohterId: item.id
+          ohterId: item.id,
+          date: item.createDate,
         }
       })
     },

+ 6 - 3
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/workReport/daily.vue

@@ -63,11 +63,11 @@
                                         </span>
                                         <span v-if="data.isUser == 1 && !data.workingTime && (data.leaveDays || data.leaveTimes)" :style="(data.leaveDays < 1 || data.leaveTimes < user.timeType.allday) ? 'color:red;font-size:13px' : 'color:#32cd32;font-size:13px'">
                                         <!-- {{data.leaveDays ? (data.leaveDays >= 1 ? '当日请假' : '未填报(请假' + data.leaveDays + '天)') : (data.leaveTimes >= user.timeType.allday ? '当日请假' : '未填报(请假' + data.leaveTimes + 'h)')}} -->
-                                        {{data.leaveDays ? (data.leaveDays >= 1 ? $t('other.AskForLeaveOnTheSameDay') : $t('state.DidNotFillIn') + '('+$t('other.AskForLeave') + data.leaveDays + $t('time.day')+')') : (data.leaveTimes >= user.timeType.allday ? $t('other.AskForLeaveOnTheSameDay') : $t('state.DidNotFillIn') + '('+$t('other.AskForLeave') + data.leaveTimes + 'h)')}}
+                                        {{data.leaveDays ? (data.leaveDays >= 1 ? $t('other.AskForLeaveOnTheSameDay') : $t('state.DidNotFillIn') + '('+$t('other.AskForLeave') + data.leaveDays + $t('time.day')+')') : (data.leaveTimes >= user.timeType.allday ? $t('other.AskForLeaveOnTheSameDay') : $t('state.DidNotFillIn') + '('+$t('other.AskForLeave') + data.leaveTimes + '分钟)')}}
                                         </span>
                                         <span v-if="data.isUser == 1 && data.workingTime" style="color:#32cd32;font-size:13px">
                                         <!-- 待审核 -->
-                                        ({{data.workingTime.toFixed(1) + 'h'}})
+                                        ({{data.workingTime.toFixed(1) + '分钟'}})
                                         </span>
                                     </div>
                                 </span>
@@ -164,7 +164,10 @@
                                                     <p v-if="item2.planType == 0">工序名称:<b>{{item2.procedureName}}</b></p>
                                                     <p v-if="item2.planType == 1">任务名称:<b>{{item2.taskName}}</b></p>
                                                     <p v-if="item2.planType == 1">任务类型:<b>{{item2.taskTypeName}}</b></p>                                                    
-                                                    <p>今日报工件数:<b>{{ item2.finishNum }}</b></p>
+                                                    <p>当日报工件数:<b>{{ item2.finishNum }}</b>
+                                                        <b v-if="item2.status==1" style="margin-left:20px;color:#20a0ff;">进行中</b>
+                                                        <b v-if="item2.status==2" style="margin-left:20px;color:#00ff00;">已完成</b>
+                                                        <b v-if="item2.status==3" style="margin-left:20px;color:#ff0000;">已中止</b></p>
                                                     <p>质检类型:<b>{{checkTypeTxt[item2.checkType]}}</b></p>
                                                     <p>质检人:<b>{{item2.checkerName}}</b></p>
                                                 </el-card>

+ 27 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -100,6 +100,12 @@
                             <el-col :span="18" ><span>{{project.projectSeparate.bu}}</span></el-col>
                         </el-row>
                     </div>
+                    <div v-if="user.timeType.projectManDay">
+                        <el-row :gutter="10" >
+                            <el-col :span="5" ><span class="gray_label">实际/预估工时:</span></el-col><el-col :span="7" ></el-col>
+                            <el-col :span="18" ><b :style="fillTimeData.total>project.manDay*user.timeType.allday?'color:red;':''">{{fillTimeData.total}}</b>/<b>{{project.manDay*user.timeType.allday}}</b>&nbsp;小时</el-col>
+                        </el-row>
+                    </div>
                     <!-- <div v-if="user.companyId == '428'">
                         <el-row :gutter="10" >
                             <el-col :span="5" ><span class="gray_label">{{ $t('projectgroup') }}:</span></el-col><el-col :span="7" ></el-col>
@@ -778,6 +784,7 @@
                 addFormVisible:false,
                 userDetail:{},
                 userDetailVisible: false,
+                fillTimeData:{total:0, waiting: 0},
                 importanceList:[{id:1,label:this.$t('zheng-chang')},{id:2,label:this.$t('jin-ji')},{id:3,label:this.$t('zhong-yao')},{id:4,label:this.$t('zhong-yao-qie-jin-ji')}],
                 //1-一般,2-紧急,3-重要,4-重要且紧急
                 levelTxt:[this.$t('all'),this.$t('zheng-chang'),this.$t('jin-ji'),this.$t('zhong-yao'),this.$t('zhong-yao-qie-jin-ji')],
@@ -2043,6 +2050,25 @@
                     });
                 })
             },
+            
+            getProjectFillTime() {
+                this.http.post('/project/getProjectFillTime', {projectId: this.curProjectId},
+                res => {
+                    if (res.code == "ok") {
+                        this.fillTimeData = res.data
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                })
+            },
             // 处理数据
             chulishuju(data) {
                 let arrLists = JSON.parse(JSON.stringify(this.projectCustomList))
@@ -2220,6 +2246,7 @@
             if(this.user.companyId == '936') {
                 this.getKeyNodes()
             }
+            this.getProjectFillTime();
 
             const usersJson = JSON.parse(sessionStorage.getItem("user"))
             if(usersJson.companyId == '936') {

+ 52 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -57,6 +57,9 @@
                                         <el-dropdown-item divided @click.native="renameGroup(item)" :disabled="!(projectCreatorId == user.id || projectInchargerId == user.id || permissions.projectManagement || isManageDept)">
                                             <i class="el-icon-edit"></i>
                                             {{ $t('changegroups') }}</el-dropdown-item>
+                                        <el-dropdown-item divided @click.native="setManDay(item)" :disabled="!(projectCreatorId == user.id || projectInchargerId == user.id || permissions.projectManagement || isManageDept)">
+                                            <i class="el-icon-time"></i>
+                                            预估工时</el-dropdown-item>
                                         <el-dropdown-item divided @click.native="addToTemplate(item)" :disabled="!(projectCreatorId == user.id || projectInchargerId == user.id || permissions.projectManagement || isManageDept)">
                                             <i class="el-icon-plus"></i>
                                             {{ $t('settemplate') }}</el-dropdown-item>
@@ -71,7 +74,6 @@
                                         <el-dropdown-item divided @click.native="deleteGroup(item)" :disabled="!(projectCreatorId == user.id || projectInchargerId == user.id || permissions.projectManagement || isManageDept)">
                                             <i class="el-icon-delete"></i>
                                             {{ $t('deletethegroup') }} </el-dropdown-item>
-                                            <!-- 设置参与人 0000 -->
                                         <el-dropdown-item divided @click.native="getGroupDetails(item)">
                                             <i class="el-icon-tickets"></i>
                                             {{ $t('groupdetails') }} </el-dropdown-item>
@@ -93,7 +95,7 @@
                     <!-- 分组详情 -->
                     <el-dialog :title="groupDetailTil" :visible.sync="groupDetailsShow" width="500px" :before-close="handleClose">
                         <div>
-                            <el-form label-width="80px">
+                            <el-form label-width="90px">
                                 <el-form-item :label="$t('head') + ':'">
                                     <span v-if="user.userNameNeedTranslate != '1'">{{groupDetailData.incharger}}</span>
                                     <span v-if="user.userNameNeedTranslate == '1'">
@@ -111,9 +113,12 @@
                                         <span v-if="index < groupDetailData.participators.length - 1">、</span>
                                     </span>
                                 </el-form-item>
-                                <el-form-item label="wbsCode" v-if="user.companyId == 936">
+                                <el-form-item label="wbsCode" v-if="user.companyId == 936">
                                     <span>{{groupDetailData.wbsCode}}</span>
                                 </el-form-item>
+                                <el-form-item label="预估工时:" v-if="user.timeType.projectManDay">
+                                    <span>{{groupDetailData.manDay}}人天 ({{ (groupDetailData.manDay==null?0:groupDetailData.manDay)*user.timeType.allday }}小时)</span>
+                                </el-form-item>
                             </el-form>
                         </div>
                         <span slot="footer" class="dialog-footer">
@@ -1133,6 +1138,22 @@
                 <el-button type="primary" @click="addGroup('form2')" style="width:100%;" >{{ $t('save') }}</el-button>
             </div>
         </el-dialog>
+        
+        <el-dialog title="设置分组预估工时" v-if="modGroupManDayDialog" :visible.sync="modGroupManDayDialog" :close-on-click-modal="false" customClass="customWidth" width="450px">
+            <el-table :data="groupList" size="small" :key="Math.random()" :height="'400px'" show-summary="true">
+                <el-table-column prop="name" label="分组名称">
+                </el-table-column>
+                <el-table-column prop="manDay" width="200" label="预估工时" >
+                    <template slot-scope="scope">
+                        <el-input v-model="scope.row.manDay" type="number"  :placeholder="$t('peaseenterthe')" maxlength="10" :max="99999" style="width:120px;"></el-input>&nbsp;人天
+                    </template>
+                </el-table-column>
+            </el-table>
+            <p style="text-align:center;">当前项目预估工时为:{{ currentProject.manDay == null? 0:currentProject.manDay }}人天</p>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="setManDayData()" style="width:100%;" >{{ $t('save') }}</el-button>
+            </div>
+        </el-dialog>
         <el-dialog :title="$t('addtemplate')" v-if="addToTmpDialog" :visible.sync="addToTmpDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-form ref="formTmp" :model="templateForm" :rules="rules" style="margin-top:10px;">
                     <el-form-item prop="name">
@@ -1257,6 +1278,7 @@
         
         data() {
             return {
+                modGroupManDayDialog: false,
                 isManageDept: false,
                 componentFlg: false,
                 mileageCup: false,
@@ -1336,6 +1358,9 @@
                 rules: {
                     name: [{ required: true, message: this.$t('pleaseenteragroupname'), trigger: "blur" }],
                 },
+                rulesManDay: {
+                    manDay: [{ required: true, message: '请输入预估工时', trigger: "blur" }],
+                },
                 rules2: {
                     stagesName: [{ required: true, message: this.$t('pleaseenteratasklistname'), trigger: "blur" }],
                 },
@@ -3038,6 +3063,10 @@
                 this.groupForm = JSON.parse(JSON.stringify(item));
                 this.setInchargerDialog = true;
             },
+            setManDay(item) {
+                this.groupForm = JSON.parse(JSON.stringify(item));
+                this.modGroupManDayDialog = true;
+            },
             renameGroup(item) {
                 this.groupForm = JSON.parse(JSON.stringify(item));
                 this.modGroupDialog = true;
@@ -3181,7 +3210,26 @@
                     });
                 });
             },
-
+            setManDayData() {
+                this.http.post('/task-group/saveManDay',{data:JSON.stringify(this.groupList)},
+                        res => {
+                            if (res.code == "ok") {
+                                this.modGroupManDayDialog = false;
+                                this.groupList = res.data;
+                            } else {
+                                this.$message({
+                                message: res.msg,
+                                type: "error"
+                                });
+                            }
+                        },
+                        error => {
+                            this.$message({
+                                message: error,
+                                type: "error"
+                            });
+                        });
+            },
             // 重新定义了 addGroup 方法
              addGroup(formName) {
                 // return

+ 7 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -7213,13 +7213,16 @@
                             if (res.code == "ok") {
                                 if(res.msg!=null){
                                     this.$message({
-                                    message: res.msg,
-                                    type: "success"
+                                        dangerouslyUseHTMLString: true,
+                                        message: res.msg,
+                                        type: "warning",
+                                        showClose: true,
+                                        duration: 0
                                     });
                                 }else{
                                     this.$message({
-                                    message: this.isDraft==0?this.$t('message.submittedSuccessfully'):this.$t('message.Temporarysuccess'),
-                                    type: "success"
+                                        message: this.isDraft==0?this.$t('message.submittedSuccessfully'):this.$t('message.Temporarysuccess'),
+                                        type: "success"
                                     });
                                 }
                                 this.dialogVisible = false;