Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

yusm před 2 dny
rodič
revize
3e23e0460e
21 změnil soubory, kde provedl 356 přidání a 161 odebrání
  1. 9 5
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java
  2. 3 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/ErpOrderInfo.java
  3. 0 47
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/ReportController.java
  4. 13 4
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/TaskController.java
  5. 13 11
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/entity/Task.java
  6. 5 0
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/mapper/TaskMapper.java
  7. 2 0
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/TaskService.java
  8. 2 2
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  9. 1 1
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  10. 11 2
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  11. 4 4
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/task/TimingTask.java
  12. 22 0
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/resources/mapper/TaskMapper.xml
  13. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  14. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java
  15. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  16. 3 20
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  17. 104 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  18. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  19. 112 34
      fhKeeper/formulahousekeeper/timesheet_mld/src/components/taskComponent.vue
  20. 37 26
      fhKeeper/formulahousekeeper/timesheet_mld/src/views/project/gantt.vue
  21. 1 1
      fhKeeper/formulahousekeeper/timesheet_mld/src/views/project/projectInside.vue

+ 9 - 5
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java

@@ -265,7 +265,7 @@ public class DataCollectController {
                 " " +
                 "from mom_orderdetail mo " +
 //                " left join ca_batchmap cb on substring(cbSysBarCode,CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode) + 1) + 1)+1,CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode) + 1) + 1) + 1)-CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode) + 1) + 1)-1)= cb.cMOCode and RIGHT(mo.cbSysBarCode,1) = cb.iMOSubSN " +
-                " where mo.Status = 3 " +
+                " where (mo.Status = 3 or mo.Status = 4) " +
                 "         )tmp ";
         int totalCount = 0;
         try (Connection connection = sqlServerDataSource.getConnection()) {
@@ -288,13 +288,13 @@ public class DataCollectController {
 //                " where status in (3,4) "
 //                +" ORDER BY MoDId OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ";
         String sqlQuery = "select mo.MoDId,substring(cbSysBarCode,CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode) + 1) + 1)+1,CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode) + 1) + 1) + 1)-CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode) + 1) + 1)-1) as orderId,mo.Define24  as projectId,mo.Define25  as projectName,mo.relsdate" +
-                "     ,RIGHT(mo.cbSysBarCode,1) as line,mo.Status,mo.MDeptCode " +
+                "     ,RIGHT(mo.cbSysBarCode,1) as line,mo.Status,mo.MDeptCode,mo.CloseDate as closeDate " +
                 " from mom_orderdetail mo " +
 //                " left join ca_batchmap cb on substring(cbSysBarCode,CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode) + 1) + 1)+1,CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode) + 1) + 1) + 1)-CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode, CHARINDEX('|', cbSysBarCode) + 1) + 1)-1) = cb.cMOCode and RIGHT(mo.cbSysBarCode,1) = cb.iMOSubSN " +
-                " where mo.Status = 3 " +
+                " where (mo.Status = 3 or mo.Status = 4)" +
                 " ORDER BY mo.MoDId OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ";
         List<ErpOrderInfo> resList = new ArrayList<>();
-        SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd");
         try (Connection connection = sqlServerDataSource.getConnection()) {
             PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
             int pageSize = pageBO.getPageSize();
@@ -312,7 +312,11 @@ public class DataCollectController {
                     erpOrderInfo.setStatus(resultSet.getInt("Status"));
                     erpOrderInfo.setRelsDate(resultSet.getDate("relsdate"));
                     erpOrderInfo.setDeptId(resultSet.getString("MDeptCode"));
-//                    erpOrderInfo.setDeptName(resultSet.getString("cDepName"));
+                    if (resultSet.getDate("closeDate") != null) {
+                        erpOrderInfo.setCloseDate(resultSet.getDate("closeDate"));
+                    } else {
+                        erpOrderInfo.setCloseDate(null);
+                    }
                     resList.add(erpOrderInfo);
                 }
             }

+ 3 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/ErpOrderInfo.java

@@ -45,4 +45,7 @@ public class ErpOrderInfo extends Model<ErpOrderInfo> {
 
     @TableField("dept_name")
     private String deptName;
+
+    @TableField("close_date")
+    private Date closeDate;
 }

+ 0 - 47
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/ReportController.java

@@ -1559,53 +1559,6 @@ public class ReportController {
 
             }
         }
-        //针对泓浒(苏州),需要按照工单号的部门来设置工时所属部门,同时设置是否是协作工时
-        if (Constant.HONG_HU_COMPANY_ID == company.getId()) {
-            for (Report report : reportList) {
-                //校验分组为车间的分组时,工单号是否必填
-                if (report.getGroupId() != null && report.getGroupId() != 0) {
-                    TaskGroup group = taskGroupService.getById(report.getGroupId());
-                    if (group != null && group.getName().contains("车间") && StringUtils.isEmpty(report.getExtraField4())) {
-                        HttpRespMsg httpRespMsg = new HttpRespMsg();
-                        httpRespMsg.setError("当前选择了带车间的工时分组,对应的工单号必填");
-                        return httpRespMsg;
-                    }
-                }
-            }
-
-            List<String> collect = reportList.stream().filter(r -> !StringUtils.isEmpty(r.getExtraField4())).map(Report::getExtraField4).collect(Collectors.toList());
-            if (collect.size() > 0) {
-                List<ErpOrderInfo> orderList = erpOrderInfoMapper.selectList(new QueryWrapper<ErpOrderInfo>().in("order_id", collect));
-                for (Report report : reportList) {
-                    if (!StringUtils.isEmpty(report.getExtraField4())) {
-                        String errorMsg = null;
-                        Optional<ErpOrderInfo> first = orderList.stream().filter(order -> order.getOrderId().equals(report.getExtraField4())).findFirst();
-                        if (first.isPresent()) {
-                            if (first.get().getDeptId() == null) {
-                                errorMsg = "工单号:"+report.getExtraField4()+"无部门id";
-                            } else {
-                                Department deptItem = departmentMapper.selectOne(new QueryWrapper<Department>().eq("dept_code", first.get().getDeptId()));
-                                if (deptItem != null) {
-                                    if (!deptItem.getDepartmentId().equals(report.getDeptId())) {
-                                        report.setDeptId(deptItem.getDepartmentId());
-                                        report.setIsAssist(true);
-                                    }
-                                } else {
-                                    errorMsg = "工时系统中尚未设置部门编号:"+first.get().getDeptId();
-                                }
-                            }
-                        } else {
-                            errorMsg = "erpOrderInfo表中工单号不存在:"+report.getExtraField4();
-                        }
-                        if (errorMsg != null) {
-                            HttpRespMsg httpRespMsg = new HttpRespMsg();
-                            httpRespMsg.setError(errorMsg);
-                            return httpRespMsg;
-                        }
-                    }
-                }
-            }
-        }
 
         //项目所属bu审核
         if(comTimeType.getReportAuditType() == 4){

+ 13 - 4
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/TaskController.java

@@ -257,6 +257,11 @@ public class TaskController {
                         }
                     }
                 }
+                //检查人员在其他任务上是否有时间冲突
+                Integer count = taskMapper.getUserConflitTaskCount(ex.getExecutorId(), task.getId(), task.getStartDate(), task.getEndDate());
+                if (count > 0) {
+                    msg.setError(ex.getExecutorName()+"在其他任务上有时间冲突");
+                }
             });
             if (msg.code.equals("error")) {
                 return msg;
@@ -546,10 +551,10 @@ public class TaskController {
                     if (recpUserList.get(0).getDingdingUserid() != null) {
                         //钉钉用户
                         CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
-                        LocalDate endDate = task.getEndDate();
+                        LocalDateTime endDate = task.getEndDate();
                         String endStr = "";
                         if (endDate != null) {
-                            endStr = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(endDate);
+                            endStr = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(endDate);
                         }
                         companyDingdingService.sendNewTaskMsg(dingding, recpUserList.stream().map(User::getDingdingUserid).collect(Collectors.joining(",")),
                                 task.getName(), endStr);
@@ -674,7 +679,7 @@ public class TaskController {
 
             if (old.getFinishDate() == null) {
                 //仅对没有完成日期的任务设置完成日期
-                task.setFinishDate(LocalDate.now());
+                task.setFinishDate(LocalDateTime.now());
             }
 
             if (task.getParentTid() == null) {
@@ -1331,7 +1336,7 @@ public class TaskController {
                 row.createCell(5).setCellValue(task.getFinishDate() !=null?dateTimeFormatter.format(task.getFinishDate()):"");
                 row.createCell(6).setCellValue(task.getTaskStatus() == 1?"Y":"N");
                 boolean isExpired = false;
-                if (task.getTaskStatus() == 0 && task.getEndDate() !=null&& !task.getEndDate().isAfter(LocalDate.now())) {
+                if (task.getTaskStatus() == 0 && task.getEndDate() !=null&& !task.getEndDate().isAfter(LocalDateTime.now())) {
                     isExpired = true;
                 }
                 row.createCell(7).setCellValue(isExpired?"Y":"N");
@@ -1783,6 +1788,10 @@ public class TaskController {
         return taskService.cancelByManager(id,request);
     }
 
+    @RequestMapping("/viewUserTaskSchedule")
+    public HttpRespMsg viewUserTaskSchedule(Integer taskId, String userId, String startDate, String endDate){
+        return taskService.viewUserTaskSchedule(taskId, userId, startDate, endDate, request);
+    }
 
 }
 

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

@@ -22,7 +22,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2025-05-14
+ * @since 2025-05-19
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -95,15 +95,17 @@ public class Task extends Model<Task> {
      * 创建时间
      */
     @TableField("create_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate createDate;
 
     /**
      * 截止时间
      */
     @TableField("end_date")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate endDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime endDate;
 
     /**
      * 项目id
@@ -162,7 +164,7 @@ public class Task extends Model<Task> {
     private Integer taskType;
 
     /**
-     * 父计划名称
+     * 父任务名称
      */
     @TableField("parent_tname")
     private String parentTname;
@@ -171,17 +173,17 @@ public class Task extends Model<Task> {
      * 完成日期
      */
     @TableField("finish_date")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate finishDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime finishDate;
 
     /**
      * 开始日期
      */
     @TableField("start_date")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate startDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime startDate;
 
     /**
      * 会议Id

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/mapper/TaskMapper.java

@@ -10,6 +10,7 @@ import com.management.platform.entity.vo.*;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -24,6 +25,7 @@ import java.util.Map;
 public interface TaskMapper extends BaseMapper<Task> {
     List<Map<String,Object>> getExecutorPanel(Integer projectId);
     List getStagesPanel(Integer projectId);
+
     List getTopCostTask(Integer projectId);
 
     List<Task> simpleList(@Param(Constants.WRAPPER) Wrapper wrapper,Integer start,Integer size);
@@ -92,4 +94,7 @@ public interface TaskMapper extends BaseMapper<Task> {
     List getMyAuditTaskList(@Param(Constants.WRAPPER) Wrapper wrapper, Integer pageStart, Integer pageSize,String userId);
     Integer getMyAuditTaskCount(@Param(Constants.WRAPPER) Wrapper wrapper,String userId);
 
+    Integer getUserConflitTaskCount(String userId, Integer taskId, LocalDateTime startDate, LocalDateTime endDate);
+
+    List getUserTaskTimeList(Integer taskId, String userId, LocalDateTime startDate, LocalDateTime endDate);
 }

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

@@ -68,4 +68,6 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg taskPlanPassOrReject(Integer taskId,boolean type, String reason,HttpServletRequest request);
 
     HttpRespMsg cancelByManager(Integer id, HttpServletRequest request);
+
+    HttpRespMsg viewUserTaskSchedule(Integer taskId, String userId, String startDate, String endDate, HttpServletRequest request);
 }

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

@@ -3696,9 +3696,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<Task> allTask = taskMapper.simpleList(new QueryWrapper<Task>().eq("project_id", id),null,null);
         long finishCount = allTask.stream().filter(t -> t.getTaskStatus() == 1).count();
         long unfinishCount = allTask.stream().filter(t -> t.getTaskStatus() == 0).count();
-        long timeupCount = allTask.stream().filter(t -> t.getTaskStatus() == 0 && t.getEndDate() != null && t.getEndDate().isBefore(LocalDate.now())).count();
+        long timeupCount = allTask.stream().filter(t -> t.getTaskStatus() == 0 && t.getEndDate() != null && t.getEndDate().isBefore(LocalDateTime.now())).count();
         long unassignCount = allTask.stream().filter(t -> t.getExecutorId() == null).count();
-        long todayTimeupCount = allTask.stream().filter(t -> t.getTaskStatus() == 0 && t.getEndDate() != null && t.getEndDate().isEqual(LocalDate.now())).count();
+        long todayTimeupCount = allTask.stream().filter(t -> t.getTaskStatus() == 0 && t.getEndDate() != null && t.getEndDate().isEqual(LocalDateTime.now())).count();
         long timeupFinishCount = allTask.stream().filter(t -> t.getTaskStatus() == 1 && t.getEndDate() != null && t.getFinishDate() != null && t.getFinishDate().isAfter(t.getEndDate())).count();
         long timeunsetCount = allTask.stream().filter(t -> t.getTaskStatus() == 0 && t.getEndDate() == null).count();
         HashMap<String, Long> map = new HashMap<>();

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -1425,7 +1425,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             Task fTask = new Task();
             fTask.setTaskStatus(1);
             LocalDate createDate = reportList.get(0).getCreateDate();
-            fTask.setFinishDate(createDate);
+            fTask.setFinishDate(createDate.atTime(LocalTime.now()));
             taskMapper.update(fTask, new QueryWrapper<Task>().in("id", finishedTaskIds));
             //如果是里程碑,需要发送通知
             List<Task> finishedMileStoneList = taskMapper.selectList(new QueryWrapper<Task>().select("id, name, project_id, finish_date").in("id", finishedTaskIds).eq("task_type", 1));

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

@@ -523,14 +523,15 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     Date dateCellValue = startDateCell.getDateCellValue();
                     System.out.println("日期=="+dateCellValue.toString());
                     String formatValue = new SimpleDateFormat("yyyy-MM-dd").format(dateCellValue);
-                    LocalDate startDate = LocalDate.parse(formatValue, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                    LocalDateTime startDate = LocalDateTime.parse(formatValue, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                     task.setStartDate(startDate);
                 }
                 if(endDateCell != null && endDateCell.getDateCellValue()!=null){
                     Date dateCellValue = endDateCell.getDateCellValue();
                     System.out.println("日期=="+dateCellValue.toString());
                     String formatValue = new SimpleDateFormat("yyyy-MM-dd").format(dateCellValue);
-                    LocalDate endDate = LocalDate.parse(formatValue, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                    LocalDateTime endDate = LocalDateTime.parse(formatValue, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                    endDate.withHour(23).withMinute(59).withSecond(59);
                     task.setEndDate(endDate);
                 }
                 if(planHoursCell!=null){
@@ -1214,6 +1215,14 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         return msg;
     }
 
+    @Override
+    public HttpRespMsg viewUserTaskSchedule(Integer taskId, String userId, String startDate, String endDate, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        msg.data = taskMapper.getUserTaskTimeList(taskId, userId, LocalDateTime.parse(startDate, dtf), LocalDateTime.parse(endDate, dtf));
+        return msg;
+    }
+
     private List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
         List<Integer> list = new ArrayList<>();
         list.add(departmentId);

+ 4 - 4
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/task/TimingTask.java

@@ -1268,9 +1268,9 @@ public class TimingTask {
                 String corpUserid = userList.stream().filter(ul -> list.contains(ul.getId())).map(User::getCorpwxUserid).distinct().collect(Collectors.joining(","));
                 StringBuilder stringBuilder=new StringBuilder();
                 stringBuilder.append("您负责的任务["+task.getName()+"]");
-                if(task.getEndDate().isEqual(now)){
+                if(task.getEndDate().toLocalDate().isEqual(now)){
                     stringBuilder.append("今天");
-                }else if(task.getEndDate().isEqual(now.plusDays(1))){
+                }else if(task.getEndDate().toLocalDate().isEqual(now.plusDays(1))){
                     stringBuilder.append("一天后");
                 }
                 stringBuilder.append("截止,请抓紧时间完成!");
@@ -1278,9 +1278,9 @@ public class TimingTask {
                 if(org.apache.commons.lang3.StringUtils.isNotBlank(sendWxIds)){
                     StringBuilder msg=new StringBuilder();
                     msg.append("任务["+task.getName()+"]");
-                    if(task.getEndDate().isEqual(now)){
+                    if(task.getEndDate().toLocalDate().isEqual(now)){
                         msg.append("今天");
-                    }else if(task.getEndDate().isEqual(now.plusDays(1))){
+                    }else if(task.getEndDate().toLocalDate().isEqual(now.plusDays(1))){
                         msg.append("一天后");
                     }
                     msg.append("截止,请督促员工完成!");

+ 22 - 0
fhKeeper/formulahousekeeper/management-platform-mld/src/main/resources/mapper/TaskMapper.xml

@@ -867,4 +867,26 @@
             ${ew.customSqlSegment}
         and (task_executor.`audit_status` = 3 AND task_executor.`first_auditor_id` = #{userId} ) or (task.task_status = 4 and task_executor.`audit_status` = 4 AND task_executor.`second_auditor_id` = #{userId} )
     </select>
+    <select id="getUserConflitTaskCount"
+            resultType="java.lang.Integer">
+        SELECT count(1) FROM task_executor LEFT JOIN task ON task.id = task_executor.`task_id`
+                        WHERE task_executor.`executor_id` = #{userId} and task.task_status &lt;&gt; 2
+        <if test="taskId != null">
+            and task.id &lt;&gt; #{taskId}
+        </if>
+        and task.start_date &lt;= #{endDate} and task.end_date &gt;= #{startDate}
+    </select>
+    <select id="getUserTaskTimeList"
+            resultType="java.util.HashMap">
+        SELECT task.id, task.task_plan_type as taskPlanType,task_type.name as typeName, task.name,task.task_status as taskStatus, project.project_name as projectName, date_format(task.`start_date`, '%Y-%m-%d %H:%i:%s') as startDate, date_format(task.`end_date`, '%Y-%m-%d %H:%i:%s') as endDate,task_executor.`plan_hours` as planHours
+        FROM task_executor LEFT JOIN task ON task.id = task_executor.`task_id`
+            left join task_type on task_type.id = task.`task_plan_type`
+        left join project on project.id = task.`project_id`
+        WHERE task_executor.`executor_id` = #{userId} and task.task_status &lt;&gt; 2
+        <if test="taskId != null">
+            and task.id &lt;&gt; #{taskId}
+        </if>
+        and task.start_date &lt;= #{endDate} and task.end_date &gt;= #{startDate}
+    </select>
+
 </mapper>

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

@@ -300,9 +300,16 @@ public class ProjectController {
 
     @RequestMapping("/exportTimeByProjectAndEmployee")
     public HttpRespMsg exportTimeByProjectAndEmployee(@RequestParam String date, HttpServletRequest request) {
+        String token = request.getHeader("token");
+        User user = userMapper.selectById(token);
+        //苏州正北定制工时表
+        if (user.getCompanyId() == 8138 || user.getCompanyId() == 7) {
+            return projectService.exportZhengBeiTimeReport(date, request);
+        }
         return projectService.exportTimeByProjectAndEmployee(date, request);
     }
 
+
     /**
      * 导出查询者所在公司每个项目分类的工时成本
      */

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

@@ -872,7 +872,7 @@ public class UserCorpwxTimeController {
             if (oldList.size() > 0) {
                 list.forEach(l->{
                     for (UserCorpwxTime old : oldList) {
-                        if (old.getName().equals(l.getName()) && old.getCreateDate().equals(l.getCreateDate())) {
+                        if (old.getName() != null && old.getName().equals(l.getName()) && old.getCreateDate().equals(l.getCreateDate())) {
                             l.setId(old.getId());
                         }
                     }

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

@@ -314,7 +314,7 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg getProjectListByPage(Integer pageIndex, Integer pageSize, String infoString, Integer id, Integer forReport, HttpServletRequest request);
 
     HttpRespMsg exportTimeByProjectAndEmployee(String date, HttpServletRequest request);
-
+    HttpRespMsg exportZhengBeiTimeReport(String date, HttpServletRequest request);
     HttpRespMsg getProjectEstimatedWorkNew(Integer pageIndex, Integer pageSize, Integer projectId, Integer type,Integer isWarn, HttpServletRequest request);
 
     HttpRespMsg exportProjectEstimatedWorkNew( Integer projectId, Integer type, Integer isWarn, HttpServletRequest request);

+ 3 - 20
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -58,9 +58,7 @@ public class DingDingServiceImpl implements DingDingService {
     private final Logger bizLogger = LoggerFactory.getLogger(getClass());
     public static final DateTimeFormatter timeDtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     public static final DateTimeFormatter mmDtf = DateTimeFormatter.ofPattern("HH:mm");
-//    public static long appId = 71020L;
-    String token = "cf776d62c5fb3508b5d8c2cbb9f3df0c";
-    String aesKey = "ktmbamhymjsf60ndwp6n81mnu92847oynsgj9e0zr9v";
+
     public static String suiteKey = "suitejwoq9dw4bxv4stdb";
     public static String suiteSecret = "o-TWFLkFe8YbJsa_025JOj_JEWydP5GR3eigt1Yn1rtx5dTcryTJiSA6KEih3Bi4";
 
@@ -74,32 +72,17 @@ public class DingDingServiceImpl implements DingDingService {
     @Resource
     ExpenseMainTypeService expenseMainTypeService;
 
-    public static String PRE_AUTH_CODE = null;
     public static long expireTime = 0L;
 
     private static Object deptLock = new Object();
     private static Object userLock = new Object();
     @Resource
-    SysRoleModuleMapper sysRoleModuleMapper;
-    @Resource
     BusinessTripMapper businessTripMapper;
     @Resource
-    SysRoleFunctionMapper sysRoleFunctionMapper;
-    @Resource
     private SysRoleMapper sysRoleMapper;
     @Resource
-    private HttpServletRequest request;
-    @Resource
-    private SysModuleMapper sysModuleMapper;
-    @Resource
     private LeaveQuotaNumService leaveQuotaNumService;
     @Resource
-    private SysFunctionMapper sysFunctionMapper;
-    @Resource
-    private SysRoleModuleService sysRoleModuleService;
-    @Resource
-    private SysRoleFunctionService sysRoleFunctionService;
-    @Resource
     private SysRoleService sysRoleService;
     @Resource
     private SysConfigMapper sysConfigMapper;
@@ -2295,7 +2278,7 @@ public class DingDingServiceImpl implements DingDingService {
         }
         String accessToken = getCorpAccessToken(dingding);
         if (userList.size() > 50) {
-            int batchSize = userList.size()/50+userList.size()%50==0?0:1;
+            int batchSize = userList.size()/50+(userList.size()%50==0?0:1);
             for (int i=0; i<batchSize; i++) {
                 int endIndex = (i+1)*50;
                 if (endIndex > userList.size()) {
@@ -2331,7 +2314,7 @@ public class DingDingServiceImpl implements DingDingService {
                 List<String> ids = userList.stream().map(User::getId).collect(Collectors.toList());
 
                 List<UserDingdingTime> oldList = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().between("work_date", startDate, endDate).in("user_id", ids));
-                System.out.println("历史数据size===="+oldList.size());
+//                System.out.println("历史数据size===="+oldList.size());
                 List<UserDingdingTime> cardRecordList = new ArrayList<>();
                 //按人员进行分组
                 Map<String, List<DdingCardTimeItem>> map = list.stream().collect(Collectors.groupingBy(DdingCardTimeItem::getUserId));

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

@@ -375,6 +375,110 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg exportZhengBeiTimeReport(String date, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        String[] strings = date.split("-");
+        int year = Integer.parseInt(strings[0]);
+        int month = Integer.parseInt(strings[1]);
+        YearMonth yearMonth = YearMonth.of((year), month);
+        int daysInMonth = yearMonth.lengthOfMonth();
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        // 获取该月份的第一天
+        LocalDate startDate = LocalDate.of(year, month, 1);
+        // 获取下个月的第一天
+        LocalDate lastDate = startDate.with(TemporalAdjusters.lastDayOfMonth());
+        try {
+            User targetUser = userMapper.selectById(request.getHeader("Token"));
+            Integer companyId = targetUser.getCompanyId();
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
+            //查找该时间段内公司的所有日报数据
+            List<Report> monthlyReport = reportMapper.selectList(
+                    new QueryWrapper<Report>().select("project_id", "sum(working_time) as working_time", "create_date", "creator_id").between("create_date", startDate, lastDate)
+                            .eq("company_id", targetUser.getCompanyId()).eq("state", 1).groupBy()
+                            .groupBy("project_id", "create_date", "creator_id"));
+            //构建表头: 项目编号,项目名称,项目计划日期,日期, 员工姓名
+            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id", "project_code", "project_name", "plan_start_date", "plan_end_date").eq("company_id", targetUser.getCompanyId()));
+            List<String> header = new ArrayList<>();
+            header.add("项目编号");
+            header.add("项目名称");
+            header.add("项目计划日期");
+            header.add("日期");
+            List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", targetUser.getCompanyId()));
+            for (User user : users) {
+                header.add(user.getName());
+            }
+            DecimalFormat df = new DecimalFormat("0.0");
+            //构建表体
+            List<List<String>> body = new ArrayList<>();
+            body.add(header);
+            //按项目进行分组
+            Map<Integer, List<Report>> groupByProjectList = monthlyReport.stream().collect(Collectors.groupingBy(Report::getProjectId));
+            Iterator<Integer> it = groupByProjectList.keySet().iterator();
+            while (it.hasNext()) {
+                Integer projectId = it.next();
+                Project project = projectList.stream().filter(p->p.getId().equals(projectId)).findFirst().orElse(null);
+                if (project == null) {
+                    continue;
+                }
+                List<Report> curProjectReportList = groupByProjectList.get(projectId);
+                //构建日期,按自然日期填充
+                for (int i=0;i<daysInMonth;i++){
+                    List<String> row = new ArrayList<>();
+                    row.add(project.getProjectCode());
+                    row.add(project.getProjectName());
+                    row.add((project.getPlanStartDate() != null?dtf.format(project.getPlanStartDate()):"未设置")+"至"+(project.getPlanEndDate() != null?dtf.format(project.getPlanEndDate()):"未设置"));
+                    LocalDate curDate = startDate.plusDays(i);
+                    row.add(dtf.format(curDate));
+                    boolean iWorkDay = WorkDayCalculateUtils.isWorkDay(curDate);
+                    //根据人员进行填充
+                    for (User user : users) {
+                        Report report = curProjectReportList.stream().filter(  r->r.getCreateDate().equals(curDate) && r.getCreatorId().equals(user.getId())).findFirst().orElse(null);
+                        if (report != null && user.getId().equals(report.getCreatorId())) {
+                            row.add(report.getWorkingTime().toString());
+                        } else {
+                            row.add(iWorkDay?"0":"休");
+                        }
+                    }
+                    //项目+日期 组合为一行数据
+                    body.add(row);
+                }
+                //按项目进行合计
+                List<String> projectSumRow = new ArrayList<>();
+                projectSumRow.add("");
+                projectSumRow.add("项目小合计");
+                projectSumRow.add("");
+                projectSumRow.add("");
+                for (User user : users) {
+                    double sum = curProjectReportList.stream().filter(r->r.getCreatorId().equals(user.getId())).mapToDouble(Report::getWorkingTime).sum();
+                    projectSumRow.add(df.format(sum));
+                }
+                body.add(projectSumRow);
+            }
+            //全部项目的个人合计
+            List<String> sumRow = new ArrayList<>();
+            sumRow.add("");
+            sumRow.add("总合计");
+            sumRow.add("");
+            sumRow.add("");
+            for (User user : users) {
+                double sum = monthlyReport.stream().filter(r->r.getCreatorId().equals(user.getId())).mapToDouble(Report::getWorkingTime).sum();
+                sumRow.add(df.format(sum));
+            }
+            body.add(sumRow);
+            String fileName = "月度工时明细表"+System.currentTimeMillis();
+            try {
+                return excelExportService.exportGeneralExcelByTitleAndList(null,dingding,fileName , body, path);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        return httpRespMsg;
+    }
+
     @Override
     public HttpRespMsg exportTimeByProjectAndEmployee(String date, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();

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

@@ -15,9 +15,12 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://1.94.62.58:17089/man_mld?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+#    url: jdbc:mysql://1.94.62.58:17089/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+#    username: root
+#    password: P011430@Huoshi*
+    url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
-    password: P011430@Huoshi*
+    password: Ziyu20141026!@@
     hikari:
       maximum-pool-size: 60
       minimum-idle: 10

+ 112 - 34
fhKeeper/formulahousekeeper/timesheet_mld/src/components/taskComponent.vue

@@ -76,11 +76,11 @@
            
             <!-- {{timelabel}}{{mileageCup}} -->
             <el-form-item :label="!timelabel ? $t('starttimes') : $t('jie-zhi-shi-jian')" prop="startDate">
-                <el-date-picker v-model="addForm.startDate" type="date" style="width:40%;" value-format="yyyy-MM-dd"  
-                :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !permissions.editAnyTask && !(groupResponsibleId == user.id)" @change="DateChange()" v-if="!timelabel"></el-date-picker>
+                <el-date-picker v-model="addForm.startDate" type="datetime" style="width:40%;" value-format="yyyy-MM-dd HH:mm:ss"  
+                default-time="09:00:00" :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !permissions.editAnyTask && !(groupResponsibleId == user.id)" @change="DateChange()" v-if="!timelabel"></el-date-picker>
                 <span style="margin-left:30px;margin-right:10px;" v-if="!timelabel">{{ $t('deadline') }}</span>
-                <el-date-picker style="width:40%;" v-model="addForm.endDate" type="date" value-format="yyyy-MM-dd"  
-                :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !permissions.editAnyTask && !(groupResponsibleId == user.id)" @change="DateChange()"></el-date-picker>
+                <el-date-picker style="width:40%;" v-model="addForm.endDate" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"  
+                default-time="17:30:00" :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !permissions.editAnyTask && !(groupResponsibleId == user.id)" @change="DateChange()"></el-date-picker>
                 <span style="margin-left:30px;margin-right:10px;" v-if="timelabel && mileageCup">{{ $t('wan-cheng-shi-jian') }}</span>
                 <el-date-picker style="width:40%;" v-if="timelabel && mileageCup" v-model="addForm.finishDate" type="date" value-format="yyyy-MM-dd"  
                 :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !permissions.editAnyTask && !(groupResponsibleId == user.id)" @change="DateChange()"></el-date-picker>
@@ -97,8 +97,7 @@
                                         <span style="float: right; color: #8492a6; font-size: 13px;margin-left: 20px" v-if="item.jobNumber">{{ item.jobNumber }}</span>
                                     </el-option>
                                 </el-select>
-                                <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :filterable="true" :subject="users" :subjectId="executorItem.executorId" :distinction="'1'" @selectCal="selectCal" :index="executorItem.indexList" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !permissions.editAnyTask && !(groupResponsibleId == user.id)" :key="executorItem.indexList"></selectCat>
-                                <!-- <selectPersonnel v-if="user.userNameNeedTranslate == 1" v-model="executorItem.executorId" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !permissions.editAnyTask && !(groupResponsibleId == user.id)"  @change="$forceUpdate()" :key="executorItem.indexList" /> -->
+                                <el-link v-if="executorItem.executorId && addForm.startDate && addForm.endDate" style="margin-left:5px;" @click.stop="viewTaskTimeList(executorItem.executorId, executorItem.indexList)" type="primary" :underline="false">查看/修改</el-link>
                             </div>
                             
                             <!-- 计划工时 -->
@@ -606,6 +605,41 @@
             </div>
         </span>
     </div>
+
+    <!-- 修改工时弹窗 -->
+    <el-dialog title="修改计划" :visible.sync="modifyWorkingHoursRowVisable" width="840px" top="6.5vh" :before-close="handleClose" append-to-body>
+        <div>
+            <div class="modifyPlanTitle">
+                <div class="modifyPlanTitle-item">
+                    <div>执行人:</div>
+                    <el-select v-model="modifyWorkingHoursRow.userId" placeholder="请选择" filterable size="small" style="width: 180px;"  @change="getViewTaskTimeList()">
+                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
+                            <span style="float: left">{{ item.name }}</span>
+                            <span style="float: right; color: #8492a6; font-size: 13px;margin-left: 20px" v-if="item.jobNumber">{{ item.jobNumber }}</span>
+                        </el-option>
+                    </el-select>
+                </div>
+                <div class="modifyPlanTitle-item">
+                    <div>时间段:</div>
+                    <el-date-picker v-model="modifyWorkingHoursRow.startDate" type="datetime" style="width: 200px;" value-format="yyyy-MM-dd HH:mm:ss"  
+                    default-time="09:00:00" :placeholder="$t('pleaseselectadate')" size="small" @change="getViewTaskTimeList()" :clearable="false"></el-date-picker>
+                    <span style="margin:0 10px;">至</span>
+                    <el-date-picker style="width: 200px;" v-model="modifyWorkingHoursRow.endDate" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"  
+                    default-time="17:30:00" :placeholder="$t('pleaseselectadate')" size="small" @change="getViewTaskTimeList()" :clearable="false"></el-date-picker>
+                </div>
+            </div>
+            <el-table :data="modifyWorkingHoursList" style="width: 100%" border v-loading="modifyWorkingHoursListLoading" height="58vh">
+                <el-table-column prop="name" label="项目名称"></el-table-column>
+                <el-table-column prop="typeName" label="计划名称"></el-table-column>
+                <el-table-column prop="startDate" label="开始时间" width="180"></el-table-column>
+                <el-table-column prop="endDate" label="截止时间" width="180"></el-table-column>
+            </el-table>
+        </div>
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="modifyWorkingHoursRowVisable = false">取 消</el-button>
+            <el-button type="primary" @click="confirmArrangement()">确认安排</el-button>
+        </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -687,8 +721,8 @@ export default {
         taskTypeList:[{id:0,name:this.$t('other.task'), icon:"iconfont firerock-iconrenwu"},{id:1,name:this.$t('other.milestone'),icon:"iconfont firerock-iconicon-"},{id:2,name:this.$t('risk'),icon:"iconfont firerock-iconfengxian"}],
         taskTypeColor:[getThemeColor(),'#8613ad','#bf0404'],
         taskTypeIcon:['iconfont firerock-iconrenwu','iconfont firerock-iconicon-','iconfont firerock-iconfengxian'],
-        taskStatusList:[this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone'),'待第一审核人审核','待第二审核人审核','驳回'],
-        taskStatusColorList:['#20a0ff','#E6A23C','#a0a0a0','#f7863b','#262626','#FF0000'],
+        taskStatusList:[this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone'),'待第一审核人审核','待第二审核人审核','第一审核人驳回','第二审核人驳回'],
+        taskStatusColorList:['#20a0ff','#E6A23C','#a0a0a0','#f7863b','#262626','#FF0000','#FF0000'],
         
         //优先级
         taskLevelColor:['#262626','#E6A23C','#F56C6C'],
@@ -877,6 +911,11 @@ export default {
         },
         pmUserList: [],
         millerSReviewer: [],
+
+        modifyWorkingHoursRow: {},
+        modifyWorkingHoursList: [],
+        modifyWorkingHoursListLoading: false,
+        modifyWorkingHoursRowVisable: false,
     };
   },
   computed: {
@@ -924,6 +963,51 @@ export default {
     onTypeChange(e) {
         this.selectType = this.typeList.filter(a=>a.id == e)[0];
     },  
+    confirmArrangement() {
+        const { index, userId, startDate, endDate } = this.modifyWorkingHoursRow    
+        const userList = (this.addForm.executorListFront || []).filter(item => item.executorId == userId)
+        const row = this.addForm.executorListFront[index].executorId
+
+        if(userList.length > 0 && row != userId) {
+            this.$message({ message: '执行人已存在', type: "error" });
+            return
+        }
+
+        const name = this.users.find(item => item.id == userId).name
+
+        this.addForm.executorListFront[index].executorId = userId
+        this.addForm.executorListFront[index].executorName = name
+
+        this.addForm.startDate = startDate
+        this.addForm.endDate = endDate
+
+        this.modifyWorkingHoursRowVisable = false
+
+        this.$message({ message: '修改成功', type: "success" });
+    },
+    viewTaskTimeList(executorId, index) {
+        this.modifyWorkingHoursRow = { taskId: this.addForm.id, userId: executorId, startDate: this.addForm.startDate, endDate: this.addForm.endDate, index}
+        this.modifyWorkingHoursRowVisable = true
+        this.getViewTaskTimeList()
+    },
+    getViewTaskTimeList() {
+        this.modifyWorkingHoursListLoading = true
+        let obj = { ...this.modifyWorkingHoursRow }
+        delete obj.index
+        this.http.post('/task/viewUserTaskSchedule', { ...obj },
+        res => {
+            this.modifyWorkingHoursListLoading = false
+          if (res.code == "ok") {
+            this.modifyWorkingHoursList = res.data;
+          } else {
+            this.$message({ message: res.msg, type: "error" });
+          }
+        },
+        error => {
+          this.modifyWorkingHoursListLoading = false
+          this.$message({ message: error, type: "error" });
+        });
+    },
     getTaskTypeList() {
       this.http.post('/task-type/list', { companyId: this.user.companyId },
         res => {
@@ -1115,7 +1199,7 @@ export default {
                 projectId: obj.stage.projectId, 
                 groupId: obj.stage.groupId, 
                 stagesId: obj.stage.id, 
-                startDate: obj.addForm.startDate,
+                startDate: obj.addForm.startDate + ' 08:00:00',
                 taskLevel:0, 
                 planHours: 8, 
                 taskType: 0
@@ -1675,14 +1759,14 @@ export default {
         if(this.addForm.startDate != undefined && this.addForm.endDate != undefined){
             let stdate = Date.parse(this.addForm.startDate)
             let eddate = Date.parse(this.addForm.endDate)
-            if(stdate <= eddate){
-                let days = (eddate - stdate) / (1*24*60*60*1000) + 1
-                for (let i=0;i<this.gstimday.length;i++) {
-                    this.gstimday[i] = days
-                    this.gstimhour[i] = days * this.user.timeType.allday
-                }
-                this.$forceUpdate()
-            }
+            // if(stdate <= eddate){
+            //     let days = (eddate - stdate) / (1*24*60*60*1000) + 1
+            //     for (let i=0;i<this.gstimday.length;i++) {
+            //         this.gstimday[i] = days
+            //         this.gstimhour[i] = days * this.user.timeType.allday
+            //     }
+            //     this.$forceUpdate()
+            // }
         }
         
     },
@@ -2006,23 +2090,6 @@ export default {
             this.timelabel = false
         }
     },
-    DateChange(){
-        if(this.addForm.startDate != undefined && this.addForm.endDate != undefined){
-            let stdate = Date.parse(this.addForm.startDate)
-            let eddate = Date.parse(this.addForm.endDate)
-            if(stdate <= eddate){
-                let days = (eddate - stdate) / (1*24*60*60*1000) + 1
-                for (let i=0;i<this.gstimday.length;i++) {
-                    this.gstimday[i] = days
-                    this.gstimhour[i] = days * this.user.timeType.allday
-                }
-                this.$forceUpdate()
-            }
-            // console.log("gstimday",this.gstimday);
-            
-        }
-        
-    },
     kkk(el){
         var k = this.checkLists.indexOf(el.id)
         if (k == -1) {
@@ -2709,4 +2776,15 @@ export default {
         margin-right: 10px;
     }
 }
+
+.modifyPlanTitle {
+    display: flex;
+    align-items: center;
+    margin-bottom: 20px;
+}
+.modifyPlanTitle-item {
+    display: flex;
+    align-items: center;
+    margin-right: 20px;
+}
 </style>

+ 37 - 26
fhKeeper/formulahousekeeper/timesheet_mld/src/views/project/gantt.vue

@@ -291,37 +291,48 @@ export default {
           </div>`
       }
 
+      // 更改为统一的
+      if([3,4,5,6].includes(taskStatus)) {
+          return `<div class="task_text">
+            ${task.taskStatus == 3 ? `<div class="circle"></div> <div class="circle"></div>` : ''}
+            ${task.taskStatus == 4 ? `<div class="exclamation-circle circle" style="color: #8ecaf8">V</div> <div class="circle"></div>` : ''}
+            ${task.taskStatus == 5 ? `<div class="exclamation-circle circle" style="color: #f56c6c">!</div> <div class="circle"></div>` : ''}
+            ${task.taskStatus == 6 ? `<div class="exclamation-circle circle" style="color: #8ecaf8">V</div> <div class="exclamation-circle circle" style="color: #f56c6c">!</div>` : ''}
+            <div>${task.text}</div>
+          </div>`;
+      }
+
       // 小组长
       // if (userInfo.projectLeaderType == 1) {
-      if (leaderOrManager == 1) {
-        return `<div class="task_text">
-          ${task.taskStatus == 3 ? `<div class="circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div> <div class="circle"></div>` : ''}
-          ${task.taskStatus == 4 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="circle"></div>` : ''}
-          ${task.taskStatus == 5 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div> <div class="circle"></div>` : ''}
-          ${task.taskStatus == 6 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div>` : ''}
-          <div>${task.text}</div>
-        </div>`;
-      }
+      // if (leaderOrManager == 1) {
+      //   return `<div class="task_text">
+      //     ${task.taskStatus == 3 ? `<div class="circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div> <div class="circle"></div>` : ''}
+      //     ${task.taskStatus == 4 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="circle"></div>` : ''}
+      //     ${task.taskStatus == 5 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div> <div class="circle"></div>` : ''}
+      //     ${task.taskStatus == 6 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div>` : ''}
+      //     <div>${task.text}</div>
+      //   </div>`;
+      // }
 
       // 审核人
       // if (userInfo.projectLeaderType == 2) {
-      if (leaderOrManager == 2) {
-        const oneRight = `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="circle"></div>`
-        const twoPairs = `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="circle exclamation-circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div>`
-        const toExamine = `<div class="task_text statuss">
-            ${task.taskStatus == 3 || task.taskStatus == 4 ? `<div class="circle">
-              <div class="pendingReviewOfCornerMarkers">!</div>
-            </div>` : ''}`
-        const twoEmptyCircles = `<div class="circle"></div><div class="circle"></div>`
-        return `<div class="task_text">
-          ${(userIds == checkFirstId && task.taskStatus == 3) ? toExamine : (userIds == checkFirstId && task.taskStatus == 4) ? oneRight : ''}
-          ${(userIds == checkSecondId && task.taskStatus == 4) ? toExamine : (userIds == checkSecondId && task.taskStatus == 3) ? twoEmptyCircles : ''}
-          ${task.taskStatus == 5 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div> <div class="circle"></div>` : ''}
-          ${task.taskStatus == 6 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div>` : ''}
-          <div>${task.text}</div>
-          <div>${task.text}</div>
-        </div>`
-      }
+      // if (leaderOrManager == 2) {
+      //   const oneRight = `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="circle"></div>`
+      //   const twoPairs = `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="circle exclamation-circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div>`
+      //   const toExamine = `<div class="task_text statuss">
+      //       ${task.taskStatus == 3 || task.taskStatus == 4 ? `<div class="circle">
+      //         <div class="pendingReviewOfCornerMarkers">!</div>
+      //       </div>` : ''}`
+      //   const twoEmptyCircles = `<div class="circle"></div><div class="circle"></div>`
+      //   return `<div class="task_text">
+      //     ${(userIds == checkFirstId && task.taskStatus == 3) ? toExamine : (userIds == checkFirstId && task.taskStatus == 4) ? oneRight : ''}
+      //     ${(userIds == checkSecondId && task.taskStatus == 4) ? toExamine : (userIds == checkSecondId && task.taskStatus == 3) ? twoEmptyCircles : ''}
+      //     ${task.taskStatus == 5 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div> <div class="circle"></div>` : ''}
+      //     ${task.taskStatus == 6 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div>` : ''}
+      //     <div>${task.text}</div>
+      //     <div>${task.text}</div>
+      //   </div>`
+      // }
 
       // 正常人
       return `<div class="task_text">

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

@@ -1360,7 +1360,7 @@
                 taskTypeList:[{id:0,name:this.$t('other.task'), icon:"iconfont firerock-iconrenwu"},{id:1,name:this.$t('other.milestone'),icon:"iconfont firerock-iconicon-"},{id:2,name:this.$t('risk'),icon:"iconfont firerock-iconfengxian"}],
                 taskTypeColor:[getThemeColor(),'#8613ad','#bf0404'],
                 taskTypeIcon:['iconfont firerock-iconrenwu','iconfont firerock-iconicon-','iconfont firerock-iconfengxian'],
-                taskStatusList:[this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
+                taskStatusList:[this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone'),'待第一审核人审核','待第二审核人审核','第一审核人驳回','第二审核人驳回'],
                 //优先级
                 taskLevelColor:['#262626','#E6A23C','#F56C6C'],
                 stageListHeight:0,