|
@@ -1429,7 +1429,7 @@ public class TimingTask {
|
|
|
DecimalFormat df = new DecimalFormat("#0.0");
|
|
DecimalFormat df = new DecimalFormat("#0.0");
|
|
|
String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + df.format(sum)+"小时。其中审核通过"+df.format(pass)
|
|
String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + df.format(sum)+"小时。其中审核通过"+df.format(pass)
|
|
|
+"小时, 待审核"+df.format(waiting)+"小时,驳回"+df.format(reject)+"小时。";
|
|
+"小时, 待审核"+df.format(waiting)+"小时,驳回"+df.format(reject)+"小时。";
|
|
|
- pushLastWeekReportFill(u, str);
|
|
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1591,16 +1591,6 @@ public class TimingTask {
|
|
|
LocalDate startDate = localDate.with(DayOfWeek.MONDAY);
|
|
LocalDate startDate = localDate.with(DayOfWeek.MONDAY);
|
|
|
userList = reportService.getNotFullReportUserList(company.getId(), startDate, lastDay);
|
|
userList = reportService.getNotFullReportUserList(company.getId(), startDate, lastDay);
|
|
|
} else {
|
|
} 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) {
|
|
} else if (t.getAlertType() == 3) {
|
|
|
//3--每月固定日期提醒上个月的
|
|
//3--每月固定日期提醒上个月的
|
|
@@ -1638,37 +1628,7 @@ public class TimingTask {
|
|
|
final boolean finalLastWeekNotFill = lastWeekNotFill;
|
|
final boolean finalLastWeekNotFill = lastWeekNotFill;
|
|
|
//今天或者明天统一提醒,提醒内容大家都一样
|
|
//今天或者明天统一提醒,提醒内容大家都一样
|
|
|
if (t.getAlertType() == 0 || t.getAlertType() == 1) {
|
|
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 {
|
|
} else {
|
|
|
//修改代码
|
|
//修改代码
|
|
|
userList.forEach(u->{
|
|
userList.forEach(u->{
|
|
@@ -1719,7 +1679,6 @@ public class TimingTask {
|
|
|
wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
|
|
wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
|
|
|
}
|
|
}
|
|
|
} else if (u.get("wxOpenid") != null) {
|
|
} 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) {
|
|
public static void main(String[] args) {
|
|
|
int dayOfMonth = LocalDate.now().getDayOfMonth();
|
|
int dayOfMonth = LocalDate.now().getDayOfMonth();
|
|
|
System.out.println(dayOfMonth);
|
|
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 ? * *")
|
|
@Scheduled(cron = "0 30 09 ? * *")
|
|
|
public void remindTaskFile(){
|
|
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);
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|