Jelajahi Sumber

sap 推送修改
增加推送记录
修改同步服务问题
费用报销接口修改

Min 1 tahun lalu
induk
melakukan
12c0a2c9bd
13 mengubah file dengan 406 tambahan dan 124 penghapusan
  1. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CommonUploadController.java
  2. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SapSyncLogController.java
  3. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseSheet.java
  4. 71 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SapSyncLog.java
  5. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/SapSyncLogMapper.java
  6. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/SapSyncLogService.java
  7. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  9. 41 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  10. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SapSyncLogServiceImpl.java
  11. 162 113
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  12. 22 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/SyncSapUtils.java
  13. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SapSyncLogMapper.xml

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

@@ -70,7 +70,7 @@ public class CommonUploadController {
     }
 
     @RequestMapping(value="uploadFileArray")
-    public HttpRespMsg uploadFileArray(@RequestParam("multipartFiles") List<MultipartFile> multipartFiles) {
+    public HttpRespMsg uploadFileArray(List<MultipartFile> multipartFiles) {
         HttpRespMsg msg = new HttpRespMsg();
         StringBuilder stringBuilder=new StringBuilder();
 

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SapSyncLogController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-12-18
+ */
+@RestController
+@RequestMapping("/sap-sync-log")
+public class SapSyncLogController {
+
+}
+

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseSheet.java

@@ -136,6 +136,12 @@ public class ExpenseSheet extends Model<ExpenseSheet> {
     @TableField(exist = false)
     private String expenseMainTypeName;
 
+    @TableField(exist = false)
+    private String firstCheckerName;
+
+    @TableField(exist = false)
+    private String secondCheckerName;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 71 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SapSyncLog.java

@@ -0,0 +1,71 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-12-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SapSyncLog extends Model<SapSyncLog> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 同步结果
+     */
+    @TableField("result")
+    private String result;
+
+    /**
+     * 同步结果报文
+     */
+    @TableField("result_remark")
+    private String resultRemark;
+
+    /**
+     * 同步时间
+     */
+    @TableField("sync_time")
+    private LocalDateTime syncTime;
+
+    /**
+     * 同步方式
+     */
+    @TableField("sync_type")
+    private String syncType;
+
+    /**
+     * 操作人
+     */
+    @TableField("operator")
+    private String operator;
+
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return null;
+    }
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/SapSyncLogMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.SapSyncLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-12-18
+ */
+public interface SapSyncLogMapper extends BaseMapper<SapSyncLog> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/SapSyncLogService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.SapSyncLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-12-18
+ */
+public interface SapSyncLogService extends IService<SapSyncLog> {
+
+}

+ 8 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -525,6 +525,14 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
     public HttpRespMsg getDetail(Integer id) {
         String token = request.getHeader("TOKEN");
         ExpenseSheet expenseSheet = expenseSheetMapper.selectById(id);
+        if(expenseSheet.getFirstCheckerId()!=null){
+            User user = userMapper.selectById(expenseSheet.getFirstCheckerId());
+            expenseSheet.setFirstCheckerName(user.getName());
+        }
+        if(expenseSheet.getSecondCheckerId()!=null){
+            User user = userMapper.selectById(expenseSheet.getFirstCheckerId());
+            expenseSheet.setSecondCheckerName(user.getName());
+        }
         List<ExpenseItem> list = expenseItemMapper.selectList(new QueryWrapper<ExpenseItem>().eq("expense_id", id));
         List<Project> Project = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", expenseSheet.getCompanyId()));
         ExpenseAuditSetting expenseAuditSetting = expenseAuditSettingMapper.selectById(expenseSheet.getCompanyId());

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

@@ -11592,7 +11592,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<ServiceProduct> serviceProducts = projectServiceData.getServiceProducts();
             if(serviceProducts!=null&&serviceProducts.size()>0){
                 for (ServiceProduct serviceProduct : serviceProducts) {
-                    if(serviceProduct.getProductCategoryID().equals("901")&&serviceProduct.getBaseMeasureUnitCode().equals("HUR")){
+                    if(serviceProduct.getProductCategoryID().equals("901")){
                         SapProjectService sapProjectService=new SapProjectService();
                         sapProjectService.setServiceCode(serviceProduct.getInternalID());
                         sapProjectService.setServiceName(serviceProduct.getDescription().getDescription());

+ 41 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -211,6 +211,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private HttpServletRequest request;
     @Resource
     private ReportPushLogService reportPushLogService;
+    @Resource
+    private SapSyncLogService sapSyncLogService;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -2793,7 +2795,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
 
         if(timeType.getSyncSap()==1){
-            cancelReportPushSap(reportIds);
+            cancelReportPushSap(reportIds,user);
         }
         return httpRespMsg;
     }
@@ -7448,11 +7450,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Override
     public HttpRespMsg pushProjectReportToSap(String startDate, String endDate,String userId) {
         HttpRespMsg httpRespMsg =new HttpRespMsg();
-        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        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,startDate,endDate,userId);
         //提前推送项目工时(工时管家相关项目任务分组阶段下任务作为SAP服务 预算工时数据推送到SAP)
         List<Map<String, Object>> pushProjectPlanHour = reportMapper.getProjectPlanData(companyId,null,null);
-        SyncSapUtils.pushProjectPlanToSap(pushProjectPlanHour);
+        List<SapSyncLog> projectPlanSyncLogs = SyncSapUtils.pushProjectPlanToSap(pushProjectPlanHour, user.getCompanyId(), user.getJobNumber());
+        sapSyncLogs.addAll(projectPlanSyncLogs);
         //配置xml请求参数
         XmlRequestData xmlRequestData=new XmlRequestData();
         xmlRequestData.setBasicMessageHeader("");
@@ -7462,6 +7468,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         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){
@@ -7521,10 +7528,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             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());
-                continue;
+                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);
@@ -7533,15 +7548,23 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 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);
+        }
+        long eTime = System.currentTimeMillis();
+        httpRespMsg.setData("推送完成 耗时:"+(eTime-sTime)+"ms");
         return httpRespMsg;
     }
 
-    public void  cancelReportPushSap(String reportIds){
+    public void  cancelReportPushSap(String reportIds,User user){
         if(!StringUtils.isEmpty(reportIds)){
+            LocalDateTime localDateTime=LocalDateTime.now();
+            List<SapSyncLog> sapSyncLogs=new ArrayList<>();
             List<Integer> reportIdList = ListUtil.convertIntegerIdsArrayToList(reportIds);
             List<ReportPushLog> reportPushLogList = reportPushLogService.list(new LambdaQueryWrapper<ReportPushLog>().in(ReportPushLog::getReportId, reportIdList));
             for (Integer reportId : reportIdList) {
@@ -7577,14 +7600,26 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                     System.out.println(result);
                     XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
+                    SapSyncLog sapSyncLog=new SapSyncLog();
+                    sapSyncLog.setCompanyId(user.getCompanyId());
+                    sapSyncLog.setRemark("日报数据取消推送");
+                    sapSyncLog.setSyncType("手动推送");
+                    sapSyncLog.setOperator(user.getJobNumber());
+                    sapSyncLog.setSyncTime(localDateTime);
                     if(StringUtils.isEmpty(xmlResponseData.getZDeleteEmployeeTime())){
                         log.error("推送取消考勤失败===》UUID:"+xmlRequestData.getZDeleteEmployeeTime().getEmployeeTimeUUID());
+                        sapSyncLog.setResult("推送取消考勤失败");
                     }else {
                         //删除推送记录
-                        reportPushLogService.removeById(reportId);
+                        sapSyncLog.setResult("推送取消考勤成功");
+                        reportPushLogService.remove(new LambdaQueryWrapper<ReportPushLog>().eq(ReportPushLog::getReportId,reportId));
                     }
+                    sapSyncLogs.add(sapSyncLog);
                 }
             }
+            if(sapSyncLogs.size()>0){
+                sapSyncLogService.saveBatch(sapSyncLogs);
+            }
         }
     }
 

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SapSyncLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.SapSyncLog;
+import com.management.platform.mapper.SapSyncLogMapper;
+import com.management.platform.service.SapSyncLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-12-18
+ */
+@Service
+public class SapSyncLogServiceImpl extends ServiceImpl<SapSyncLogMapper, SapSyncLog> implements SapSyncLogService {
+
+}

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

@@ -172,6 +172,8 @@ public class TimingTask {
     private StagesService stagesService;
     @Resource
     private SapProjectServiceService sapProjectServiceService;
+    @Resource
+    private SapSyncLogService sapSyncLogService;
 
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
@@ -1694,11 +1696,14 @@ public class TimingTask {
         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();
+            List<SapSyncLog> sapSyncLogs=new ArrayList<>();
             //提前推送项目工时(工时管家相关项目任务分组阶段下任务作为SAP服务 预算工时数据推送到SAP)
             List<Map<String, Object>> pushProjectPlanHour = reportMapper.getProjectPlanData(companyId,null,null);
-            SyncSapUtils.pushProjectPlanToSap(pushProjectPlanHour);
+            List<SapSyncLog> projectPlanSapSyncLogs = SyncSapUtils.pushProjectPlanToSap(pushProjectPlanHour, companyId, "");
+            sapSyncLogs.addAll(projectPlanSapSyncLogs);
             List<Map<String, Object>> mapList = reportMapper.getPushProjectReportToSap(companyId,df.format(date.minusDays(1)),df.format(date.minusDays(1)), null);
             List<ReportPushLog> addList=new ArrayList<>();
             for (Map<String, Object> map : mapList) {
@@ -1707,10 +1712,17 @@ public class TimingTask {
                     continue;
                 }
                 XmlResponseData xmlResponseData = SyncSapUtils.pushReportToSap(map);
+                SapSyncLog sapSyncLog=new SapSyncLog();
+                sapSyncLog.setCompanyId(companyId);
+                sapSyncLog.setRemark("日报数据推送");
+                sapSyncLog.setSyncType("定时任务推送");
+                sapSyncLog.setSyncTime(localDateTime);
                 if(StringUtils.isEmpty(xmlResponseData.getEmployeeTime())){
                     log.error("推送失败===》工号:"+map.get("EmployeeID"));
-                    continue;
+                    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);
@@ -1719,10 +1731,14 @@ public class TimingTask {
                     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);
+            }
         }
     }
 
@@ -1742,12 +1758,11 @@ public class TimingTask {
             //已有的项目分类
             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)));
             XmlResponseData xmlResponseData = SyncSapUtils.syncProjectFromSap(df.format(date.minusDays(1)), df.format(date.minusDays(1)));
             List<ProjectQueryResponse> projectQueryResponses = xmlResponseData.getProjectQueryResponses();
             List<Map<String,Object>> idsMapList=new ArrayList<>();
+            LocalDate localDate=LocalDate.now();
             if(projectQueryResponses!=null&&projectQueryResponses.size()>0){
-                List<Stages> stagesList=new ArrayList<>();
                 for (ProjectQueryResponse item : projectQueryResponses) {
                     Project project=new Project();
                     //处理项目分类
@@ -1811,44 +1826,144 @@ public class TimingTask {
                     //处理项目下任务 ----> 工时管家生成任务分组
                     List<ProjectTask> projectTasks = item.getProjectTasks();
                     if(projectTasks!=null&&projectTasks.size()>0){
-                        projectTasks.forEach(ps->{
-                            TaskGroup taskGroup=new TaskGroup();
-                            taskGroup.setProjectId(project.getId());
-                            taskGroup.setTaskGroupCode(ps.getProjectElementID());
-                            taskGroup.setName(ps.getTaskGroupName()==null?"":ps.getTaskGroupName().getName());
-                            TaskGroup one = taskGroupMapper.selectOne(new QueryWrapper<TaskGroup>().eq("project_id", project.getId()).eq("task_group_code", ps.getProjectElementID()));
-                            if(one!=null){
-                                taskGroup.setId(one.getId());
+                        //找到任务列表中 作为项目出现的第一级列表
+                        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());
+                        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);
+                                }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);
+                                }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);
                             }
-                            taskGroupService.saveOrUpdate(taskGroup);
-                            Map<String,Object> map=new HashMap<>();
-                            map.put("groupId",taskGroup.getId());
-                            map.put("projectId",project.getId());
-                            idsMapList.add(map);
-                        });
-                    }
-                }
-                if(idsMapList.size()>0){
-                    List<Integer> projectIds = idsMapList.stream().map(i -> Integer.valueOf(String.valueOf(i.get("projectId")))).collect(Collectors.toList());
-                    List<Integer> groupIds = idsMapList.stream().map(i -> Integer.valueOf(String.valueOf(i.get("groupId")))).collect(Collectors.toList());
-                    List<Stages> allStages = stagesMapper.selectList(new LambdaQueryWrapper<Stages>().in(Stages::getProjectId, projectIds).in(Stages::getGroupId, groupIds));
-                    for (Map<String, Object> map : idsMapList) {
-                        Optional<Stages> first = allStages.stream().filter(a -> a.getGroupId().equals(String.valueOf(map.get("groupId"))) && a.getProjectId().equals(String.valueOf(map.get("projectId")))).findFirst();
-                        if(!first.isPresent()){
-                            //创建默认列表
-                            Stages stage = new Stages();
-                            stage.setGroupId(Integer.valueOf(String.valueOf(map.get("groupId"))));
-                            stage.setSequence(1);
-                            stage.setProjectId(Integer.valueOf(String.valueOf(map.get("projectId"))));
-                            stage.setStagesName(MessageUtils.message("excel.WorkUnfolds"));
-                            allStages.add(stage);
-                            stagesList.add(stage);
                         }
                     }
                 }
-                if(stagesList.size()>0){
-                    stagesService.saveBatch(stagesList);
-                }
             }
             //处理项目下服务数据 ------->工时管家相关项目下任务分组下创建任务数据
             List<SapProjectService> serviceList = sapProjectServiceService.list(new LambdaQueryWrapper<SapProjectService>().eq(SapProjectService::getCompanyId, companyId));
@@ -1857,13 +1972,15 @@ public class TimingTask {
                 List<ServiceProduct> serviceProducts = projectServiceData.getServiceProducts();
                 if(serviceProducts!=null&&serviceProducts.size()>0){
                     for (ServiceProduct serviceProduct : serviceProducts) {
-                        SapProjectService sapProjectService=new SapProjectService();
-                        sapProjectService.setServiceCode(serviceProduct.getInternalID());
-                        sapProjectService.setServiceName(serviceProduct.getDescription().getDescription());
-                        sapProjectService.setCompanyId(companyId);
-                        boolean match = serviceList.stream().anyMatch(s -> s.getServiceCode().equals(serviceProduct.getInternalID()));
-                        if(!match){
-                            sapProjectServiceList.add(sapProjectService);
+                        if(serviceProduct.getProductCategoryID().equals("901")){
+                            SapProjectService sapProjectService=new SapProjectService();
+                            sapProjectService.setServiceCode(serviceProduct.getInternalID());
+                            sapProjectService.setServiceName(serviceProduct.getDescription().getDescription());
+                            sapProjectService.setCompanyId(companyId);
+                            boolean match = serviceList.stream().anyMatch(s -> s.getServiceCode().equals(serviceProduct.getInternalID()));
+                            if(!match){
+                                sapProjectServiceList.add(sapProjectService);
+                            }
                         }
                     }
                 }
@@ -1874,72 +1991,4 @@ public class TimingTask {
         }
     }
 
-
-
-    public static void main(String[] args) {
-        List<Map<String, Object>> mapList = new ArrayList<>();
-        Map<String,Object> map2=new HashMap<>();
-        map2.put("ProjectID","1");
-        map2.put("ProjectTaskID","2");
-        map2.put("ServiceID","3");
-        map2.put("EmployeeID","4");
-        map2.put("PlanWork","5");
-        map2.put("StartDate","6");
-        map2.put("EndDate","7");
-        mapList.add(map2);
-        Map<String,Object> map1=new HashMap<>();
-        map1.put("ProjectID","1");
-        map1.put("ProjectTaskID","2");
-        map1.put("ServiceID","3");
-        map1.put("EmployeeID","5");
-        map1.put("PlanWork","3");
-        map1.put("StartDate","2");
-        map1.put("EndDate","1");
-        mapList.add(map1);
-        //根据项目分组 按照项目推送
-        //获取当前数据中的所有项目编号
-        List<String> projectIds = mapList.stream().map(m -> String.valueOf(m.get("ProjectID"))).distinct().collect(Collectors.toList());
-        Map<Object, List<Map<String, Object>>> mapListGroupPro = mapList.stream().collect(Collectors.groupingBy(m -> m.get("ProjectID")));
-        //循环推送
-        for (String projectId : projectIds) {
-            //配置xml请求参数
-            XmlRequestData xmlRequestData=new XmlRequestData();
-            xmlRequestData.setBasicMessageHeader("");
-            ZManageProjectTaskWork zManageProjectTaskWork=new ZManageProjectTaskWork();
-            zManageProjectTaskWork.setProjectID(projectId);
-            List<Map<String, Object>> resultList = mapListGroupPro.get(projectId);
-            //获取当前数据下的任务分组的分组数据
-            List<String> taskGroupIds = resultList.stream().map(m -> String.valueOf(m.get("ProjectTaskID"))).distinct().collect(Collectors.toList());
-            Map<Object, List<Map<String, Object>>> resultGroupByTaskGroup = resultList.stream().collect(Collectors.groupingBy(m -> m.get("ProjectTaskID")));
-            List<RequestTask> tasks=new ArrayList<>();
-            for (String taskGroupId : taskGroupIds) {
-                RequestTask requestTask=new RequestTask();
-                requestTask.setProjectTaskID(taskGroupId);
-                List<Map<String, Object>> list = resultGroupByTaskGroup.get(taskGroupId);
-                List<Service> services=new ArrayList<>();
-                for (Map<String, Object> map : list) {
-                    Service service=new Service();
-                    service.setServiceID(String.valueOf(map.get("ServiceID")));
-                    service.setEmployeeID(String.valueOf(map.get("EmployeeID")));
-                    service.setPlanWork(String.valueOf(map.get("PlanWork")));
-                    StartDate startDate=new StartDate();
-                    startDate.setTimeZoneCode("UTC+8");
-                    startDate.setStartDate(String.valueOf(map.get("StartDate")));
-                    service.setStartDate(startDate);
-                    EndDate endDate=new EndDate();
-                    endDate.setTimeZoneCode("UTC+8");
-                    endDate.setEndDate(String.valueOf(map.get("EndDate")));
-                    service.setEndDate(endDate);
-                    service.setOverDeliveryAllowedIndicator("true");
-                    services.add(service);
-                }
-                requestTask.setServices(services);
-                tasks.add(requestTask);
-            }
-            zManageProjectTaskWork.setTasks(tasks);
-            xmlRequestData.setZManageProjectTaskWork(zManageProjectTaskWork);
-            String xml = CommonUtils.convertToXml(xmlRequestData);
-            System.out.println(xml);
-        }
-    }
 }

+ 22 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/SyncSapUtils.java

@@ -2,13 +2,17 @@ package com.management.platform.util;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.management.platform.entity.ReportPushLog;
+import com.management.platform.entity.SapSyncLog;
+import com.management.platform.entity.User;
 import com.management.platform.service.ReportPushLogService;
 import com.management.platform.service.ReportService;
+import com.management.platform.service.SapSyncLogService;
 import com.management.platform.webservice.po.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -17,14 +21,19 @@ import java.util.stream.Collectors;
 @Slf4j
 public class SyncSapUtils {
 
+    @Resource
+    private SapSyncLogService sapSyncLogService;
+
 
     //工时管家推送项目任务计划工时数据到SAP
-    public static void pushProjectPlanToSap(List<Map<String, Object>> mapList) {
+    public static List<SapSyncLog> pushProjectPlanToSap(List<Map<String, Object>> mapList, Integer companyId, String operator) {
         //根据项目分组 按照项目推送
         //获取当前数据中的所有项目编号
         List<String> projectIds = mapList.stream().map(m -> String.valueOf(m.get("ProjectID"))).distinct().collect(Collectors.toList());
         Map<Object, List<Map<String, Object>>> mapListGroupPro = mapList.stream().collect(Collectors.groupingBy(m -> m.get("ProjectID")));
         //循环推送
+        LocalDateTime localDateTime=LocalDateTime.now();
+        List<SapSyncLog> sapSyncLogs=new ArrayList<>();
         for (String projectId : projectIds) {
             //配置xml请求参数
             XmlRequestData xmlRequestData=new XmlRequestData();
@@ -54,7 +63,7 @@ public class SyncSapUtils {
                     endDate.setTimeZoneCode("UTC+8");
                     endDate.setEndDate(String.valueOf(map.get("EndDate"))+"T23:59:59Z");
                     service.setEndDate(endDate);
-                    service.setRemainingWork(String.valueOf(map.get("PlanWork")));
+//                    service.setRemainingWork(String.valueOf(map.get("PlanWork")));
                     service.setOverDeliveryAllowedIndicator("true");
                     services.add(service);
                 }
@@ -89,11 +98,21 @@ public class SyncSapUtils {
             }
             System.out.println(result);
             XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
+            SapSyncLog sapSyncLog=new SapSyncLog();
+            sapSyncLog.setOperator(operator);
+            sapSyncLog.setCompanyId(companyId);
+            sapSyncLog.setRemark("项目预算工时数据推送");
+            sapSyncLog.setSyncType(StringUtils.isEmpty(operator)?"定时任务推送":"手动推送");
+            sapSyncLog.setSyncTime(localDateTime);
             if(StringUtils.isEmpty(xmlResponseData.getZManageProjectTaskWork())){
                 log.error("推送失败===》项目编号:"+zManageProjectTaskWork.getProjectID());
-                continue;
+                sapSyncLog.setResult("项目编号["+zManageProjectTaskWork.getProjectID()+"]预算工时推送失败");
+            }else {
+                sapSyncLog.setResult("项目编号["+zManageProjectTaskWork.getProjectID()+"]预算工时推送成功");
             }
+            sapSyncLogs.add(sapSyncLog);
         }
+        return sapSyncLogs;
     }
 
     //推送工时管家填报考勤数据到SAP

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SapSyncLogMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.SapSyncLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.SapSyncLog">
+        <result column="company_id" property="companyId" />
+        <result column="result" property="result" />
+        <result column="result_remark" property="resultRemark" />
+        <result column="sync_time" property="syncTime" />
+        <result column="sync_type" property="syncType" />
+        <result column="operator" property="operator" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, result, result_remark, sync_time, sync_type, operator, remark
+    </sql>
+
+</mapper>