Browse Source

增加周总结

seyason 1 năm trước cách đây
mục cha
commit
8b03acb5e2

+ 9 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -242,6 +242,11 @@ public class ReportController {
         return reportService.getReport(date, request);
     }
 
+    @RequestMapping("/getReportById")
+    public HttpRespMsg getReportById(@RequestParam Integer reportId) {
+        return reportService.getReportById(reportId, request);
+    }
+
     /**
      * AI智能填报
      * @return
@@ -338,7 +343,8 @@ public class ReportController {
                                   String[] picStr, //图片的文件名,不含后缀的,多个用@分隔,如:["3UlRmLbTnqLPM0-xjja2dS2VAg5OFERPUZz0HRqjb8BXLq8ewaFH6NmlFm1pnVza0"@"338EniZDtXtKGSnavdgvebGGyRgoieGv2aobIq6k5jboa_DsZNIvLmzHjW69kDG6x"]
                                   Integer[] extraField1,
                                   Integer[] extraField2,
-                                  Integer[] extraField3
+                                  Integer[] extraField3,
+                                  String summary         //针对工作总结的字段
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
@@ -1564,8 +1570,8 @@ public class ReportController {
                 return msg;
             }
         }
-
-        HttpRespMsg httpRespMsg = reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId());
+        System.out.println("summary==========="+summary);
+        HttpRespMsg httpRespMsg = reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId(), summary);
         //填报自动通过功能:【上海绎维】、【火石演示】、【博通容合】、【威派格】使用
         if (company.getId() == 862 || company.getId() == 10 || company.getId() == 3344 || company.getId() == 936) {
             //项目审核人是提交人的情况,直接审核

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

@@ -22,7 +22,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-08-11
+ * @since 2023-11-27
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -91,6 +91,13 @@ public class ReportBatch extends Model<ReportBatch> {
     @TableField(exist = false)
     private String reportIds;
 
+    /**
+     * 周总结
+     */
+    @TableField("summary")
+    private String summary;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2023-11-17
+ * @since 2023-11-27
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -522,6 +522,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("sync_sap")
     private Integer syncSap;
 
+    /**
+     * 项目超期不可填报
+     */
+    @TableField("not_allowed_expired_project")
+    private Integer notAllowedExpiredProject;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -33,7 +33,7 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg getCardTime(String date, HttpServletRequest request);
 
-    HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId);
+    HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId, String summary);
 
     HttpRespMsg deleteReport(String userId, String date);
 
@@ -133,4 +133,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getWeeklyFillReportData(String targetDate, HttpServletRequest request);
 
     HttpRespMsg pushProjectReportToSap(String startDate, String endDate,String userId);
+
+    HttpRespMsg getReportById(Integer reportId, HttpServletRequest request);
 }

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

@@ -261,6 +261,35 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     httpRespMsg.data = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()).orderByDesc("is_public").orderByAsc("id"));
                 }
             }
+
+            //按计划完成日期进行过滤
+            if (timeTypeMapper.selectById(user.getCompanyId()).getNotAllowedExpiredProject() == 1) {
+                Object data = httpRespMsg.data;
+                List projectList = (List) data;
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+                for (int i=0;i<projectList.size(); i++) {
+                    Object item = projectList.get(i);
+                    if (item instanceof Project) {
+                        Project project = (Project) item;
+                        if (project.getPlanEndDate() != null && project.getPlanEndDate().isBefore(LocalDate.now())) {
+                            projectList.remove(i);
+                            i--;
+                        }
+                    } else if (item instanceof HashMap) {
+                        HashMap project = (HashMap) item;
+                        if (project.get("planEndDate") != null) {
+                            String yyyymmdd = simpleDateFormat.format((java.sql.Date)project.get("planEndDate"));
+                            if (LocalDate.parse(yyyymmdd, dateTimeFormatter).isBefore(LocalDate.now())) {
+                                projectList.remove(i);
+                                i--;
+                            }
+                        }
+                    }
+                }
+                httpRespMsg.data = projectList;
+            }
         } catch (NullPointerException e) {
             //httpRespMsg.setError("验证失败");
             httpRespMsg.setError(MessageUtils.message("access.verificationError"));

+ 309 - 32
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -216,6 +216,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //首先根据日期获取当天所有提交过日志的人
             String userId = request.getHeader("Token");
             User user = userMapper.selectById(userId);
+            TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
             List<Map<String, Object>> nameList = new ArrayList<>();
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
             if (functionList.size() == 0) {
@@ -329,7 +330,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     //担任项目经理或者日报审核人,查找相关的人员的日报
                     List<Map<String, Object>> puserNames = reportMapper.getReportNameByDate(date, user.getCompanyId(), leaderId);
                     List<Map<String, Object>> inchargeReportList= reportMapper.getInchargeReportByDate(date, leaderId, null);
-                    TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+
                     if ((timeType.getReportAuditType() == 5 || timeType.getReportAuditType() == 6)&& timeType.getReportCc() == 1) {
                         //存在抄送人的设置,需要把抄送人的项目相关日报也加上
                         List<Map<String, Object>> viewUserNames = reportMapper.getCcReportNameByDate(date, user.getCompanyId(),leaderId);
@@ -542,6 +543,35 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             }
+            if (timeType.getEnableNewWeeklyfill() == 1) {
+                //新版按周填报有周总结
+                List<Integer> batchIds = new ArrayList<>();
+                for (Map map : nameList) {
+                    List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
+                    for (Map<String, Object> report : reportList) {
+                        Integer batchId = (Integer)report.get("batchId");
+                        if (!batchIds.contains(batchId)) {
+                            batchIds.add(batchId);
+                        }
+                    }
+                }
+                if (batchIds.size() > 0) {
+                    List<ReportBatch> batchList = reportBatchMapper.selectList(new QueryWrapper<ReportBatch>().in("id", batchIds));
+                    DateTimeFormatter sdf = DateTimeFormatter.ofPattern("MM/dd");
+                    for (Map map : nameList) {
+                        List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
+                        if (reportList.size() > 0) {
+                            Integer batchId = (Integer)((Map)reportList.get(0)).get("batchId");
+                            Optional<ReportBatch> first = batchList.stream().filter(b -> b.getId().equals(batchId)).findFirst();
+                            if (first.isPresent()) {
+                                ReportBatch batchItem = first.get();
+                                map.put("summaryTitle", sdf.format(batchItem.getStartDate())+"至"+sdf.format(batchItem.getEndDate())+"周总结:");
+                                map.put("summary", batchItem.getSummary());
+                            }
+                        }
+                    }
+                }
+            }
             httpRespMsg.data = nameList;
         } catch (NullPointerException e) {
             e.printStackTrace();
@@ -798,6 +828,227 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg getReportById(Integer reportId, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        try {
+            String userId = request.getHeader("Token");
+            Integer companyId = userMapper.selectById(userId).getCompanyId();
+            Company company = companyMapper.selectById(companyId);
+            Map<String, Object> resultMap = new HashMap<>();
+            //查日报
+            Report report = reportMapper.selectById(reportId);
+            LocalDate date = report.getCreateDate();
+            Integer projectId = report.getProjectId();
+            List<SubProject> subProjectList = subProjectMapper.selectList(new QueryWrapper<SubProject>().eq("project_id",projectId));
+            List<ProjectAuditor> auditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", projectId));
+
+            List<Profession> professions = professionMapper.selectList(new QueryWrapper<Profession>().eq("company_id", companyId));
+
+            List<ReportExtraDegree> degreeList = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", companyId));
+            List<TaskGroup> taskGroups = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().eq("project_id", projectId));
+            List<Stages> stagesList =stagesMapper.selectList(new QueryWrapper<Stages>().eq("project_id", projectId));
+
+            //获取当前项目的子项目列表,任务分组,任务列表,项目相关维度列表
+            Report r = report;
+            r.setSubProjectList(subProjectList.stream().filter(s->s.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
+            r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId));
+            //获取当前项目的工程专业进度
+            List<ReportProfessionProgress> progressList = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().eq("report_id", r.getId()));
+            //去掉当前项目上已经不存在的专业
+            List<ProjectProfession> projectProfessions = projectProfessionMapper.selectList(new QueryWrapper<ProjectProfession>().eq("project_id", r.getProjectId()));
+            progressList = progressList.stream().filter(p->projectProfessions.stream().anyMatch(pp->pp.getProfessionId().equals(p.getProfessionId()))).collect(Collectors.toList());
+            progressList.stream().forEach(p->{
+                p.setProfessionName(professions.stream().filter(m->m.getId().equals(p.getProfessionId())).findFirst().get().getName());
+            });
+            r.setProfessionProgressList(progressList);
+            //获取任务阶段列表
+            if (company.getPackageProject() == 1 && r.getGroupId() != null && r.getGroupId() != 0) {
+                r.setStages(stagesList.stream().filter(s->s.getGroupId() !=null && s.getGroupId().equals(r.getGroupId())).collect(Collectors.toList()));
+            }
+            //处理图片
+            if (!StringUtils.isEmpty(r.getPicStr()) && !r.getPicStr().equals("@")) {
+                JSONArray array = JSONArray.parseArray(r.getPicStr().replaceAll("@", ","));
+                List<String> list = new ArrayList<>();
+                for (int i=0;i<array.size(); i++) {
+                    String picName = array.getString(i);
+                    if (!picName.contains(".")) {
+                        picName += ".jpg";
+                    }
+                    list.add("/upload/"+picName);
+                }
+                r.setPics(list);
+            }
+            if (r.getMultiWorktime() == 1) {
+                //设置多个工时情况下的报告列表
+                String timeStr = r.getContent();
+                if (timeStr != null) {
+                    JSONArray parse = JSONArray.parseArray(timeStr);
+                    List<WorktimeItem> list = new ArrayList<>();
+                    for (int i=0;i<parse.size(); i++) {
+                        JSONObject obj = parse.getJSONObject(i);
+                        list.add(JSONObject.toJavaObject(obj, WorktimeItem.class));
+                    }
+                    r.setWorktimeList(list);
+                }
+            }
+
+            //处理维度列表数据
+            if (timeTypeMapper.selectById(companyId).getCustomDegreeActive() == 1) {
+                Project project = projectMapper.selectById(projectId);
+                String associateDegrees = project.getAssociateDegrees();
+                List<HashMap> degreeMapList = new ArrayList<>();
+                if (associateDegrees != null) {
+                    String[] split = associateDegrees.split("\\,");
+                    for (int i=0;i<split.length; i++) {
+                        HashMap map = new HashMap();
+                        if (!StringUtils.isEmpty(split[i])) {
+                            Integer id = Integer.parseInt(split[i]);
+                            map.put("id", id);
+                            map.put("name", degreeList.stream().filter(d->d.getId().equals(id)).findFirst().get().getName());
+                            degreeMapList.add(map);
+                        }
+                    }
+                }
+                r.setDegreeList(degreeMapList);
+            }
+            //检查是否是按照任务分组负责人审核
+            int reportAuditType = timeTypeMapper.selectById(companyId).getReportAuditType();
+            //分组
+            if (company.getPackageProject() == 1) {
+                //如果是按照任务分组负责人审核,取参与的分组
+                if (reportAuditType == 1 || reportAuditType == 2){
+                    List<GroupParticipator> groupParticipatorList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>().eq("user_id", r.getCreatorId()));
+                    if (groupParticipatorList.size() > 0) {
+                        List<Integer> groupIds = groupParticipatorList.stream().map(GroupParticipator::getGroupId).collect(Collectors.toList());
+                        List<TaskGroup> findGroups = taskGroups.stream().filter(tg->groupIds.contains(tg.getId()) || userId.equals(tg.getInchargerId())).collect(Collectors.toList());
+                        r.setTaskGroups(findGroups);
+                        if (r.getGroupId() != null && r.getGroupId() != 0) {
+                            Optional<TaskGroup> optinal = taskGroups.stream().filter(tg->tg.getId().equals(r.getGroupId())).findFirst();
+                            if (optinal.isPresent()) {
+                                r.setGroupName(optinal.get().getName());
+                            }
+                        }
+                    }
+                } else {
+                    //取该项目下的全部分组数据
+                    r.setTaskGroups(taskGroups.stream().filter(tg->tg.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
+                    if (r.getGroupId() != null && r.getGroupId() != 0) {
+                        Optional<TaskGroup> optinal = taskGroups.stream().filter(tg->tg.getId().equals(r.getGroupId())).findFirst();
+                        if (optinal.isPresent()) {
+                            r.setGroupName(optinal.get().getName());
+                        }
+                    }
+                }
+            }
+            //项目的审核人
+            if (reportAuditType == 0) {
+                r.setAuditUserList(auditorList.stream().filter(au->au.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
+                if (r.getProjectAuditorId() != null) {
+                    Optional<ProjectAuditor> auItem = auditorList.stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
+                    if (auItem.isPresent()) {
+                        r.setProjectAuditorName(auItem.get().getAuditorName());
+                    }
+                }
+            } else if (reportAuditType == 1 || reportAuditType == 2) {
+                if (r.getGroupId() != null && r.getGroupId() != 0) {
+                    //直接获取分组的负责人作为审核人
+                    Optional<TaskGroup> tgoup = taskGroups.stream().filter(tg->tg.getId().equals(r.getGroupId())).findFirst();
+                    if (tgoup.isPresent()) {
+                        TaskGroup curGroup = tgoup.get();
+                        if (curGroup.getInchargerId() != null) {
+                            User user = userMapper.selectById(curGroup.getInchargerId());
+                            HashMap map = new HashMap();
+                            map.put("auditorId", user.getId());
+                            map.put("auditorName", user.getName());
+                            List list = new ArrayList();
+                            list.add(map);
+                            r.setAuditUserList(list);
+                            if (r.getProjectAuditorId() != null) {
+                                r.setProjectAuditorName(user.selectById(r.getProjectAuditorId()).getName());
+                            }
+                        }
+                    }
+                }
+            } else if (reportAuditType == 3) {
+                //获取日报对应已经设置好的审核人和抄送人
+                ReportAuditorSetting reportAuditorSetting = reportAuditorSettingMapper.selectById(r.getId());
+                r.setAuditorSetting(reportAuditorSetting);
+                //手机端数据
+                if (reportAuditorSetting.getAuditorFirst() != null) {
+                    User auditorItem = userMapper.selectOne(new QueryWrapper<User>().select("id, name").eq("id", reportAuditorSetting.getAuditorFirst()));
+                    r.setAuditorFirst(auditorItem);
+                }
+                if (reportAuditorSetting.getAuditorSec() != null) {
+                    User auditorItem = userMapper.selectOne(new QueryWrapper<User>().select("id, name").eq("id", reportAuditorSetting.getAuditorSec()));
+                    r.setAuditorSec(auditorItem);
+                }
+                if (reportAuditorSetting.getAuditorThird() != null) {
+                    User auditorItem = userMapper.selectOne(new QueryWrapper<User>().select("id, name").eq("id", reportAuditorSetting.getAuditorThird()));
+                    r.setAuditorThird(auditorItem);
+                }
+                if (reportAuditorSetting.getCcUserid() != null) {
+                    User auditorItem = userMapper.selectOne(new QueryWrapper<User>().select("id, name").eq("id", reportAuditorSetting.getCcUserid()));
+                    r.setCcUserid(auditorItem);
+                }
+            }
+            //昱众要返回工作内容下拉选项
+            if (companyId == 3385) {
+                HttpRespMsg funWorkContextList = projectService.getFunWorkContextList(r.getExtraField2());
+                List<ProFunWorkContext> workContentList = ((List<ProFunWorkContext>)funWorkContextList.data);
+                r.setWorkContentList(workContentList);
+            }
+            resultMap.put("report", report);
+            TimeType timeType = timeTypeMapper.selectById(companyId);
+            if (timeType.getShowDdCardtime() == 1) {
+                List<UserDingdingTime> dingdingTimes = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>()
+                        .eq("user_id", userId).eq("work_date", date));
+                if (dingdingTimes.size() > 0) {
+                    UserDingdingTime time = dingdingTimes.get(0);
+                    resultMap.put("time", time);
+                }
+            }else if(timeType.getSyncFanwei()==1){
+                List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>()
+                        .eq("user_id", userId).eq("work_date", date));
+                if (userFvTimeList.size() > 0) {
+                    UserFvTime time = userFvTimeList.get(0);
+                    resultMap.put("time", time);
+                }
+            } else if (timeType.getShowCorpwxCardtime() == 1) {
+                User user = userMapper.selectById(userId);
+                List<UserCorpwxTime> corpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
+                        .eq("corpwx_userid", user.getCorpwxUserid()).eq("create_date", date));
+                if (corpwxTimes.size() > 0) {
+                    UserCorpwxTime time = corpwxTimes.get(0);
+                    resultMap.put("time", time);
+                }
+            }
+
+            //顺便返回公司的工作时间设置
+            resultMap.put("timeType",timeType);
+            //返回公司的项目工时预警的成本项列表
+            List<ProjectBasecostSetting> timeBasecostList = new ArrayList<>();
+            if (company.getPackageProject() == 1) {
+                timeBasecostList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+            }
+            //当天是否是工作日
+            boolean isWorkDay = companyId == 817 ? WorkDayCalculateUtils.isWorkDayExceptSaturday(date) : WorkDayCalculateUtils.isWorkDay(date);
+            resultMap.put("isWorkDay", isWorkDay);
+            resultMap.put("timeBasecostList",timeBasecostList);
+            httpRespMsg.data = resultMap;
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            //httpRespMsg.setError("验证失败");
+            httpRespMsg.setError(MessageUtils.message("Company.validationError"));
+            return httpRespMsg;
+        } catch (DateTimeParseException e) {
+            //httpRespMsg.setError("日期格式有误");
+            httpRespMsg.setError(MessageUtils.message("date.formatError"));
+            return httpRespMsg;
+        }
+        return httpRespMsg;
+    }
+
     @Override
     public HttpRespMsg getCardTime(String date, HttpServletRequest request) {
         String userId = request.getHeader("TOKEN");
@@ -832,7 +1083,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
     //新增或编辑报告
     @Override
-    public HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId) {
+    public HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId, String summary) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         TimeType timeType = timeTypeMapper.selectById(companyId);
         //删除不在本次更新名单中的老记录
@@ -893,7 +1144,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //成都明夷电子,需要生成批量记录
             Company company = companyMapper.selectById(companyId);
             System.out.println(company.getCompanyName()+", date==="+date);
-            if (company.getCompanyName().equals("成都明夷电子科技有限公司")) {
+
+            if (company.getCompanyName().equals("成都明夷电子科技有限公司") || timeType.getEnableNewWeeklyfill() == 1) {//物奇需要填写周总结
                 if (date.contains("@")) {
                     //批量填报
                     String[] split = date.split("\\@");
@@ -919,42 +1171,46 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     //每日或按周填报,为每天生成一条记录; 每日或者按周填报时,填报人就是操作人自己,不存在代填的情况
                     List<LocalDate> dateList = reportList.stream().map(Report::getCreateDate).distinct().collect(Collectors.toList());
                     String creatorId = reportList.get(0).getCreatorId();
-                    for (LocalDate curDate : dateList) {
+                    if (timeType.getEnableNewWeeklyfill() == 1) {
+                        //按周填报,需要保存周总结
+                        LocalDate minDate = dateList.stream().min(LocalDate::compareTo).get();
+                        LocalDate maxDate = dateList.stream().max(LocalDate::compareTo).get();
                         //删除已有的记录
-                        reportBatchMapper.delete(new QueryWrapper<ReportBatch>().eq("start_date", curDate).eq("end_date", curDate).eq("creator_id", creatorId));
+                        reportBatchMapper.delete(new QueryWrapper<ReportBatch>().eq("start_date", minDate).eq("end_date", maxDate).eq("creator_id", creatorId));
                         ReportBatch batch = new ReportBatch();
                         batch.setCreatorId(creatorId);
                         batch.setState(0);
                         batch.setCompanyId(companyId);
-                        batch.setStartDate(curDate);
-                        batch.setEndDate(curDate);
-                        batch.setTotalWorkTime(reportList.stream().filter(item->item.getCreateDate().equals(curDate) && item.getCreatorId().equals(creatorId)).mapToDouble(Report::getWorkingTime).sum());
+                        batch.setStartDate(minDate);
+                        batch.setEndDate(maxDate);
+                        //周总结
+                        batch.setSummary(summary);
+                        batch.setTotalWorkTime(reportList.stream().filter(item->item.getCreatorId().equals(creatorId)).mapToDouble(Report::getWorkingTime).sum());
                         reportBatchMapper.insert(batch);
-
                         //更新batchId
-                        List<Integer> curDateReportIds = reportList.stream().filter(item -> item.getCreateDate().equals(curDate) && item.getCreatorId().equals(creatorId)).map(Report::getId).collect(Collectors.toList());
+                        List<Integer> curDateReportIds = reportList.stream().map(Report::getId).collect(Collectors.toList());
                         reportMapper.update(new Report().setBatchId(batch.getId()), new QueryWrapper<Report>().in("id", curDateReportIds));
+                    } else {
+                        for (LocalDate curDate : dateList) {
+                            //删除已有的记录
+                            reportBatchMapper.delete(new QueryWrapper<ReportBatch>().eq("start_date", curDate).eq("end_date", curDate).eq("creator_id", creatorId));
+                            ReportBatch batch = new ReportBatch();
+                            batch.setCreatorId(creatorId);
+                            batch.setState(0);
+                            batch.setCompanyId(companyId);
+                            batch.setStartDate(curDate);
+                            batch.setEndDate(curDate);
+                            //周总结
+                            batch.setSummary(summary);
+                            batch.setTotalWorkTime(reportList.stream().filter(item->item.getCreateDate().equals(curDate) && item.getCreatorId().equals(creatorId)).mapToDouble(Report::getWorkingTime).sum());
+                            reportBatchMapper.insert(batch);
+
+                            //更新batchId
+                            List<Integer> curDateReportIds = reportList.stream().filter(item -> item.getCreateDate().equals(curDate) && item.getCreatorId().equals(creatorId)).map(Report::getId).collect(Collectors.toList());
+                            reportMapper.update(new Report().setBatchId(batch.getId()), new QueryWrapper<Report>().in("id", curDateReportIds));
+                        }
                     }
-//                    for (Report r : reportList) {
-//                        LocalDate curDate = r.getCreateDate();
-//                        //删除已有的记录; //TODO: 一天多个项目会导致删除其他项目的记录, 需要修复
-//                        reportBatchMapper.delete(new QueryWrapper<ReportBatch>().eq("start_date", curDate).eq("end_date", curDate).eq("creator_id", r.getCreatorId()));
-//
-//                        ReportBatch batch = new ReportBatch();
-//                        batch.setCreatorId(reportList.get(0).getCreatorId());
-//                        batch.setState(0);
-//                        batch.setCompanyId(companyId);
-//                        batch.setStartDate(curDate);
-//                        batch.setEndDate(curDate);
-//                        batch.setTotalWorkTime(reportList.stream().filter(item->item.getCreateDate().equals(curDate) && item.getCreatorId().equals(r.getCreatorId())).mapToDouble(Report::getWorkingTime).sum());
-//                        reportBatchMapper.insert(batch);
-//                        //更新batchId
-//                        Report uItem = new Report();
-//                        uItem.setId(r.getId());
-//                        uItem.setBatchId(batch.getId());
-//                        updateBIdList.add(uItem);
-//                    }
-//                    reportService.updateBatchById(updateBIdList);
+
                 }
             }
         } else {
@@ -6717,6 +6973,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 .eq("creator_id", userId).between("create_date", startDate, endDate).groupBy("create_date"));
         //获取日报详情
         List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", userId).between("create_date", startDate, endDate).orderByAsc("create_date"));
+
         List<Integer> collect = reportList.stream().map(Report::getProjectId).collect(Collectors.toList());
         //加载这段时间内已填报过的项目
         List<Project> projectList = new ArrayList<>();
@@ -6729,6 +6986,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", oldReport.stream().map(Report::getProjectId).collect(Collectors.toList())));
             }
         }
+//
+//        List<TaskGroup> allGroupList = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().in("project_id", projectList.stream().map(Project::getId).collect(Collectors.toList())));
+//        //获取当前日报项目下的所有任务分组
+//        for (Report report : reportList) {
+//            Integer targetPid = report.getProjectId();
+//            report.setTaskGroups(allGroupList.stream().filter(tg->tg.getProjectId().equals(targetPid)).collect(Collectors.toList()));
+//        }
 
         List cardTimeList = new ArrayList();
         if (timeType.getShowDdCardtime() == 1) {
@@ -6945,8 +7209,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         if (user.getIsActive()==0 && leaveDate != null && leaveDate.isBefore(lastDayOfWeek)) {
             lastDayOfWeek = leaveDate;
         }
-        Map<String, List> reportMap = new HashMap<>();
+        Map<String, Object> reportMap = new HashMap<>();
         if (needFill) {
+            String summary = null;
             String startDate = firstDayOfWeek.format(dtf);
             String endDate = lastDayOfWeek.format(dtf);
             TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
@@ -6954,6 +7219,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", userId).between("create_date", startDate, endDate).orderByAsc("create_date"));
             //已填日报设置审核人姓名
             if (reportList.size() > 0) {
+                Integer batchId = reportList.get(0).getBatchId();
+                if (batchId != null) {
+                    //获取周总结
+                    summary = reportBatchMapper.selectById(batchId).getSummary();
+                }
                 List<String> collect = reportList.stream().map(Report::getProjectAuditorId).distinct().collect(Collectors.toList());
                 if (collect.size() > 0) {
                     List<User> auditorUserList = userMapper.selectList(new QueryWrapper<User>().in("id", collect));
@@ -6981,7 +7251,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (joinGroupList.size() > 0) {
                     List<TaskGroup> taskGroups = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().in("project_id", collect).in("id", joinGroupList));
                     //获取负责人的用户集合
-                    List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", taskGroups.stream().map(TaskGroup::getInchargerId).collect(Collectors.toList())));
+                    List<String> inchargerIds = taskGroups.stream().map(TaskGroup::getInchargerId).collect(Collectors.toList());
+                    if (inchargerIds.size() == 0) {
+                        inchargerIds.add("-1");
+                    }
+                    List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", inchargerIds));
                     reportList.forEach(r->{
                         r.setTaskGroups(taskGroups.stream().filter(tg->tg.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
                         for (TaskGroup gp : r.getTaskGroups()) {
@@ -7047,9 +7321,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
             }
             reportMap.put("dateList", dateList);
+            reportMap.put("summary", summary);
         } else {
             reportMap.put("dateList", new ArrayList());
         }
+
+
         msg.data = reportMap;
         return msg;
     }

+ 44 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -1269,6 +1269,50 @@ public class TimingTask {
             }
         }
     }
+
+
+    @Scheduled(cron = "0 0 10 28-31 * ?")
+    private void sendMonthlyMissReportLog() {
+        if (isDev || isPrivateDeploy) {
+            return;
+        }
+        //每月最后一天
+        LocalDate now = LocalDate.now();
+        LocalDate lastDay = now.with(TemporalAdjusters.lastDayOfMonth());
+        if (!now.isEqual(lastDay)) {
+            return;
+        }
+        //目前针对物奇进行推送
+        Integer companyId = 1071;
+        //获取
+        LocalDate startDate = now.with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endDate = lastDay;
+        List<Map<String, Object>> userList = reportService.getNotFullReportUserList(companyId, startDate, endDate);
+//        System.out.println("漏填报人员列表:"+userList);
+        List<WxCorpInfo> cpList = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        userList.forEach(u->{
+            if (u.get("corpwxUserid") != null){
+                //推送到企业微信
+                String corpUid = (String) u.get("corpwxUserid");
+                JSONObject json=new JSONObject();
+                JSONArray dataJson = new JSONArray();
+                JSONObject jsonObj = new JSONObject();
+                jsonObj.put("key", "提示");
+                jsonObj.put("value", "您本月有"+(Integer)u.get("days")+"天未填写工时报告,请尽快填写");
+                dataJson.add(jsonObj);
+                json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
+                json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                json.put("content_item",dataJson);
+                if (cpList.size() > 0) {
+//                      System.out.println("发送企业微信漏填提醒:" + LocalDateTime.now().toString() + ", corpUid=" + corpUid + ", json=" + json.toJSONString());
+                    wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
+                }
+            }
+        });
+    }
+
+
+
     //每分钟校验是否有需要提醒的填报
     @Scheduled(fixedRate = 60 * 1000)
     private void process() {

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

@@ -121,7 +121,7 @@
     </select>
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getParticipatedProject" resultType="java.util.Map">
-        SELECT id, project_code AS projectCode, project_name AS projectName, status, task_gp_incharge as taskGpIncharge, project_desc as projectDesc,is_public as isPublic
+        SELECT id, project_code AS projectCode, project_name AS projectName, status, task_gp_incharge as taskGpIncharge, project_desc as projectDesc,is_public as isPublic, plan_end_date as planEndDate
         FROM project
         WHERE id IN (
             SELECT project_id
@@ -133,7 +133,7 @@
         ORDER BY is_public DESC, id DESC
     </select>
     <select id="getOnlyJoinProjects" resultType="java.util.Map">
-        SELECT id, project_code AS projectCode, project_name AS projectName, status, task_gp_incharge as taskGpIncharge, project_desc as projectDesc, is_public as isPublic
+        SELECT id, project_code AS projectCode, project_name AS projectName, status, task_gp_incharge as taskGpIncharge, project_desc as projectDesc, is_public as isPublic, plan_end_date as planEndDate
         FROM project
         WHERE status = 1 and (id IN (
             SELECT project_id

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

@@ -12,11 +12,12 @@
         <result column="state" property="state" />
         <result column="create_time" property="createTime" />
         <result column="company_id" property="companyId" />
+        <result column="summary" property="summary" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, creator_id, start_date, end_date, total_work_time, state, create_time, company_id
+        id, creator_id, start_date, end_date, total_work_time, state, create_time, company_id, summary
     </sql>
 
 </mapper>

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

@@ -68,7 +68,7 @@
         ,c.plate1 as plate1,c.plate2 as plate2,c.plate3 as plate3,c.plate4 as plate4,c.plate5 as plate5
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId,a.custom_data as customData
         ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText,a.project_audit_time  as projectAuditTime,project_main.name as projectMainName,
-        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
+        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3, a.batch_id as batchId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -200,7 +200,7 @@
         ,c.plate1 as plate1,c.plate2 as plate2,c.plate3 as plate3,c.plate4 as plate4,c.plate5 as plate5
         ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as
         departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as
-        projectAuditTime,project_main.name as projectMainName,a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
+        projectAuditTime,project_main.name as projectMainName,a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3, a.batch_id as batchId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -325,7 +325,7 @@
         ,c.plate1 as plate1,c.plate2 as plate2,c.plate3 as plate3,c.plate4 as plate4,c.plate5 as plate5
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime,project_main.name as projectMainName
-        ,a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
+        ,a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3, a.batch_id as batchId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -385,7 +385,7 @@
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId,dp2.department_name as buDepartmentName,a.overtime_hours as overtimeHours, a.custom_text as customText,a.evaluate as evaluate,a.report_auto_approve as reportAutoApprove,
-        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
+        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3, a.batch_id as batchId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -412,7 +412,7 @@
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours, a.custom_text as customText,a.evaluate as evaluate,a.report_auto_approve as reportAutoApprove,
-        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
+        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3, a.batch_id as batchId
         FROM report AS a
             JOIN project AS b ON a.project_id=b.id
             left join sub_project as d on d.id = a.sub_project_id
@@ -436,7 +436,7 @@
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours, a.custom_text as customText, dept_manager.name as deptAuditorName,a.evaluate as evaluate,
-        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
+        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3, a.batch_id as batchId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -467,7 +467,7 @@
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours, a.custom_text as customText, dept_manager.name as deptAuditorName,a.evaluate as evaluate,
-        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
+        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3, a.batch_id as batchId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join project_ccuser on project_ccuser.project_id = a.project_id
@@ -499,7 +499,7 @@
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours, a.custom_text as customText, dept_manager.name as deptAuditorName
-        ,a.group_audit_state as groupAuditState,a.batch_id as batchId,a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
+        ,a.group_audit_state as groupAuditState,a.batch_id as batchId,a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3, a.batch_id as batchId
         FROM report AS a
         left join user on user.id = a.creator_id
         JOIN project AS b ON a.project_id=b.id
@@ -579,7 +579,7 @@
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId,dp2.department_name as buDepartmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, dept_manager.name as deptAuditorName,a.evaluate as evaluate,a.report_auto_approve as reportAutoApprove,
-        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
+        a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3, a.batch_id as batchId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml