Browse Source

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

# Conflicts:
#	fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
#	fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java
#	fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
seyason 1 year ago
parent
commit
aaad5ccbab

+ 0 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -106,12 +106,6 @@ public class TaskController {
         //当前用户
         User user = userMapper.selectById(userId);
         HttpRespMsg msg = new HttpRespMsg();
-        if(task.getServiceId()!=null){
-            SapProjectService one = sapProjectServiceService.getOne(new LambdaQueryWrapper<SapProjectService>().eq(SapProjectService::getCompanyId, user.getCompanyId()).eq(SapProjectService::getServiceCode,task.getServiceId()));
-            if(one!=null){
-                task.setName(one.getServiceName()+"-"+one.getServiceCode());
-            }
-        }
 
         //新建的任务,需要设置创建人,创建时间
         if (task.getId() == null) {

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

@@ -24,8 +24,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-12-06
- */
+ * @since 2023-08-10 */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
@@ -388,6 +387,12 @@ public class Report extends Model<Report> {
     @TableField("extra_field3")
     private Integer extraField3;
 
+    /**
+     * SAP项目服务ID
+     */
+    @TableField("sap_service_id")
+    private Integer sapServiceId;
+
     @TableField(exist = false)
     private List<ProFunWorkContext> workContentList;
 

+ 8 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java

@@ -21,8 +21,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-12-04
- */
+ * @since 2023-11-23 */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
@@ -215,11 +214,16 @@ public class Task extends Model<Task> {
     private String meetingId;
 
     /**
-     * SAP服务编号
+     * 前置任务ids,多个逗号隔开
      */
-    @TableField("service_id")
     private String serviceId;
 
+    /**
+     * SAP项目任务编号
+     */
+    @TableField("sap_task_code")
+    private String sapTaskCode;
+
     @TableField(exist = false)
     private List<TaskExecutor> executorList;
 

+ 10 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskExecutor.java

@@ -1,9 +1,10 @@
 package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -18,7 +19,7 @@ import java.util.List;
  * </p>
  *
  * @author Seyason
- * @since 2022-03-27
+ * @since 2023-12-05
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -60,6 +61,12 @@ public class TaskExecutor extends Model<TaskExecutor> {
     @TableField("project_id")
     private Integer projectId;
 
+    /**
+     * SAP项目服务ID
+     */
+    @TableField("service_id")
+    private String serviceId;
+
 
     @Override
     protected Serializable pkVal() {

+ 98 - 50
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -11370,6 +11370,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         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){
             for (ProjectQueryResponse item : projectQueryResponses) {
                 Project project=new Project();
@@ -11431,87 +11432,129 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     project.setId(any.get().getId());
                 }
                 saveOrUpdate(project);
-                if(project.getProjectCode().equals("CPSP2250001")){
-                    System.out.println(1);
-                }
                 //处理项目下任务 ----> 工时管家生成任务分组
                 List<ProjectTask> projectTasks = item.getProjectTasks();
                 if(projectTasks!=null&&projectTasks.size()>0){
                     //找到任务列表中 作为项目出现的第一级列表
                     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) && p.getSummaryTaskIndicator()!=null&& p.getSummaryTaskIndicator().equals("true")).collect(Collectors.toList());
+                    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()) && p.getSummaryTaskIndicator()!=null&& p.getSummaryTaskIndicator().equals("true")).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.getSummaryTaskIndicator()==null||(p.getSummaryTaskIndicator()!=null && !p.getSummaryTaskIndicator().equals("true"))).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("taskGroupUUID",group.getUUID());
-                            map.put("projectId",project.getId());
-                            idsMapList.add(map);
-                            //当没有作为阶段的数据时 创建默认阶段数据
-                            if(stagesList==null || stagesList.size()==0){
+                            //如果作为第二层数据是不存在下级数据的 把当前数据作为第四层数据 手动添加阶段数据 作为该数据的上级数据
+                            if(group.getSummaryTaskIndicator()==null){
+                                TaskGroup taskGroup=new TaskGroup();
+                                taskGroup.setProjectId(project.getId());
+                                taskGroup.setName("项目阶段");
+                                TaskGroup one = taskGroupMapper.selectOne(new QueryWrapper<TaskGroup>().eq("project_id", project.getId()).eq("name","项目阶段"));
+                                if(one!=null){
+                                    taskGroup.setId(one.getId());
+                                }
+                                taskGroupService.saveOrUpdate(taskGroup);
                                 Stages stage = new Stages();
                                 stage.setSequence(1);
                                 stage.setProjectId(project.getId());
                                 stage.setGroupId(taskGroup.getId());
                                 stage.setStagesName("工作开展");
+                                Stages two = stagesMapper.selectOne(new QueryWrapper<Stages>().eq("project_id", project.getId()).eq("stages_name","工作开展").eq("group_id",stage.getGroupId()));
+                                if(two!=null){
+                                    stage.setId(two.getId());
+                                }
                                 stagesService.saveOrUpdate(stage);
-                                Map<String,Object> map1=new HashMap<>();
-                                map1.put("groupId",taskGroup.getId());
-                                map1.put("taskGroupUUID",group.getUUID());
-                                map1.put("stageId",stage.getId());
-                                map1.put("projectId",project.getId());
-                                idsMapList.add(map1);
+                                Task task=new Task();
+                                task.setProjectId(project.getId());
+                                task.setGroupId(taskGroup.getId());
+                                task.setStagesId(stage.getId());
+                                task.setCreateDate(localDate);
+                                task.setCompanyId(companyId);
+                                task.setSapTaskCode(group.getProjectElementID());
+                                task.setName(group.getTaskGroupName()==null?"空的任务名称":group.getTaskGroupName().getName());
+                                Task three = taskMapper.selectOne(new LambdaQueryWrapper<Task>().eq(Task::getProjectId, task.getProjectId()).eq(Task::getGroupId, task.getGroupId()).eq(Task::getStagesId, task.getStagesId()));
+                                if(three!=null){
+                                    task.setId(three.getId());
+                                }
+                                taskService.saveOrUpdate(task);
+                            }else {
+                                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("taskGroupUUID").equals(targetStage.getParentTaskUUID())).findFirst();
+                            Optional<Map<String, Object>> targetGroup = idsMapList.stream().filter(i -> i.get("UUID").equals(targetStage.getParentTaskUUID())).findFirst();
                             if(!targetGroup.isPresent()){
                                 continue;
                             }
-                            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){
-                                stage.setId(one.getId());
+                            //如果作为第三层数据是不存在下级数据的 把当前数据作为第四层数据 手动添加阶段数据 作为该数据的上级数据
+                            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.setSapTaskCode(targetStage.getProjectElementID());
+                                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){
+                                    stage.setId(one.getId());
+                                }
+                                stagesService.saveOrUpdate(stage);
+                                Map<String,Object> map=new HashMap<>();
+                                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);
                             }
-                            stagesService.saveOrUpdate(stage);
-                            Map<String,Object> map=new HashMap<>();
-                            map.put("groupId",targetGroup.get().get("groupId"));
-                            map.put("stageId",stage.getId());
-                            map.put("taskGroupUUID",targetGroup.get().get("taskGroupUUID"));
-                            map.put("projectId",project.getId());
-                            idsMapList.add(map);
                         }
                     }
                     for (ProjectTask targetTask : taskList) {
-                        Optional<Map<String, Object>> targetMapOp = idsMapList.stream().filter(i -> i.get("taskGroupUUID").equals(targetTask.getParentTaskUUID())&&i.get("stageId")!=null).findFirst();
+                        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()){
-//                            if(StringUtils.isEmpty(targetTask.getTaskGroupName())){
-//                                continue;
-//                            }
                             Map<String, Object> targetMap = targetMapOp.get();
                             Task task=new Task();
                             task.setProjectId(project.getId());
@@ -11519,7 +11562,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             task.setStagesId(Integer.valueOf(String.valueOf(targetMap.get("stageId"))));
                             task.setCreateDate(localDate);
                             task.setCompanyId(companyId);
+                            task.setSapTaskCode(targetTask.getProjectElementID());
                             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);
                         }
                     }

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

@@ -950,14 +950,14 @@
     </select>
 
     <select id="getPushProjectReportToSap" resultType="java.util.Map">
-        select r.id as ReportId, u.job_number as EmployeeID,r.create_date as StartDate,r.create_date as EndDate,r.start_time as StartTime,r.end_time as EndTime,r.working_time as Duration,tg.task_group_code as ProjectElementID,
-        t.service_id as ServiceProductInternalID,r.content as WorkDescriptionText
+        select r.id as ReportId, u.job_number as EmployeeID,r.create_date as StartDate,r.create_date as EndDate,r.start_time as StartTime,r.end_time as EndTime,
+        r.working_time as Duration,t.sap_task_code as ProjectElementID,
+        r.sap_service_id as ServiceProductInternalID,r.content as WorkDescriptionText
         from report r
         left join user u on u.id=r.creator_id
         left join department d on u.department_id=d.department_id
         left join project p on p.id=r.project_id
         left join task t on t.id=r.task_id
-        left join task_group tg on tg.id=t.group_id
         where r.state=1
         and d.push_to_sap=1
         and r.company_id=#{companyId}
@@ -992,16 +992,18 @@
     </select>
 
     <select id="getProjectPlanData" resultType="java.util.Map">
-        select p.project_code as ProjectID,tg.task_group_code ProjectTaskID,t.service_id as  ServiceID,u.job_number as EmployeeID,t.plan_hours as PlanWork ,t.start_date as StartDate ,t.end_date as EndDate
-        from task t
+        select p.project_code as ProjectID,t.sap_task_code ProjectTaskID,sps.service_code as ServiceID,u.job_number as EmployeeID,t.plan_hours as PlanWork ,
+        t.start_date as StartDate ,t.end_date as EndDate
+        from
+        task_executor te
+        left join task t on te.task_id = t.id
+        right join sap_project_service sps on  FIND_IN_SET( sps.id,REPLACE(REPLACE(te.service_id,'[',''),']',''))
         left join project p on t.project_id = p.id
-        left join task_group tg on tg.id=t.group_id
-        left join task_executor te on te.task_id = t.id
         left join user u on te.executor_id=u.id
         where t.company_id=#{companyId}
         and t.start_date is not null
         and t.plan_hours is not null
-        and t.service_id is not null
+        and te.service_id is not null
         and u.job_number is not null
         <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
             and t.create_date between #{startDate} and #{endDate}

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

@@ -11,11 +11,12 @@
         <result column="executor_color" property="executorColor" />
         <result column="plan_hours" property="planHours" />
         <result column="project_id" property="projectId" />
+        <result column="service_id" property="serviceId" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, task_id, executor_id, executor_name, executor_color, plan_hours, project_id
+        id, task_id, executor_id, executor_name, executor_color, plan_hours, project_id, service_id
     </sql>
 
 </mapper>

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

@@ -30,7 +30,7 @@
         <result column="finish_date" property="finishDate" />
         <result column="start_date" property="startDate" />
         <result column="meeting_id" property="meetingId" />
-        <result column="service_id" property="serviceId" />
+        <result column="sap_task_code" property="sapTaskCode" />
         <result column="ahead_tid" property="aheadTid" />
     </resultMap>
     <resultMap id="timeResultMap" type="com.management.platform.entity.TimeTask" >
@@ -95,8 +95,7 @@
     </resultMap>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, task_desc, creater_id, creater_name, creator_color, executor_id, executor_name, executor_color, task_level, task_status, create_date, end_date, project_id, stages_id, company_id, indate, parent_tid, group_id, seq, plan_hours, task_type, parent_tname, finish_date, start_date, meeting_id, service_id, ahead_tid
-    </sql>
+        id, name, task_desc, creater_id, creater_name, creator_color, executor_id, executor_name, executor_color, task_level, task_status, create_date, end_date, project_id, stages_id, company_id, indate, parent_tid, group_id, seq, plan_hours, task_type, parent_tname, finish_date, start_date, meeting_id, service_id    </sql>
 
     <select id="simpleList" resultMap="BaseResultMap">
         select id, name, creater_id, creater_name, creator_color, executor_id, executor_name, executor_color, task_level, task_status, create_date, end_date, project_id, stages_id, company_id, indate, parent_tid, group_id, seq, plan_hours, task_type, parent_tname, finish_date, start_date
@@ -109,7 +108,7 @@
     <select id="nameList" resultMap="BaseResultMap">
         select id, name, task_level, stages_id, company_id, indate,  group_id, seq,task_type,task_desc
         from task
-                 ${ew.customSqlSegment}
+        ${ew.customSqlSegment}
     </select>
 
     <!--计算执行人任务分布-->
@@ -140,7 +139,7 @@
     <!--计算耗时排名前十的任务-->
     <select id="getTopCostTask" resultType="java.util.Map">
         SELECT task.id , task.name AS name, IFNULL(SUM(report.`working_time`),0) AS value FROM task
-            LEFT JOIN report ON report.`task_id` = task.id
+        LEFT JOIN report ON report.`task_id` = task.id
         WHERE task.project_id = #{projectId} and report.state = 1
         GROUP BY task.id ORDER BY SUM(report.`working_time`) DESC LIMIT 10
     </select>
@@ -148,7 +147,7 @@
     <!-- 查询任务实际工时和计划工时对比,仅查询有实际工时的数据 -->
     <select id="getTaskTimeCompare" resultType="java.util.Map">
         SELECT task.id , task.name AS name, task.plan_hours as planHours, IFNULL(SUM(report.`working_time`),0) AS workHours FROM report
-                                                                                                                                     LEFT JOIN task ON report.`task_id` = task.id AND report.state = 1
+        LEFT JOIN task ON report.`task_id` = task.id AND report.state = 1
         WHERE task.project_id = #{projectId}
         GROUP BY task.id
     </select>
@@ -236,7 +235,7 @@
         select * from task where
         task.task_type=1
         <if test="ids!=null">
-            and task.project_id in
+        and task.project_id in
             <foreach collection="ids" index="index" close=")" open="(" separator="," item="item">
                 #{item}
             </foreach>

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

@@ -168,7 +168,7 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
                 }
                 collect.add(-1);
                 List<Integer> finalCollect = collect;
-                queryWrapper.and(wrapper->wrapper.in(Plan::getId, finalCollect).or().eq(Plan::getCreateId,user.getId()));
+                queryWrapper.and(wrapper->wrapper.in(Plan::getId, finalCollect).or().eq(Plan::getCreateId,user.getId())).eq(Plan::getStatus,1);
             }
         }
         if(!StringUtils.isEmpty(steelStampNumber)){

+ 1 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application-prod.yml

@@ -15,7 +15,7 @@ spring:
     driver-class-name: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
-    password: P011430@Huoshi*
+    password: Ziyu20141026!@@
     hikari:
       maximum-pool-size: 10
       minimum-idle: 3

+ 57 - 18
fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue

@@ -41,7 +41,7 @@
                     </el-option>
                 </el-select>
             </el-form-item>
-            <el-form-item v-if="this.user.companyId==3092" :label="$t('taskdefinition')" prop="serviceId">
+            <!-- <el-form-item v-if="this.user.companyId==3092" :label="$t('taskdefinition')" prop="serviceId">
                 <el-select filterable style="width:100%;"  v-model="addForm.serviceId" placeholder="请选择任务内容">
                     <el-option
                     v-for="item in sapServiceList"
@@ -50,8 +50,8 @@
                     :value="item.serviceCode">
                     </el-option>
                 </el-select>
-            </el-form-item>
-            <el-form-item v-else  :label="$t('taskdefinition')" prop="name">
+            </el-form-item> -->
+            <el-form-item  :label="$t('taskdefinition')" prop="name">
                 <el-input v-model="addForm.name" :maxlength="40" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" :placeholder="$t('enterthetaskcontent')" clearable></el-input>
             </el-form-item>
             <!-- {{timelabel}}{{mileageCup}} -->
@@ -67,22 +67,40 @@
             </el-form-item>
             <div style="border: 1px solid #ddd;margin:5px 0;padding:5px 0;">
             <el-form-item :label="$t('zhi-hang-ren') + (index+1)" v-for="(executorItem, index) in addForm.executorListFront" :key="index">
-                <el-select v-if="user.userNameNeedTranslate != 1" v-model="executorItem.executorId" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" size="small" filterable clearable :placeholder="$t('pleaseselectanexecutor')" style="width:40%;" @change="$forceUpdate()">
-                    <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
-                        <span style="float: left">{{ item.name }}</span>
-                        <span style="float: right; color: #8492a6; font-size: 13px;margin-left: 20px" v-if="item.jobNumber">{{ item.jobNumber }}</span>
-                    </el-option>
-                </el-select>
-                <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :filterable="true" :subject="users" :subjectId="executorItem.executorId" :distinction="'1'" @selectCal="selectCal" :index="index" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)"></selectCat>
-                
-                <span style="margin-left:30px;margin-right:10px;">{{ $t('plantime') }}</span>
-                <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" v-model="gstimday[index]" style="width:16%;" :min="1" :max="100"  :placeholder="$t('danweitian')" @change="chggstim(0,index)"></el-input-number ><span style="margin-left:5px;">{{ $t('time.day') }}</span>
-                <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" v-model="gstimhour[index]" style="width:16%;" :min="1" :max="999"  :placeholder="$t('pleaseentertheplannedworking')" @change="chggstim(1,index)"></el-input-number ><span style="margin-left:5px;">{{ $t('time.hour') }}</span>
+                <div class="editingTask">
+                    <div style="margin-right: 30px">
+                        <el-select v-if="user.userNameNeedTranslate != 1" v-model="executorItem.executorId" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" size="small" filterable clearable :placeholder="$t('pleaseselectanexecutor')" style="width:40%;" @change="$forceUpdate()">
+                            <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
+                                <span style="float: left">{{ item.name }}</span>
+                                <span style="float: right; color: #8492a6; font-size: 13px;margin-left: 20px" v-if="item.jobNumber">{{ item.jobNumber }}</span>
+                            </el-option>
+                        </el-select>
+                        <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :filterable="true" :subject="users" :subjectId="executorItem.executorId" :distinction="'1'" @selectCal="selectCal" :index="index" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)"></selectCat>
+                    </div>
+                    <!-- 项目服务 -->
+                    <div v-if="user.companyId==3092">
+                        <span style="margin-left:30px;margin-right:10px;">{{'项目服务'}}</span>
+                        <el-select multiple clearable collapse-tags  filterable  v-model="executorItem.serviceId" size="small" placeholder="请选择项目服务" style="width: 300px" @change="serviceIdChange()">
+                            <el-option
+                            v-for="item in sapServiceList"
+                            :key="item.id"
+                            :label="item.serviceName+'-'+item.serviceCode"
+                            :value="item.id">
+                            </el-option>
+                        </el-select>
+                    </div>
+                    <!-- 计划工时 -->
+                    <div>
+                        <span style="margin-right:10px;">{{ $t('plantime') }}</span>
+                        <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" v-model="gstimday[index]" style="width:120px;" :min="1" :max="100"  :placeholder="$t('danweitian')" @change="chggstim(0,index)"></el-input-number ><span style="margin-left:5px;">{{ $t('time.day') }}</span>
+                        <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" v-model="gstimhour[index]" style="width:120px;" :min="1" :max="999"  :placeholder="$t('pleaseentertheplannedworking')" @change="chggstim(1,index)"></el-input-number ><span style="margin-left:5px;">{{ $t('time.hour') }}</span>
 
-                <!-- <el-input-number v-model="numnnumnum" @change="handleChange" :min="1" :max="10" label="描述文字"></el-input-number> -->
+                        <!-- <el-input-number v-model="numnnumnum" @change="handleChange" :min="1" :max="10" label="描述文字"></el-input-number> -->
 
-                <!-- 移除执行人 -->
-                <i class="el-icon-delete" v-if="index>0 && (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id|| permissions.projectManagement || groupResponsibleId == user.id)" style="margin-left:5px" @click="removeExecutorLine(index)"></i>
+                        <!-- 移除执行人 -->
+                        <i class="el-icon-delete" v-if="index>0 && (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id|| permissions.projectManagement || groupResponsibleId == user.id)" style="margin-left:5px" @click="removeExecutorLine(index)"></i>
+                    </div>
+                </div>
             </el-form-item>
             <el-link type="primary" v-if="(((addForm.executorListFront == null || addForm.executorListFront.length<100) && 
             (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id || permissions.projectManagement)) || 
@@ -858,6 +876,13 @@ export default {
     
   },
   methods: {
+    // 刷新数据
+    refreshData() {
+        this.$forceUpdate()
+    },
+    serviceIdChange() {
+        this.refreshData()
+    },
     // 触发外层的会议
     meetingCli() {
         this.$parent.$parent.parentMeetingCli(this.integrationTask.id)
@@ -1063,6 +1088,12 @@ export default {
                 this.recentProgressInfo = res.data.progress;
                 
                 if(res.data.executorList.length > 0) {
+                    for(var i in res.data.executorList){
+                        if(res.data.executorList[i].serviceId) {
+                            res.data.executorList[i].serviceId = JSON.parse(res.data.executorList[i].serviceId)
+                        }
+                    }
+                    console.log("==================",res.data.executorList)
                     this.addForm.executorListFront = res.data.executorList;
                 } else {
                     this.addForm.executorListFront = [{executorId: null, planHours: 8}];
@@ -1392,6 +1423,9 @@ export default {
                 delete this.addForm.progress;
                 //去掉没有执行人的.(因为要有计划工时,执行人可以暂不设置)
                 // this.addForm.executorListFront = this.addForm.executorListFront.filter(exe=>exe.executorId);
+                if(this.addForm.executorListFront.serviceId){
+                    this.addForm.executorListFront.serviceId= JSON.stringify(this.addForm.executorListFront.serviceId);
+                }
                 this.addForm.executorListStr = JSON.stringify(this.addForm.executorListFront);
                 this.addForm.aheadTid = JSON.stringify(this.addForm.aheadTidList);
                 this.addLoading = true;
@@ -1645,7 +1679,8 @@ export default {
         if(this.isRelationItem){return}
         this.addFormVisible = true;
         this.addForm = {parentTname: this.addForm.name,parentTid: this.addForm.id,projectId: this.addForm.projectId, groupId: this.addForm.groupId,  taskLevel:0, planHours: 8, taskType: 0};
-        this.addForm.executorListFront = [{executorId:null, planHours:8}];
+        // this.addForm.executorListFront = [{executorId:null, planHours:8}];
+        this.addForm.executorListFront = [{executorId:null, planHours:8, serviceId: []}];
         this.addLoading = false;
 
         //创建子任务,非编辑状态
@@ -2023,6 +2058,10 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+.editingTask {
+    display: flex;
+    flex-wrap: wrap;
+}
 .carts .commentSpan {
     float: none;
     display: block;

+ 2 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -249,8 +249,8 @@
                 <el-option :label="$t('wai-bao')" :value="2"></el-option> -->
                 </el-select>
               </el-form-item>
-              <el-form-item :label="'发放状态'">
-                <el-select v-model="sendState" size="small" style="width: 150px" v-if="permissions.costExpenseRelease"
+              <el-form-item :label="'发放状态'" v-if="permissions.costExpenseRelease">
+                <el-select v-model="sendState" size="small" style="width: 150px"
                   clearable>
                   <el-option :label="'未发放'" :value="0"></el-option>
                   <el-option :label="'已发放'" :value="1"></el-option>

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

@@ -1307,7 +1307,7 @@
                         <el-button icon="el-icon-delete" size="mini" style="margin-left:10px;" @click.stop.native="deleteMembItem(scope.$index)"></el-button>
                     </template>
                     <template slot="header" >
-                        <el-link @click="addMembItem">{{ $t('addTian') }}</el-link>
+                        <el-link @click="addMembItem" type="primary">{{ $t('addTian') }}</el-link>
                     </template>
                 </el-table-column>
             </el-table>

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

@@ -6545,7 +6545,17 @@
                             }
                         }
                     }
-                    
+
+                    // 对于先分组负责人审核再项目经理审核的模式,分组要必选
+                    let { next, error } = this.handleGroupAuditorData(this.zhoData)
+                    if(!next) {
+                        this.$message({
+                            message: `【${error.join('、')}】请填写任务分组`,
+                            type: 'error'
+                        })
+                        return
+                    }
+
                     // 自定义维度
                     this.submitingReport = true;
                     this.http.uploadFile( this.port.report.editPort, formData,
@@ -6582,6 +6592,37 @@
                             });
                         });
             },
+            handleGroupAuditorData(data) {
+                const { reportAuditType } = this.user.timeType
+                if(reportAuditType != 1 && reportAuditType != 2) {
+                    return {next: true}
+                }
+
+                let arrList = [];
+                Object.entries(data).forEach(([key, obj]) => {
+                    Object.entries(obj).forEach(([projectName, projectData]) => {
+                        if (projectData.workingTime && !projectData.groupId) {
+                            arrList.push({
+                                projectName,
+                                date: obj.zhoDataTime,
+                                dateText: obj.zhoDataTimeTxt
+                            });
+                        }
+                    });
+                });
+                
+                if(arrList.length > 0) {
+                    return {
+                        next: false,
+                        error: arrList.map(item => `【${item.date} ${item.dateText} 中的 (${item.projectName})项目】`),
+                    }
+                } else {
+                    return {
+                        next: true,
+                        error: [],
+                    }
+                }
+            },
             ChangeHourMinutestr (str) {
                 if (str !== "0" && str !== "" && str !== null) {
                     return ((Math.floor(str / 60)).toString().length < 2 ? "0" + (Math.floor(str / 60)).toString() :