浏览代码

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

Lijy 1 年之前
父节点
当前提交
7560ca0480

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Stages.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-04-21
+ * @since 2023-12-04
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -59,6 +59,13 @@ public class Stages extends Model<Stages> {
     @TableField("stages_time")
     private float stagesTime;
 
+    /**
+     * 编号
+     */
+    @TableField("stages_code")
+    private String stagesCode;
+
+
     @TableField(exist = false)
     private List<Task> taskList;
 

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -189,4 +189,6 @@ public interface ReportMapper extends BaseMapper<Report> {
     Double getReallWorkingTimeByProjectAndGroup(Integer projectId, Integer taskGroupId);
 
     List<Map<String, Object>> getProjectPlanData(Integer companyId, String startDate, String endDate);
+
+    List<String> getUserIds(ArrayList<Integer> deptIds, String startDate, String endDate);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserMapper.java

@@ -47,6 +47,8 @@ public interface UserMapper extends BaseMapper<User> {
 
     int getIsActiveCount(ArrayList<Integer> deptIds, String startDate, String endDate);
 
+    List<User> getIsActiveList(ArrayList<Integer> deptIds, String startDate, String endDate);
+
     List<User> getInActiveList(ArrayList<Integer> deptIds, String startDate, String endDate);
 
     List<User> getInActiveBewttenStartAndEndList(ArrayList<Integer> deptIds, String startDate, String endDate);

+ 107 - 53
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -11369,8 +11369,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         XmlResponseData xmlResponseData = SyncSapUtils.syncProjectFromSap(startDate, endDate);
         List<ProjectQueryResponse> projectQueryResponses = xmlResponseData.getProjectQueryResponses();
         List<Map<String,Object>> idsMapList=new ArrayList<>();
+        LocalDate localDate=LocalDate.now();
+//        projectQueryResponses=projectQueryResponses.stream().filter(p->p.getProjectID().equals("CPSP2250001")).collect(Collectors.toList());
         if(projectQueryResponses!=null&&projectQueryResponses.size()>0){
-            List<Stages> stagesList=new ArrayList<>();
             for (ProjectQueryResponse item : projectQueryResponses) {
                 Project project=new Project();
                 //处理项目分类
@@ -11434,61 +11435,105 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 //处理项目下任务 ----> 工时管家生成任务分组
                 List<ProjectTask> projectTasks = item.getProjectTasks();
                 if(projectTasks!=null&&projectTasks.size()>0){
-                    projectTasks.forEach(ps->{
-                        boolean match = idsMapList.stream().anyMatch(i -> i.get("taskGroupUUID").equals(ps.getUUID()));
-                        if(!match){
-                            if(StringUtils.isEmpty(ps.getParentTaskUUID())){
-                                TaskGroup taskGroup=new TaskGroup();
-                                taskGroup.setProjectId(project.getId());
-                                taskGroup.setTaskGroupCode(ps.getProjectElementID());
-                                taskGroup.setName(ps.getTaskGroupName()==null?"":ps.getTaskGroupName().getName());
-                                TaskGroup one = taskGroupMapper.selectOne(new QueryWrapper<TaskGroup>().eq("project_id", project.getId()).eq("task_group_code", ps.getProjectElementID()));
+                    //找到任务列表中 作为项目出现的第一级列表
+                    Optional<ProjectTask> targetProject = projectTasks.stream().filter(p -> p.getProjectElementID().equals(project.getProjectCode())).findFirst();
+                    String targetUUID = targetProject.get().getUUID();
+                    //todo:按照层级抽取数据
+                    //项目下第一层 作为任务分组数据
+                    List<ProjectTask> taskGroupList = projectTasks.stream().filter(p -> p.getParentTaskUUID() != null && p.getParentTaskUUID().equals(targetUUID)).collect(Collectors.toList());
+                    //抽调任务分组下级数据 作为阶段数据(是没有下级数据的情况下 作为最末级--->工时管家任务)
+                    List<String> taskGroupUUIDList = taskGroupList.stream().map(ProjectTask::getUUID).collect(Collectors.toList());
+                    List<ProjectTask> stagesList = projectTasks.stream().filter(p -> p.getParentTaskUUID() != null && taskGroupUUIDList.contains(p.getParentTaskUUID())).collect(Collectors.toList());
+                    List<String> stagesUUIDList = stagesList.stream().map(ProjectTask::getUUID).collect(Collectors.toList());
+                    //抽调出最末级
+                    List<ProjectTask> taskList = projectTasks.stream().filter(p ->p.getParentTaskUUID() != null &&stagesUUIDList.contains(p.getParentTaskUUID())&&(p.getSummaryTaskIndicator()==null||(p.getSummaryTaskIndicator()!=null && !p.getSummaryTaskIndicator().equals("true")))).collect(Collectors.toList());
+                    if(taskGroupList!=null && taskGroupList.size()>0){
+                        for (ProjectTask group : taskGroupList) {
+                            TaskGroup taskGroup=new TaskGroup();
+                            taskGroup.setProjectId(project.getId());
+                            taskGroup.setTaskGroupCode(group.getProjectElementID());
+                            taskGroup.setName(group.getTaskGroupName()==null?"":group.getTaskGroupName().getName());
+                            TaskGroup one = taskGroupMapper.selectOne(new QueryWrapper<TaskGroup>().eq("project_id", project.getId()).eq("task_group_code", group.getProjectElementID()));
+                            if(one!=null){
+                                taskGroup.setId(one.getId());
+                            }
+                            taskGroupService.saveOrUpdate(taskGroup);
+                            Map<String,Object> map=new HashMap<>();
+                            map.put("groupId",taskGroup.getId());
+                            map.put("UUID",group.getUUID());
+                            map.put("projectId",project.getId());
+                            idsMapList.add(map);
+                        }
+                    }
+                    if(stagesList!=null&&stagesList.size()>0){
+                        for (ProjectTask targetStage : stagesList) {
+                            Optional<Map<String, Object>> targetGroup = idsMapList.stream().filter(i -> i.get("UUID").equals(targetStage.getParentTaskUUID())).findFirst();
+                            if(!targetGroup.isPresent()){
+                                continue;
+                            }
+                            //如果作为第三层数据是不存在下级数据的 把当前数据作为第四层数据 手动添加阶段数据 作为该数据的上级数据
+                            if(targetStage.getSummaryTaskIndicator()==null){
+                                Stages stage = new Stages();
+                                stage.setSequence(1);
+                                stage.setProjectId(project.getId());
+                                stage.setGroupId(Integer.valueOf(String.valueOf(targetGroup.get().get("groupId"))));
+                                stage.setStagesName("工作开展");
+                                Stages one = stagesMapper.selectOne(new QueryWrapper<Stages>().eq("project_id", project.getId()).eq("stages_name","工作开展").eq("group_id",stage.getGroupId()));
+                                if(one!=null){
+                                    stage.setId(one.getId());
+                                }
+                                stagesService.saveOrUpdate(stage);
+                                Task task=new Task();
+                                task.setProjectId(project.getId());
+                                task.setGroupId(Integer.valueOf(String.valueOf(targetGroup.get().get("groupId"))));
+                                task.setStagesId(stage.getId());
+                                task.setCreateDate(localDate);
+                                task.setCompanyId(companyId);
+                                task.setName(targetStage.getTaskGroupName()==null?"空的任务名称":targetStage.getTaskGroupName().getName());
+                                Task two = taskMapper.selectOne(new LambdaQueryWrapper<Task>().eq(Task::getProjectId, task.getProjectId()).eq(Task::getGroupId, task.getGroupId()).eq(Task::getStagesId, task.getStagesId()));
+                                if(two!=null){
+                                    task.setId(two.getId());
+                                }
+                                taskService.saveOrUpdate(task);
+                            }else {
+                                Stages stage = new Stages();
+                                stage.setSequence(1);
+                                stage.setProjectId(project.getId());
+                                stage.setGroupId(Integer.valueOf(String.valueOf(targetGroup.get().get("groupId"))));
+                                stage.setStagesCode(targetStage.getProjectElementID());
+                                stage.setStagesName(targetStage.getTaskGroupName()==null?"":targetStage.getTaskGroupName().getName());
+                                Stages one = stagesMapper.selectOne(new QueryWrapper<Stages>().eq("project_id", project.getId()).eq("stages_name", targetStage.getProjectElementID()).eq("group_id",stage.getGroupId()));
                                 if(one!=null){
-                                    taskGroup.setId(one.getId());
+                                    stage.setId(one.getId());
                                 }
-                                taskGroupService.saveOrUpdate(taskGroup);
+                                stagesService.saveOrUpdate(stage);
                                 Map<String,Object> map=new HashMap<>();
-                                map.put("groupId",taskGroup.getId());
-                                map.put("taskGroupUUID",ps.getUUID());
+                                map.put("groupId",targetGroup.get().get("groupId"));
+                                map.put("stageId",stage.getId());
+                                map.put("UUID",targetStage.getUUID());
                                 map.put("projectId",project.getId());
                                 idsMapList.add(map);
-                            }else {
-                                Optional<ProjectTask> task = projectTasks.stream().filter(p -> p.getUUID().equals(ps.getParentTaskUUID())).findFirst();
-                                if(task.isPresent()){
-                                    Stages stage = new Stages();
-                                    Optional<Map<String, Object>> exist = idsMapList.stream().filter(i -> i.get("taskGroupUUID").equals(task.get().getUUID())).findFirst();
-                                    if(exist.isPresent()){
-                                        stage.setGroupId(Integer.valueOf(String.valueOf(exist.get().get("groupId"))));
-                                    }else {
-                                        //避免排序问题导致 上级数据未添加 漏掉子数据
-                                        TaskGroup taskGroup=new TaskGroup();
-                                        taskGroup.setProjectId(project.getId());
-                                        taskGroup.setTaskGroupCode(ps.getProjectElementID());
-                                        taskGroup.setName(ps.getTaskGroupName()==null?"":ps.getTaskGroupName().getName());
-                                        TaskGroup one = taskGroupMapper.selectOne(new QueryWrapper<TaskGroup>().eq("project_id", project.getId()).eq("task_group_code", ps.getProjectElementID()));
-                                        if(one!=null){
-                                            taskGroup.setId(one.getId());
-                                        }
-                                        taskGroupService.saveOrUpdate(taskGroup);
-                                        Map<String,Object> map=new HashMap<>();
-                                        map.put("groupId",taskGroup.getId());
-                                        map.put("taskGroupUUID",ps.getUUID());
-                                        map.put("projectId",project.getId());
-                                        idsMapList.add(map);
-                                        stage.setGroupId(taskGroup.getId());
-                                    }
-                                    stage.setSequence(1);
-                                    stage.setProjectId(project.getId());
-                                    stage.setStagesName(ps.getTaskGroupName()==null?"":ps.getTaskGroupName().getName());
-                                    Stages one = stagesMapper.selectOne(new QueryWrapper<Stages>().eq("project_id", project.getId()).eq("stages_name", ps.getProjectElementID()).eq("group_id",stage.getGroupId()));
-                                    if(one!=null){
-                                        stage.setId(one.getId());
-                                    }
-                                    stagesService.saveOrUpdate(stage);
-                                }
                             }
                         }
-                    });
+                    }
+                    for (ProjectTask targetTask : taskList) {
+                        Optional<Map<String, Object>> targetMapOp = idsMapList.stream().filter(i -> String.valueOf(i.get("UUID")).equals(targetTask.getParentTaskUUID())&&i.get("stageId")!=null).findFirst();
+                        if(targetMapOp.isPresent()){
+                            Map<String, Object> targetMap = targetMapOp.get();
+                            Task task=new Task();
+                            task.setProjectId(project.getId());
+                            task.setGroupId(Integer.valueOf(String.valueOf(targetMap.get("groupId"))));
+                            task.setStagesId(Integer.valueOf(String.valueOf(targetMap.get("stageId"))));
+                            task.setCreateDate(localDate);
+                            task.setCompanyId(companyId);
+                            task.setName(targetTask.getTaskGroupName()==null?"空的任务名称":targetTask.getTaskGroupName().getName());
+                            Task one = taskMapper.selectOne(new LambdaQueryWrapper<Task>().eq(Task::getProjectId, task.getProjectId()).eq(Task::getGroupId, task.getGroupId()).eq(Task::getStagesId, task.getStagesId()));
+                            if(one!=null){
+                                task.setId(one.getId());
+                            }
+                            taskService.saveOrUpdate(task);
+                        }
+                    }
                 }
             }
         }
@@ -11542,6 +11587,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             laborHourRateVo.setChild_ids(deptIds);
             //查询该公司下某头部部门及子部门在四种项目下的工时之和,某个时间段内
             List<Report> reportList= reportMapper.getSumWorkingTime(deptIds,startDate,endDate);
+            List<String> userIds= reportMapper.getUserIds(deptIds,startDate,endDate);
+
 
             ArrayList<Report> reports = new ArrayList<>();//按时填报的report
             for (Report report : reportList) {
@@ -11570,6 +11617,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //-- 查询 有多少个  入职时间早于起始时间 并且是在职的员工
             int isActiveCount=userMapper.getIsActiveCount(deptIds,startDate,endDate);
 
+            List<User> isActiveList = userMapper.getIsActiveList(deptIds, startDate, endDate);
+            List<String> collect = isActiveList.stream().map(User::getId).collect(Collectors.toList());
+            HashSet<String> idStrings = new HashSet<>();
+            idStrings.addAll(userIds);
+            idStrings.addAll(collect);
+
             //-- 查询 有多少个  入职时间晚于起始时间 并且在这段时间离职的员工
             List<User> inActiveBewttenStartAndEndList=userMapper.getInActiveBewttenStartAndEndList(deptIds,startDate,endDate);
             //获取入职时间晚于起始时间 并且在这段时间离职的员工在此期间工作多少天
@@ -11582,14 +11635,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
             laborHourRateVo.setWorking_time(timeSum);
             laborHourRateVo.setDate_count(dayCount);
-            laborHourRateVo.setCount(isActiveCount);
-            if (inActiveDays == 0) {
+            laborHourRateVo.setCount(idStrings.size());
+            int v = 8 * inActiveDays + idStrings.size() * 8 * dayCount;
+            if (v== 0) {
                 laborHourRateVo.setTotal_time(0L);
                 laborHourRateVo.setRate(0.0);
                 laborHourRateVos.add(laborHourRateVo);
             } else {
-                laborHourRateVo.setTotal_time((long) (8*inActiveDays+isActiveCount*8*dayCount));//应报工时还少了在职的加上可能辞职的
-                BigDecimal bd = new BigDecimal(timeSum/(8*inActiveDays+isActiveCount*8*dayCount)*100);
+                laborHourRateVo.setTotal_time((long) (v));//应报工时还少了在职的加上可能辞职的
+                BigDecimal bd = new BigDecimal(timeSum/(v)*100);
                 bd = bd.setScale(2, RoundingMode.HALF_UP);
                 laborHourRateVo.setRate(bd.doubleValue());
                 laborHourRateVos.add(laborHourRateVo);

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

@@ -980,13 +980,7 @@
         </foreach>
         AND p.company_id=936 AND p.category IN(168,169,171,172)
         AND r.create_date BETWEEN #{startDate} AND #{endDate}
-        AND r.creator_id NOT IN(8276751764399792128,8236086890927300608,8326361182460387328,
-        8342351512166014976,8236086972770754560,8236087310001184768,
-        8236087296243867648,8236087257492692992,8236088012337389568,
-        8245855829805441024,8318841602900172800,8236087360399941632,
-        8236087733260984320,8236090183732764672,8291179326062796800,
-        8236090183611129856,8236087738910711808
-        )
+        AND r.creator_id NOT IN(SELECT * from user_exclude)
     </select>
 
     <select id="getReallWorkingTimeByProjectId" resultType="java.lang.Double">
@@ -1013,4 +1007,18 @@
             and t.create_date between #{startDate} and #{endDate}
         </if>
     </select>
+
+    <select id="getUserIds" resultType="java.lang.String">
+        SELECT DISTINCT r.creator_id as id FROM report r
+        LEFT JOIN project p
+        ON r.project_id=p.id
+        WHERE
+        r.dept_id IN
+        <foreach collection="deptIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        AND p.company_id=936 AND p.category IN(168,169,171,172)
+        AND r.create_date BETWEEN #{startDate} AND #{endDate}
+        AND r.creator_id NOT IN(SELECT * from user_exclude)
+    </select>
 </mapper>

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

@@ -9,11 +9,13 @@
         <result column="project_id" property="projectId" />
         <result column="sequence" property="sequence" />
         <result column="group_id" property="groupId" />
+        <result column="stages_time" property="stagesTime" />
+        <result column="stages_code" property="stagesCode" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, stages_name, project_id, sequence, group_id
+        id, stages_name, project_id, sequence, group_id, stages_time, stages_code
     </sql>
     <select id="getProjectStages" resultType="java.lang.String">
         select distinct stages_name as name from stages where project_id = #{projectId} order by sequence

+ 45 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml

@@ -182,8 +182,7 @@
             ${ew.customSqlSegment}
     </select>
 
-    <select id="getIsActiveCount" resultType="java.lang.Integer">
-        SELECT count(1) isActiveCount FROM user
+    <!--SELECT count(1) isActiveCount FROM user
         WHERE id IN (SELECT DISTINCT r.creator_id  FROM report r
         LEFT JOIN project p
         ON r.project_id=p.id
@@ -193,11 +192,19 @@
             #{id}
         </foreach>
         AND r.create_date BETWEEN #{startDate} AND #{endDate})
-        AND is_active=1 AND induction_date &lt;= #{startDate}
+        AND is_active=1 AND induction_date &lt;= #{startDate}-->
+    <select id="getIsActiveCount" resultType="java.lang.Integer">
+        SELECT count(1) isActiveCount FROM user
+        WHERE department_id IN
+          <foreach collection="deptIds" item="id" open="(" close=")" separator=",">
+            #{id}
+          </foreach>
+        AND (is_active = 1 OR inactive_date > #{endDate} OR inactive_date IS NULL)
+        AND (induction_date &lt;= #{startDate} OR induction_date is NULL)
+        AND id not IN (SELECT * from user_exclude)
     </select>
 
-    <select id="getInActiveList" resultType="com.management.platform.entity.User">
-        SELECT user.* FROM user
+    <!-- SELECT user.* FROM user
         WHERE id in
         (SELECT DISTINCT r.creator_id  FROM report r
         LEFT JOIN project p
@@ -208,11 +215,19 @@
             #{id}
         </foreach>
         AND r.create_date BETWEEN #{startDate} AND #{endDate})
-        AND inactive_date BETWEEN #{startDate} AND #{endDate} and induction_date &lt;= #{startDate}
+        AND inactive_date BETWEEN #{startDate} AND #{endDate} and induction_date &lt;= #{startDate}-->
+    <select id="getInActiveList" resultType="com.management.platform.entity.User">
+        SELECT * FROM user
+        WHERE department_id IN
+        <foreach collection="deptIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        AND inactive_date &lt; #{endDate} AND inactive_date >= #{startDate}
+        AND induction_date &lt;= #{startDate}
+        AND id not IN (SELECT * from user_exclude)
     </select>
 
-    <select id="getInActiveBewttenStartAndEndList" resultType="com.management.platform.entity.User">
-        SELECT user.* FROM user
+    <!-- SELECT user.* FROM user
         WHERE id in
               (SELECT DISTINCT r.creator_id  FROM report r
                LEFT JOIN project p
@@ -223,7 +238,28 @@
                     #{id}
                 </foreach>
                AND r.create_date BETWEEN #{startDate} AND #{endDate})
-          AND induction_date BETWEEN #{startDate} AND #{endDate} AND inactive_date BETWEEN #{startDate} AND #{endDate}
+          AND induction_date BETWEEN #{startDate} AND #{endDate} AND inactive_date BETWEEN #{startDate} AND #{endDate}-->
+    <select id="getInActiveBewttenStartAndEndList" resultType="com.management.platform.entity.User">
+        SELECT * FROM user
+        WHERE department_id IN
+        <foreach collection="deptIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        AND inactive_date &lt; #{endDate} AND inactive_date &gt;= #{startDate}
+        AND induction_date &lt; #{endDate} AND induction_date &gt;= #{startDate}
+        AND induction_date &lt; inactive_date
+        AND id not IN (SELECT * from user_exclude)
+    </select>
+
+    <select id="getIsActiveList" resultType="com.management.platform.entity.User">
+        SELECT id  FROM user
+        WHERE department_id IN
+        <foreach collection="deptIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        AND (is_active = 1 OR inactive_date > #{endDate} OR inactive_date IS NULL)
+        AND (induction_date &lt;= #{startDate} OR induction_date is NULL)
+        AND id not IN (SELECT * from user_exclude)
     </select>
 
     <update id="updateActiveByIds">

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -93,6 +93,7 @@ const StringUtil = {
         reportResponsibleManhourCost: false, // 负责项目子项目工时成本 //
         reportFTEAll: false, // 全部部门FTE报表 //
         reportFTEPart: false, // 负责部门FTE报表 // 
+        reportEfficent: false, // 有效工时率 // 
 
         // 请假模块
         leaveFil : false, // 请假填报 // 
@@ -226,6 +227,7 @@ const StringUtil = {
         arr[i] == '负责项目分组阶段工时' ? obj.reportStageWorkingTime = true : ''
         arr[i] == '全部部门FTE报表' ? obj.reportFTEAll = true : ''
         arr[i] == '负责部门FTE报表' ? obj.reportFTEPart = true : ''
+        arr[i] == '有效工时率表' ? obj.reportEfficent = true : ''
 
         arr[i] == '新增合同' ? obj.contractNew = true : ''
         arr[i] == '查看全部合同' ? obj.contractView = true : ''

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

@@ -40,6 +40,7 @@
                   <el-menu-item index="1-18" v-if="permissions.reportAllManhourCost || permissions.reportResponsibleManhourCost" @click="ssl(17)"><p>子项目工时成本表</p></el-menu-item>
                   <el-menu-item index="1-19" v-if="user.timeType.restartTaskNeedReason == 1" @click="ssl(18)"><p>任务重启表</p></el-menu-item>
                   <el-menu-item index="1-20" v-if="permissions.reportFTEAll || permissions.reportFTEPart" @click="ssl(19)"><p>FTE报表</p></el-menu-item>
+                  <el-menu-item index="1-21" v-if="permissions.reportEfficent"  @click="ssl(20)"><p>有效工时率表</p></el-menu-item>
                   <!-- <el-menu-item index="1-12"><p @click="ssl(11)">人员工时统计表</p></el-menu-item> -->
                 </el-submenu>
               </el-menu>
@@ -65,7 +66,7 @@
             <el-option v-for="(item) in customerList" :key="item.id" :label="item.customerName" :value="item.id">
             </el-option>
           </el-select>
-          <el-select v-model="cusProJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" popper-class="projectSelectPopperClass">
+          <el-select v-if="ins != 20" v-model="cusProJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" popper-class="projectSelectPopperClass">
             <el-option v-for="(item) in cusProListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
               <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
               <span style="float: right;font-size: 13px;">{{ item.projectName }}</span>
@@ -73,7 +74,7 @@
           </el-select>
         </template>
         <!-- 时间段筛选 -->
-          <template v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 12 || ins == 5 || ins == 16 || ins == 17 || ins == 18">
+          <template v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 12 || ins == 5 || ins == 16 || ins == 17 || ins == 18 || ins == 20">
             <span>
               <span class="demonstration" style="color:#999;padding:0 10px">
                 {{ ins == 15 ? $t('xiang-mu-chuang-jian-shi-jian-duan') : $t('message.period') }}
@@ -88,7 +89,7 @@
           <el-option label="查看部门审核人" :value="0"></el-option>
         </el-select> -->
         <!-- 项目筛选 -->
-        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 19 && ins != 10 && ins != 11 && ins != 14 && ins != 15 && ins != 17" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
+        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 19 && ins != 10 && ins != 11 && ins != 14 && ins != 15 && ins != 17 && ins != 20" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
           <el-option v-for="(item) in proListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
             <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
             <span style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
@@ -896,8 +897,20 @@
                 <el-table-column align="center" prop="FTE" label="FTE(工时/当月工时基数)" min-width="250"></el-table-column>
             </el-table>
 
+            <!-- 有效工时率表 -->
+            <el-table  v-if="ins == 20" key="20" border :data="efficentList" highlight-current-row v-loading="listLoading" :height="+tableHeight - 1" style="width: 100%;" >
+                <el-table-column align="center" prop="department_name" label="所属部门" min-width="150"></el-table-column>
+                <el-table-column align="center" prop="working_time" label="实报工时(小时)" min-width="150"></el-table-column>
+                <el-table-column align="center" label="应工时(小时)" >
+                    <el-table-column align="center" prop="count" label="在职人数" min-width="150"></el-table-column>
+                    <el-table-column align="center" prop="date_count" label="应报工时天数" min-width="150"></el-table-column>
+                    <el-table-column align="center" prop="day_time" label="日标准工时" min-width="150"></el-table-column>
+                    <el-table-column align="center" prop="total_time" label="应报工时" min-width="150"></el-table-column>
+                </el-table-column>
+                <el-table-column align="center" prop="rate" label="有效工时率" min-width="150"></el-table-column>
+            </el-table>
         <!--工具条-->
-        <el-col :span="24" class="toolbar" v-if="ins != 6">
+        <el-col :span="24" class="toolbar" v-if="ins != 6 && ins != 20">
           <el-pagination
                 v-if="ins == 12"
                 @size-change="groupSizeChange"
@@ -1129,6 +1142,7 @@ export default {
   props: {},
   data() {
     return {
+      efficentList:[],
       groupNames: [],
       taskgroupList: [],
       customNameChoose: '',
@@ -1182,13 +1196,13 @@ export default {
       this.$t('pojectbalancesheetincomestatement'),this.$t('customerprojectprofitstatement'),this.$t('projectphasetimesheet'),
       this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
       this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
-      this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表'],
+      this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表', '有效工时率表'],
 
       shuzArr: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
       this.$t('projectbalancesheet'),this.$t('customerprojectincomestatement'),this.$t('projectphasetimesheet'),
       this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
       this.$t('employeereporttimelinessrate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
-      this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表'],
+      this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表','有效工时率表'],
 
       ins: 10000,
       user: JSON.parse(sessionStorage.user),
@@ -1641,8 +1655,10 @@ export default {
                 } else if(this.ins == 19) {
                   this.getETF()
                   this.getArea()
+                } else if (this.ins == 20) {
+                  this.getEffectiveLaborHourRate();
                 }
-                if(this.ins != 16 && this.ins != 17 && this.ins != 18 && this.ins != 19) {
+                if(this.ins != 16 && this.ins != 17 && this.ins != 18 && this.ins != 19 && this.ins != 20) {
                   this.getUserList()
                 }
             },
@@ -1874,6 +1890,32 @@ export default {
       this.page = 1
       this.getAuditRateList()
     },
+    //获取有效工时率表
+    getEffectiveLaborHourRate() {
+      this.listLoading = true;
+      let parameter = {
+        startDate: this.rangeDatas[0],
+        endDate: this.rangeDatas[1],
+      }
+      this.http.post('/project/getEffectiveLaborHourRate', parameter,
+      res => {
+          if (res.code == "ok") {
+              this.efficentList = res.data;
+              this.listLoading = false; 
+          } else {
+              this.$message({
+              message: res.msg,
+              type: "error"
+              });
+          }
+      },
+      error => {
+          this.$message({
+              message: error,
+              type: "error"
+          });
+      });
+    },
     // 获取EFT报表的数据
     getETF() {
       this.getCustomName();
@@ -2825,6 +2867,9 @@ export default {
       if(this.ins == 18) {
         this.taskRestart()
       }
+      if (this.ins == 20) {
+        this.getEffectiveLaborHourRate();
+      }
     },
     // 任务重启表
     taskRestart() {

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

@@ -4607,16 +4607,16 @@
 
             // 获取部门列表
             getDepartment() {
+                //如果没有权限,就不需要获取
+                if (!(this.permissions.reportsCompany || this.user.manageDeptId != 0 || this.permissions.reportsDept)) {
+                    return;
+                }
                 let day = (this.choseDay+1) > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
                 var param = {date:this.date + day};
                 this.http.post("/report/getMembList", param,
                 res => {
                     if (res.code == "ok") {
                         if(res.data.length == 0){
-                            // this.$message({
-                            //     message: '请联系管理员设置负责部门',
-                            //     type: 'error'
-                            // })
                             return
                         }
                         this.departmentList = JSON.parse(JSON.stringify(res.data))

+ 81 - 23
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue

@@ -190,7 +190,8 @@
                         <!-- 常规选择时间的方式 -->
                         <!-- 全天上下午模式 -->
                         <div v-if="reportTimeType.multiWorktime==0">
-                        <van-field v-if="reportTimeType.type < 2" readonly clickable  :value="reportTimeType.type==0?item.label:(parseFloat(item.workingTime).toFixed(1)+'h')" label="工作时长" placeholder="请选择工作时长(小时)" @click="clickTimePicker(index)"
+                        <van-field v-if="reportTimeType.type < 2" readonly clickable  :value="reportTimeType.type==0?item.label:(parseFloat(item.workingTime).toFixed(1)+'h')" label="工作时长" placeholder="请选择工作时长(小时)" 
+                        @click="clickTimePicker(index, item)"
                         :rules="[{ required: true, message: '请选择工作时长' }]"/>
                         <van-popup v-model="showPickerTime" position="bottom">
                             <van-picker show-toolbar :columns="timeType"  value-key="label" @confirm="choseTimePick" @cancel="showPickerTime = false" />
@@ -247,7 +248,7 @@
                             </template>
                         </van-cell>
                         <van-field class="form_input"
-                        v-model="item.content" name="content" type="textarea" :label="user.companyId==781?'具体内容与结果':'工作事项'" placeholder="请输入" 
+                        v-model="item.content" name="content" type="textarea" :label="user.companyId==781?'具体内容与结果':'工作事项'" placeholder="请输入" :disabled="item.state<=1"
                         rows="3" autosize :rules="user.timeType.workContentState == 1 ? [{ required: true, message: user.companyId==781?'具体内容与结果':'工作事项' }] : null" />
                         </div>
                         
@@ -758,14 +759,17 @@
                 let date = new Date(shuldDate.getFullYear(),shuldDate.getMonth(),shuldDate.getDate()-shuldDate.getDay()+1)
                 console.log(this.formatDate(date), '<=== date', this.formatDate(shuldDate), this.formatDate(nowWeekday))
                 this.dateRange = []
-
+                let newWeeklyDataList = [];
+                let serverPList = [];
                 if(enableNewWeeklyfill) { // 针对物奇
                     let { data } = await this.$axios.post('/report/getWeeklyFillReportData', {
                         targetDate: this.formatDate(date)
                     })
+                    serverPList = data.projectList;
                     let { dateList } = data
                     this.dateRange = dateList.map(item => new Date(item.date))
                     this.dateText = [dateList[0].date, dateList[dateList.length - 1].date]
+                    newWeeklyDataList = dateList;
                 } else {
                     for(let i=0;i<this.weekIndex;i++){
                         this.dateRange.push(new Date(date.getFullYear(),date.getMonth(),date.getDate()+i))
@@ -778,23 +782,71 @@
                 let startDateD = startDate.getDate()
 
                 // let endDate = this.dateRange[this.weekIndex - 1]
-                let endDate = this.dateRange.at(-1)
+                let endDate = this.dateRange[this.dateRange.length-1];
                 let endDateM = endDate.getMonth() + 1
                 let endDateD = endDate.getDate()
 
                 let startDateStr = startDate.getFullYear() + '-' + (startDateM < 10 ? '0' + startDateM : startDateM) + '-' + (startDateD < 10 ? '0' + startDateD : startDateD)
                 let endDateStr = endDate.getFullYear() + '-' + (endDateM < 10 ? '0' + endDateM : endDateM) + '-' + (endDateD < 10 ? '0' + endDateD : endDateD)
 
+                this.form = []
                 if(enableNewWeeklyfill != 1) {
                     this.dateText = [startDateStr,endDateStr]
-                }
-
-                this.form = []
-                // for(let i=0;i<this.weekIndex;i++){
-                for(let i=0;i<this.dateRange.length;i++){
-                    let formItem = {
-                            createDate: this.format(this.dateRange[i],"yyyy-MM-dd"),
-                            domains: [{
+                    for(let i=0;i<this.dateRange.length;i++){
+                        let formItem = {
+                                createDate: this.format(this.dateRange[i],"yyyy-MM-dd"),
+                                domains: [{
+                                    id: null,
+                                    projectId: "",
+                                    projectName: "",
+                                    workingTime: this.user.timeType.allday,
+                                    content: "",
+                                    progress: 100,
+                                    state: 2,
+                                    multiWorktime:0,
+                                    worktimeList:[{}],
+                                    degreeId: '',
+
+                                    auditorFirst: {name:'',id:''},
+                                    auditorSec: {name:'',id:''},
+                                    auditorThird: {name:'',id:''},
+                                    ccUserid: {name:'',id:''}
+                                }],
+                            }
+                        this.form.push(formItem)
+                    }
+                } else {
+                    //启用了新版按周填报,加载接口返回的日报数据
+                    for(let i=0;i<newWeeklyDataList.length;i++){
+                        let oneDayItem = newWeeklyDataList[i];
+                        console.log('111',oneDayItem.date);
+                        let formItem = {
+                            createDate: oneDayItem.date,
+                            // domains: [{
+                            //     id: null,
+                            //     projectId: "",
+                            //     projectName: "",
+                            //     workingTime: this.user.timeType.allday,
+                            //     content: "",
+                            //     progress: 100,
+                            //     state: 2,
+                            //     multiWorktime:0,
+                            //     worktimeList:[{}],
+                            //     degreeId: '',
+
+                            //     auditorFirst: {name:'',id:''},
+                            //     auditorSec: {name:'',id:''},
+                            //     auditorThird: {name:'',id:''},
+                            //     ccUserid: {name:'',id:''}
+                            // }],
+                        }
+                        //日报数据
+                        let reportList = oneDayItem.reportList;
+                        reportList.forEach(r=>r.projectName = serverPList.filter(s=>s.id==r.projectId)[0].projectName);
+                        if (reportList.length > 0) {
+                            formItem.domains = reportList;
+                        } else {
+                            formItem.domains = [{
                                 id: null,
                                 projectId: "",
                                 projectName: "",
@@ -805,15 +857,19 @@
                                 multiWorktime:0,
                                 worktimeList:[{}],
                                 degreeId: '',
-
                                 auditorFirst: {name:'',id:''},
                                 auditorSec: {name:'',id:''},
                                 auditorThird: {name:'',id:''},
                                 ccUserid: {name:'',id:''}
-                            }],
+                            }]
                         }
-                    this.form.push(formItem)
+                        this.form.push(formItem)
+                    }
                 }
+
+                
+
+                
                 this.currentForm = this.form[0]
                 if(this.reportBasecostList.length != 0 && this.user.company.packageProject == 1){
                     this.currentForm.domains[0].basecostId = this.reportBasecostList[0].id;
@@ -1176,10 +1232,8 @@
                 }
       
             },
-            clickTimePicker(i) {
-                // if (!this.canEdit) {
-                //     return;
-                // }
+            clickTimePicker(i, item) {
+                if (item.state <=1) return
                 this.clickTimeIndex = i;
                 
                 if (this.reportTimeType.type == 0) {
@@ -1423,7 +1477,8 @@
 
             //点击选择审核人
             clickPickAuditor(i, item) {
-                // if (!this.canEdit) return;
+                //不可待审核和已通过不可编辑
+                if (item.state<2) return;
                 if (item.auditUserList.length<=1) return;
                 this.clickIndex = i;
                 item.showPickerAuditor = true;
@@ -1441,7 +1496,8 @@
 
             //点击选择子项目
             clickPickSubProject(i, item) {
-                // if (!this.canEdit) return;
+                //不可待审核和已通过不可编辑
+                if (item.state<2) return;
                 this.clickIndex = i;
                 item.showPickerSubProject = true;
                 this.$forceUpdate();
@@ -1452,7 +1508,8 @@
                 this.$forceUpdate();
             },
             clickPickStage(i, item) {
-                // if (!this.canEdit) return;
+                //不可待审核和已通过不可编辑
+                if (item.state<2) return;
                 this.clickIndex = i;
                 item.showPickerStage = true;
                 this.$forceUpdate();
@@ -1460,7 +1517,8 @@
 
             // 选择项目
             clickPicker(i, item) {
-                // if (!this.canEdit) return;
+                //不可待审核和已通过不可编辑
+                if (item.state<2) return;
                 // this.clickIndex = i;
                 // this.showPickerProject = true;
                 // console.log(i, item, this.currentForm)