|
@@ -54,6 +54,7 @@ import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CountDownLatch;
|
|
|
import java.util.concurrent.Executor;
|
|
|
+import java.util.concurrent.ExecutorService;
|
|
|
import java.util.concurrent.Executors;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -5146,6 +5147,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
// titles.add("审核流程");
|
|
|
titles.add(MessageUtils.message("excel.fillTime"));
|
|
|
titles.add(MessageUtils.message("excel.proReviewer"));
|
|
|
+ titles.add("项目经理");
|
|
|
titles.add(MessageUtils.message("excel.auditTime"));
|
|
|
titles.add(MessageUtils.message("excel.auditProcess"));
|
|
|
// logDetails = reportLogDetailMapper.selectList(new QueryWrapper<ReportLogDetail>().select("report_id, msg, operator_id, operate_date").eq("company_id", company.getId()).between("work_date", startDate, endDate));
|
|
@@ -5416,6 +5418,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}else {
|
|
|
item.add((String)map.get("projectAuditorName"));
|
|
|
}
|
|
|
+ if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
|
|
|
+ String projectManagerName ="$userName="+String.valueOf(map.get("projectManagerCorpwxUserId"))+"$";
|
|
|
+ item.add(projectManagerName);
|
|
|
+ }else {
|
|
|
+ item.add((String)map.get("projectManagerName"));
|
|
|
+ }
|
|
|
//分组审核通过或者项目审核通过都显示
|
|
|
if (map.get("projectAuditTime") != null && ((Integer)map.get("projectAuditState") == 1 || (Integer)map.get("groupAuditState") == 1)) {
|
|
|
item.add(sdf.format((Date)map.get("projectAuditTime")));
|
|
@@ -7465,21 +7473,23 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public HttpRespMsg pushProjectReportToSap(String yearMonth) {
|
|
|
+ public HttpRespMsg pushProjectReportToSap(String pushDate) {
|
|
|
HttpRespMsg httpRespMsg =new HttpRespMsg();
|
|
|
- String dateStr = yearMonth+"-01";
|
|
|
- DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
- LocalDate start = LocalDate.parse(dateStr,df);
|
|
|
- LocalDate end =start.plusMonths(1).minusDays(1);
|
|
|
- List<SapSyncLog> sapSyncLogs=new ArrayList<>();
|
|
|
LocalDateTime localDateTime=LocalDateTime.now();
|
|
|
User user = userMapper.selectById(request.getHeader("token"));
|
|
|
Integer companyId = user.getCompanyId();
|
|
|
- List<Map<String,Object>> resultList=reportMapper.getPushProjectReportToSap(companyId,df.format(start),df.format(end),null);
|
|
|
+ List<Map<String,Object>> resultList=reportMapper.getPushProjectReportToSap(companyId,pushDate,pushDate,null);
|
|
|
+ //过滤服务code为空的数据
|
|
|
+ resultList=resultList.stream().filter(r->r.get("ProjectElementID")!=null && !StringUtils.isEmpty(String.valueOf(r.get("ProjectElementID")))).collect(Collectors.toList());
|
|
|
+ List<Integer> projectIds = resultList.stream().map(r -> Integer.valueOf(String.valueOf(r.get("ProjectId")))).distinct().collect(Collectors.toList());
|
|
|
+ projectIds.add(-1);
|
|
|
//提前推送项目工时(工时管家相关项目任务分组阶段下任务作为SAP服务 预算工时数据推送到SAP)
|
|
|
- List<Map<String, Object>> pushProjectPlanHour = reportMapper.getProjectPlanData(companyId,null,null);
|
|
|
+ //只推送需要推送日报参与的部分就可以了
|
|
|
+ List<Map<String, Object>> pushProjectPlanHour = reportMapper.getProjectPlanData(companyId,projectIds,null,null);
|
|
|
List<SapSyncLog> projectPlanSyncLogs = SyncSapUtils.pushProjectPlanToSap(pushProjectPlanHour, user.getCompanyId(), user.getJobNumber());
|
|
|
- sapSyncLogs.addAll(projectPlanSyncLogs);
|
|
|
+ if(projectPlanSyncLogs.size()>0){
|
|
|
+ sapSyncLogService.saveBatch(projectPlanSyncLogs);
|
|
|
+ }
|
|
|
//配置xml请求参数
|
|
|
XmlRequestData xmlRequestData=new XmlRequestData();
|
|
|
xmlRequestData.setBasicMessageHeader("");
|
|
@@ -7488,102 +7498,123 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
workDescriptionText.setLanguageCode("ZH");
|
|
|
SapPeriod datePeriod=new SapPeriod();
|
|
|
SapPeriod timePeriod=new SapPeriod();
|
|
|
- List<ReportPushLog> addList=new ArrayList<>();
|
|
|
- long sTime = System.currentTimeMillis();
|
|
|
- for (Map<String, Object> map : resultList) {
|
|
|
- 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;
|
|
|
- }
|
|
|
- employeeTime.setEmployeeID(String.valueOf(map.get("EmployeeID")));
|
|
|
- employeeTime.setActionCode("01");
|
|
|
- if(map.get("StartDate")!=null){
|
|
|
- datePeriod.setStartDate(String.valueOf(map.get("StartDate")));
|
|
|
- }
|
|
|
- if(map.get("EndDate")!=null){
|
|
|
- datePeriod.setEndDate(String.valueOf(map.get("EndDate")));
|
|
|
- }
|
|
|
- if(map.get("StartTime")!=null){
|
|
|
- timePeriod.setStartTime(String.valueOf(map.get("StartTime"))+":00");
|
|
|
- }
|
|
|
- if(map.get("EndTime")!=null){
|
|
|
- timePeriod.setEndTime(String.valueOf(map.get("EndTime"))+":00");
|
|
|
- }
|
|
|
- employeeTime.setDatePeriod(datePeriod);
|
|
|
- employeeTime.setTimePeriod(timePeriod);
|
|
|
- employeeTime.setItemTypeCode("CN0001");
|
|
|
- String duration=map.get("Duration")==null?"0":String.valueOf(map.get("Duration"))+"";
|
|
|
- String hour = duration.substring(0, duration.indexOf("."));
|
|
|
- String min = "0"+duration.substring(duration.indexOf("."));
|
|
|
- BigDecimal minBigDecimal = new BigDecimal(min);
|
|
|
- minBigDecimal=minBigDecimal.multiply(new BigDecimal(60)).setScale(0,BigDecimal.ROUND_HALF_UP);
|
|
|
- employeeTime.setDuration("PT"+hour+"H"+minBigDecimal.intValue()+"M");
|
|
|
- if(map.get("ProjectElementID")==null||map.get("ServiceProductInternalID")==null){
|
|
|
- continue;
|
|
|
- }
|
|
|
- employeeTime.setProjectElementID(String.valueOf(map.get("ProjectElementID")));
|
|
|
- employeeTime.setServiceProductInternalID(String.valueOf(map.get("ServiceProductInternalID")));
|
|
|
- if(map.get("WorkDescriptionText")!=null){
|
|
|
- workDescriptionText.setWorkDescriptionText(String.valueOf(map.get("WorkDescriptionText")));
|
|
|
- employeeTime.setWorkDescriptionText(workDescriptionText);
|
|
|
- }
|
|
|
- xmlRequestData.setEmployeeTime(employeeTime);
|
|
|
- String xml = CommonUtils.convertToXml(xmlRequestData);
|
|
|
- System.out.println(xml);
|
|
|
- xml=xml.substring(xml.indexOf("<XMLDATA>")+9,xml.lastIndexOf("</XMLDATA>"));
|
|
|
- StringBuffer sb = new StringBuffer();
|
|
|
- sb.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:glob=\"http://sap.com/xi/SAPGlobal20/Global\">\n" +
|
|
|
- " <soapenv:Header/>\n" +
|
|
|
- " <soapenv:Body>\n" +
|
|
|
- " <glob:EmployeeTimeAsBundleMaintainRequest_sync>\n");
|
|
|
- sb.append(xml);
|
|
|
- sb.append(" </glob:EmployeeTimeAsBundleMaintainRequest_sync>\n" +
|
|
|
- " </soapenv:Body>\n" +
|
|
|
- "</soapenv:Envelope>");
|
|
|
- System.out.println(sb.toString());
|
|
|
- String result = "";
|
|
|
- try {
|
|
|
- result = WebServiceUtils.requestByXml("https://my601432.sapbyd.cn/sap/bc/srt/scs/sap/manageemployeetimein?sap-vhost=my601432.sapbyd.cn", sb.toString(), 0, "_BYDHOST", "Welcome1");
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(result)) {
|
|
|
- result = result.substring(result.indexOf("<soap-env:Body>")+15, result.lastIndexOf("</soap-env:Body>"));
|
|
|
- result = result.substring(result.indexOf(">")+1, result.lastIndexOf("</n0:EmployeeTimeAsBundleMaintainConfirmation_sync>"));
|
|
|
- result="<XMLDATA>"+result+"</XMLDATA>";
|
|
|
- }
|
|
|
- System.out.println(result);
|
|
|
- XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
|
|
|
- SapSyncLog sapSyncLog=new SapSyncLog();
|
|
|
- sapSyncLog.setOperator(user.getJobNumber());
|
|
|
- sapSyncLog.setCompanyId(companyId);
|
|
|
- sapSyncLog.setRemark("日报数据推送");
|
|
|
- sapSyncLog.setSyncType("手动推送");
|
|
|
- sapSyncLog.setSyncTime(localDateTime);
|
|
|
- if(StringUtils.isEmpty(xmlResponseData.getEmployeeTime())){
|
|
|
- log.error("推送失败===》工号:"+employeeTime.getEmployeeID());
|
|
|
- sapSyncLog.setResult("员工工号["+employeeTime.getEmployeeID()+"]"+datePeriod.getStartDate()+"日报推送失败");
|
|
|
- sapSyncLog.setResultRemark(xmlResponseData.getLog()!=null?xmlResponseData.getLog().getItem()!=null?xmlResponseData.getLog().getItem().getNote():"":"");
|
|
|
- }else {
|
|
|
- sapSyncLog.setResult("工号["+employeeTime.getEmployeeID()+"]"+datePeriod.getStartDate()+"日报推送成功");
|
|
|
- //推送成功 日报数据打上标记
|
|
|
- ReportPushLog reportPushLog=new ReportPushLog();
|
|
|
- reportPushLog.setCompanyId(companyId);
|
|
|
- reportPushLog.setReportId(Integer.valueOf(String.valueOf(map.get("ReportId"))));
|
|
|
- reportPushLog.setTargetSystem("SAP");
|
|
|
- reportPushLog.setUuid(xmlResponseData.getEmployeeTime().getUUID());
|
|
|
- addList.add(reportPushLog);
|
|
|
- }
|
|
|
- sapSyncLogs.add(sapSyncLog);
|
|
|
- }
|
|
|
- if(addList.size()>0){
|
|
|
- reportPushLogService.saveBatch(addList);
|
|
|
- }
|
|
|
- if(sapSyncLogs.size()>0){
|
|
|
- sapSyncLogService.saveBatch(sapSyncLogs);
|
|
|
+ List<Map<String, Object>> finalResultList = resultList;
|
|
|
+ //创建多个个线程来处理 每个线程处理10条数据
|
|
|
+ int size = finalResultList.size();
|
|
|
+ //需要创建的线程数量 防止有小数 获取整数+1
|
|
|
+ BigDecimal divide = new BigDecimal(size).divide(new BigDecimal(10));
|
|
|
+ int thredNum = divide.intValue() + 1;
|
|
|
+ ExecutorService executor = Executors.newFixedThreadPool(10);
|
|
|
+ //创建锁对象
|
|
|
+ Object o = new Object();
|
|
|
+ /*execute()让线程池中的线程来执行业务,每次调用都会将一个线程加入到就绪队列*/
|
|
|
+ for (int i = 0; i <thredNum ; i++) {
|
|
|
+ //目标数据进行分组
|
|
|
+ int start=i*10;
|
|
|
+ int end=(i+1)*10;
|
|
|
+ if(end>finalResultList.size()){
|
|
|
+ end=finalResultList.size();
|
|
|
+ }
|
|
|
+ List<Map<String, Object>> mapList = finalResultList.subList(start, end);
|
|
|
+ executor.execute(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ synchronized (o) {//同步代码块解决的是重卖的问题
|
|
|
+ /*本方法的参数就是你要执行的业务,也就是目标业务类对象*/
|
|
|
+ //3.定义成员变量,保存票数
|
|
|
+ for (Map<String, Object> map : mapList) {
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ employeeTime.setEmployeeID(String.valueOf(map.get("EmployeeID")));
|
|
|
+ employeeTime.setActionCode("01");
|
|
|
+ if(map.get("StartDate")!=null){
|
|
|
+ datePeriod.setStartDate(String.valueOf(map.get("StartDate")));
|
|
|
+ }
|
|
|
+ if(map.get("EndDate")!=null){
|
|
|
+ datePeriod.setEndDate(String.valueOf(map.get("EndDate")));
|
|
|
+ }
|
|
|
+ if(map.get("StartTime")!=null){
|
|
|
+ timePeriod.setStartTime(String.valueOf(map.get("StartTime"))+":00");
|
|
|
+ }
|
|
|
+ if(map.get("EndTime")!=null){
|
|
|
+ timePeriod.setEndTime(String.valueOf(map.get("EndTime"))+":00");
|
|
|
+ }
|
|
|
+ employeeTime.setDatePeriod(datePeriod);
|
|
|
+ employeeTime.setTimePeriod(timePeriod);
|
|
|
+ employeeTime.setItemTypeCode("CN0001");
|
|
|
+ String duration=map.get("Duration")==null?"0":String.valueOf(map.get("Duration"))+"";
|
|
|
+ String hour = duration.substring(0, duration.indexOf("."));
|
|
|
+ String min = "0"+duration.substring(duration.indexOf("."));
|
|
|
+ BigDecimal minBigDecimal = new BigDecimal(min);
|
|
|
+ minBigDecimal=minBigDecimal.multiply(new BigDecimal(60)).setScale(0,BigDecimal.ROUND_HALF_UP);
|
|
|
+ employeeTime.setDuration("PT"+hour+"H"+minBigDecimal.intValue()+"M");
|
|
|
+ if(map.get("ProjectElementID")==null||map.get("ServiceProductInternalID")==null){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ employeeTime.setProjectElementID(String.valueOf(map.get("ProjectElementID")));
|
|
|
+ employeeTime.setServiceProductInternalID(String.valueOf(map.get("ServiceProductInternalID")));
|
|
|
+ if(map.get("WorkDescriptionText")!=null){
|
|
|
+ workDescriptionText.setWorkDescriptionText(String.valueOf(map.get("WorkDescriptionText")));
|
|
|
+ employeeTime.setWorkDescriptionText(workDescriptionText);
|
|
|
+ }
|
|
|
+ xmlRequestData.setEmployeeTime(employeeTime);
|
|
|
+ String xml = CommonUtils.convertToXml(xmlRequestData);
|
|
|
+ System.out.println(xml);
|
|
|
+ xml=xml.substring(xml.indexOf("<XMLDATA>")+9,xml.lastIndexOf("</XMLDATA>"));
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
+ sb.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:glob=\"http://sap.com/xi/SAPGlobal20/Global\">\n" +
|
|
|
+ " <soapenv:Header/>\n" +
|
|
|
+ " <soapenv:Body>\n" +
|
|
|
+ " <glob:EmployeeTimeAsBundleMaintainRequest_sync>\n");
|
|
|
+ sb.append(xml);
|
|
|
+ sb.append(" </glob:EmployeeTimeAsBundleMaintainRequest_sync>\n" +
|
|
|
+ " </soapenv:Body>\n" +
|
|
|
+ "</soapenv:Envelope>");
|
|
|
+ System.out.println(sb.toString());
|
|
|
+ String result = "";
|
|
|
+ try {
|
|
|
+ result = WebServiceUtils.requestByXml("https://my601432.sapbyd.cn/sap/bc/srt/scs/sap/manageemployeetimein?sap-vhost=my601432.sapbyd.cn", sb.toString(), 0, "_BYDHOST", "Welcome1");
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(result)) {
|
|
|
+ result = result.substring(result.indexOf("<soap-env:Body>")+15, result.lastIndexOf("</soap-env:Body>"));
|
|
|
+ result = result.substring(result.indexOf(">")+1, result.lastIndexOf("</n0:EmployeeTimeAsBundleMaintainConfirmation_sync>"));
|
|
|
+ result="<XMLDATA>"+result+"</XMLDATA>";
|
|
|
+ }
|
|
|
+ System.out.println(result);
|
|
|
+ XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
|
|
|
+ SapSyncLog sapSyncLog=new SapSyncLog();
|
|
|
+ sapSyncLog.setOperator(user.getJobNumber());
|
|
|
+ sapSyncLog.setCompanyId(companyId);
|
|
|
+ sapSyncLog.setRemark("日报数据推送");
|
|
|
+ sapSyncLog.setSyncType("手动推送");
|
|
|
+ sapSyncLog.setSyncTime(localDateTime);
|
|
|
+ if(StringUtils.isEmpty(xmlResponseData.getEmployeeTime())){
|
|
|
+ log.error("推送失败===》员工工号:"+employeeTime.getEmployeeID());
|
|
|
+ sapSyncLog.setResult("员工工号["+employeeTime.getEmployeeID()+"]"+datePeriod.getStartDate()+"日报推送失败");
|
|
|
+ sapSyncLog.setResultRemark(xmlResponseData.getLog()!=null?xmlResponseData.getLog().getItem()!=null?xmlResponseData.getLog().getItem().getNote():"":"");
|
|
|
+ }else {
|
|
|
+ sapSyncLog.setResult("员工工号["+employeeTime.getEmployeeID()+"]"+datePeriod.getStartDate()+"日报推送成功");
|
|
|
+ //推送成功 日报数据打上标记
|
|
|
+ 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);
|
|
|
+ System.out.println("线程:"+Thread.currentThread().getName()+"正在操作"+map.get("ReportId"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
- long eTime = System.currentTimeMillis();
|
|
|
- httpRespMsg.setData("推送完成 耗时:"+(eTime-sTime)+"ms");
|
|
|
+ httpRespMsg.setData("推送正在进行...待推送完成可查看工时日志");
|
|
|
+ executor.shutdown();
|
|
|
return httpRespMsg;
|
|
|
}
|
|
|
|