Browse Source

Merge remote-tracking branch 'origin/master'

yusm 1 year ago
parent
commit
e1d0f55a7f
38 changed files with 1398 additions and 206 deletions
  1. 94 20
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  2. 49 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  3. 14 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  4. 14 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java
  5. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskExecutor.java
  6. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProjectVO.java
  7. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  9. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserMapper.java
  10. 6 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  11. 23 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  12. 481 11
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  13. 10 11
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  14. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  15. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ListUtil.java
  16. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  17. 70 13
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  18. 17 8
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  19. 12 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  20. BIN
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/员工工时导入模板_新版.xlsx
  21. 10 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ReportController.java
  22. 4 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java
  23. 3 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanProcedureTotalServiceImpl.java
  24. 11 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  25. 145 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  26. 2 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProdProcedureTeamMapper.xml
  27. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ReportMapper.xml
  28. BIN
      fhKeeper/formulahousekeeper/ops-platform/octopus.2023-11-10.log.gz
  29. 2 2
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application-dev.yml
  30. 9 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/workView.vue
  31. 71 8
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue
  32. 63 26
      fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue
  33. 8 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  34. 0 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  35. 4 3
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  36. 180 39
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  37. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  38. 72 15
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

+ 94 - 20
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -344,6 +344,7 @@ public class ReportController {
                                   Integer[] extraField1,
                                   Integer[] extraField2,
                                   Integer[] extraField3,
+                                  Integer[] sapServiceId,//依斯贝的服务Id
                                   String summary         //针对工作总结的字段
                                     ) {
         List<Report> reportList = new ArrayList<>();
@@ -477,6 +478,12 @@ public class ReportController {
                 professionProgress[i] = null;
             }
         }
+        if (sapServiceId == null) {
+            sapServiceId = new Integer[projectId.length];
+            for (int i=0;i<sapServiceId.length; i++) {
+                sapServiceId[i] = null;
+            }
+        }
         if (company.getPackageProject() == 1) {
             //检查是否设置了预算的工时预警
             ProjectBasecostSetting alarmSetting = projectBasecostSettingMapper.selectOne(new QueryWrapper<ProjectBasecostSetting>()
@@ -685,7 +692,6 @@ public class ReportController {
                 LocalDate curMonthDeadline = LocalDate.now().withDayOfMonth(compTimeType.getFillMonthOnDay());
                 if (createDate.length > 0) {
                     String createDateOne = createDate[0];
-                    //日期都是一样的,取第一个就行了
                     if (fillMonths == 2) {
                         //补填到上个月的情况,要检查当前日期,是否在设置的日期之前
                         LocalDate lastMonth = LocalDate.now().minusMonths(1);
@@ -705,15 +711,20 @@ public class ReportController {
                                 }
                             }
                         } else {
-                            //单日填报,检查日期是否早于限制时间
-                            if (LocalDate.parse(createDateOne, dateTimeFormatter).isBefore(targetDate)) {
-                                isForbidden = true;
-                            } else {
-                                if (LocalDate.parse(createDateOne, dateTimeFormatter).getMonth().getValue() == lastMonth.getMonth().getValue()) {
-                                    //补填到上个月的情况,要检查当前日期,是否在设置的日期之前
-                                    if (LocalDate.now().isAfter(curMonthDeadline)) {
-                                        isForbidden = true;
-                                        isLastMonthFail = true;
+                            //单日或者按周填报
+                            String checkDate = getCheckDate(createDate, id);
+                            //可能返回的是Null,表示都是待审核或者已通过的
+                            if (checkDate != null) {
+                                //检查目标是否早于限制时间
+                                if (LocalDate.parse(checkDate, dateTimeFormatter).isBefore(targetDate)) {
+                                    isForbidden = true;
+                                } else {
+                                    if (LocalDate.parse(checkDate, dateTimeFormatter).getMonth().getValue() == lastMonth.getMonth().getValue()) {
+                                        //补填到上个月的情况,要检查当前日期,是否在设置的日期之前
+                                        if (LocalDate.now().isAfter(curMonthDeadline)) {
+                                            isForbidden = true;
+                                            isLastMonthFail = true;
+                                        }
                                     }
                                 }
                             }
@@ -727,10 +738,14 @@ public class ReportController {
                                 isForbidden = true;
                             }
                         } else {
-                            //单日填报,检查日期是否早于限制时间
-                            if (LocalDate.parse(createDateOne, dateTimeFormatter).isBefore(targetDate)) {
-                                isForbidden = true;
+                            //单日填报,检查日期是否早于限制时间; //可能返回的是Null,表示都是待审核或者已通过的
+                            String checkDate = getCheckDate(createDate, id);
+                            if (checkDate != null) {
+                                if (LocalDate.parse(checkDate, dateTimeFormatter).isBefore(targetDate)) {
+                                    isForbidden = true;
+                                }
                             }
+
                         }
                     }
                 }
@@ -854,6 +869,7 @@ public class ReportController {
                             report.setExtraField1(extraField1[i]);
                             report.setExtraField2(extraField2[i]);
                             report.setExtraField3(extraField3[i]);
+                            report.setSapServiceId(sapServiceId[i]);
                             //如果是员工自由选择审批流程的方式,需要处理一下
                             if (comTimeType.getReportAuditType() == 3) {
                                 report.setAuditorSetting(auditorSettingList.get(i));
@@ -919,6 +935,7 @@ public class ReportController {
                                 report.setExtraField1(extraField1[i]);
                                 report.setExtraField2(extraField2[i]);
                                 report.setExtraField3(extraField3[i]);
+                                report.setSapServiceId(sapServiceId[i]);
                                 //如果是员工自由选择审批流程的方式,需要处理一下
                                 if (comTimeType.getReportAuditType() == 3) {
                                     report.setAuditorSetting(auditorSettingList.get(i));
@@ -986,6 +1003,7 @@ public class ReportController {
                         report.setExtraField1(extraField1[i]);
                         report.setExtraField2(extraField2[i]);
                         report.setExtraField3(extraField3[i]);
+                        report.setSapServiceId(sapServiceId[i]);
                         //如果是员工自由选择审批流程的方式,需要处理一下
                         if (comTimeType.getReportAuditType() == 3) {
                             report.setAuditorSetting(auditorSettingList.get(i));
@@ -1058,6 +1076,7 @@ public class ReportController {
                             report.setExtraField1(extraField1[i]);
                             report.setExtraField2(extraField2[i]);
                             report.setExtraField3(extraField3[i]);
+                            report.setSapServiceId(sapServiceId[i]);
                             //如果是员工自由选择审批流程的方式,需要处理一下
                             if (comTimeType.getReportAuditType() == 3) {
                                 report.setAuditorSetting(auditorSettingList.get(i));
@@ -1227,14 +1246,12 @@ public class ReportController {
                                 }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 != null && 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()+"]预算工时,无法继续提交工时");
@@ -1886,13 +1903,13 @@ public class ReportController {
     }
 
     @RequestMapping("/getNoReportUserList")
-    public HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate) {
-        return reportService.getNoReportUserList(request, startDate, endDate);
+    public HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId) {
+        return reportService.getNoReportUserList(request, startDate, endDate,noReportDeptId);
     }
 
     @RequestMapping("/exportNoReportUserList")
-    public HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate) {
-        return reportService.exportNoReportUserList(request, startDate, endDate);
+    public HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId) {
+        return reportService.exportNoReportUserList(request, startDate, endDate,noReportDeptId);
     }
 
     @RequestMapping("/exportUserDailyWorkTime")
@@ -2309,11 +2326,68 @@ public class ReportController {
     }
 
 
-    //推送工时管家工时考勤数据到SAP
+    //todo:推送工时管家工时考勤数据到SAP
     @RequestMapping("/pushProjectReportToSap")
     public HttpRespMsg pushProjectReportToSap(String startDate,String endDate,String userId){
         return reportService.pushProjectReportToSap(startDate,endDate,userId);
     }
 
+    //todo: 提供接口(威派格) 获取项目工时数据
+    @RequestMapping("/getProjectTimeCostByThird")
+    public HttpRespMsg getProjectTimeCostByThird(@RequestBody String json){
+        return reportService.geProjectTimeCostByThird(json);
+    }
+
+    //todo: 提供接口 (威派格) 获取人员工时数据
+    @RequestMapping("/getUserTimeCostByThird")
+    public HttpRespMsg getUserTimeCostByThird(@RequestBody String json){
+        return reportService.getUserTimeCostByThird(json);
+    }
+
+
+    private String getCheckDate(String[] createDate, Integer[] id) {
+        String checkDate = null;
+        String createDateOne = createDate[0];
+        if (createDate.length == 1) {
+            checkDate = createDateOne;
+        } else {
+            List<Integer> idParams = ListUtil.fromIntegers(id);
+            //只取填报过的日报id,新增加的不用检查
+            idParams = idParams.stream().filter(i->i!=-1).collect(Collectors.toList());
+            if (idParams.size() >0) {
+                //已通过或待审核的日报
+                System.out.println("=============查询已通过或者待审核的日报==================");
+                List<Report> passOrPendingReportList = reportMapper.selectList(new QueryWrapper<Report>().select("id").in("id", idParams).and(reportQueryWrapper -> reportQueryWrapper.eq("state", 1).or().eq("state", 0)));
+                if (passOrPendingReportList.size() > 0) {
+                    List<Integer> collect = passOrPendingReportList.stream().map(Report::getId).collect(Collectors.toList());
+                    for (int i=0;i<id.length; i++) {
+                        if (!collect.contains(id[i])) {
+                            if (checkDate == null) {
+                                checkDate = createDate[i];
+                            } else {
+                                //取最早的日期
+                                if (createDate[i].compareTo(checkDate) < 0) {
+                                    checkDate = createDate[i];
+                                }
+                            }
+                        }
+                    }
+                }
+            } else {
+                //全是新增的情况,取最早的一个日期
+                for (int i=0;i<createDate.length; i++) {
+                    if (checkDate == null) {
+                        checkDate = createDate[i];
+                    } else {
+                        //取最早的日期
+                        if (createDate[i].compareTo(checkDate) < 0) {
+                            checkDate = createDate[i];
+                        }
+                    }
+                }
+            }
+        }
+        return checkDate;
+    }
 }
 

+ 49 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -65,6 +65,8 @@ public class TaskController {
     @Resource
     private SysFunctionMapper sysFunctionMapper;
     @Resource
+    private SapProjectServiceMapper sapProjectServiceMapper;
+    @Resource
     private TprogressPaticipatorsService tprogressPaticipatorsService;
     @Resource
     private TaskCommentMapper taskCommentMapper;
@@ -361,12 +363,30 @@ public class TaskController {
                 return msg;
             }
         }
+        //检查前置任务是否都已经完成
+
         boolean isFinishTask = false;
         if (task.getTaskStatus() == 0) {
             task.setTaskStatus(1);
             isFinishTask = true;
             //计算排序,需要移动到最后
             Task old = taskService.getById(task.getId());
+            //检查前置任务是否都已经完成
+            if (!StringUtils.isEmpty(old.getAheadTid())) {
+                //解析JSONArray字符串
+                List<String> aheadTidList = JSONArray.parseArray(old.getAheadTid(), String.class);
+                if (aheadTidList.size() > 0) {
+                    List<Task> aheadTaskList = taskService.list(new QueryWrapper<Task>().in("id", aheadTidList));
+                    if (aheadTaskList.size() > 0) {
+                        List<Task> notFinishList = aheadTaskList.stream().filter(ahead->ahead.getTaskStatus() == 0).collect(Collectors.toList());
+                        if (notFinishList.size() > 0) {
+                            msg.setError("存在前置任务未完成:["+notFinishList.stream().map(Task::getName).collect(Collectors.joining(","))+"]。");
+                            return msg;
+                        }
+                    }
+                }
+            }
+
             if (old.getFinishDate() == null) {
                 //仅对没有完成日期的任务设置完成日期
                 task.setFinishDate(LocalDate.now());
@@ -565,6 +585,7 @@ public class TaskController {
         return msg;
     }
 
+
     @RequestMapping("/getTaskOnlyList")
     public HttpRespMsg getTaskOnlyList(Integer projectId) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -747,14 +768,14 @@ public class TaskController {
 
     @RequestMapping("/getRecentTask")
     public HttpRespMsg getRecentTask(Integer projectId,
-                                     @RequestParam(required = false, defaultValue = "0") Integer isSubstitude) {
+                                     @RequestParam(required = false, defaultValue = "0") Integer isSubstitude, String stage, Integer groupId) {
         HttpRespMsg msg = new HttpRespMsg();
         String userId = request.getHeader("Token");
         if (isSubstitude == 0) {
-            msg.data = taskMapper.recentSimpleList(projectId, userId);
+            msg.data = taskMapper.recentSimpleList(projectId, userId, stage, groupId);
         } else {
             //代填的情况,获取的是项目中的所有任务
-            msg.data = taskMapper.recentSimpleList(projectId, null);
+            msg.data = taskMapper.recentSimpleList(projectId, null, stage, groupId);
         }
 
         return msg;
@@ -1005,5 +1026,30 @@ public class TaskController {
         httpRespMsg.data=meetingInfo;
         return httpRespMsg;
     }
+
+    //获取当前用户在任务上参与的服务
+    @RequestMapping("/getMyTaskService")
+    public HttpRespMsg getMyTaskService(Integer taskId) throws Exception {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        String userId = request.getHeader("token");
+        System.out.println(userId+"======="+taskId);
+        List<TaskExecutor> taskExecutors = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("executor_id", userId).eq("task_id", taskId));
+        List<Integer> serviceIds = new ArrayList<>();
+        for (TaskExecutor executor : taskExecutors) {
+            Integer serviceId = executor.getServiceId();
+            if (!StringUtils.isEmpty(serviceId)) {
+                serviceIds.add(serviceId);
+            }
+        }
+        if (serviceIds.size() > 0) {
+            List<SapProjectService> dataList = sapProjectServiceMapper.selectList(new QueryWrapper<SapProjectService>().in("id", serviceIds));
+            httpRespMsg.data = dataList;
+        } else {
+            httpRespMsg.data = new ArrayList<>();
+        }
+        return httpRespMsg;
+    }
+
+
 }
 

+ 14 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java

@@ -20,12 +20,11 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
- *
+ * 
  * </p>
  *
  * @author Seyason
- * @since 2023-12-05
- */
+ * @since 2023-08-10 */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
@@ -388,6 +387,16 @@ public class Report extends Model<Report> {
     @TableField("extra_field3")
     private Integer extraField3;
 
+    @TableField(exist = false)
+    private List<ProFunWorkContext> workContentList;
+
+    @TableField(exist = false)
+    private Integer extraField2Name;
+
+    @TableField(exist = false)
+    private Integer extraField3Name;
+
+
     /**
      * SAP项目服务ID
      */
@@ -395,13 +404,10 @@ public class Report extends Model<Report> {
     private Integer sapServiceId;
 
     @TableField(exist = false)
-    private List<ProFunWorkContext> workContentList;
-
-    @TableField(exist = false)
-    private Integer extraField2Name;
+    private String sapServiceName;
 
     @TableField(exist = false)
-    private Integer extraField3Name;
+    private List<SapProjectService> serviceList;
 
     @Override
     protected Serializable pkVal() {

+ 14 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java

@@ -21,7 +21,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-12-05
+ * @since 2023-12-06
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -214,18 +214,6 @@ public class Task extends Model<Task> {
     @TableField("meeting_id")
     private String meetingId;
 
-    /**
-     * 前置任务ids,多个逗号隔开
-     */
-    @TableField("ahead_tid")
-    private String aheadTid;
-
-    /**
-     * SAP项目任务编号
-     */
-    @TableField("sap_task_code")
-    private String sapTaskCode;
-
     @TableField(exist = false)
     private List<TaskExecutor> executorList;
 
@@ -242,6 +230,19 @@ public class Task extends Model<Task> {
     @TableField(exist = false)
     private boolean canAddTask;
 
+    /**
+     * 前置任务ids,多个逗号隔开
+     */
+    @TableField("ahead_tid")
+    private String aheadTid;
+
+    /**
+     * SAP项目任务编号
+     */
+    @TableField("sap_task_code")
+    private String sapTaskCode;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -19,7 +19,7 @@ import java.util.List;
  * </p>
  *
  * @author Seyason
- * @since 2023-12-05
+ * @since 2023-12-13
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -65,7 +65,7 @@ public class TaskExecutor extends Model<TaskExecutor> {
      * SAP项目服务ID
      */
     @TableField("service_id")
-    private String serviceId;
+    private Integer serviceId;
 
 
     @Override

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProjectVO.java

@@ -20,5 +20,7 @@ public class ProjectVO extends Project {
     String statusName;
     String projectMainName;
     String levelName;
+    String projectAuditorName;
+    String projectAuditorId;
     List<Map<String,Object>> providerInfoList;
 }

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

@@ -191,4 +191,10 @@ public interface ReportMapper extends BaseMapper<Report> {
     List<Map<String, Object>> getProjectPlanData(Integer companyId, String startDate, String endDate);
 
     List<String> getUserIds(ArrayList<Integer> deptIds, String startDate, String endDate);
+
+    List<Map<String, Object>> getProjectTimeCost(Integer companyId,Integer projectId);
+
+    List<Map<String, Object>> getProjectMainTimeCost(Integer companyId,String requestProjectMainCode);
+
+    List<Map<String, Object>> getTaskGroupPlanTime(@Param("list") List<Integer> projectIds);
 }

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

@@ -39,7 +39,7 @@ public interface TaskMapper extends BaseMapper<Task> {
 
     List getTaskWithProjectName(@Param(Constants.WRAPPER) Wrapper wrapper, Integer pageStart, Integer pageSize,Integer companyId,List<Integer> deptIds);
 
-    List recentSimpleList(Integer projectId, String userId);
+    List recentSimpleList(Integer projectId, String userId, String stage, Integer groupId);
 
     @Update("update task set executor_id = null, executor_name = null, executor_color=null where id=#{id}")
     void removeTaskExecutor(Integer id);

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

@@ -28,7 +28,7 @@ public interface UserMapper extends BaseMapper<User> {
 
     List<Map<String, Object>> getUserByDepartmentList(Page page,
                                                       @Param("companyId") Integer companyId,
-                                                      @Param("departmentIds") List departmentIds, String keyword, Integer status, @Param("roleId") Integer roleId);
+                                                      @Param("departmentIds") List departmentIds,Integer matchingType, String keyword, Integer status, @Param("roleId") Integer roleId);
 
     List<Map<String, Object>> getPushUserList(@Param("companyId") Integer companyId,Integer alertType, String date);
 

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

@@ -82,11 +82,11 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg getlastWeekFillTime(String userId);
 
-    HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate);
+    HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId);
 
     List<Map<String, Object>> getNotFullReportUserList(Integer companyId, LocalDate startDate, LocalDate endDate);
 
-    HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate);
+    HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId);
 
     HttpRespMsg approveAllImport(HttpServletRequest request);
 
@@ -135,4 +135,8 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg pushProjectReportToSap(String startDate, String endDate,String userId);
 
     HttpRespMsg getReportById(Integer reportId, HttpServletRequest request);
+
+    HttpRespMsg geProjectTimeCostByThird(String json);
+
+    HttpRespMsg getUserTimeCostByThird(String json);
 }

+ 23 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -618,6 +618,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
             long end = System.currentTimeMillis();
             List<String> stringList = providerCategoryList.stream().map(ProviderCategory::getProviderCategoryName).distinct().collect(Collectors.toList());
+            //处理项目日报审核人
+            if(projectIds.size()>0){
+                List<ProjectAuditor> projectAuditorList = projectAuditorMapper.selectList(new LambdaQueryWrapper<ProjectAuditor>().in(ProjectAuditor::getProjectId, projectIds));
+                list.forEach(l->{
+                    Optional<ProjectAuditor> first = projectAuditorList.stream().filter(p -> p.getProjectId().equals(l.getId())).findFirst();
+                    if(first.isPresent()){
+                        l.setProjectAuditorName(first.get().getAuditorName());
+                        l.setProjectAuditorId(first.get().getAuditorId());
+                    }
+                });
+            }
             //stringList.add("未分类");
             stringList.add(MessageUtils.message("excel.unclassified"));
             Long total = projectIPage.getTotal();
@@ -1834,37 +1845,37 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             }
                             if (withPercent == 1) {
                                 //工时占比
-                                membRowData.add(String.valueOf(new BigDecimal((Double)resultList.get(0).get("cost")/curUserTotalTime*100).setScale(1, BigDecimal.ROUND_HALF_UP))+"%");
+                                membRowData.add(String.valueOf(new BigDecimal((Double)resultList.get(0).get("cost")/curUserTotalTime*100).setScale(2, BigDecimal.ROUND_HALF_UP))+"%");
                             }
                             costTime += (Double)resultList.get(0).get("cost");
                             moneyCost = moneyCost.add((BigDecimal)resultList.get(0).get("costMoney"));
                         }else{
                             if ("hours".equals(exportContent) && functionTimeList.size()>0){
-                                membRowData.add("");
+                                membRowData.add("0");
                             }else if ("cost".equals(exportContent) && functionCostList.size()>0){
-                                membRowData.add("");
+                                membRowData.add("0");
                             }else {
                                 if(functionTimeList.size()>0){
-                                    membRowData.add("");
+                                    membRowData.add("0");
                                 }
                                 if(functionCostList.size()>0){
-                                    membRowData.add("");
+                                    membRowData.add("0");
                                 }
                             }
                             if (withPercent == 1) {
                                 //工时占比
-                                membRowData.add("");
+                                membRowData.add("0");
                             }
                         }
                     }
 
                     if ("hours".equals(exportContent) && functionTimeList.size()>0){
-                        membRowData.add(""+new BigDecimal(costTime).setScale(1, BigDecimal.ROUND_HALF_UP));
+                        membRowData.add(""+new BigDecimal(costTime).setScale(2, BigDecimal.ROUND_HALF_UP));
                     }else if ("cost".equals(exportContent) && functionCostList.size()>0){
                         membRowData.add(moneyCost.toString());
                     }else {
                         if(functionTimeList.size()>0){
-                            membRowData.add(""+new BigDecimal(costTime).setScale(1, BigDecimal.ROUND_HALF_UP));
+                            membRowData.add(""+new BigDecimal(costTime).setScale(2, BigDecimal.ROUND_HALF_UP));
                         }
                         if(functionCostList.size()>0){
                             membRowData.add(moneyCost.toString());
@@ -11477,7 +11488,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 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()));
+                                Task three = taskMapper.selectOne(new LambdaQueryWrapper<Task>().eq(Task::getProjectId, task.getProjectId()).eq(Task::getSapTaskCode,task.getSapTaskCode()).eq(Task::getGroupId, task.getGroupId()).eq(Task::getStagesId, task.getStagesId()));
                                 if(three!=null){
                                     task.setId(three.getId());
                                 }
@@ -11526,7 +11537,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 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()));
+                                Task two = taskMapper.selectOne(new LambdaQueryWrapper<Task>().eq(Task::getProjectId, task.getProjectId()).eq(Task::getSapTaskCode,task.getSapTaskCode()).eq(Task::getGroupId, task.getGroupId()).eq(Task::getStagesId, task.getStagesId()));
                                 if(two!=null){
                                     task.setId(two.getId());
                                 }
@@ -11538,7 +11549,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 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()));
+                                Stages one = stagesMapper.selectOne(new QueryWrapper<Stages>().eq("project_id", project.getId()).eq("stages_code", targetStage.getProjectElementID()).eq("group_id",stage.getGroupId()));
                                 if(one!=null){
                                     stage.setId(one.getId());
                                 }
@@ -11564,7 +11575,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             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()));
+                            Task one = taskMapper.selectOne(new LambdaQueryWrapper<Task>().eq(Task::getProjectId, task.getProjectId()).eq(Task::getSapTaskCode,targetTask.getProjectElementID()).eq(Task::getGroupId, task.getGroupId()).eq(Task::getStagesId, task.getStagesId()));
                             if(one!=null){
                                 task.setId(one.getId());
                             }

+ 481 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -149,6 +149,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private ProjectMapper projectMapper;
     @Resource
+    private SapProjectServiceMapper sapProjectServiceMapper;
+    @Resource
     private CompanyDingdingService companyDingdingService;
     @Resource
     private InformationMapper informationMapper;
@@ -194,12 +196,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private DepartmentOtherManagerMapper departmentOtherManagerMapper;
     @Resource
     private ExcelExportService excelExportService;
+    @Resource
+    private ProjectMainMapper projectMainMapper;
     @Autowired
     RestTemplate restTemplate;
 
     @Resource
     private ReportAuditLogService reportAuditLogService;
     @Resource
+    private TaskExecutorMapper taskExecutorMapper;
+    @Resource
     private TimeTypeService timeTypeService;
     @Resource
     private HttpServletRequest request;
@@ -573,6 +579,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             }
+            //为依斯贝增加日报的服务名称显示
+            if (user.getCompanyId() == 3092) {
+                List<SapProjectService> alLServiceList = sapProjectServiceMapper.selectList(new QueryWrapper<SapProjectService>().eq("company_id", user.getCompanyId()));
+                for (Map map : nameList) {
+                    List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
+                    for (Map<String, Object> report : reportList) {
+                        Integer sapServiceId = (Integer)report.get("sapServiceId");
+                        Optional<SapProjectService> first = alLServiceList.stream().filter(d->d.getId().equals(sapServiceId)).findFirst();
+                        if (first.isPresent()) {
+                            SapProjectService divItem = first.get();
+                            report.put("sapServiceName", divItem.getServiceName());
+                        }
+                    }
+                }
+            }
             httpRespMsg.data = nameList;
         } catch (NullPointerException e) {
             e.printStackTrace();
@@ -626,7 +647,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //获取当前项目的子项目列表,任务分组,任务列表,项目相关维度列表
             reports.forEach(r->{
                 r.setSubProjectList(subProjectList.stream().filter(s->s.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
-                r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId));
+                r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId, r.getStage(), r.getGroupId()));
                 //获取当前项目的工程专业进度
                 List<ReportProfessionProgress> progressList = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().eq("report_id", r.getId()));
                 //去掉当前项目上已经不存在的专业
@@ -773,6 +794,30 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     List<ProFunWorkContext> workContentList = ((List<ProFunWorkContext>)funWorkContextList.data);
                     r.setWorkContentList(workContentList);
                 }
+                //依斯贝要返回服务
+                if (companyId == 3092) {
+                    Integer taskId = r.getTaskId();
+                    if (taskId != null) {
+                        List<TaskExecutor> taskExecutors = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", taskId).eq("executor_id", r.getCreatorId()));
+                        List<Integer> serviceIds = new ArrayList<>();
+                        for (TaskExecutor executor : taskExecutors) {
+                            Integer serviceId = executor.getServiceId();
+                            if (!StringUtils.isEmpty(serviceId)) {
+                                serviceIds.add(serviceId);
+                            }
+                        }
+                        if (serviceIds.size() > 0) {
+                            List<SapProjectService> sapSList = sapProjectServiceMapper.selectList(new QueryWrapper<SapProjectService>().in("id", serviceIds));
+                            r.setServiceList(sapSList);
+                            Optional<SapProjectService> first = sapSList.stream().filter(s -> s.getId().equals(r.getSapServiceId())).findFirst();
+                            if (first.isPresent()) {
+                                r.setSapServiceName(first.get().getServiceName());
+                            }
+                        } else {
+                            r.setServiceList(new ArrayList<>());
+                        }
+                    }
+                }
             });
             resultMap.put("report", reports);
             TimeType timeType = timeTypeMapper.selectById(companyId);
@@ -853,7 +898,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //获取当前项目的子项目列表,任务分组,任务列表,项目相关维度列表
             Report r = report;
             r.setSubProjectList(subProjectList.stream().filter(s->s.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
-            r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId));
+            r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId, r.getStage(), r.getGroupId()));
             //获取当前项目的工程专业进度
             List<ReportProfessionProgress> progressList = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().eq("report_id", r.getId()));
             //去掉当前项目上已经不存在的专业
@@ -1571,6 +1616,19 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 targetUids = ListUtil.convertLongIdsArrayToList(userId);
             }
             List<Map<String, Object>> auditReportList = reportMapper.getAuditReportList(date, companyId, departmentId, projectId, leaderId, isEngeering, startDate, endDate, targetUids);
+            //针对依斯贝增加服务名称显示
+            if (companyId == 3092) {
+                List<SapProjectService> serviceList = sapProjectServiceMapper.selectList(new QueryWrapper<SapProjectService>().eq("company_id", companyId));
+                for (Map<String, Object> mapItem : auditReportList) {
+                    Integer sapServiceId = (Integer)mapItem.get("sapServiceId");
+                    if (sapServiceId != null) {
+                        Optional<SapProjectService> first = serviceList.stream().filter(s -> s.getId().equals(sapServiceId)).findFirst();
+                        if (first.isPresent()) {
+                            mapItem.put("sapServiceName", first.get().getServiceName());
+                        }
+                    }
+                }
+            }
             //抽取姓名,进行分组
             List<Map<String, Object>> nameList = new ArrayList<Map<String, Object>>();
             Map<String, Object> lastName = null;
@@ -2847,9 +2905,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
 
             ArrayList<DepartmentVO> realMDeptList = new ArrayList<>();
-            for (Department d : allMDeptList) {
-                realMDeptList.addAll(getSpecifiedDept(list, d.getDepartmentId()));
+            //存在负责的部门,需要查询所有子部门
+            if (allMDeptList.size() > 0) {
+                HttpRespMsg departmentList = departmentService.getDepartmentList(request);
+                list = (List<DepartmentVO>) departmentList.data;
+                for (Department d : allMDeptList) {
+                    realMDeptList.addAll(getSpecifiedDept(list, d.getDepartmentId()));
+                }
             }
+
             //去掉第一层的部门是其他第一层部门的子部门的数据
 
             for (int i=0;i<realMDeptList.size(); i++) {
@@ -2862,7 +2926,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
 
             list = realMDeptList;
-            System.out.println("负责部门的数量:"+list.size());
         }
 
         if (list.size() > 0) {
@@ -4705,6 +4768,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (ExcelUtil.isRowEmpty(row)) {
                     continue;
                 }
+                //设置字符格式,防止纯数字工号读取时报错
+                row.getCell(1).setCellType(CellType.STRING);
                 String username = row.getCell(1).getStringCellValue().trim();
 
                 if (rowIndex == 0) {
@@ -4826,8 +4891,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             return msg;
                         }
                     }
-                    String workContent = row.getCell(7)==null?null:row.getCell(7).getStringCellValue();
-                    String stringCellValue = row.getCell(8)==null?null:row.getCell(8).getStringCellValue();
+                    String stringCellValue = row.getCell(7)==null?null:row.getCell(7).getStringCellValue();
+                    String workContent = row.getCell(8)==null?null:row.getCell(8).getStringCellValue();
                     double time = 0;
                     if (!StringUtils.isEmpty(stringCellValue)) {
                         time = Double.parseDouble(stringCellValue);
@@ -5011,6 +5076,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             titles.add(MessageUtils.message("entry.department"));
             titles.add(MessageUtils.message("entry.projectId"));
             titles.add(MessageUtils.message("entry.projectName"));
+            if(companyId==936){
+                titles.add("项目状态");
+                titles.add("自主项目类别");
+            }
             titles.add(MessageUtils.message("entry.projectType"));
             if(timeType.getMainProjectState()==1){
                 //titles.add("主项目名称");
@@ -5264,6 +5333,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
                 item.add((String) map.get("projectCode"));
                 item.add((String) map.get("project"));
+                if(companyId==936){
+                    String projectStatus="";
+                    switch (Integer.valueOf(String.valueOf(map.get("projectStatus")))){
+                        case 1:projectStatus="进行中";
+                            break;
+                        case 2:projectStatus="已完成";
+                            break;
+                        case 3:projectStatus="已撤销";
+                            break;
+                        case 4:projectStatus="暂停";
+                            break;
+                    }
+                    item.add(projectStatus.equals("已完成")?projectStatus+"("+map.get("finishDate")+")":projectStatus);
+                    item.add((String)map.get("projectCategorySub"));
+                }
                 item.add((String) map.get("categoryName"));
                 if(timeType.getMainProjectState()==1){
                     item.add((String) map.get("projectMainName"));
@@ -5615,12 +5699,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate) {
+    public HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId) {
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("TOKEN"));
         List<User> allRangeUserList = new ArrayList<>();
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        //获取部门的所有子部门
+        List<Department> departments = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
+        List<Integer> branchDepartment = null;
+        if(noReportDeptId != null){
+            branchDepartment = departmentService.getBranchDepartment(Integer.valueOf(noReportDeptId),departments);
+        }
         List<Map<String, Object>> list = null;
         //分角色权限:管理员看全部的,部门负责人看自己部门的,个人只能看自己的。
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
@@ -5687,6 +5777,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<Report> deniedReportList = reportMapper.selectList(new QueryWrapper<Report>().eq("company_id", companyId).eq("state", 2).between("create_date", startDate, endDate));
         List<Report> waitingSubmitReportList = reportMapper.selectList(new QueryWrapper<Report>().eq("company_id", companyId).eq("state", 3).between("create_date", startDate, endDate));
         //按人员过滤
+        if(branchDepartment!=null&&branchDepartment.size()>0){
+            List<Integer> finalBranchDepartment = branchDepartment;
+            allRangeUserList=allRangeUserList.stream().filter(at-> finalBranchDepartment.contains(at.getDepartmentId())).collect(Collectors.toList());
+        }
         for (User curUser: allRangeUserList){
                 for (int i=0;i<=cnt; i++) {
                     LocalDate date = localStart.plusDays(i);
@@ -5848,8 +5942,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate) {
-        HttpRespMsg msg = getNoReportUserList(request, startDate, endDate);
+    public HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId) {
+        HttpRespMsg msg = getNoReportUserList(request, startDate, endDate,noReportDeptId);
         String token = request.getHeader("TOKEN");
         TimeType timeType = timeTypeMapper.selectById(userMapper.selectById(token).getCompanyId());
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", userMapper.selectById(token).getCompanyId()));
@@ -6858,7 +6952,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reports.forEach(r->{
                 r.setContent(null);
                 r.setSubProjectList(subProjectList.stream().filter(s->s.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
-                r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId));
+                r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId, r.getStage(), r.getGroupId()));
                 //获取当前项目的工程专业进度
                 List<ReportProfessionProgress> progressList = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().eq("report_id", r.getId()));
                 //去掉当前项目上已经不存在的专业
@@ -7493,4 +7587,380 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
         }
     }
+
+    @Override
+    public HttpRespMsg geProjectTimeCostByThird(String json) {
+        HttpRespMsg msg=new HttpRespMsg();
+        JSONObject requestData = JSONObject.parseObject(json);
+        if(requestData.get("header")==null){
+            msg.setError("Request Parameter Parsing Error,Unable to find 'header'");
+            return msg;
+        }
+        JSONObject requestHeader = JSONObject.parseObject(String.valueOf(requestData.get("header")));
+        if(requestData.get("projectQuery")==null){
+            msg.setError("Request Parameter Parsing Error,Unable to find 'projectQuery'");
+            return msg;
+        }
+        JSONObject requestProjectQuery = JSONObject.parseObject(String.valueOf(requestData.get("projectQuery")));
+        if(requestHeader.get("token")==null){
+            msg.setError("Request Parameter Parsing Error,Unable to find 'token'");
+            return msg;
+        }
+        String requestToken = String.valueOf(requestHeader.get("token"));
+        List<ThirdPartyInterface> thirdPartyInterfaces = thirdPartyInterfaceMapper.selectList(new QueryWrapper<ThirdPartyInterface>().eq("token", requestToken));
+        if(thirdPartyInterfaces.size()<=0){
+            msg.setError("Validation failed,'token' is Error");
+            return msg;
+        }
+        if(LocalDateTime.now().isAfter(thirdPartyInterfaces.get(0).getExpireTime())){
+            msg.setError("'token' is Expire");
+            return msg;
+        }
+        if(requestProjectQuery.get("projectMainCode")==null){
+            msg.setError("Request Parameter Parsing Error,Unable to find 'projectMainCode'");
+            return msg;
+        }
+        String requestProjectCode = String.valueOf(requestProjectQuery.get("projectMainCode"));
+        Project project = projectMapper.selectOne(new LambdaQueryWrapper<Project>().eq(Project::getProjectCode, requestProjectCode).eq(Project::getCompanyId,thirdPartyInterfaces.get(0).getCompanyId()));
+        if(project==null){
+            msg.setError("'projectMainCode'["+requestProjectCode+"] is Not Exist");
+            return msg;
+        }
+        Map<String,Object> responseData=new HashMap<>();
+        ProjectMain projectMain = projectMainMapper.selectOne(new LambdaQueryWrapper<ProjectMain>().eq(ProjectMain::getId, project.getProjectMainId()));
+//        List<Integer> projectMainIds = projectMainTimeCostList.stream().map(p -> Integer.valueOf(String.valueOf(p.get("pmId")))).distinct().collect(Collectors.toList());
+//        projectMainIds.add(-1);
+        List<Map<String,Object>> projectTimeCostList=reportMapper.getProjectTimeCost(thirdPartyInterfaces.get(0).getCompanyId(),project.getId());
+        List<Integer> projectIds = projectTimeCostList.stream().map(p -> Integer.valueOf(String.valueOf(p.get("projectId")))).distinct().collect(Collectors.toList());
+        projectIds.add(-1);
+        List<Map<String,Object>> taskGroupPlanTimeList=reportMapper.getTaskGroupPlanTime(projectIds);
+        List<Integer> groupIds = taskGroupPlanTimeList.stream().map(t -> Integer.valueOf(String.valueOf(t.get("groupId")))).distinct().collect(Collectors.toList());
+        groupIds.add(-1);
+        List<Report> reportList = reportMapper.selectList(new LambdaQueryWrapper<Report>().in(Report::getGroupId, groupIds).and(wrapper -> wrapper.eq(Report::getState, 0).or().eq(Report::getState, 1)));
+        for (Map<String, Object> map : taskGroupPlanTimeList) {
+            BigDecimal workingTime = reportList.stream().filter(r -> r.getGroupId().equals(map.get("groupId"))).map(r -> new BigDecimal(r.getWorkingTime())).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal bigDecimal=new BigDecimal(String.valueOf(map.get("planTime")));
+            bigDecimal=bigDecimal.subtract(workingTime);
+            map.put("realityTime",workingTime.doubleValue());
+            map.put("isOver",bigDecimal.doubleValue()<0?"是":"否");
+            map.put("remaining",bigDecimal.doubleValue()>0?bigDecimal.doubleValue():0);
+        }
+        projectTimeCostList.forEach(pt->{
+            List<Map<String, Object>> mapList = taskGroupPlanTimeList.stream().filter(t -> t.get("projectId").equals(pt.get("projectId"))).collect(Collectors.toList());
+            switch (Integer.valueOf(pt.get("status").toString())){
+                case 1:pt.put("status","进行中");
+                    break;
+                case 2:pt.put("status","已完成");
+                    break;
+                case 3:pt.put("status","已撤销");
+                    break;
+                case 4:pt.put("status","暂停");
+                    break;
+            }
+            pt.put("projectGroupData",mapList);
+        });
+        responseData.put("projectArrays",projectTimeCostList);
+        msg.setData(responseData);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getUserTimeCostByThird(String json) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        DateFormat timeDf = new SimpleDateFormat("yyyy-MM-dd");
+        JSONObject requestData = JSONObject.parseObject(json);
+        if(requestData.get("header")==null){
+            httpRespMsg.setError("Request Parameter Parsing Error,Unable to find 'header'");
+            return httpRespMsg;
+        }
+        JSONObject requestHeader = JSONObject.parseObject(String.valueOf(requestData.get("header")));
+        if(requestData.get("memberQuery")==null){
+            httpRespMsg.setError("Request Parameter Parsing Error,Unable to find 'memberQuery'");
+            return httpRespMsg;
+        }
+        JSONObject memberQueryQuery = JSONObject.parseObject(String.valueOf(requestData.get("memberQuery")));
+        if(requestHeader.get("token")==null){
+            httpRespMsg.setError("Request Parameter Parsing Error,Unable to find 'token'");
+            return httpRespMsg;
+        }
+        String requestToken = String.valueOf(requestHeader.get("token"));
+        List<ThirdPartyInterface> thirdPartyInterfaces = thirdPartyInterfaceMapper.selectList(new QueryWrapper<ThirdPartyInterface>().eq("token", requestToken));
+        if(thirdPartyInterfaces.size()<=0){
+            httpRespMsg.setError("Validation failed,'token' is Error");
+            return httpRespMsg;
+        }
+        Integer companyId = thirdPartyInterfaces.get(0).getCompanyId();
+        Company company = companyMapper.selectById(companyId);
+        if(LocalDateTime.now().isAfter(thirdPartyInterfaces.get(0).getExpireTime())){
+            httpRespMsg.setError("'token' is Expire");
+            return httpRespMsg;
+        }
+        if(memberQueryQuery.get("personnelId")==null&&memberQueryQuery.get("organizationId")==null){
+            httpRespMsg.setError("Request Parameter Parsing Error,Unable to find 'personnelId' or 'organizationId',There must be a non empty parameter");
+            return httpRespMsg;
+        }
+        if(memberQueryQuery.get("startDate")==null||memberQueryQuery.get("endDate")==null){
+            httpRespMsg.setError("The date range cannot be empty");
+            return httpRespMsg;
+        }
+        String startDate = String.valueOf(memberQueryQuery.get("startDate"));
+        String endDate = String.valueOf(memberQueryQuery.get("endDate"));
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate start = LocalDate.parse(startDate, dateTimeFormatter);
+        LocalDate end = LocalDate.parse(endDate, dateTimeFormatter);
+        if (start.until(end, ChronoUnit.DAYS) > 365) {
+            httpRespMsg.setError("The time interval shall not exceed one year");
+            return httpRespMsg;
+        }
+        String userId =null;
+        String departmentId =null;
+        Integer stateKey =0;
+        if(memberQueryQuery.get("personnelId")!=null){
+            userId = String.valueOf(memberQueryQuery.get("personnelId"));
+            User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getJobNumber, userId));
+            if(user!=null){
+                userId=user.getId();
+            }
+        }
+        if(memberQueryQuery.get("organizationId")!=null){
+            departmentId = String.valueOf(memberQueryQuery.get("organizationId"));
+            Department department = departmentMapper.selectOne(new LambdaQueryWrapper<Department>().eq(Department::getCorpwxDeptid, departmentId));
+            if(department!=null){
+                departmentId = String.valueOf(department.getDepartmentId());
+            }
+
+        }
+        if(memberQueryQuery.get("stateKey")!=null){
+            stateKey = Integer.valueOf(String.valueOf(memberQueryQuery.get("stateKey")));
+        }
+        Map<String,Object> responseData=new HashMap<>();
+        //检查模式,是否是一个项目多个工作事项的情况
+        TimeType timeType = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id",companyId));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        List<Map<String,Object>> dataList=new ArrayList<>();
+
+        List<HashMap<String, Object>> allReportByDate = null;
+
+        //获取部门的所有子部门
+        List<Department> departments = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
+        List<Integer> branchDepartment = null;
+        if(departmentId != null){
+            branchDepartment = departmentService.getBranchDepartment(Integer.valueOf(departmentId),departments);
+        }
+        //看公司所有人的
+        if (timeType.getShowFillauditTime() == 1) {
+            allReportByDate = reportMapper.getAllReportByDateWithReportLog(startDate, companyId, userId, endDate, null,stateKey,branchDepartment);
+        } else {
+            allReportByDate = reportMapper.getAllReportByDate(startDate,companyId, userId, endDate, null,stateKey,branchDepartment);
+        }
+        if (timeType.getMultiWorktime() == 1) {
+            java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00");
+            //重新处理一下数据,把工作时间和工作事项移出来
+            List<HashMap<String, Object>> dealDataList = new ArrayList<HashMap<String, Object>>();
+            for (HashMap<String, Object> map : allReportByDate) {
+                if ((Integer)map.get("multiWorktime") == 1) {
+                    String data = (String)map.get("content");
+                    Integer isOvertime = (Integer) map.get("isOvertime");
+                    JSONArray array = JSONArray.parseArray(data);
+                    if (array != null) {
+                        for (int i=0;i<array.size(); i++) {
+                            JSONObject obj = array.getJSONObject(i);
+                            WorktimeItem worktimeItem = JSONObject.toJavaObject(obj, WorktimeItem.class);
+                            HashMap<String, Object> newMap = new HashMap<>();
+                            newMap.putAll(map);
+                            newMap.put("startTime", worktimeItem.getStartTime());
+                            newMap.put("endTime", worktimeItem.getEndTime());
+                            newMap.put("content", worktimeItem.getContent());
+                            newMap.put("duration", df.format(worktimeItem.getTime()));
+                            //第一条填充加班
+                            if (isOvertime == 1 && i == 0) {
+                                newMap.put("isOvertime", 1);
+                                newMap.put("overtimeHours", map.get("overtimeHours"));
+                            } else {
+                                newMap.put("isOvertime", 0);
+                            }
+                            dealDataList.add(newMap);
+                        }
+                    } else {
+                        HashMap<String, Object> newMap = new HashMap<>();
+                        newMap.putAll(map);
+                        newMap.put("startTime", "");
+                        newMap.put("endTime", "");
+                        newMap.put("content", "");
+                        dealDataList.add(newMap);
+                    }
+                } else {
+                    dealDataList.add(map);
+                }
+            }
+            allReportByDate = dealDataList;
+        }
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        DecimalFormat df = new DecimalFormat("#0.0");
+        int offsetSeconds = 0;
+        if (company.getIsInternational() == 1) {
+            //国际化版本
+            LocaleInformation locale = localeInformationMapper.selectById(companyId);
+            TimeZone curZone = TimeZone.getTimeZone(locale.getTimezone());
+            offsetSeconds = (curZone.getRawOffset() - TimeZone.getTimeZone("GMT+8").getRawOffset())/1000;
+            //时区转换,默认数据库存的是GMT+8
+            for (Map<String, Object> map : allReportByDate) {
+                String createTime = sdf.format((Date)map.get("time"));
+                LocalDateTime time = LocalDateTime.parse(createTime, dtf);
+                time = time.plusSeconds(offsetSeconds);
+                map.put("time", DateTimeUtil.localDateTimeToDate(time));
+
+                //审核时间
+                if(map.get("projectAuditTime") != null){
+                    String projectAuditTime = sdf.format((Date)map.get("projectAuditTime"));
+                    LocalDateTime auditTime = LocalDateTime.parse(projectAuditTime, dtf);
+                    auditTime = auditTime.plusSeconds(offsetSeconds);
+                    map.put("projectAuditTime", DateTimeUtil.localDateTimeToDate(auditTime));
+                }else  map.put("projectAuditTime","");
+
+            }
+        }
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        long t1 = System.currentTimeMillis();
+        DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        for (Map<String, Object> map : allReportByDate) {
+            Map<String,Object> item=new HashMap<>();
+            item.put("jobNumber",(String) map.get("jobNumber"));
+            Department dept = null;
+            for (Department department : departments) {
+                if (map.containsKey("departmentId") && department.getDepartmentId().toString().equals(map.get("departmentId").toString())){
+                    dept = department;
+                    break;
+                }
+            }
+            item.put("userName",(String) map.get("name"));
+            item.put("departmentName",departmentService.getSupDepartment(dept,departments));
+            item.put("departmentId",dept.getCorpwxDeptid());
+            item.put("projectCode",(String) map.get("projectCode"));
+            item.put("projectName",(String) map.get("project"));
+            item.put("categoryName",(String) map.get("categoryName"));
+            if(timeType.getMainProjectState()==1){
+                item.put("projectMainName",(String) map.get("projectMainName"));
+            }else {
+                item.put("subProjectName",(String) map.get("subProjectName"));
+                item.put("subProjectCode",(String) map.get("subProjectCode"));
+            }
+            if (company.getPackageProject() == 1) {
+                item.put("taskName",(String) map.get("taskName"));
+            }
+            item.put("createDate",new SimpleDateFormat("yyyy-MM-dd")
+                    .format((java.sql.Date) map.get("createDate")));
+            item.put("duration",map.get("duration").toString());
+            if (timeType.getMultiWorktime() == 1) {
+                if ((Integer)map.get("multiWorktime") == 1) {
+                    item.put("multiWorktime",map.get("startTime").toString()+"-"+map.get("endTime").toString());
+                } else {
+                    item.put("multiWorktime","");
+                }
+                //加班情况
+                int isOverTime = (Integer) map.get("isOvertime");
+                item.put("overtimeHours",isOverTime==1?(df.format((double)map.get("overtimeHours"))):"-");
+            }
+            if (timeType.getMultiWorktime() == 0) {
+                int isOverTime = (Integer) map.get("isOvertime");
+                item.put("overtimeHours",isOverTime==1?(df.format((double)map.get("overtimeHours"))):"-");
+            }
+            //项目管理专业版,需要显示任务分组和投入阶段
+            if (company.getPackageProject() == 1) {
+                item.put("groupName",map.get("groupName") != null? map.get("groupName").toString():"");
+                item.put("stage",map.get("stage") != null?map.get("stage").toString():"");
+            }
+            if (timeType.getShowFillauditTime() == 1) {
+                item.put("time",sdf.format((Date)map.get("time")));
+                item.put("projectAuditorName",(String)map.get("projectAuditorName"));
+                //分组审核通过或者项目审核通过都显示
+                if (map.get("projectAuditTime") != null && ((Integer)map.get("projectAuditState") == 1 || (Integer)map.get("groupAuditState") == 1)) {
+                    item.put("projectAuditTime",sdf.format((Date)map.get("projectAuditTime")));
+                } else {
+                    item.put("projectAuditTime","");
+                }
+                StringBuilder sb = new StringBuilder();
+                boolean isFirst = true;
+                String logMsg = (String)map.get("logMsg");
+                if (logMsg != null) {
+                    String[] logMsgs = logMsg.split("❤");
+                    for (String msgItem : logMsgs) {
+                        String[] splitItems = msgItem.split("@");
+                        //operator_id@operate_date@msg
+                        String operateDateStr = splitItems[1];
+                        LocalDateTime operateDate = LocalDateTime.parse(operateDateStr, dtf);
+                        ReportLogDetail audit = new ReportLogDetail();
+                        audit.setOperatorId(splitItems[0]);
+                        audit.setOperateDate(operateDate);
+                        audit.setMsg(splitItems[2]);
+
+                        if (company.getIsInternational() == 1) {
+                            operateDate = operateDate.plusSeconds(offsetSeconds);
+                        }
+                        String time = dtf.format(operateDate);
+                        String msg= "";
+                        msg = time+" " + audit.getMsg();
+                        if (!isFirst) {
+                            sb.append("->");
+                        } else {
+                            isFirst = false;
+                        }
+                        sb.append(msg);
+                    }
+                }
+                item.put("reviewProcess",sb.toString());
+            }
+            item.put("content",(String) map.get("content"));
+            if(stateKey==1){
+                Integer state = (Integer) map.get("state");
+                switch (state){
+                    //case 0:row.createCell(index).setCellValue("待审核");
+                    case 0:item.put("state",MessageUtils.message("stages.reviewed"));
+                        break;
+                    //case 1:row.createCell(index).setCellValue("已通过");
+                    case 1:item.put("state",MessageUtils.message("stages.passed"));
+                        break;
+                }
+            }
+            //审核流程状态
+            Integer packageEngineering = company.getPackageEngineering();
+            if (packageEngineering.equals(0)){
+                if(String.valueOf(map.get("state")).equals("1")){
+                    item.put("reviewProcessState","——");
+                }else if (String.valueOf(map.get("state")).equals("-1")){
+                    item.put("reviewProcessState","导入待审核");
+                } else {
+                    //部门审核
+                    if(String.valueOf(map.get("isDeptAudit")).equals("1")){
+                        String deptAuditorId = map.get("deptAuditorName")+"";
+                        String departmentName = map.get("departmentName") + "";
+                        for (User userItem : userList) {
+                            if (userItem.getId().equals(deptAuditorId)){
+                                if(timeType.getReportAuditType()==4){
+                                    departmentName = map.get("buDepartmentName") + "";
+                                    item.put("reviewProcessState","待项目所属BU[" + departmentName + "](" + userItem.getName() + ")审核");
+                                }else {
+                                    item.put("reviewProcessState","待" + departmentName + "(" + userItem.getName() + ")审核");
+                                }
+                                break;
+                            }
+
+                        }
+                    }else {
+                        //项目审核或分组审核
+                        if (String.valueOf(map.get("projectAuditState")).equals("0") || String.valueOf(map.get("groupAuditState")).equals("0")){
+                            String projectAuditorName = map.get("projectAuditorName")+"";
+                            String projectAuditorId = map.get("projectAuditorId")+"";
+                            item.put("reviewProcessState","待项目审核人" + "(" + projectAuditorName + ")审核");
+                        }
+                    }
+                }
+            }
+            dataList.add(item);
+        }
+        responseData.put("userTimeCostArray",dataList);
+        httpRespMsg.setData(responseData);
+        return httpRespMsg;
+    }
 }

+ 10 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -848,25 +848,24 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", WXCompanyId));
         HashMap<String, Object> data = new HashMap<>();
         httpRespMsg.data=data;
-        //当企业开启了微信通讯录的情况下
-        if (org.apache.commons.lang3.StringUtils.isNotBlank(keyword) && wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1 && departmentId == -1){
+        //企业微信同步方式下,按姓名查找,需要去调用企微通讯录搜索接口
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(keyword) && wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1 && matchingType == 0){
             System.out.println("====================开始查询通讯录名单======================");
             HashMap<String, List> result = wxCorpInfoService.getOpenId(wxCorpInfo.getCorpid(), keyword, cursor,1,200);
             List users = result.get("user");
-            if (users.size()!=0&&matchingType==0){
+            if (users.size() > 0){
                 List<User> realUser = userMapper.selectList(new QueryWrapper<User>().in("corpwx_userid", users));
-
                 long total = realUser.size();
                 data.put("records",realUser);
                 data.put("nextCursor",result.get("nextCursor").get(0));
                 data.put("total",total);
             }else {
-                System.err.println("======================user列表没有查询到数据===========================");
-                System.err.println("======================httpRespMsg返回空集合===========================");
-                List<User> realUser = userMapper.selectList(new QueryWrapper<User>().eq("company_id",WXCompanyId).like(MATCHING_FILED[matchingType],keyword));
-                long total = realUser.size();
-                data.put("records",realUser);
-                data.put("nextCursor",result.get("nextCursor").get(0));
+//                System.err.println("======================user列表没有查询到数据===========================");
+//                System.err.println("======================httpRespMsg返回空集合===========================");
+//                List<User> realUser = userMapper.selectList(new QueryWrapper<User>().eq("company_id",WXCompanyId).like(MATCHING_FILED[matchingType],keyword));
+                long total = 0;
+                data.put("records",new ArrayList<>());
+                data.put("nextCursor","");
                 data.put("total",total);
             }
             return httpRespMsg;
@@ -897,7 +896,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         ids = departmentService.getDeptIncludeSubDeptIds(departmentId, allDeptList);
                     }
 
-                    list = userMapper.getUserByDepartmentList(page, companyId, ids, keyword, status, roleId);
+                    list = userMapper.getUserByDepartmentList(page, companyId, ids, matchingType, keyword, status, roleId);
                     total = page.getTotal();
                 }
                 Map<String, Object> resultMap = new HashMap<>();

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -2051,6 +2051,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     }
                 }else {
                     System.err.println("===================通讯录查询请求失败=================");
+                    System.out.println(respJson.toString());
                 }
             }
         }else {

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ListUtil.java

@@ -154,4 +154,11 @@ public class ListUtil {
 		}
 		return ids;
 	}
+	public static List<Integer> fromIntegers(Integer[] data) {
+		List<Integer> ids = new ArrayList<>();
+		for (int i : data) {
+			ids.add(i);
+		}
+		return ids;
+	}
 }

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

@@ -18,7 +18,7 @@ spring:
     url: jdbc:mysql://47.101.180.183:17089/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
     password: P011430@Huoshi*
-    
+
     hikari:
       maximum-pool-size: 60
       minimum-idle: 10

File diff suppressed because it is too large
+ 70 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml


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

@@ -30,9 +30,9 @@
         <result column="finish_date" property="finishDate" />
         <result column="start_date" property="startDate" />
         <result column="meeting_id" property="meetingId" />
+        <result column="ahead_tid" property="aheadTid" />
         <result column="sap_task_code" property="sapTaskCode" />
     </resultMap>
-
     <resultMap id="timeResultMap" type="com.management.platform.entity.TimeTask" >
         <id column="id" property="id" />
         <result column="name" property="name" />
@@ -60,6 +60,8 @@
         <result column="finish_date" property="finishDate" />
         <result column="start_date" property="startDate" />
         <result column="meeting_id" property="meetingId" />
+        <result column="ahead_tid" property="aheadTid" />
+        <result column="sap_task_code" property="sapTaskCode" />
         <result column="work_hours" property="workHours" />
     </resultMap>
     <resultMap id="RichResultMap" type="com.management.platform.entity.Task">
@@ -90,10 +92,11 @@
         <result column="project_name" property="projectName" />
         <result column="start_date" property="startDate" />
         <result column="meeting_id" property="meetingId" />
+        <result column="ahead_tid" property="aheadTid" />
+        <result column="sap_task_code" property="sapTaskCode" />
         <result column="stages_name" property="stagesName" />
         <result column="department_name" property="departmentName" />
     </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, ahead_tid, sap_task_code
@@ -109,7 +112,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>
 
     <!--计算执行人任务分布-->
@@ -131,7 +134,7 @@
     <select id="getStagesPanel" resultType="java.util.Map">
         SELECT a.stages_id AS stagesId, stages.`stages_name` AS name,  COUNT(1) AS value
         FROM task a
-        LEFT JOIN stages ON stages.id = a.`stages_id`
+            LEFT JOIN stages ON stages.id = a.`stages_id`
         WHERE a.project_id = #{projectId}
         GROUP BY a.stages_id
         ORDER BY stages.`sequence`
@@ -140,7 +143,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 +151,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>
@@ -224,19 +227,25 @@
     </select>
 
     <select id="recentSimpleList" resultType="java.util.Map">
-        select task.id as taskId, task.name as taskName, stages.stages_name as stagesName
+        select task.id as taskId, task.name as taskName, stages.stages_name as stagesName,task.group_id as groupId
         from task left join stages on stages.id = task.stages_id
         where task.project_id = #{projectId}
         <if test="userId != null">
             and executor_id like '%${userId}%'
         </if>
+        <if test="stage != null">
+            and stages.stages_name = #{stage}
+        </if>
+        <if test="groupId != null">
+            and task.group_id = #{groupId}
+        </if>
         and task_status = 0 order by task.id desc limit 50
     </select>
     <select id="selectMilepost" resultType="com.management.platform.entity.Task">
         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>

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

@@ -106,7 +106,18 @@
             #{departmentId}
         </foreach>
         <if test="keyword != null and keyword != ''">
-            AND a.name like '%${keyword}%'
+            AND
+            <choose>
+                <when test="matchingType==0">
+                    a.name like '%${keyword}%'
+                </when>
+                <when test="matchingType==1">
+                    a.phone like '%${keyword}%'
+                </when>
+                <when test="matchingType==2">
+                    a.job_number like '%${keyword}%'
+                </when>
+            </choose>
         </if>
         <if test="status != null">
             AND a.is_active = #{status}

BIN
fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/员工工时导入模板_新版.xlsx


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

@@ -1596,5 +1596,15 @@ public class ReportController {
     public HttpRespMsg deleteReport(String id) {
         return reportService.deleteReport(id);
     }
+
+    @RequestMapping("/productionQuantityList")
+    public HttpRespMsg productionQuantityList(Integer productId,String startDate,String endDate,Integer pageIndex,Integer pageSize){
+        return reportService.productionQuantityList(productId,startDate,endDate,pageIndex,pageSize);
+    }
+
+    @RequestMapping("/exportProductionQuantity")
+    public HttpRespMsg exportProductionQuantity(Integer productId,String startDate,String endDate){
+        return reportService.exportProductionQuantity(productId,startDate,endDate);
+    }
 }
 

+ 4 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java

@@ -142,4 +142,8 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg exportReport(String startDate, String endDate, Integer planId, Integer stateKey, Integer departmentId, HttpServletRequest request);
 
     HttpRespMsg deleteReport(String id);
+
+    HttpRespMsg productionQuantityList(Integer productId, String startDate, String endDate,Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportProductionQuantity(Integer productId, String startDate, String endDate);
 }

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

@@ -1,6 +1,7 @@
 package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
@@ -56,6 +57,7 @@ public class PlanProcedureTotalServiceImpl extends ServiceImpl<PlanProcedureTota
         List<HashMap> dataList = prodProcedureTeamMapper.getReportForWorkList(user.getId(),vehicleNum);
         //抽取出所有的planId
         List<Integer> planIdList = dataList.stream().map(item -> (Integer) item.get("planId")).collect(Collectors.toList());
+        List<Integer> teamIds = dataList.stream().map(item -> (Integer) item.get("id")).collect(Collectors.toList());
         //重新封装成两层结构,第一层为planId,第二层为planId下的数据
         List<HashMap> resultList = new ArrayList<>();
         Integer prePlanId = null;
@@ -80,6 +82,7 @@ public class PlanProcedureTotalServiceImpl extends ServiceImpl<PlanProcedureTota
                 planMap.put("plan_type", map.get("plan_type"));
                 planMap.put("num", map.get("num"));
                 planMap.put("procedureList", procedureList);
+                planMap.put("isReported", map.get("isReported"));
                 resultList.add(planMap);
             } else {
                 procedureList = (List<HashMap>) resultList.get(resultList.size() - 1).get("procedureList");

+ 11 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java

@@ -186,13 +186,22 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         );
 
         if(count==0){
-
             prodProcedureMapper.delete(new LambdaQueryWrapper<ProdProcedure>().eq(id!=null,ProdProcedure::getProductId,id));
             prodMaterialMapper.delete(new LambdaQueryWrapper<ProdMaterial>().eq(id!=null,ProdMaterial::getProductId,id));
             productMapper.deleteById(id);
 
         }else{
-            msg.setError("该产品已被使用!");
+            List<Plan> planList = planMapper.selectList(new LambdaQueryWrapper<Plan>().eq(Plan::getProductId, id));
+            StringBuilder sb=new StringBuilder();
+            for (int i = 0; i < planList.size(); i++) {
+                Plan p = planList.get(i);
+                if(i<planList.size()-1){
+                    sb.append(p.getProductSchedulingNum()+"/");
+                }else {
+                    sb.append(p.getProductSchedulingNum());
+                }
+            }
+            msg.setError("该产品已被计划["+sb.toString()+"]使用!");
         }
 
         return msg;

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

@@ -114,6 +114,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     RestTemplate restTemplate;
     @Resource
     private ProductMapper productMapper;
+    @Resource
+    private ProdProcedureMapper prodProcedureMapper;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -4598,4 +4600,147 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg productionQuantityList(Integer productId, String startDate, String endDate,Integer pageIndex, Integer pageSize) {
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        Integer companyId = user.getCompanyId();
+        boolean hasRole = sysFunctionService.hasPriviledge(user.getRoleId(), "月生产件数报表");
+        if (!hasRole) {
+            msg.setError("无权限");
+            return msg;
+        }
+        //获取所有产品信息
+        if(pageIndex==null || pageSize==null){
+            pageIndex=-1;
+            pageSize=-1;
+        }
+        IPage<Product> productIPage = productMapper.selectPage(new Page<>(pageIndex, pageSize), new LambdaQueryWrapper<Product>().eq(productId != null, Product::getId, productId).eq(Product::getCompanyId, companyId));
+        List<Product> products = productIPage.getRecords();
+        long total = productIPage.getTotal();
+        List<Integer> productIds = products.stream().map(Product::getId).distinct().collect(Collectors.toList());
+        //获取产品下的所有工序数据
+        List<ProdProcedure> prodProcedureList = prodProcedureMapper.selectList(new LambdaQueryWrapper<ProdProcedure>().in(productIds != null&&productIds.size()>0, ProdProcedure::getProductId, productIds).eq(ProdProcedure::getCompanyId,companyId));
+        //获取产品下所有已完工的日报数据
+        LambdaQueryWrapper<Report> reportLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        reportLambdaQueryWrapper.eq(Report::getStatus, 2).in(productIds != null&&productIds.size()>0, Report::getProductId, productIds).eq(Report::getCompanyId,companyId);
+        if(!StringUtils.isEmpty(startDate)&&!StringUtils.isEmpty(endDate)){
+            reportLambdaQueryWrapper.between(Report::getCreateDate,startDate,endDate);
+        }
+        List<Report> reportList = reportMapper.selectList(reportLambdaQueryWrapper);
+        List<Integer> reportIds = reportList.stream().map(Report::getId).distinct().collect(Collectors.toList());
+        List<ReportSteelNum> reportSteelNums = reportSteelNumMapper.selectList(new LambdaQueryWrapper<ReportSteelNum>().in(reportIds != null&&reportIds.size()>0, ReportSteelNum::getReportId, reportIds));
+        List<Map<String,Object>> resultMapList=new ArrayList<>();
+        for (Product product : products) {
+            Map<String,Object> resultMap=new HashMap<>();
+            resultMap.put("productName",product.getName());
+            //完整件数
+            Integer integrated=0;
+            //凑整件数
+            Integer rounding=0;
+            //拆算件数
+            double converted=0;
+            //找到产品下的工序
+            List<ProdProcedure> targetProdProcedures = prodProcedureList.stream().filter(p -> p.getProductId().equals(product.getId())).collect(Collectors.toList());
+            //过滤工序id 作为完整件数 需要路过的全部工序
+            List<Integer> targetProdProduceIds = targetProdProcedures.stream().map(ProdProcedure::getId).collect(Collectors.toList());
+            //找到产品下的所日报
+            List<Report> targetReportList = reportList.stream().filter(r ->r.getProductId()!=null&& r.getProductId().equals(product.getId())).collect(Collectors.toList());
+            //找到目标下的所有钢印号数据
+            List<Integer> targetReportIds = targetReportList.stream().map(Report::getId).distinct().collect(Collectors.toList());
+            //过滤已经填报过的所有钢印号去重
+            List<ReportSteelNum> targetReportSteelNums = reportSteelNums.stream().filter(r -> targetReportIds.contains(r.getReportId())).collect(Collectors.toList());
+            List<String> steelNums = targetReportSteelNums.stream().map(ReportSteelNum::getSteelNum).distinct().collect(Collectors.toList());
+            for (String steelNum : steelNums) {
+                //找到该产品下填报了该钢印号的所有日报数据
+                List<Integer> hasReportIds = reportSteelNums.stream().filter(r -> r.getSteelNum().equals(steelNum)).collect(Collectors.toList()).stream().map(ReportSteelNum::getReportId).collect(Collectors.toList());
+                List<Report> hasReportList = targetReportList.stream().filter(r->hasReportIds.contains(r.getId())).collect(Collectors.toList());
+                //过滤日报所填了哪些工序
+                List<Integer> hasReportProdProduceIds = hasReportList.stream().map(Report::getProdProcedureId).collect(Collectors.toList());
+                //如果全包含了所需路过的全部工序内容 就算完整件数
+                if(hasReportProdProduceIds.containsAll(targetProdProduceIds)){
+                    integrated+=1;
+                }else {
+                    //如果没有包含所需路过的全部工序内容 (有任意工序可以共同完成)-->凑整
+                    //根据当前钢印号已经填报的内容 对比出没有填报的工序内容
+                    List<Integer> hasNotReportProdProduceIds=new ArrayList<>();
+                    targetProdProduceIds.forEach(tp->{
+                        if(!hasReportProdProduceIds.contains(tp)){
+                            hasNotReportProdProduceIds.add(tp);
+                        }
+                    });
+                    //所有已填报的钢印号有任意满足 上面未填报工序集合 就算凑整件数
+                    //找到所有填报了未填报工序日报数据
+                    List<Report> comparatorReportList = targetReportList.stream().filter(r ->r.getProdProcedureId()!=null && hasNotReportProdProduceIds.contains(r.getProdProcedureId())).collect(Collectors.toList());
+                    //过滤这些日报下的工序数据
+                    List<Integer> targetComparator = comparatorReportList.stream().map(Report::getProdProcedureId).distinct().collect(Collectors.toList());
+                    boolean match = targetComparator.containsAll(hasNotReportProdProduceIds);
+                    if(match){
+                        rounding+=1;
+                    }else {
+                        //计算当前产品的总预算工时
+                        BigDecimal reduce = targetProdProcedures.stream().map(i -> new BigDecimal(i.getWorkingTime())).reduce(BigDecimal.ZERO, BigDecimal::add);
+                        //利用上面找到的所填了哪些工序 按照所在工序占比计算
+                        List<ProdProcedure> hasReportProcedures = targetProdProcedures.stream().filter(ts -> hasReportProdProduceIds.contains(ts.getId())).collect(Collectors.toList());
+                        BigDecimal bigDecimal=new BigDecimal(0);
+                        for (ProdProcedure hasReportProcedure : hasReportProcedures) {
+                            //找到当前工序所在产品总预算工时
+                            BigDecimal decimal = new BigDecimal(hasReportProcedure.getWorkingTime());
+                            BigDecimal divide = decimal.divide(reduce, 2, RoundingMode.HALF_UP);
+                            BigDecimal check = new BigDecimal(1);
+                            check=check.multiply(divide);
+                            bigDecimal=bigDecimal.add(check);
+                        }
+                        converted=bigDecimal.doubleValue();
+                    }
+                }
+
+            }
+            resultMap.put("integrated",integrated);
+            resultMap.put("rounding",rounding);
+            resultMap.put("converted",converted);
+            BigDecimal bigDecimal=new BigDecimal(integrated);
+            bigDecimal=bigDecimal.add(new BigDecimal(rounding)).add(new BigDecimal(converted));
+            resultMap.put("total",bigDecimal.doubleValue());
+            resultMapList.add(resultMap);
+        }
+        Map<String,Object> result=new HashMap<>();
+        result.put("records",resultMapList);
+        result.put("total",total);
+        msg.setData(result);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg exportProductionQuantity(Integer productId, String startDate, String endDate) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        HttpRespMsg respMsg = productionQuantityList(productId, startDate, endDate, null, null);
+        Map<String, Object> data = (Map<String, Object>) respMsg.getData();
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        titleList.add("产品名称");
+        titleList.add("完整件数");
+        titleList.add("凑整件数");
+        titleList.add("拆算件数");
+        titleList.add("总件数");
+        dataList.add(titleList);
+        List<Map<String, Object>> records = (List<Map<String, Object>>) data.get("records");
+        for (Map<String, Object> record : records) {
+            List<String> item=new ArrayList<>();
+            item.add(String.valueOf(record.get("productName")));
+            item.add(String.valueOf(record.get("integrated")));
+            item.add(String.valueOf(record.get("rounding")));
+            item.add(String.valueOf(record.get("converted")));
+            item.add(String.valueOf(record.get("total")));
+            dataList.add(item);
+        }
+        Company company = companyMapper.selectById(companyId);
+        String fileName=("月度生产统计_")+company.getCompanyName()+System.currentTimeMillis();
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName, dataList, path);
+        msg.setData(resp);
+        return msg;
+    }
+
 }

+ 2 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProdProcedureTeamMapper.xml

@@ -27,7 +27,8 @@
     <select id="getReportForWorkList" resultType="java.util.HashMap" >
         SELECT a.*, plan_procedure_total.plan_id, plan_procedure_total.prod_procedure_id,plan_procedure_total.total_working_hours,plan_procedure_total.total_wages, date_format(plan.`start_date`,'%Y-%m-%d') as start_date, date_format(plan.`end_date`,'%Y-%m-%d') as end_date, plan.`plan_type`,
         plan.`product_scheduling_num`,plan.task_type_name,plan.task_name,plan.task_change_notice_num,
-        product.`name` AS product_name,prod_procedure.name AS procedure_name, prod_procedure.check_type, plan.check_type as plan_check_type,plan.vehicle_num_start,plan.vehicle_num_end,plan.num
+        product.`name` AS product_name,prod_procedure.name AS procedure_name, prod_procedure.check_type, plan.check_type as plan_check_type,plan.vehicle_num_start,plan.vehicle_num_end,plan.num,
+        (case when (select count(1) from report where user_procedure_team_id=a.id and creator_id=#{userId} and create_date=DATE_FORMAT(DATE(NOW()),'%Y-%m-%d'))>0 then 1 else 0 end ) isReported
         FROM prod_procedure_team a
         left join plan_procedure_total on plan_procedure_total.id = a.plan_procedure_id
         LEFT JOIN plan ON plan.id = plan_procedure_total.plan_id

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ReportMapper.xml

@@ -312,7 +312,7 @@
 
     <select id="getPlanRealTimeProgressList" resultType="java.util.Map">
         select b.id as planId,(Case when b.plan_type=0 then b.product_scheduling_num else b.task_change_notice_num end) as taskName,
-        b.foreman_name as userName,IFNULL(SUM(d.work_time),0) as planWorkTime,SUM(d.job_of_money) as planCost,
+        b.foreman_name as userName,IFNULL(ROUND(SUM(d.work_time),2),0) as planWorkTime,SUM(d.job_of_money) as planCost,
         IFNULL(SUM((select SUM(working_time) from report where user_procedure_team_id = d.id)),0)  as nowWorkTime,
         SUM((select SUM(cost) from report where user_procedure_team_id = d.id)) as nowCost
         from plan_procedure_total a

BIN
fhKeeper/formulahousekeeper/ops-platform/octopus.2023-11-10.log.gz


+ 2 - 2
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application-dev.yml

@@ -13,9 +13,9 @@ spring:
       max-request-size: 100MB
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.101.180.183:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://47.101.180.183:17089/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
-    password: HuoshiDB@2022
+    password: P011430@Huoshi*
     hikari:
       maximum-pool-size: 10
       minimum-idle: 3

+ 9 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/workView.vue

@@ -40,6 +40,7 @@
 
           <!-- 列表内容 -->
           <div class="distribution_box" v-for="item, index in prod.procedureList" :key="index" @click="reportItem(item, prod)">
+            <div class="distribution_box_active" v-if="prod.isReported == 1"></div>
             <!-- 状态 -->
             <div class="statusLeft" :style="`background: ${statusColor[item.status]}`" v-if="item.status"></div>
             <div v-if="reportBoolean" class="marginBtnPro">{{ item.productName }}</div>
@@ -447,6 +448,14 @@ export default {
       margin-bottom: 15px;
       position: relative;
       overflow: hidden;
+      .distribution_box_active {
+        position: absolute;
+        width: 4px;
+        height: 100%;
+        left: 0;
+        top: 0;
+        background: rgb(98, 236, 1);
+      }
 
       .distribution_ItemBom {
         font-size: 16px;

+ 71 - 8
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue

@@ -22,6 +22,7 @@
                   <el-menu-item index="1-3"  @click="ssl(2)"><p>{{'报工查询表'}}</p></el-menu-item>
                   <el-menu-item index="1-4"  @click="ssl(3)"><p>{{'计划实时进度表'}}</p></el-menu-item>
                   <el-menu-item index="1-5"  @click="ssl(4)"><p>{{'部门生产统计表'}}</p></el-menu-item>
+                  <el-menu-item index="1-6"  @click="ssl(5)"><p>{{'月生产件数报表'}}</p></el-menu-item>
                 </el-submenu>
               </el-menu>
           </el-col>
@@ -36,18 +37,18 @@
       <h3 ref="headHe" style="padding-left: 10px;float:left;width:15%">{{shuz[ins]}}</h3>
       <div class="headScreen" :style="'width:72%'">
           <!-- 部门筛选 -->
-          <el-cascader v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
+          <el-cascader v-if="ins!=5" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
             :props="{ checkStrictly: true,expandTrigger: 'hover',multiple: ins == 6 ? true : false }" collapse-tags :show-all-levels="false" clearable
             @change="selcts()" size="small" style="margin-bottom: 10px;width:180px"
           ></el-cascader>
 
           <!-- 人员筛选 -->
-          <el-select v-if="ins!=4" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="width:120px">
+          <el-select v-if="ins!=4 && ins!=5" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="width:120px">
             <el-option v-for="(item, index) in selUserList" :key="index" :label="item.name" :value="item.id"></el-option>
           </el-select>
 
           <!-- 产品筛选 -->
-          <el-select v-if="ins == 2"  v-model="productId" :placeholder="'请选择'" @change="selcts()" clearable filterable size="small" style="width:140px">
+          <el-select v-if="ins == 2 || ins==5"  v-model="productId" :placeholder="'请选择产品'" @change="selcts()" clearable filterable size="small" style="width:140px">
             <el-option v-for="(item, index) in productList" :key="index" :label="item.name" :value="item.id"></el-option>
           </el-select>
 
@@ -82,8 +83,8 @@
                     {{scope.row.departmentCascade}}
                   </template>
                 </el-table-column>
-                <el-table-column align="center" prop="name" label="人员" min-width="250" fixed="left"></el-table-column>
-                <el-table-column v-for="(item, index) in personWorkHoursWagesHead" :key="index" :label="item" align="center" min-width="250">
+                <el-table-column align="center" prop="name" label="人员" min-width="100" fixed="left"></el-table-column>
+                <el-table-column v-for="(item, index) in personWorkHoursWagesHead" :key="index" :label="item" align="center" min-width="150">
                     <template slot-scope="scope">
                         <div v-for="(items, indexs) in scope.row.personWorkHoursWages" :key="indexs" @click="showReportDetail(scope.row,item)" class="colorText">
                             <div v-if="items.crateDate == item">
@@ -92,7 +93,7 @@
                         </div>
                     </template>
                 </el-table-column>
-                <el-table-column align="center" prop="totalResult" label="合计" min-width="250">
+                <el-table-column align="center" prop="totalResult" label="合计" min-width="150">
                    <template slot-scope="scope">
                     {{scope.row.totalResult}}
                   </template>
@@ -166,6 +167,25 @@
                 </el-table-column>
             </el-table>
 
+            <!-- 月生产件数报表 -->
+            <el-table v-if="ins == 5"  key="6" border :data="productionQuantityList" highlight-current-row v-loading="listLoading" :height="+tableHeight - 1" style="width: 100%;">
+                <el-table-column align="center" prop="productName" label="产品名称" min-width="150">
+                  <template slot-scope="scope">{{scope.row.productName}}</template>
+                </el-table-column>
+                <el-table-column align="center" prop="integrated" label="完整件数" min-width="150">
+                  <template slot-scope="scope">{{scope.row.integrated}}</template>
+                </el-table-column>
+                <el-table-column align="center" prop="rounding" label="凑整件数" min-width="150">
+                  <template slot-scope="scope">{{scope.row.rounding}}</template>
+                </el-table-column>
+                <el-table-column align="center" prop="converted" label="拆算件数" min-width="150">
+                  <template slot-scope="scope">{{scope.row.converted}}</template>
+                </el-table-column>
+                <el-table-column align="center" prop="total" label="总件数" min-width="150">
+                  <template slot-scope="scope">{{scope.row.total}}</template>
+                </el-table-column>
+            </el-table>
+
         <!--工具条-->
         <el-col :span="24" class="toolbar" v-if="ins != 6">
           <el-pagination
@@ -445,9 +465,9 @@ export default {
       z   : null,
       value: null,
       dialog: false, // 单据查看展示
-      shuz: ['人员工时工价表', '工序实时进度表','报工查询表','计划实时进度表','部门生产统计表'],
+      shuz: ['人员工时工价表', '工序实时进度表','报工查询表','计划实时进度表','部门生产统计表','月度生产件数表'],
 
-      shuzArr: ['人员工时工价表', '工序实时进度表','报工查询表','计划实时进度表','部门生产统计表'],
+      shuzArr: ['人员工时工价表', '工序实时进度表','报工查询表','计划实时进度表','部门生产统计表','月度生产件数表'],
 
       ins: 10000,
       user: JSON.parse(sessionStorage.user),
@@ -542,6 +562,8 @@ export default {
       orderInsertPlanDetailDiaLog:false,
       reportQueryList:[],
 
+      productionQuantityList:[],
+
       //筛选项
       productId:"",
       productList:[],
@@ -914,6 +936,34 @@ export default {
           });
         });
     },
+    //月度生产件数表
+    getProductionQuantityList(){
+      this.listLoading=true
+        this.http.post( "/report/productionQuantityList", {
+            startDate:this.rangeDatas[0],
+            endDate:this.rangeDatas[1],
+            pageIndex: this.page,
+            pageSize: this.size,
+            productId:this.productId,
+        },
+        res => {
+          if (res.code == "ok") {
+            this.productionQuantityList=res.data.records
+            this.total=res.data.total
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error"
+            });
+          }
+          this.listLoading=false
+        },error => {
+          this.$message({
+            message: error,
+            type: "error"
+          });
+        });
+    },
     //获取产品列表
     getProductList(){
       this.http.post( "/product/getProductPage", {
@@ -1028,6 +1078,8 @@ export default {
             this.getPlanRealTimeProgressList()
         }else if(this.ins==4){
             this.getDpetStatisticsProgressList()
+        }else if(this.ins==5){
+            this.getProductionQuantityList()
         }
     },
     exportExcel() {
@@ -1071,6 +1123,13 @@ export default {
         sl.startDate=this.rangeDatas[0];
         sl.endDate=this.rangeDatas[1];
         sl.deptId=this.departmentIdArray[this.departmentIdArray.length-1];
+    }
+    else if (this.ins == 5) {
+        fName = '月度生产件数表_' + '.xlsx';
+        url += "/exportProductionQuantity";
+        sl.startDate=this.rangeDatas[0];
+        sl.endDate=this.rangeDatas[1];
+        sl.productId=this.productId;
     }
         this.http.post(url, sl,
         res => {
@@ -1153,6 +1212,10 @@ export default {
         //TODO: 获取数据
         this.getDpetStatisticsProgressList()
       }
+      if(this.ins == 5){
+        //TODO: 获取数据
+        this.getProductionQuantityList()
+      }
     },
     // 日期
     getCurrentRangeTime() {

+ 63 - 26
fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue

@@ -4,18 +4,12 @@
         <el-form ref="form1" :model="addForm" :rules="taskRules" label-width="120px">
             <el-form-item label="所属项目" v-if="showOrNot" prop="projectId">
                 <el-select v-model="addForm.projectId" :placeholder="$t('defaultText.pleaseChoose')" @change="agentCreatesEvents(1)" filterable="true" style="width:100%;">
-
-                    <!-- <el-option v-for="item in projectList" :key="item.id" :label="item.projectName + item.projectCode" :value="item.id">
-                        <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
-                        <span style="float: right;font-size: 13px;">{{ item.projectName }}</span>
-                    </el-option> -->
                     <el-option-group v-for="group in integrationProjectList" :key="group.label" :label="group.label">
                         <el-option v-for="item in group.peojectList" :key="item.id" :label="item.projectName + '\u3000' + item.projectCode" :value="item.id">
                             <span style="float: left; color: #8492a6; font-size: 13px;">{{ item.projectCode }}</span>
                             <span style="float: right;">{{ item.projectName }}</span>
                         </el-option>
                     </el-option-group>
-
                 </el-select>
             </el-form-item>
             <el-form-item label="所属任务分组" v-if="showOrNot" prop="groupId">
@@ -34,6 +28,11 @@
                     <el-option v-for="item in stageList" :key="item.id" :label="item.stagesName" :value="item.id"></el-option>
                 </el-select>
             </el-form-item>
+            <el-form-item label="前置任务" prop="aheadTidList" >
+                <el-select v-model="addForm.aheadTidList" style="width:100%;" multiple filterable @change="$forceUpdate()">
+                    <el-option v-for="item in relationdata" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                </el-select>
+            </el-form-item>
             <el-form-item :label="$t('types')">
                 <el-select v-model="addForm.taskType" style="width:100%;" :disabled="((this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement) && !(groupResponsibleId == user.id)" @change="selchg()">
                     <el-option v-for="item in taskTypeList" :key="item.id" :label="item.name" :value="item.id">
@@ -70,7 +69,7 @@
             <el-form-item :label="$t('zhi-hang-ren') + (index+1)" v-for="(executorItem, index) in addForm.executorListFront" :key="index">
                 <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-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: 150px" @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>
@@ -81,7 +80,7 @@
                     <!-- 项目服务 -->
                     <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-select  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"
@@ -873,7 +872,8 @@ export default {
     this.gstimday = [1]
     this.getSapServiceList()
 
-    this.timess()
+    this.timess();
+    
   },
   methods: {
     // 刷新数据
@@ -899,6 +899,7 @@ export default {
         if(obj.create) {
             this.mileageCup = false
             this.addFormVisible = true;
+            this.curProjectId = obj.stage.projectId;
             this.addForm = {projectId: obj.stage.projectId, groupId: obj.stage.groupId, stagesId: obj.stage.id, taskLevel:0, planHours: 8, taskType: 0};
             this.addForm.executorListFront = [{executorId:null, planHours:this.user.timeType.allday}];
             this.gstimhour = [this.user.timeType.allday]
@@ -913,13 +914,18 @@ export default {
                 this.isEditFile = true;
                 this.getDetail(obj.curProjectId)
             }
-            this.getTaskDetail(obj.id);
+            this.curProjectId = obj.task.projectId;
+            // this.getTaskDetail(obj.id);
             this.getTaskProgressList(obj.id); // 获取任务进展列表 
             this.gain(obj.task); // 获取评论列表
             this.getDailyList(obj.id) // 获取来自日报
             this.getRelationTaskList(obj.num, obj.id)
             this.getTaskFileList(obj.num,obj.id)
+            setTimeout(() => {
+                this.getTaskDetail(obj.id);
+            }, 200)
         }
+        this.getrelation();
     },
     // 代办任务创建事件
     agentCreatesEvents(num) {
@@ -927,6 +933,7 @@ export default {
             this.addForm.groupId = ''
             this.addForm.stagesId = ''
             this.getTaskGrouping()
+            this.getrelation();
         } else if(num == 2) {
             this.addForm.stagesId = ''
             this.getTaskList()
@@ -1069,6 +1076,12 @@ export default {
                     }   
                 }
                 this.addForm = res.data;
+                if (this.addForm.aheadTid) {
+                    this.addForm.aheadTidList = JSON.parse(this.addForm.aheadTid);
+                } else {
+                    this.addForm.aheadTidList = [];
+                }
+                
                 this.addForm.createDate = null;
                 this.addForm.indate = null;
                 this.addLoading = false;
@@ -1380,20 +1393,39 @@ export default {
         // }
         
         for (var i=0;i<exeList.length;i++) {
-            var findSameUser = false;
-            exeList[i].planHours = this.gstimhour[i]
-            for (var j=i+1;j<exeList.length; j++) {
-                if (exeList[i].executorId && exeList[j].executorId && exeList[i].executorId == exeList[j].executorId) {
-                    findSameUser = true;
-                    break;
+            if(this.user.companyId==3092){
+                var findSameUser = false;
+                exeList[i].planHours = this.gstimhour[i]
+                for (var j=i+1;j<exeList.length; j++) {
+                    if ((exeList[i].executorId && exeList[j].executorId && exeList[i].executorId == exeList[j].executorId)
+                     &&(exeList[i].serviceId && exeList[j].serviceId && exeList[i].serviceId == exeList[j].serviceId)) {
+                        findSameUser = true;
+                        break;
+                    }
+                }
+                if (findSameUser) {
+                    return this.$message({
+                        showClose: true,
+                        message: '同一个执行人,服务不能相同',
+                        type: 'error'
+                    });
+                }
+            }else{
+                var findSameUser = false;
+                exeList[i].planHours = this.gstimhour[i]
+                for (var j=i+1;j<exeList.length; j++) {
+                    if (exeList[i].executorId && exeList[j].executorId && exeList[i].executorId == exeList[j].executorId) {
+                        findSameUser = true;
+                        break;
+                    }
+                }
+                if (findSameUser) {
+                    return this.$message({
+                        showClose: true,
+                        message: this.$t('executorhasduplication'),
+                        type: 'error'
+                    });
                 }
-            }
-            if (findSameUser) {
-                return this.$message({
-                    showClose: true,
-                    message: this.$t('executorhasduplication'),
-                    type: 'error'
-                });
             }
         }
         if(this.addForm.startDate && this.addForm.endDate) {
@@ -1417,6 +1449,7 @@ export default {
                     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;
                 this.http.post('/task/save',this.addForm,
                     res => {
@@ -1631,16 +1664,20 @@ export default {
         this.isRelationTab = true
         this.getrelation()
     },
-    getrelation(){  //获取选择关联列表
+    getrelation(){  
+
+        //获取选择关联列表
         this.http.post('/task/getTaskOnlyList',{
-            projectId: this.curProjectId
+            projectId: this.curProjectId?this.curProjectId:this.addForm.projectId
         },
         res => {
             if (res.code == "ok") {
                 this.relationdata = []
                 res.data.forEach( (item) =>{
                     if(item.taskType != 1){
-                        this.relationdata.push(item)
+                        if (item.id != this.addForm.id) {
+                            this.relationdata.push(item)
+                        }
                     }
                 })
                 

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

@@ -347,6 +347,14 @@
                     <span>¥{{Number(scope.row.contractAmount).toFixed(2)}}</span>
                 </template>
             </el-table-column>
+            <!-- 日报审核人 -->
+            <el-table-column prop="projectAuditorName" :label="'日报审核人'" sortable="custom" min-width="150" v-if="user.company.companyName=='成都明夷电子科技有限公司'">
+                <template slot-scope="scope">
+                    <el-link type="primary" :underline="false" @click="showUser(scope.row.projectAuditorId)">
+                            {{scope.row.projectAuditorName}}
+                    </el-link>
+                </template>
+            </el-table-column>
             <!-- 供应商 -->
             <!-- <el-table-column prop="providerNames" label="供应商" min-width="190" v-if="user.company.packageProvider">
             </el-table-column> -->

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

@@ -2668,7 +2668,6 @@
                                 } else {
                                     this.getViewTaskList();
                                 }
-                                
                             } else {
                                 this.$message({
                                     message: res.msg,

+ 4 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -17,13 +17,12 @@
             </div>
             <el-divider style="margin: 0px 0px !important;height:0.5px;"></el-divider>
             <div class="tree" :style="'height:'+ (tableHeight + 83) + 'px'">
-                <!-- <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" accordion></el-tree> -->
-                <!-- <el-tree :data="data" :props="defaultProps" node-key="id" :expand-on-click-node="false" accordion @node-click="handleNodeClick" :default-expanded-keys="jDarr" @node-expand="jieDian" @node-collapse="shutDown" @current-change="chufa"> -->
                 <el-tree :data="data" 
                 :props="defaultProps" 
                 :draggable="adjustPosition"
                 :allow-drop="allowDrop"
                 @node-drop="nodeDrop"
+                style="padding-bottom:70px;"
                 :expand-on-click-node="false" accordion @node-click="handleNodeClick" :default-expanded-keys="jDarr" @node-expand="jieDian" @node-collapse="shutDown" @current-change="chufa">
                     <span class="custom-tree-node" style="position: relative;box-sizing: border-box;width: 10%;" slot-scope="{ node }" @mouseleave= mouseleave(data,$event) @mouseover= mouseover(data,$event)>
                         <span style="padding-right: 50px;box-sizing: border-box;overflow:hidden;text-overflow:ellipsis;line-height: 36px; display: inline-block;">
@@ -452,7 +451,7 @@
                               <span style="float: right; color: #8492a6; font-size: 13px">{{item.departmentName}}</span>
                           </el-option>
                       </el-select>
-                      <selectCat :size="'medium'" :widthStr="'360'" v-if="user.userNameNeedTranslate == '1'" :subject="users" :subjectId="depForm.managerId" :distinction="'3'" @selectCal="selectCal"></selectCat>
+                      <selectCat :size="'medium'" :widthStr="'360'" v-if="user.userNameNeedTranslate == '1'" :subject="users" :subjectId="insertForm.superiorId" :distinction="'6'" @selectCal="selectCal"></selectCat>
                   </el-form-item>
                   <el-form-item :label="$t('jiao-se')" prop="roleId" v-if="roleNameFlg != $t('role.superAdministrator')">
                       <el-select v-model="insertForm.roleId" :placeholder="$t('defaultText.pleaseChoose')" style="width: 100%">
@@ -3555,6 +3554,8 @@ export default {
       } else if(obj.distinction == '23') {
         console.log(obj, '返回qwe')
         this.transferActive.takeoverId = obj.id
+      } else if (obj.distinction == '6') {
+        this.insertForm.superiorId = obj.id;
       }
     },
     // 企业微信可见范围设置

File diff suppressed because it is too large
+ 180 - 39
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue


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

@@ -130,7 +130,8 @@
                                                         <span>角色:{{item.extraField1? roleList.filter(r=>r.value == item.extraField1)[0].label:''}}</span>
                                                     <span style="margin-left:10px;">工作职责:{{ item.extraField2? item.extraField2Name:''}}</span>
                                                     <span style="margin-left:10px;">工作内容:{{ item.extraField3? item.extraField3Name:''}}</span></p>
-                                <p v-if="item.taskId != null">{{$t('other.task')}}:{{item.taskName}}</p>
+                                <p v-if="item.taskId != null">{{$t('other.task')}}:{{item.taskName}}
+                                    <span style="margin-left:10px;" v-if="user.companyId==3092">-- 服务:{{ item.sapServiceName }}</span></p>
                                 <p v-if="item.groupId">
                                     <span>{{$t('other.taskGroup')}}:{{item.groupName}}</span>
                                     <!-- 阶段 -->

+ 72 - 15
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -204,15 +204,22 @@
                     :rules="[{ required: user.companyId==3092?true:false, message: '请选择任务/里程碑' }]"
                     label="任务/里程碑" placeholder="请选择任务/里程碑" @click="clickPickerTask(index,item)"
                     ></van-field>
+                    <van-field v-if="user.companyId==3092"  readonly name="sapServiceId" :value="item.sapServiceName" 
+                    :rules="[{ required: true, message: '请选择服务' }]"
+                    label="服务" placeholder="请选择服务" @click="clickPickerService(index,item)"
+                    ></van-field>
                     <van-field name="taskFinish" label="是否已完成" v-if="item.taskId != null">
                         <template #input>
                             <van-checkbox :disabled="!item.canEdit" v-model="item.taskFinish" shape="square">已完成</van-checkbox>
                         </template>
-                        
                     </van-field>
                     <van-popup v-model="item.showPickerTask" position="bottom">
                         <van-picker show-toolbar :columns="item.taskList" value-key="taskName" @confirm="choseTask" @cancel="item.showPickerTask = false;$forceUpdate()" />
                     </van-popup>
+                    
+                    <van-popup v-model="item.showPickerService" position="bottom">
+                        <van-picker show-toolbar :columns="item.serviceList" value-key="serviceName" @confirm="choseService" @cancel="item.showPickerService = false;$forceUpdate()" />
+                    </van-popup>
                     <!-- <van-field readonly clickable class="form_input" :value="item.workingTime" name="workingTime" label="工作时长" placeholder="请输入工作时长(单位:小时)"
                     :rules="[{ required: true, message: '请输入工作时长(单位:小时)' }]" @touchstart.native.stop="showNumberKey = true"/>
                     <van-number-keyboard v-model="item.workingTime" :show="showNumberKey" close-button-text="完成" extra-key="." :maxlength="4" @blur="showNumberKey = false" /> -->
@@ -911,7 +918,7 @@ import timetoolVue from '../timetool/timetool.vue';
                 this.getTaskGroups(this.form.domains[this.clickIndex], this.clickIndex);
 
                 // 获取1相关维度
-                this.getTaskList(domainItem.projectId)
+                this.getTaskList(domainItem)
                 this.dimension(domainItem.projectId)
                 //获取相关日报提交选择人
                 domainItem.projectAuditorId = null;
@@ -1517,7 +1524,10 @@ import timetoolVue from '../timetool/timetool.vue';
                                     extraField3: list[i].extraField3,
                                     extraField3Name: list[i].extraField3Name,
                                     workContentList: list[i].workContentList,
-                                    filteredRespList: filteredRespList
+                                    filteredRespList: filteredRespList,
+                                    sapServiceId: list[i].sapServiceId,
+                                    sapServiceName: list[i].sapServiceName,
+                                    serviceList: list[i].serviceList,
                                 })
                                 if (list[i].state >= 2) {
                                     this.canEdit = true;
@@ -1663,8 +1673,8 @@ import timetoolVue from '../timetool/timetool.vue';
                 // var proId = this.form.domains[this.clickIndex].projectId
                 // this.dimension(proId)
             },
-            //选择
-            clickPickerTask(i,item) {
+            //选择
+            clickPickerService(i,item) {
                 if (!item.canEdit) return;
                 // console.log(i);
                 this.clickIndex = i;
@@ -1672,15 +1682,33 @@ import timetoolVue from '../timetool/timetool.vue';
                 // this.getTaskList(proId)
                 // console.log(this.form.domains[this.clickIndex].taskList);
                 this.$toast.clear();
-                if(!this.form.domains[this.clickIndex].taskList){
-                    this.$toast.fail('当前项目暂无可选的任务/里程碑');
-                }else if(this.form.domains[this.clickIndex].taskList.length == 0){
+                if(!this.form.domains[this.clickIndex].serviceList || this.form.domains[this.clickIndex].serviceList.length == 0){
+                    this.$toast.fail('当前任务暂无服务');
+                } else{
+                    this.form.domains[this.clickIndex].showPickerService= true;
+                    this.$forceUpdate();
+                }
+            },
+            choseService(value, index) {
+                if(value){
+                    this.form.domains[this.clickIndex].sapServiceId = value.id;
+                    this.form.domains[this.clickIndex].sapServiceName = value.serviceName;
+                }
+                this.form.domains[this.clickIndex].showPickerService = false;
+                this.$forceUpdate();
+            },
+
+            //选择任务
+            clickPickerTask(i,item) {
+                if (!item.canEdit) return;
+                this.clickIndex = i;
+                this.$toast.clear();
+                if(!this.form.domains[this.clickIndex].taskList || this.form.domains[this.clickIndex].taskList.length == 0){
                     this.$toast.fail('当前项目暂无可选的任务/里程碑');
-                }else{
+                } else{
                     this.form.domains[this.clickIndex].showPickerTask = true;
+                    this.$forceUpdate();
                 }
-                
-                this.$forceUpdate();
             },
             choseTask(value, index) {
                 if(value){
@@ -1689,8 +1717,21 @@ import timetoolVue from '../timetool/timetool.vue';
                 }
                 this.form.domains[this.clickIndex].showPickerTask = false;
                 this.$forceUpdate();
+                if (this.user.companyId == 3092) {
+                    //依斯贝,加载服务
+                    this.$axios.post("/task/getMyTaskService", {taskId: value.taskId})
+                    .then(res => {
+                        if(res.code == "ok") {
+                            this.$set(this.form.domains[this.clickIndex],'sapServiceId',null);
+                            this.$set(this.form.domains[this.clickIndex],'sapServiceName',null);
+                            this.$set(this.form.domains[this.clickIndex],'serviceList',res.data);
+                            this.$forceUpdate();
+                        } else {
+                            this.$toast.fail('获取失败:'+res.msg);
+                        }
+                    }).catch(err=> {this.$toast.clear();});
+                }
             },
-
             choseProjects(value, index) {
                 // console.log(value)
                 if(value){
@@ -1765,6 +1806,7 @@ import timetoolVue from '../timetool/timetool.vue';
                             if(res.code == "ok") {
                                 domain.stage = '';
                                 domain.stages = res.data;
+                                this.getTaskList(domain);
                                 this.$forceUpdate();
                             } else {
                                 this.$toast.fail('获取失败');
@@ -1800,15 +1842,27 @@ import timetoolVue from '../timetool/timetool.vue';
             },
 
 
-            getTaskList(projectId) {
+            getTaskList(domainItem) {
                 //如果是专业版,需要列出任务列表
                 if (this.user.company.packageProject == 1) {
-                    this.$axios.post("/task/getRecentTask", {projectId: projectId})
+                    //清空选中的任务
+                    this.$set(domainItem, 'taskId', null);
+                    this.$set(domainItem, 'taskName', null);
+                    this.$set(domainItem, 'sapServiceId', null);
+                    this.$set(domainItem, 'sapServiceName', null);
+                    this.$set(domainItem, 'serviceList', null);
+                    var param = {projectId: domainItem.projectId}
+                    if (domainItem.groupId) {
+                        param.groupId = domainItem.groupId;
+                    }
+                    if (domainItem.stage) {
+                        param.stage = domainItem.stage;
+                    }
+                    this.$axios.post("/task/getRecentTask", param)
                         .then(res => {
                             if(res.code == "ok") {
                                 this.form.domains[this.clickIndex].taskList = res.data;
                                 this.form = this.form;
-                                // this.$forceUpdate();
                             } else {
                                 this.$toast.fail('获取失败');
                             }
@@ -2263,6 +2317,9 @@ import timetoolVue from '../timetool/timetool.vue';
                             formData.append('extraField2', this.form.domains[i].extraField2);
                             formData.append('extraField3', this.form.domains[i].extraField3);
                         }
+                        if (this.user.companyId == 3092) {
+                            formData.append('sapServiceId', this.form.domains[i].sapServiceId);
+                        }
                     }
                     if(!this.flgLg) {
                         return