Ver Fonte

美莱德填报及时率表

QuYueTing há 1 mês atrás
pai
commit
40f3507297

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

@@ -1429,7 +1429,7 @@ public class TimingTask {
                     DecimalFormat df = new DecimalFormat("#0.0");
                     String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + df.format(sum)+"小时。其中审核通过"+df.format(pass)
                             +"小时, 待审核"+df.format(waiting)+"小时,驳回"+df.format(reject)+"小时。";
-                    pushLastWeekReportFill(u, str);
+
                 }
             }
         }
@@ -1591,16 +1591,6 @@ public class TimingTask {
                         LocalDate startDate = localDate.with(DayOfWeek.MONDAY);
                         userList = reportService.getNotFullReportUserList(company.getId(), startDate, lastDay);
                     } else {
-                        LocalDate startDate = localDate.minusDays(7);
-                        //针对物奇,从2023-11-10号以后开始算,上周漏填的也要提醒
-                        if (startDate.isAfter(LocalDate.parse("2023-11-05")) && company.getId() == 1071) {
-                            //检查上周日报是否漏填
-                            LocalDate lastSunday = localDate.with(DayOfWeek.SUNDAY).minusWeeks(1);
-                            LocalDate lastMonday = lastSunday.minusDays(6);
-                            userList = reportService.getNotFullReportUserList(company.getId(), lastMonday, lastSunday);
-//                            System.out.println("上周未填人员数量="+userList.size());
-                            lastWeekNotFill = true;
-                        }
                     }
                 } else if (t.getAlertType() == 3) {
                     //3--每月固定日期提醒上个月的
@@ -1638,37 +1628,7 @@ public class TimingTask {
                 final boolean finalLastWeekNotFill = lastWeekNotFill;
                 //今天或者明天统一提醒,提醒内容大家都一样
                 if (t.getAlertType() == 0 || t.getAlertType() == 1) {
-                    //判断是企业微信用户还是微信用户
-                    List<String> corpUidList = userList.stream().filter(u -> u.get("corpwxUserid") != null).map(u -> (String) u.get("corpwxUserid")).distinct().collect(Collectors.toList());
-                    if (corpUidList.size() > 0) {
-                        //给企业微信用户发送
-                        JSONObject json=new JSONObject();
-                        JSONArray dataJson = new JSONArray();
-                        JSONObject jsonObj = new JSONObject();
-                        jsonObj.put("key", "提示");
-                        jsonObj.put("value", StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg());
-                        dataJson.add(jsonObj);
-                        if(isPrivateDeploy){
-                            json.put("content",StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg()+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid="+suitId+"&redirect_uri="+pcUrl+"/api/corpInsideWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去填写</a>");
-                        }else {
-                            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) {
-                            String collectCPIds = corpUidList.stream().collect(Collectors.joining("|"));
-                            if (!StringUtils.isEmpty(collectCPIds)) {
-//                                System.out.println("发送企业微信漏填提醒:" + LocalDateTime.now().toString() + ", corpUid=" + collectCPIds + ", json=" + json.toJSONString());
-                                wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), collectCPIds, json);
-                            }
-                        }
-                    }
-                    //给微信用户发送
-                    userList.forEach(u->{
-                        if (u.get("corpwxUserid") == null && u.get("wxOpenid") != null) {
-                            push(u, t.getAlertMsg());
-                        }
-                    });
+
                 } else {
                     //修改代码
                     userList.forEach(u->{
@@ -1719,7 +1679,6 @@ public class TimingTask {
                                 wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
                             }
                         } else if (u.get("wxOpenid") != null) {
-                            push(u, t.getAlertMsg());
                         }
                     });
                     //针对钉钉发送提醒
@@ -1832,535 +1791,13 @@ public class TimingTask {
         }
     }
 
-    //推送日报未填消息
-    public void push(Map<String, Object> user, String alertMsg) {
-        //1,配置
-        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
-        wxStorage.setAppId(appId);
-        wxStorage.setSecret(appSecret);
-        WxMpService wxMpService = new WxMpServiceImpl();
-        wxMpService.setWxMpConfigStorage(wxStorage);
-
-        //2,推送消息
-        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
-                .toUser((String)user.get("wxOpenid"))//要推送的用户openid
-                .templateId(TEMPLATE_REPORT_FILL)//模版id
-                .url("http://mobworktime.ttkuaiban.com/#/edit")//点击模版消息要访问的网址
-                .build();
-        //3,如果是正式版发送模版消息,这里需要配置你的信息
-        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
-        templateMessage.addData(new WxMpTemplateData("keyword1", (String)user.get("name"), "#000000"));
-        templateMessage.addData(new WxMpTemplateData("keyword2", (String)user.get("departmentName"), "#000000"));
-        templateMessage.addData(new WxMpTemplateData("remark", "请尽快填报", "#000000"));
-        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
-        try {
-            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
-        } catch (Exception e) {
-            System.out.println("推送失败:" + e.getMessage());
-            e.printStackTrace();
-        }
-
-    }
-
-
-    //推送上周填写的日报工时情况
-    public void pushLastWeekReportFill(User user, String alertMsg) {
-        //1,配置
-        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
-        wxStorage.setAppId(appId);
-        wxStorage.setSecret(appSecret);
-        WxMpService wxMpService = new WxMpServiceImpl();
-        wxMpService.setWxMpConfigStorage(wxStorage);
-
-        //2,推送消息
-        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
-                .toUser(user.getWxOpenid())//要推送的用户openid
-                .templateId(TEMPLATE_REPORT_FILL)//模版id
-                .url("http://mobworktime.ttkuaiban.com/")//点击模版消息要访问的网址
-                .build();
-        //3,如果是正式版发送模版消息,这里需要配置你的信息
-        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
-        templateMessage.addData(new WxMpTemplateData("keyword1", user.getName(), "#000000"));
-        templateMessage.addData(new WxMpTemplateData("keyword2", user.getDepartmentName(), "#000000"));
-        templateMessage.addData(new WxMpTemplateData("remark", "-", "#000000"));
-        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
-        try {
-            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
-        } catch (Exception e) {
-            System.out.println("推送失败:" + e.getMessage());
-            e.printStackTrace();
-        }
-    }
-
-
-    private void checkDingDingSuiteTicket() {
-        List<SysConfig> sysConfigs = sysConfigMapper.selectList(new QueryWrapper<SysConfig>().eq("param_key", "dingding_suite_ticket"));
-        if (sysConfigs.size() > 0) {
-            SysConfig sysConfig = sysConfigs.get(0);
-            LocalDateTime indate = sysConfig.getIndate();
-            //一般5个小时后过期,此处多加30s,作为缓冲
-            LocalDateTime expireTime = indate.plusHours(5).plusSeconds(30);
-            if (LocalDateTime.now().isAfter(expireTime)) {
-                //需要发出通知
-                String managerWxopenId = "o1L3L5lOrOl3_UEJjONaoT2Rne1I";
-                HashMap map = new HashMap();
-                map.put("wxOpenid", managerWxopenId);
-                map.put("name", "管理员");
-                map.put("departmentName", "管理部");
-                push(map, "钉钉的SuiteTicket没有及时下推,请快去手动更新");
-            }
-        }
-
-    }
-
-    //每天凌晨 2:00 推送前1天审核通过的日报  工时管家---->SAP
-    @Scheduled(cron = "0 0 2 ? * *")
-    public void pushReportToSap(){
-        if(isDev){
-            return;
-        }
-        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_sap",1));
-        LocalDate date=LocalDate.now();
-        LocalDateTime localDateTime=LocalDateTime.now();
-        for (TimeType timeType : timeTypeList) {
-            Integer companyId = timeType.getCompanyId();
-            //提前推送项目工时(工时管家相关项目任务分组阶段下任务作为SAP服务 预算工时数据推送到SAP)
-            List<Map<String, Object>> mapList = reportMapper.getPushProjectReportToSap(companyId,df.format(date.minusDays(1)),df.format(date.minusDays(1)), null,null);
-            //过滤服务code为空的数据
-            mapList=mapList.stream().filter(r->r.get("ProjectElementID")!=null && !StringUtils.isEmpty(String.valueOf(r.get("ProjectElementID")))).collect(Collectors.toList());
-            List<Integer> taskIds = mapList.stream().map(r -> Integer.valueOf(String.valueOf(r.get("TaskId")))).distinct().collect(Collectors.toList());
-            taskIds.add(-1);
-            List<Map<String, Object>> pushProjectPlanHour = reportMapper.getProjectPlanData(companyId,taskIds,null,null);
-            //多加一个作为预算工时推送
-            ExecutorService executor = Executors.newFixedThreadPool(1);
-            List<Map<String, Object>> finalMapList = mapList;
-            executor.execute(new Runnable() {
-                @Override
-                public void run() {
-                    List<SapSyncLog> projectPlanSyncLogs = SyncSapUtils.pushProjectPlanToSap(pushProjectPlanHour, companyId, "",isDev);
-                    if(projectPlanSyncLogs.size()>0){
-                        sapSyncLogService.saveBatch(projectPlanSyncLogs);
-                    }
-                    for (Map<String, Object> map : finalMapList) {
-                        ReportPushLog one = reportPushLogService.getOne(new LambdaQueryWrapper<ReportPushLog>().eq(ReportPushLog::getCompanyId, companyId).eq(ReportPushLog::getReportId, map.get("ReportId")).eq(ReportPushLog::getTargetSystem,"SAP"));
-                        if(one!=null){
-                            continue;
-                        }
-                        String result = SyncSapUtils.pushReportToSap(map, isDev);
-                        if(StringUtils.isEmpty(result)){
-                            continue;
-                        }
-                        XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
-                        SapSyncLog sapSyncLog=new SapSyncLog();
-                        sapSyncLog.setCompanyId(companyId);
-                        sapSyncLog.setRemark("日报数据推送");
-                        sapSyncLog.setSyncType("定时任务推送");
-                        sapSyncLog.setSyncTime(localDateTime);
-                        if(StringUtils.isEmpty(xmlResponseData.getEmployeeTime())){
-                            log.error("推送失败===》工号:"+map.get("EmployeeID"));
-                            sapSyncLog.setResult("员工工号["+map.get("EmployeeID")+"]"+map.get("StartDate")+"日报推送失败");
-                            sapSyncLog.setResultRemark(xmlResponseData.getLog()!=null?xmlResponseData.getLog().getItem()!=null?xmlResponseData.getLog().getItem().getNote():"":"");
-                        }else {
-                            sapSyncLog.setResult("员工工号["+map.get("EmployeeID")+"]"+map.get("StartDate")+"日报推送成功");
-                            //推送成功 日报数据打上标记
-                            ReportPushLog reportPushLog=new ReportPushLog();
-                            reportPushLog.setCompanyId(companyId);
-                            reportPushLog.setReportId(Integer.valueOf(String.valueOf(map.get("ReportId"))));
-                            reportPushLog.setTargetSystem("SAP");
-                            reportPushLog.setUuid(xmlResponseData.getEmployeeTime().getUUID());
-                            reportPushLogService.save(reportPushLog);
-                        }
-                        sapSyncLogService.save(sapSyncLog);
-                    }
-                }
-            });
-        }
-    }
-
-    //每天凌晨 3:00 获取创建的项目服务和项目数据  SAP---->工时管家
-    @Scheduled(cron = "0 0 3 ? * *")
-    public void syncProjectFromSap(){
-        if(isDev){
-            return;
-        }
-        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_sap",1));
-        LocalDate date=LocalDate.now();
-        for (TimeType timeType : timeTypeList) {
-            Integer companyId = timeType.getCompanyId();
-            //获取SAP项目服务数据 ----> 工时管家任务分组下阶段作为项目服务数据
-            XmlResponseData projectServiceData= SyncSapUtils.syncServiceData(df.format(date.minusDays(1)), null, companyId,isDev);
-            //已有的项目分类
-            List<ProjectCategory> allProjectCategoryList = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId));
-            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
-            XmlResponseData xmlResponseData = SyncSapUtils.syncProjectFromSap(df.format(date.minusDays(1)), df.format(date.minusDays(1)),null,isDev);
-            List<ProjectQueryResponse> projectQueryResponses = xmlResponseData.getProjectQueryResponses();
-            List<Map<String,Object>> idsMapList=new ArrayList<>();
-            LocalDate localDate=LocalDate.now();
-            if(projectQueryResponses!=null&&projectQueryResponses.size()>0){
-                for (ProjectQueryResponse item : projectQueryResponses) {
-                    Project project=new Project();
-                    //处理项目分类
-                    String categoryName;
-                    switch (item.getTypeCode()){
-                        case "10":categoryName="成本收集项目";
-                            break;
-                        case "20":categoryName="直接成本项目";
-                            break;
-                        case "21":categoryName="市场营销项目";
-                            break;
-                        case "22":categoryName="战略采购项目";
-                            break;
-                        case "23":categoryName="研发项目";
-                            break;
-                        case "25":categoryName="设备销售项目";
-                            break;
-                        case "Z01":categoryName="报价项目";
-                            break;
-                        case "Z02":categoryName="售后报价项目";
-                            break;
-                        case "Z03":categoryName="产品设备报价项目";
-                            break;
-                        case "Z04":categoryName="半成品项目(无销售)";
-                            break;
-                        case "Z05":categoryName="产成品项目(含销售)";
-                            break;
-                        case "Z06":categoryName="机器生产项目";
-                            break;
-                        case "Z07":categoryName="电气柜生产项目";
-                            break;
-                        case "Z08":categoryName="工程项目";
-                            break;
-                        case "Z09":categoryName="售后工程项目";
-                            break;
-                        case "Z10":categoryName="运维项目";
-                            break;
-                        case "Z11":categoryName="数字化服务项目";
-                            break;
-                        default:categoryName="未知";
-                    }
-                    String finalCategoryName = categoryName;
-                    Optional<ProjectCategory> first = allProjectCategoryList.stream().filter(at -> at.getName().equals(finalCategoryName)).findFirst();
-                    if(!first.isPresent()&&!finalCategoryName.equals("未知")){
-                        ProjectCategory projectCategory=new ProjectCategory();
-                        projectCategory.setName(categoryName);
-                        projectCategory.setCompanyId(companyId);
-                        projectCategoryMapper.insert(projectCategory);
-                        allProjectCategoryList.add(projectCategory);
-                        project.setCategory(projectCategory.getId());
-                        project.setCategoryName(projectCategory.getName());
-                    }else {
-                        project.setCategory(first.get().getId());
-                        project.setCategoryName(first.get().getName());
-                    }
-                    project.setProjectName(item.getProjectSummaryTask().getProjectName().getName());
-                    project.setProjectCode(item.getProjectSummaryTask().getProjectElementID());
-                    project.setCompanyId(companyId);
-                    //处理项目数据 --->工时管家生成对应项目数据
-                    Optional<Project> any = projectList.stream().filter(pt -> pt.getProjectCode().equals(project.getProjectCode())).findAny();
-                    if(any.isPresent()){
-                        project.setId(any.get().getId());
-                    }
-                    projectService.saveOrUpdate(project);
-                    //处理项目下任务 ----> 工时管家生成任务分组
-                    List<ProjectTask> projectTasks = item.getProjectTasks();
-                    if(projectTasks!=null&&projectTasks.size()>0){
-                        //找到任务列表中 作为项目出现的第一级列表
-                        Optional<ProjectTask> targetProject = projectTasks.stream().filter(p -> p.getProjectElementID().equals(project.getProjectCode())).findFirst();
-                        String targetUUID = targetProject.get().getUUID();
-                        //todo:按照层级抽取数据
-                        //项目下第一层 作为任务分组数据
-                        List<ProjectTask> taskGroupList = projectTasks.stream().filter(p -> p.getParentTaskUUID() != null && p.getParentTaskUUID().equals(targetUUID)).collect(Collectors.toList());
-                        //抽调任务分组下级数据 作为阶段数据(是没有下级数据的情况下 作为最末级--->工时管家任务)
-                        List<String> taskGroupUUIDList = taskGroupList.stream().map(ProjectTask::getUUID).collect(Collectors.toList());
-                        List<ProjectTask> stagesList = projectTasks.stream().filter(p -> p.getParentTaskUUID() != null && taskGroupUUIDList.contains(p.getParentTaskUUID())).collect(Collectors.toList());
-                        List<String> stagesUUIDList = stagesList.stream().map(ProjectTask::getUUID).collect(Collectors.toList());
-                        //抽调出最末级
-                        List<ProjectTask> taskList = projectTasks.stream().filter(p ->p.getParentTaskUUID() != null &&stagesUUIDList.contains(p.getParentTaskUUID())&&(p.getSummaryTaskIndicator()==null||(p.getSummaryTaskIndicator()!=null && !p.getSummaryTaskIndicator().equals("true")))).collect(Collectors.toList());
-                        List<Task> tasks=new ArrayList<>();
-                        if(taskGroupList!=null && taskGroupList.size()>0){
-                            for (ProjectTask group : taskGroupList) {
-                                //如果作为第二层数据是不存在下级数据的 把当前数据作为第四层数据 手动添加阶段数据 作为该数据的上级数据
-                                if(group.getSummaryTaskIndicator()==null){
-                                    TaskGroup taskGroup=new TaskGroup();
-                                    taskGroup.setProjectId(project.getId());
-                                    taskGroup.setName("项目阶段");
-                                    TaskGroup one = taskGroupMapper.selectOne(new QueryWrapper<TaskGroup>().eq("project_id", project.getId()).eq("name","项目阶段"));
-                                    if(one!=null){
-                                        taskGroup.setId(one.getId());
-                                    }
-                                    taskGroupService.saveOrUpdate(taskGroup);
-                                    Stages stage = new Stages();
-                                    stage.setSequence(1);
-                                    stage.setProjectId(project.getId());
-                                    stage.setGroupId(taskGroup.getId());
-                                    stage.setStagesName("工作开展");
-                                    Stages two = stagesMapper.selectOne(new QueryWrapper<Stages>().eq("project_id", project.getId()).eq("stages_name","工作开展").eq("group_id",stage.getGroupId()));
-                                    if(two!=null){
-                                        stage.setId(two.getId());
-                                    }
-                                    stagesService.saveOrUpdate(stage);
-                                    Task task=new Task();
-                                    task.setProjectId(project.getId());
-                                    task.setGroupId(taskGroup.getId());
-                                    task.setStagesId(stage.getId());
-                                    task.setCreateDate(localDate);
-                                    task.setCompanyId(companyId);
-                                    task.setSapTaskCode(group.getProjectElementID());
-                                    task.setName(group.getTaskGroupName()==null?"空的计划名称":group.getTaskGroupName().getName());
-                                    Task three = taskMapper.selectOne(new LambdaQueryWrapper<Task>().eq(Task::getProjectId, task.getProjectId()).eq(Task::getSapTaskCode,task.getSapTaskCode()).eq(Task::getGroupId, task.getGroupId()).eq(Task::getStagesId, task.getStagesId()));
-                                    if(three!=null){
-                                        task.setId(three.getId());
-                                    }
-//                                taskService.saveOrUpdate(task);
-                                    tasks.add(task);
-                                }else {
-                                    TaskGroup taskGroup=new TaskGroup();
-                                    taskGroup.setProjectId(project.getId());
-                                    taskGroup.setTaskGroupCode(group.getProjectElementID());
-                                    taskGroup.setName(group.getTaskGroupName()==null?"":group.getTaskGroupName().getName());
-                                    TaskGroup one = taskGroupMapper.selectOne(new QueryWrapper<TaskGroup>().eq("project_id", project.getId()).eq("task_group_code", group.getProjectElementID()));
-                                    if(one!=null){
-                                        taskGroup.setId(one.getId());
-                                    }
-                                    taskGroupService.saveOrUpdate(taskGroup);
-                                    Map<String,Object> map=new HashMap<>();
-                                    map.put("groupId",taskGroup.getId());
-                                    map.put("UUID",group.getUUID());
-                                    map.put("projectId",project.getId());
-                                    idsMapList.add(map);
-                                }
-                            }
-                        }
-                        if(stagesList!=null&&stagesList.size()>0){
-                            for (ProjectTask targetStage : stagesList) {
-                                Optional<Map<String, Object>> targetGroup = idsMapList.stream().filter(i -> i.get("UUID").equals(targetStage.getParentTaskUUID())).findFirst();
-                                if(!targetGroup.isPresent()){
-                                    continue;
-                                }
-                                //如果作为第三层数据是不存在下级数据的 把当前数据作为第四层数据 手动添加阶段数据 作为该数据的上级数据
-                                if(targetStage.getSummaryTaskIndicator()==null){
-                                    Stages stage = new Stages();
-                                    stage.setSequence(1);
-                                    stage.setProjectId(project.getId());
-                                    stage.setGroupId(Integer.valueOf(String.valueOf(targetGroup.get().get("groupId"))));
-                                    stage.setStagesName("工作开展");
-                                    Stages one = stagesMapper.selectOne(new QueryWrapper<Stages>().eq("project_id", project.getId()).eq("stages_name","工作开展").eq("group_id",stage.getGroupId()));
-                                    if(one!=null){
-                                        stage.setId(one.getId());
-                                    }
-                                    stagesService.saveOrUpdate(stage);
-                                    Task task=new Task();
-                                    task.setProjectId(project.getId());
-                                    task.setGroupId(Integer.valueOf(String.valueOf(targetGroup.get().get("groupId"))));
-                                    task.setStagesId(stage.getId());
-                                    task.setCreateDate(localDate);
-                                    task.setCompanyId(companyId);
-                                    task.setSapTaskCode(targetStage.getProjectElementID());
-                                    task.setName(targetStage.getTaskGroupName()==null?"空的计划名称":targetStage.getTaskGroupName().getName());
-                                    Task two = taskMapper.selectOne(new LambdaQueryWrapper<Task>().eq(Task::getProjectId, task.getProjectId()).eq(Task::getSapTaskCode,task.getSapTaskCode()).eq(Task::getGroupId, task.getGroupId()).eq(Task::getStagesId, task.getStagesId()));
-                                    if(two!=null){
-                                        task.setId(two.getId());
-                                    }
-//                                taskService.saveOrUpdate(task);
-                                    tasks.add(task);
-                                }else {
-                                    Stages stage = new Stages();
-                                    stage.setSequence(1);
-                                    stage.setProjectId(project.getId());
-                                    stage.setGroupId(Integer.valueOf(String.valueOf(targetGroup.get().get("groupId"))));
-                                    stage.setStagesCode(targetStage.getProjectElementID());
-                                    stage.setStagesName(targetStage.getTaskGroupName()==null?"":targetStage.getTaskGroupName().getName());
-                                    Stages one = stagesMapper.selectOne(new QueryWrapper<Stages>().eq("project_id", project.getId()).eq("stages_code", targetStage.getProjectElementID()).eq("group_id",stage.getGroupId()));
-                                    if(one!=null){
-                                        stage.setId(one.getId());
-                                    }
-                                    stagesService.saveOrUpdate(stage);
-                                    Map<String,Object> map=new HashMap<>();
-                                    map.put("groupId",targetGroup.get().get("groupId"));
-                                    map.put("stageId",stage.getId());
-                                    map.put("UUID",targetStage.getUUID());
-                                    map.put("projectId",project.getId());
-                                    idsMapList.add(map);
-                                }
-                            }
-                        }
-                        for (ProjectTask targetTask : taskList) {
-                            Optional<Map<String, Object>> targetMapOp = idsMapList.stream().filter(i -> String.valueOf(i.get("UUID")).equals(targetTask.getParentTaskUUID())&&i.get("stageId")!=null).findFirst();
-                            if(targetMapOp.isPresent()){
-                                Map<String, Object> targetMap = targetMapOp.get();
-                                Task task=new Task();
-                                task.setProjectId(project.getId());
-                                task.setGroupId(Integer.valueOf(String.valueOf(targetMap.get("groupId"))));
-                                task.setStagesId(Integer.valueOf(String.valueOf(targetMap.get("stageId"))));
-                                task.setCreateDate(localDate);
-                                task.setCompanyId(companyId);
-                                task.setSapTaskCode(targetTask.getProjectElementID());
-                                task.setName(targetTask.getTaskGroupName()==null?"空的计划名称":targetTask.getTaskGroupName().getName());
-                                Task one = taskMapper.selectOne(new LambdaQueryWrapper<Task>().eq(Task::getProjectId, task.getProjectId()).eq(Task::getSapTaskCode,targetTask.getProjectElementID()).eq(Task::getGroupId, task.getGroupId()).eq(Task::getStagesId, task.getStagesId()));
-                                if(one!=null){
-                                    task.setId(one.getId());
-                                }
-//                            taskService.saveOrUpdate(task);
-                                tasks.add(task);
-                            }
-                        }
-                        if(tasks.size()>0){
-                            Map<Integer, List<Task>> listMap = tasks.stream().collect(Collectors.groupingBy(t -> t.getStagesId()));
-                            List<Integer> list = tasks.stream().map(Task::getStagesId).collect(Collectors.toList());
-                            for (Integer id : list) {
-                                List<Task> subList = listMap.get(id);
-                                for (int i = 0; i < subList.size(); i++) {
-                                    subList.get(i).setSeq(i);
-                                }
-                            }
-                            taskService.saveOrUpdateBatch(tasks);
-                        }
-                    }
-                }
-            }
-            //处理项目下服务数据 ------->工时管家相关项目下任务分组下创建任务数据
-            List<SapProjectService> serviceList = sapProjectServiceService.list(new LambdaQueryWrapper<SapProjectService>().eq(SapProjectService::getCompanyId, companyId));
-            List<SapProjectService> sapProjectServiceList=new ArrayList<>();
-            if(projectServiceData!=null){
-                List<ServiceProduct> serviceProducts = projectServiceData.getServiceProducts();
-                if(serviceProducts!=null&&serviceProducts.size()>0){
-                    for (ServiceProduct serviceProduct : serviceProducts) {
-                        if(serviceProduct.getProductCategoryID().equals("901")&&serviceProduct.getBaseMeasureUnitCode().equals("HUR")){
-                            SapProjectService sapProjectService=new SapProjectService();
-                            sapProjectService.setServiceCode(serviceProduct.getInternalID());
-                            sapProjectService.setServiceName(serviceProduct.getDescription().getDescription());
-                            sapProjectService.setCompanyId(companyId);
-                            Optional<SapProjectService> first = serviceList.stream().filter(s -> s.getServiceCode().equals(serviceProduct.getInternalID())).findFirst();
-                            if(first.isPresent()){
-                                sapProjectService.setId(first.get().getId());
-                            }
-                            sapProjectServiceList.add(sapProjectService);
-                        }
-                    }
-                }
-            }
-            if(sapProjectServiceList.size()>0){
-                sapProjectServiceService.saveOrUpdateBatch(sapProjectServiceList);
-            }
-        }
-    }
 
-    //每天凌晨  2:30 以及每天中午 12:30 获取前一天时间增量的人员数据  BeiSenHR---->工时管家  针对威派格
-    @Scheduled(cron = "0 30 2 ? * *")
-    @Scheduled(cron = "0 30 12 ? * *")
-    public void getByTimeWindow(){
-        if(isDev){
-            return;
-        }
-        List<UserWithBeisen> userWithBeisenList=new ArrayList<>();
-        LocalDate now=LocalDate.now();
-        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        LocalDate start = now.minusDays(1);
-        LocalDate end = now.plusDays(1);
-        String startTime=df.format(start);
-        String endTime=df.format(end);
-        List<BeisenConfig> beisenConfigs = beisenConfigMapper.selectList(null);
-        //更新电话到工时
-        List<User> needUpdateUsers=new ArrayList<>();
-        for (BeisenConfig beisenConfig : beisenConfigs) {
-            if(beisenConfig!=null){
-                List<JSONArray> byTimeWindow = BeiSenUtils.getByTimeWindow("",startTime,endTime,beisenConfig.getCompanyId(),beisenConfig.getAppKey(),beisenConfig.getAppSecret());
-                List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, beisenConfig.getCompanyId()));
-                List<UserWithBeisen> allBeisenList = userWithBeisenService.list(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getCompanyId, beisenConfig.getCompanyId()));
-                if(byTimeWindow.size()>0){
-                    for (JSONArray array : byTimeWindow) {
-                        for (int i = 0; i < array.size(); i++) {
-                            UserWithBeisen userWithBeisen=new UserWithBeisen();
-                            JSONObject targetItem = array.getJSONObject(i);
-                            JSONObject employeeInfo = targetItem.getJSONObject("employeeInfo");
-                            JSONObject recordInfo = targetItem.getJSONObject("recordInfo");
-                            userWithBeisen.setCompanyId(beisenConfig.getCompanyId());
-                            userWithBeisen.setJobNumber(recordInfo.getString("jobNumber"));
-                            userWithBeisen.setMobilePhone(employeeInfo.getString("mobilePhone"));
-                            userWithBeisen.setName(employeeInfo.getString("name"));
-                            userWithBeisen.setUserId(employeeInfo.getString("userID"));
-                            Optional<UserWithBeisen> first = allBeisenList.stream().filter(a -> a.getUserId().equals(employeeInfo.getString("userID"))).findFirst();
-                            if(first.isPresent()){
-                                userWithBeisen.setId(first.get().getId());
-                            }
-                            userWithBeisenList.add(userWithBeisen);
-                            Optional<User> user = userList.stream().filter(u ->u.getJobNumber()!=null&&u.getJobNumber().equals(userWithBeisen.getJobNumber())).findFirst();
-                            if(user.isPresent()){
-                                User u=new User();
-                                u.setId(user.get().getId());
-                                u.setPhone(userWithBeisen.getMobilePhone());
-                                u.setJobNumber(userWithBeisen.getJobNumber());
-                                needUpdateUsers.add(u);
-                            }
-                        }
-                    }
-                }
-                if(userWithBeisenList.size()>0){
-                    userWithBeisenService.saveOrUpdateBatch(userWithBeisenList);
-                }
-                if(needUpdateUsers.size()>0){
-                    userService.updateBatchById(needUpdateUsers);
-                }
-            }
-        }
-    }
 
     public static void main(String[] args) {
         int dayOfMonth = LocalDate.now().getDayOfMonth();
         System.out.println(dayOfMonth);
     }
 
-    /**
-     * 每天凌晨2:50同步前一天的北森考勤数据 暂时固定公司id(5978)针对景昱
-     * */
-    @Scheduled(cron ="0 50 2 ? * *")
-    public void syncAttendanceFromBeisen(){
-        if(isDev){
-            return;
-        }
-        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        DateTimeFormatter df1=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        DateTimeFormatter df2=DateTimeFormatter.ofPattern("HH:mm");
-        DateTimeFormatter df3=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
-        DateTimeFormatter df4=DateTimeFormatter.ofPattern("HH:mm:ss");
-        int dayOfMonth = LocalDate.now().getDayOfMonth();
-        String startDate;
-        String endDate;
-        if(dayOfMonth==8){
-            //每个月8号重新同步上个月数据以及当月至8号的数据
-            startDate=LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).minusMonths(1).format(df);
-            endDate=LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).minusMonths(1).plusDays(8).format(df);
-        }else {
-            startDate=LocalDate.now().minusDays(3).format(df);
-            endDate=LocalDate.now().plusDays(1).format(df);
-        }
-        userWithBeisenService.syncAttendanceFromBeisen(startDate,endDate,5978);
-    }
-
-
-
-    @Scheduled(cron = "1 1 1 1 1 ?")
-    public void cleanUselessData(){
-        //TODO: 日报删除表report_delete,需要定期清理
-    }
-
-    @Scheduled(cron = "0 15 0 1 * ?")
-    private void generateMonthlyFinanceReport() {
-        //为景昱生成上个月的财务审核报表
-        LocalDate now = LocalDate.now();
-        //获取上个月的第一天
-        LocalDate lastMonth = now.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
-        Integer companyId = 5978;
-        FinancialAudit financialAudit = financialAuditService.getOne(new LambdaQueryWrapper<FinancialAudit>().eq(FinancialAudit::getCompanyId, companyId).eq(FinancialAudit::getReportYrmnth, lastMonth));
-        if(financialAudit==null){
-            financialAudit=new FinancialAudit();
-            financialAudit.setCompanyId(companyId);
-            financialAudit.setReportYrmnth(lastMonth);
-            financialAuditService.save(financialAudit);
-        }
-    }
 
     @Scheduled(cron = "0 30 09 ? * *")
     public void remindTaskFile(){
@@ -2428,13 +1865,4 @@ public class TimingTask {
         }
     }
 
-    //每天9点左右针对泓浒(苏州)发送考勤不合规的提醒消息
-    @Scheduled(cron = "0 8 9 ? * *")
-    private void checkHongHuCardTime() {
-        if (isDev) return;
-        LocalDate yestoday = LocalDate.now().minusDays(1);
-        LocalDate startDate = yestoday.minusDays(7);
-        Integer companyId = 7536;//泓浒(苏州)公司Id
-        reportService.checkAndAlertFVReportTimeLessThanCardTimeList(startDate, yestoday, companyId);
-    }
 }

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

@@ -1089,14 +1089,21 @@
     </select>
 
     <select id="getUserReportTimelinessRate" resultType="java.util.Map">
-        select `user`.name as userName,`user`.corpwx_userid as corpwxUserId,d.dd_deptid as corpDdDeptId,`user`.corpwx_deptid as corpwxDeptId,rl.create_date as createDate,MIN(rl.operate_date )as createTime
-        from report_log rl
-        left join `user` on `user`.id=rl.operator_id
-        left join department d on `user`.department_id=d.department_id
-        where rl.company_id=#{companyId}
-        and rl.create_date between  #{startDate} and #{endDate}
-        and rl.msg like '%提交了%'
-        and `user`.is_active = 1
+       SELECT
+        `user`.name AS userName,
+        `user`.corpwx_userid AS corpwxUserId,
+        d.dd_deptid AS corpDdDeptId,
+        `user`.corpwx_deptid AS corpwxDeptId,
+        rl.create_date AS createDate,
+        MIN(rl.operate_date) AS createTime
+        FROM report_log rl
+        FORCE INDEX (idx_report_log_main)  -- 强制使用新索引
+        LEFT JOIN `user` ON `user`.id = rl.operator_id
+        LEFT JOIN department d ON `user`.department_id = d.department_id
+        WHERE rl.company_id = #{companyId}
+        AND rl.create_date between #{startDate} and #{endDate}
+        AND rl.msg LIKE CONCAT(`user`.name, '%提交了日报')  -- 使用LIKE替代CONCAT相等
+        AND `user`.is_active = 1
         <if test="userId!=null">
             and `user`.id=#{userId}
         </if>
@@ -1106,7 +1113,16 @@
                 #{item}
             </foreach>
         </if>
-        group by user.id,rl.create_date
+        AND NOT EXISTS (
+        SELECT 1
+        FROM report_log r2
+        FORCE INDEX (idx_report_log_sub)  -- 强制子查询使用索引
+        WHERE r2.operator_id = rl.operator_id
+        AND r2.create_date between #{startDate} and #{endDate}
+        AND r2.operate_date > rl.operate_date
+        AND r2.msg LIKE CONCAT(`user`.name, '%撤销了日报')
+        )
+        GROUP BY user.id, rl.create_date;
     </select>
 
     <select id="getDefaultDegree" resultType="java.util.Map">

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinancialAuditController.java

@@ -17,7 +17,9 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -38,6 +40,21 @@ public class FinancialAuditController {
     @Resource
     private UserMapper userMapper;
 
+    @RequestMapping("/generateMonthlyFinanceReport")
+    public HttpRespMsg generateMonthlyFinanceReport(Integer companyId, String monthDay) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        LocalDate targetMonth = LocalDate.parse(monthDay, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        FinancialAudit financialAudit = financialAuditService.getOne(new LambdaQueryWrapper<FinancialAudit>().eq(FinancialAudit::getCompanyId, companyId).eq(FinancialAudit::getReportYrmnth, targetMonth));
+        if(financialAudit==null){
+            financialAudit=new FinancialAudit();
+            financialAudit.setCompanyId(companyId);
+            financialAudit.setReportYrmnth(targetMonth);
+            financialAuditService.save(financialAudit);
+        }
+
+        return httpRespMsg;
+    }
+
     @RequestMapping("/list")
     public HttpRespMsg list(Integer pageIndex, Integer pageSize, String startDate, String endDate, Integer status, HttpServletRequest request) throws ParseException {
         HttpRespMsg httpRespMsg = new HttpRespMsg();

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

@@ -715,6 +715,7 @@ public class ReportController {
                 }
             }
             //校验,请假全天的填报限制
+            double wuqiAllDayHours = 6.5;
             List<String> dateList = Arrays.asList(createDate);
             List<UserCorpwxTime> cardTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", user.getCorpwxUserid()).in("create_date", dateList));
             List<UserDateAllow> userDateAllowList = userDateAllowService.list(new QueryWrapper<UserDateAllow>().eq("company_id", company.getId()));
@@ -724,7 +725,7 @@ public class ReportController {
                 LocalDate date = LocalDate.parse(createDate[i], dateTimeFormatter);
                 Optional<UserCorpwxTime> first = cardTimeList.stream().filter(card -> card.getCreateDate().isEqual(date)).findFirst();
                 if (first.isPresent()) {
-                    if (first.get().getAskLeaveTime() >= comTimeType.getAllday()) {
+                    if (first.get().getAskLeaveTime() >= wuqiAllDayHours) {
                         //检查是否在额外排除名单里面
                         if (!userDateAllowList.stream().anyMatch(u -> u.getUserId().equals(user.getId()) && u.getDate().isEqual(date))) {
                             HttpRespMsg msg = new HttpRespMsg();

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 3436
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java~


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

@@ -7645,6 +7645,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //查询请假数据,请假的不算漏填,状态为已通过(0)或者待审核的(1)
         List<LeaveSheet> leaveSheetList = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>().select("owner_id,start_date, end_date").eq("company_id", companyId).le("status", 1).gt("end_date", localStart).lt("start_date",localEnd));
         List<HolidaySetting> holidaySettingList = holidaySettingMapper.selectList(new QueryWrapper<HolidaySetting>().eq("company_id", companyId));
+        //企微请假查询
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        List<UserCorpwxTime> userCorpwxTimeList = null;
+        if (wxCorpInfo != null) {
+            //物奇6.5算全天
+            double allDayTime = companyId == 1071? 6.5 : timeType.getAllday();
+            //请假时间大于等于全天的
+            userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).between("create_date", localStart, localEnd).ge("ask_leave_time", allDayTime));
+        }
         //按人员过滤
         for (User curUser: allRangeUserList){
             //判断此用户当天是否请假,请假的不算
@@ -7663,13 +7672,19 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (!workDay){
                     continue;
                 }
-                List<LeaveSheet> findList = leaveSheetList.stream().filter(leaveSheet -> leaveSheet.getOwnerId().equals(curUser.getId())).collect(Collectors.toList());
                 boolean leaveOnTheDay = leaveSheetList.stream().anyMatch(leaveSheet -> leaveSheet.getOwnerId().equals(curUser.getId()) &&
                                 ((date.isEqual(leaveSheet.getStartDate()) || date.isAfter(leaveSheet.getStartDate()))
                                 && (date.isEqual(leaveSheet.getEndDate()) || date.isBefore(leaveSheet.getEndDate()))));
                 if (leaveOnTheDay) {
                     continue;
                 }
+                if (userCorpwxTimeList != null) {
+                    boolean corpwxLeaveOnTheDay = userCorpwxTimeList.stream().anyMatch(userCorpwxTime -> userCorpwxTime.getCorpwxUserid().equals(curUser.getCorpwxUserid()) &&
+                                    date.isEqual(userCorpwxTime.getCreateDate()));
+                    if (corpwxLeaveOnTheDay) {
+                        continue;
+                    }
+                }
                 //不存在已提交或者已通过的日报,视为未提交。包括未填写,待提交,已驳回,已撤销这些状态
                 if (!reportList.stream().anyMatch(item->item.getCreatorId().equals(curUser.getId())&&item.getCreateDate().isEqual(date)&&(item.getState() == 0 || item.getState() == 1))) {
                     HashMap map = new HashMap();

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

@@ -847,13 +847,13 @@ public class TimingTask {
         }
     }
 
-    //每天7点同步前2天的企业微信考勤考勤打卡记录
+    //每天7点同步前7天的企业微信考勤考勤打卡记录
     @Scheduled(cron = "0 0 7 ? * *")
     private void synCorpWXCardTime() {
         if (isDev) return;
         LocalDateTime yestoday = LocalDateTime.now().minusDays(1);
         yestoday = yestoday.withHour(0).withMinute(0).withSecond(0).withNano(0);
-        LocalDateTime yesBefore = yestoday.minusDays(1);
+        LocalDateTime yesBefore = yestoday.minusDays(7);
         List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
         for (TimeType type : typeList) {
             Integer companyId = type.getCompanyId();
@@ -861,7 +861,7 @@ public class TimingTask {
             Company company = companyMapper.selectById(companyId);
             //跳过已过期的企业
             if (company.getExpirationDate().isBefore(LocalDateTime.now())) continue;
-            //改成同步前2天的,以防止有昨天补卡前天的情况
+            //改成同步前7天的,以防止有以前补卡,补请假的情况
             wxCorpInfoService.getUserCheckInDayData(companyId, null, yesBefore, yestoday, false);
         }
     }