浏览代码

Merge remote-tracking branch 'origin/master'

yusm 1 年之前
父节点
当前提交
4c18989d40
共有 42 个文件被更改,包括 1231 次插入360 次删除
  1. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  3. 46 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SapProjectServiceController.java
  4. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  5. 54 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SapProjectService.java
  6. 9 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java
  7. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  8. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/SapProjectServiceMapper.java
  9. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/SapProjectServiceService.java
  10. 61 104
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  11. 12 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  12. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SapProjectServiceServiceImpl.java
  13. 243 99
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  14. 246 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/SyncSapUtils.java
  15. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/EndDate.java
  16. 4 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/RequestTask.java
  17. 6 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/Service.java
  18. 22 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/StartDate.java
  19. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/XmlRequestData.java
  20. 4 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/ZManageProjectTaskWork.java
  21. 18 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  22. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SapProjectServiceMapper.xml
  23. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  24. 19 4
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java
  25. 8 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Plan.java
  26. 14 4
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/PlanProcedureTotal.java
  27. 12 3
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanProcedureTotalServiceImpl.java
  28. 11 8
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java
  29. 13 8
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  30. 2 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/PlanMapper.xml
  31. 3 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/PlanProcedureTotalMapper.xml
  32. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProdProcedureTeamMapper.xml
  33. 4 7
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ReportMapper.xml
  34. 16 5
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/fillReport.vue
  35. 110 59
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/workView.vue
  36. 36 1
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponent.vue
  37. 12 10
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue
  38. 35 2
      fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue
  39. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  40. 9 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  41. 68 7
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue
  42. 17 6
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

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

@@ -1297,6 +1297,7 @@ public class ProjectController {
                 Optional<Project> project = workTimeProjectList.stream().filter(wl -> wl.getProjectCode() != null && wl.getProjectCode().equals(map.get("xmdm"))).findFirst();
                 if(project.isPresent()){
                     Project item = project.get();
+                    item.setFromOutside(1);
                     item.setProjectName(String.valueOf(map.get("xmmc")));
                     if(first.isPresent()){
                         item.setInchargerId(first.get().getId())
@@ -1346,7 +1347,8 @@ public class ProjectController {
                 project.setProjectName(String.valueOf(map.get("xmmc")))
                         .setProjectCode(String.valueOf(map.get("xmdm")))
                         .setCompanyId(876)
-                        .setCreateDate(LocalDate.now());
+                        .setCreateDate(LocalDate.now())
+                        .setFromOutside(1);
                 if(first.isPresent()){
                     project.setInchargerId(first.get().getId())
                             .setInchargerName(first.get().getName());

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

@@ -1210,7 +1210,7 @@ public class ReportController {
                                 hasReport = new BigDecimal(groupSum).add(new BigDecimal(nowReport));
                                 TaskGroup tgp = taskGroupService.getById(targetGpId);
                                 //设置的数值大于0时检查是否超额
-                                if (tgp.getManDay() != null && tgp.getManDay() > 0) {
+                                if (tgp != null && tgp.getManDay() != null && tgp.getManDay() > 0) {
                                     multiply = new BigDecimal(tgp.getManDay()).multiply(new BigDecimal(comTimeType.getAllday()));
                                     System.out.println("hasReport:"+hasReport+" multiply:"+multiply);
                                     if (hasReport.doubleValue() > multiply.doubleValue()) {

+ 46 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SapProjectServiceController.java

@@ -0,0 +1,46 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.SapProjectService;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.SapProjectServiceService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-27
+ */
+@RestController
+@RequestMapping("/sap-project-service")
+public class SapProjectServiceController {
+
+    @Resource
+    private SapProjectServiceService sapProjectServiceService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+
+    @RequestMapping("/sapServiceList")
+    public HttpRespMsg sapServiceList(){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<SapProjectService> serviceList = sapProjectServiceService.list(new LambdaQueryWrapper<SapProjectService>().eq(SapProjectService::getCompanyId, companyId));
+        msg.setData(serviceList);
+        return msg;
+    }
+
+}
+

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -4,6 +4,7 @@ package com.management.platform.controller;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.pagehelper.IPage;
@@ -93,6 +94,8 @@ public class TaskController {
     private TaskRestartMapper taskRestartMapper;
     @Resource
     private TaskPersonLiableMapper taskPersonLiableMapper;
+    @Resource
+    private SapProjectServiceService sapProjectServiceService;
 
     @RequestMapping("/save")
     @Transactional
@@ -103,6 +106,12 @@ public class TaskController {
         //当前用户
         User user = userMapper.selectById(userId);
         HttpRespMsg msg = new HttpRespMsg();
+        if(task.getServiceId()!=null){
+            SapProjectService one = sapProjectServiceService.getOne(new LambdaQueryWrapper<SapProjectService>().eq(SapProjectService::getCompanyId, user.getCompanyId()).eq(SapProjectService::getServiceCode,task.getServiceId()));
+            if(one!=null){
+                task.setName(one.getServiceName()+"-"+one.getServiceCode());
+            }
+        }
 
         //新建的任务,需要设置创建人,创建时间
         if (task.getId() == null) {

+ 54 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SapProjectService.java

@@ -0,0 +1,54 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+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-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SapProjectService extends Model<SapProjectService> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目服务编号
+     */
+    @TableField("service_code")
+    private String serviceCode;
+
+    /**
+     * 项目服务名称
+     */
+    @TableField("service_name")
+    private String serviceName;
+
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 9 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java

@@ -21,7 +21,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-02-27
+ * @since 2023-11-23
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -61,13 +61,13 @@ public class Task extends Model<Task> {
     private String creatorColor;
 
     /**
-     * 执行人id
+     * 执行人id,多个
      */
     @TableField("executor_id")
     private String executorId;
 
     /**
-     * 执行人姓名
+     * 执行人姓名,多个
      */
     @TableField("executor_name")
     private String executorName;
@@ -214,6 +214,12 @@ public class Task extends Model<Task> {
     @TableField("meeting_id")
     private String meetingId;
 
+    /**
+     * SAP服务编号
+     */
+    @TableField("service_id")
+    private String serviceId;
+
     @TableField(exist = false)
     private List<TaskExecutor> executorList;
 

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -187,4 +187,6 @@ public interface ReportMapper extends BaseMapper<Report> {
     Double getReallWorkingTimeByProjectId(Integer id);
 
     Double getReallWorkingTimeByProjectAndGroup(Integer projectId, Integer taskGroupId);
+
+    List<Map<String, Object>> getProjectPlanData(Integer companyId, String startDate, String endDate);
 }

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

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

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

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

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

@@ -17,6 +17,7 @@ import com.management.platform.service.*;
 import com.management.platform.util.*;
 import com.management.platform.webservice.po.*;
 import com.sun.star.bridge.oleautomation.Decimal;
+import javafx.stage.Stage;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpPost;
@@ -228,6 +229,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     private HttpServletResponse response;
     @Resource
     private ReportExtraDegreeService reportExtraDegreeService;
+    @Resource
+    private TaskService taskService;
+    @Resource
+    private StagesService stagesService;
+    @Resource
+    private SapProjectServiceService sapProjectServiceService;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -11300,54 +11307,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public HttpRespMsg syncProjectWithSap(String startDate,String endDate) {
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        //同步服务数据
-        syncServiceData(startDate,endDate,companyId);
+        //获取SAP项目服务数据 ----> 工时管家任务分组下阶段作为项目服务数据
+        XmlResponseData projectServiceData= SyncSapUtils.syncServiceData("2020-01-01", endDate, companyId);
         //已有的项目分类
         List<ProjectCategory> allProjectCategoryList = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId));
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
-        //配置请求xml
-        XmlRequestData xmlRequestData=new XmlRequestData();
-        ProcessingConditions processingConditions=new ProcessingConditions();
-        processingConditions.setQueryHitsUnlimitedIndicator("true");
-        xmlRequestData.setProcessingConditions(processingConditions);
-        ProjectSelectionByElement projectSelectionByElement=new ProjectSelectionByElement();
-        SelectionByLastChangeDateTime selectionByLastChangeDateTime=new SelectionByLastChangeDateTime();
-        selectionByLastChangeDateTime.setInclusionExclusionCode("I");
-        selectionByLastChangeDateTime.setIntervalBoundaryTypeCode("3");
-        selectionByLastChangeDateTime.setLowerBoundaryLastChangeDateTime(startDate+"T00:00:00Z");
-        selectionByLastChangeDateTime.setUpperBoundaryLastChangeDateTime(endDate+"T00:00:00Z");
-        projectSelectionByElement.setSelectionByLastChangeDateTime(selectionByLastChangeDateTime);
-        List<ProjectSelectionByElement> list=new ArrayList<>();
-        list.add(projectSelectionByElement);
-        xmlRequestData.setProjectSelectionByElements(list);
-        String xml = CommonUtils.convertToXml(xmlRequestData);
-        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:ProjectByElementsQuery>\n");
-        sb.append(xml);
-        sb.append("      </glob:ProjectByElementsQuery>\n" +
-                "   </soapenv:Body>\n" +
-                "</soapenv:Envelope>");
-        System.out.println(sb.toString());
-        String result = "";
-        try {
-            result = WebServiceUtils.requestByXml("https://my602728.sapbyd.cn/sap/bc/srt/scs/sap/queryprojectin?sap-vhost=my602728.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:ProjectByElementsResponse_sync>"));
-            result="<XMLDATA>"+result+"</XMLDATA>";
-        }
-        System.out.println(result);
-        XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
+        XmlResponseData xmlResponseData = SyncSapUtils.syncProjectFromSap(startDate, endDate);
         List<ProjectQueryResponse> projectQueryResponses = xmlResponseData.getProjectQueryResponses();
+        List<Map<String,Object>> idsMapList=new ArrayList<>();
         if(projectQueryResponses!=null&&projectQueryResponses.size()>0){
-            List<TaskGroup> taskGroupList=new ArrayList<>();
+            List<Stages> stagesList=new ArrayList<>();
             for (ProjectQueryResponse item : projectQueryResponses) {
                 Project project=new Project();
                 //处理项目分类
@@ -11392,6 +11361,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     projectCategory.setName(categoryName);
                     projectCategory.setCompanyId(companyId);
                     projectCategoryMapper.insert(projectCategory);
+                    allProjectCategoryList.add(projectCategory);
                     project.setCategory(projectCategory.getId());
                     project.setCategoryName(projectCategory.getName());
                 }else {
@@ -11414,20 +11384,62 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         TaskGroup taskGroup=new TaskGroup();
                         taskGroup.setProjectId(project.getId());
                         taskGroup.setTaskGroupCode(ps.getProjectElementID());
-                        taskGroup.setName(ps.getTaskGroupName().getName());
+                        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){
-                            taskGroupList.add(taskGroup);
+                        if(one!=null){
+                           taskGroup.setId(one.getId());
                         }
+                        taskGroupService.saveOrUpdate(taskGroup);
+                        Map<String,Object> map=new HashMap<>();
+                        map.put("groupId",taskGroup.getId());
+                        map.put("projectId",project.getId());
+                        idsMapList.add(map);
                     });
                 }
             }
-            if(taskGroupList.size()>0){
-                if(!taskGroupService.saveBatch(taskGroupList)){
-                   msg.setError("任务分组同步验证失败");
+            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));
+        List<SapProjectService> sapProjectServiceList=new ArrayList<>();
+        if(projectServiceData!=null){
+            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(sapProjectServiceList.size()>0){
+            sapProjectServiceService.saveBatch(sapProjectServiceList);
+        }
         msg.setData(xmlResponseData);
         return msg;
     }
@@ -11569,59 +11581,4 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
         }
     }
-
-    //同步SAP项目服务数据到工时管家
-    private void syncServiceData(String startDate, String endDate, Integer companyId) {
-        List<ReportExtraDegree> extraDegrees = reportExtraDegreeService.list(new QueryWrapper<ReportExtraDegree>().eq("company_id", companyId));
-        //配置请求xml
-        XmlRequestData xmlRequestData=new XmlRequestData();
-        ProcessingConditions processingConditions=new ProcessingConditions();
-        processingConditions.setQueryHitsUnlimitedIndicator("true");
-        xmlRequestData.setProcessingConditions(processingConditions);
-        ServiceProductSelectionByElements serviceProductSelectionByElements=new ServiceProductSelectionByElements();
-        serviceProductSelectionByElements.setSelectionByLastChangeSinceDateTime(startDate+"T00:00:00Z");
-        xmlRequestData.setServiceProductSelectionByElements(serviceProductSelectionByElements);
-        String xml = CommonUtils.convertToXml(xmlRequestData);
-        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:ServiceProductByElementsQuery_sync>\n");
-        sb.append(xml);
-        sb.append("      </glob:ServiceProductByElementsQuery_sync>\n" +
-                "   </soapenv:Body>\n" +
-                "</soapenv:Envelope>");
-        System.out.println(sb.toString());
-        String result = "";
-        try {
-            result = WebServiceUtils.requestByXml("https://my602728.sapbyd.cn/sap/bc/srt/scs/sap/queryserviceproductin?sap-vhost=my602728.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:ServiceProductByElementsResponse_sync>"));
-            result="<XMLDATA>"+result+"</XMLDATA>";
-        }
-        System.out.println(result);
-        XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
-        List<ServiceProduct> serviceProducts = xmlResponseData.getServiceProducts();
-        List<ReportExtraDegree> needAddList=new ArrayList<>();
-        for (ServiceProduct serviceProduct : serviceProducts) {
-            if(!serviceProduct.getProductCategoryID().equals("901")){
-                continue;
-            }
-            ReportExtraDegree reportExtraDegree=new ReportExtraDegree();
-            reportExtraDegree.setCompanyId(companyId);
-            reportExtraDegree.setCode(serviceProduct.getInternalID());
-            reportExtraDegree.setRmark(serviceProduct.getDescription().getDescription());
-            Optional<ReportExtraDegree> any = extraDegrees.stream().filter(es -> es.getCode().equals(serviceProduct.getInternalID())).findAny();
-            if(any.isPresent()){
-                reportExtraDegree.setId(any.get().getId());
-            }
-            needAddList.add(reportExtraDegree);
-        }
-        reportExtraDegreeService.saveOrUpdateBatch(needAddList);
-    }
 }

+ 12 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -7059,13 +7059,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg httpRespMsg =new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).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);
         //配置xml请求参数
         XmlRequestData xmlRequestData=new XmlRequestData();
+        xmlRequestData.setBasicMessageHeader("");
         EmployeeTime employeeTime=new EmployeeTime();
         WorkDescriptionText workDescriptionText=new WorkDescriptionText();
         workDescriptionText.setLanguageCode("ZH");
         SapPeriod datePeriod=new SapPeriod();
         SapPeriod timePeriod=new SapPeriod();
+        List<ReportPushLog> addList=new ArrayList<>();
         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){
@@ -7080,10 +7085,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 datePeriod.setEndDate(String.valueOf(map.get("EndDate")));
             }
             if(map.get("StartTime")!=null){
-                timePeriod.setStartTime(String.valueOf(map.get("StartTime")));
+                timePeriod.setStartTime(String.valueOf(map.get("StartTime"))+":00");
             }
             if(map.get("EndTime")!=null){
-                timePeriod.setEndTime(String.valueOf(map.get("EndTime")));
+                timePeriod.setEndTime(String.valueOf(map.get("EndTime"))+":00");
             }
             employeeTime.setDatePeriod(datePeriod);
             employeeTime.setTimePeriod(timePeriod);
@@ -7111,7 +7116,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             System.out.println(sb.toString());
             String result = "";
             try {
-                result = WebServiceUtils.requestByXml("https://my602728.sapbyd.cn/sap/bc/srt/scs/sap/queryprojectin?sap-vhost=my602728.sapbyd.cn", sb.toString(), 0, "_BYDHOST", "Welcome1");
+                result = WebServiceUtils.requestByXml("https://my602728.sapbyd.cn/sap/bc/srt/scs/sap/manageemployeetimein?sap-vhost=my602728.sapbyd.cn", sb.toString(), 0, "_BYDHOST", "Welcome1");
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -7122,7 +7127,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             System.out.println(result);
             XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
-            if(StringUtils.isEmpty(xmlResponseData.getEmployeeTime().getUUID())){
+            if(StringUtils.isEmpty(xmlResponseData.getEmployeeTime())){
                 log.error("推送失败===》工号:"+employeeTime.getEmployeeID());
                 continue;
             }else {
@@ -7133,6 +7138,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 reportPushLog.setTargetSystem("SAP");
             }
         }
+        if(addList.size()>0){
+            reportPushLogService.saveBatch(addList);
+        }
         return httpRespMsg;
     }
 }

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.SapProjectService;
+import com.management.platform.mapper.SapProjectServiceMapper;
+import com.management.platform.service.SapProjectServiceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-27
+ */
+@Service
+public class SapProjectServiceServiceImpl extends ServiceImpl<SapProjectServiceMapper, SapProjectService> implements SapProjectServiceService {
+
+}

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

@@ -29,6 +29,7 @@ import org.springframework.http.client.ClientHttpResponse;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.DefaultResponseErrorHandler;
 import org.springframework.web.client.RestTemplate;
@@ -157,6 +158,20 @@ public class TimingTask {
     private UserService userService;
     @Resource
     private ParticipationService participationService;
+    @Resource
+    private ProjectCategoryMapper projectCategoryMapper;
+    @Resource
+    private TaskService taskService;
+    @Resource
+    private StagesMapper stagesMapper;
+    @Resource
+    private TaskGroupService taskGroupService;
+    @Resource
+    private TaskGroupMapper taskGroupMapper;
+    @Resource
+    private StagesService stagesService;
+    @Resource
+    private SapProjectServiceService sapProjectServiceService;
 
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
@@ -1551,118 +1566,30 @@ public class TimingTask {
 
     }
 
-    public static void main(String[] args) throws Exception {
-        XmlRequestData xmlRequestData=new XmlRequestData();
-        ProcessingConditions processingConditions=new ProcessingConditions();
-        processingConditions.setQueryHitsUnlimitedIndicator("true");
-        xmlRequestData.setProcessingConditions(processingConditions);
-        ProjectSelectionByElement projectSelectionByElement=new ProjectSelectionByElement();
-        SelectionByLastChangeDateTime selectionByLastChangeDateTime=new SelectionByLastChangeDateTime();
-        selectionByLastChangeDateTime.setInclusionExclusionCode("I");
-        selectionByLastChangeDateTime.setIntervalBoundaryTypeCode("3");
-        selectionByLastChangeDateTime.setLowerBoundaryLastChangeDateTime("2023-09-01T00:00:00Z");
-        selectionByLastChangeDateTime.setUpperBoundaryLastChangeDateTime("2023-10-01T00:00:00Z");
-        projectSelectionByElement.setSelectionByLastChangeDateTime(selectionByLastChangeDateTime);
-        List<ProjectSelectionByElement> list=new ArrayList<>();
-        list.add(projectSelectionByElement);
-        xmlRequestData.setProjectSelectionByElements(list);
-        String xml = CommonUtils.convertToXml(xmlRequestData);
-        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:ProjectByElementsQuery>\n");
-        sb.append(xml);
-        sb.append("      </glob:ProjectByElementsQuery>\n" +
-                "   </soapenv:Body>\n" +
-                "</soapenv:Envelope>");
-        System.out.println(sb.toString());
-        String result = WebServiceUtils.requestByXml("https://my602728.sapbyd.cn/sap/bc/srt/scs/sap/queryprojectin?sap-vhost=my602728.sapbyd.cn", sb.toString(), 0, "_BYDHOST", "Welcome1");
-        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:ProjectByElementsResponse_sync>"));
-            result="<XMLDATA>"+result+"</XMLDATA>";
-        }
-        System.out.println(result);
-        XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
-    }
-
-    //每天凌晨 2:00 推送前2天审核通过的日报  工时管家---->SAP
+    //每天凌晨 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();
         for (TimeType timeType : timeTypeList) {
             Integer companyId = timeType.getCompanyId();
-            List<Map<String, Object>> mapList = reportMapper.getPushProjectReportToSap(companyId, date.minusDays(2).format(df), date.format(df), null);
+            //提前推送项目工时(工时管家相关项目任务分组阶段下任务作为SAP服务 预算工时数据推送到SAP)
+            List<Map<String, Object>> pushProjectPlanHour = reportMapper.getProjectPlanData(companyId,null,null);
+            SyncSapUtils.pushProjectPlanToSap(pushProjectPlanHour);
+            List<Map<String, Object>> mapList = reportMapper.getPushProjectReportToSap(companyId,df.format(date.minusDays(1)),df.format(date.minusDays(1)), null);
             List<ReportPushLog> addList=new ArrayList<>();
-            //配置xml请求参数
-            XmlRequestData xmlRequestData=new XmlRequestData();
-            EmployeeTime employeeTime=new EmployeeTime();
-            WorkDescriptionText workDescriptionText=new WorkDescriptionText();
-            workDescriptionText.setLanguageCode("ZH");
-            SapPeriod datePeriod=new SapPeriod();
-            SapPeriod timePeriod=new SapPeriod();
             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")));
-                }
-                if(map.get("EndTime")!=null){
-                    timePeriod.setEndTime(String.valueOf(map.get("EndTime")));
-                }
-                employeeTime.setDatePeriod(datePeriod);
-                employeeTime.setTimePeriod(timePeriod);
-                employeeTime.setItemTypeCode("CN0001");
-                employeeTime.setDuration(map.get("Duration")==null?"0":String.valueOf(map.get("Duration")));
-                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://my602728.sapbyd.cn/sap/bc/srt/scs/sap/queryprojectin?sap-vhost=my602728.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);
-                if(StringUtils.isEmpty(xmlResponseData.getEmployeeTime().getUUID())){
-                    log.error("推送失败===》工号:"+employeeTime.getEmployeeID());
+                XmlResponseData xmlResponseData = SyncSapUtils.pushReportToSap(map);
+                if(StringUtils.isEmpty(xmlResponseData.getEmployeeTime())){
+                    log.error("推送失败===》工号:"+map.get("EmployeeID"));
                     continue;
                 }else {
                     //推送成功 日报数据打上标记
@@ -1678,4 +1605,221 @@ public class TimingTask {
             }
         }
     }
+
+    //每天凌晨 3:00 获取创建的项目服务和项目数据  SAP---->工时管家
+    @Scheduled(cron = "0 0 2 ? * *")
+    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);
+            //已有的项目分类
+            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<>();
+            if(projectQueryResponses!=null&&projectQueryResponses.size()>0){
+                List<Stages> stagesList=new ArrayList<>();
+                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;
+                        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){
+                        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());
+                            }
+                            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));
+            List<SapProjectService> sapProjectServiceList=new ArrayList<>();
+            if(projectServiceData!=null){
+                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(sapProjectServiceList.size()>0){
+                sapProjectServiceService.saveBatch(sapProjectServiceList);
+            }
+        }
+    }
+
+
+
+    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);
+        }
+    }
 }

+ 246 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/SyncSapUtils.java

@@ -0,0 +1,246 @@
+package com.management.platform.util;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.ReportPushLog;
+import com.management.platform.service.ReportPushLogService;
+import com.management.platform.service.ReportService;
+import com.management.platform.webservice.po.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class SyncSapUtils {
+
+
+    //工时管家推送项目任务计划工时数据到SAP
+    public static void pushProjectPlanToSap(List<Map<String, Object>> mapList) {
+        //根据项目分组 按照项目推送
+        //获取当前数据中的所有项目编号
+        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"))+"T00:00:00Z");
+                    service.setStartDate(startDate);
+                    EndDate endDate=new EndDate();
+                    endDate.setTimeZoneCode("UTC+8");
+                    endDate.setEndDate(String.valueOf(map.get("EndDate"))+"T00:00:00Z");
+                    service.setEndDate(endDate);
+                    service.setRemainingWork(String.valueOf(map.get("PlanWork")));
+                    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);
+            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:ZManageProjectTaskWorkCreateRequest_sync>\n");
+            sb.append(xml);
+            sb.append("      </glob:ZManageProjectTaskWorkCreateRequest_sync>\n" +
+                    "   </soapenv:Body>\n" +
+                    "</soapenv:Envelope>");
+            System.out.println(sb.toString());
+            String result = "";
+            try {
+                result = WebServiceUtils.requestByXml("https://my602728.sapbyd.cn/sap/bc/srt/scs/sap/yyatr5vf6y_manageprojecttaskwo?sap-vhost=my602728.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:ZManageProjectTaskWorkCreateConfirmation_sync>"));
+                result="<XMLDATA>"+result+"</XMLDATA>";
+            }
+            System.out.println(result);
+            XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
+            if(StringUtils.isEmpty(xmlResponseData.getEmployeeTime())){
+                log.error("推送失败===》项目编号:"+zManageProjectTaskWork.getProjectID());
+                continue;
+            }
+        }
+    }
+
+    //推送工时管家填报考勤数据到SAP
+    public static XmlResponseData pushReportToSap(Map<String,Object> map){
+        //配置xml请求参数
+        XmlRequestData xmlRequestData=new XmlRequestData();
+        EmployeeTime employeeTime=new EmployeeTime();
+        WorkDescriptionText workDescriptionText=new WorkDescriptionText();
+        workDescriptionText.setLanguageCode("ZH");
+        SapPeriod datePeriod=new SapPeriod();
+        SapPeriod timePeriod=new SapPeriod();
+        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")));
+        }
+        if(map.get("EndTime")!=null){
+            timePeriod.setEndTime(String.valueOf(map.get("EndTime")));
+        }
+        employeeTime.setDatePeriod(datePeriod);
+        employeeTime.setTimePeriod(timePeriod);
+        employeeTime.setItemTypeCode("CN0001");
+        employeeTime.setDuration(map.get("Duration")==null?"0":String.valueOf(map.get("Duration")));
+        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://my602728.sapbyd.cn/sap/bc/srt/scs/sap/manageemployeetimein?sap-vhost=my602728.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);
+        return xmlResponseData;
+    }
+
+
+    //同步SAP项目数据到工时管家
+    public static XmlResponseData syncProjectFromSap(String startDate, String endDate) {
+        //配置请求xml
+        XmlRequestData xmlRequestData=new XmlRequestData();
+        ProcessingConditions processingConditions=new ProcessingConditions();
+        processingConditions.setQueryHitsUnlimitedIndicator("true");
+        xmlRequestData.setProcessingConditions(processingConditions);
+        ProjectSelectionByElement projectSelectionByElement=new ProjectSelectionByElement();
+        SelectionByLastChangeDateTime selectionByLastChangeDateTime=new SelectionByLastChangeDateTime();
+        selectionByLastChangeDateTime.setInclusionExclusionCode("I");
+        selectionByLastChangeDateTime.setIntervalBoundaryTypeCode("3");
+        selectionByLastChangeDateTime.setLowerBoundaryLastChangeDateTime(startDate+"T00:00:00Z");
+        selectionByLastChangeDateTime.setUpperBoundaryLastChangeDateTime(endDate+"T00:00:00Z");
+        projectSelectionByElement.setSelectionByLastChangeDateTime(selectionByLastChangeDateTime);
+        List<ProjectSelectionByElement> list=new ArrayList<>();
+        list.add(projectSelectionByElement);
+        xmlRequestData.setProjectSelectionByElements(list);
+        String xml = CommonUtils.convertToXml(xmlRequestData);
+        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:ProjectByElementsQuery>\n");
+        sb.append(xml);
+        sb.append("      </glob:ProjectByElementsQuery>\n" +
+                "   </soapenv:Body>\n" +
+                "</soapenv:Envelope>");
+        System.out.println(sb.toString());
+        String result = "";
+        try {
+            result = WebServiceUtils.requestByXml("https://my602728.sapbyd.cn/sap/bc/srt/scs/sap/queryprojectin?sap-vhost=my602728.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:ProjectByElementsResponse_sync>"));
+            result="<XMLDATA>"+result+"</XMLDATA>";
+        }
+        System.out.println(result);
+        XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
+        return xmlResponseData;
+    }
+
+
+    //同步SAP项目服务数据到工时管家
+    public static XmlResponseData syncServiceData(String startDate, String endDate, Integer companyId) {
+        //配置请求xml
+        XmlRequestData xmlRequestData=new XmlRequestData();
+        ProcessingConditions processingConditions=new ProcessingConditions();
+        processingConditions.setQueryHitsUnlimitedIndicator("true");
+        xmlRequestData.setProcessingConditions(processingConditions);
+        ServiceProductSelectionByElements serviceProductSelectionByElements=new ServiceProductSelectionByElements();
+        serviceProductSelectionByElements.setSelectionByLastChangeSinceDateTime(startDate+"T00:00:00Z");
+        xmlRequestData.setServiceProductSelectionByElements(serviceProductSelectionByElements);
+        String xml = CommonUtils.convertToXml(xmlRequestData);
+        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:ServiceProductByElementsQuery_sync>\n");
+        sb.append(xml);
+        sb.append("      </glob:ServiceProductByElementsQuery_sync>\n" +
+                "   </soapenv:Body>\n" +
+                "</soapenv:Envelope>");
+        System.out.println(sb.toString());
+        String result = "";
+        try {
+            result = WebServiceUtils.requestByXml("https://my602728.sapbyd.cn/sap/bc/srt/scs/sap/queryserviceproductin?sap-vhost=my602728.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:ServiceProductByElementsResponse_sync>"));
+            result="<XMLDATA>"+result+"</XMLDATA>";
+        }
+        System.out.println(result);
+        XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
+        return xmlResponseData;
+    }
+}

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/EndDate.java

@@ -0,0 +1,21 @@
+package com.management.platform.webservice.po;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.*;
+
+@Data
+@XmlRootElement(name = "EndDate")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class EndDate {
+
+    @XmlAttribute(name = "timeZoneCode")
+    private String timeZoneCode;
+
+    @XmlValue
+    private String EndDate;
+
+    public String gettimeZoneCode() {
+        return timeZoneCode;
+    }
+}

+ 4 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/RequestTask.java

@@ -3,12 +3,13 @@ package com.management.platform.webservice.po;
 import lombok.Data;
 
 import javax.xml.bind.annotation.XmlElement;
+import java.util.List;
 
 @Data
 public class RequestTask {
 
     private String projectTaskID;
-    private Service service;
+    private List<Service> services;
 
     @XmlElement(name = "ProjectTaskID")
     public String getProjectTaskID(){
@@ -16,7 +17,7 @@ public class RequestTask {
     }
 
     @XmlElement(name = "Service")
-    public Service getService(){
-        return service;
+    public List<Service> getServices(){
+        return services;
     }
 }

+ 6 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/Service.java

@@ -8,11 +8,11 @@ import javax.xml.bind.annotation.XmlElement;
 public class Service {
 
     private String serviceID;
-    private Service employeeID;
+    private String employeeID;
     private String planWork;
     private String remainingWork;
-    private String startDate;
-    private String endDate;
+    private StartDate startDate;
+    private EndDate endDate;
     private String overDeliveryAllowedIndicator;
 
     @XmlElement(name = "ServiceID")
@@ -21,7 +21,7 @@ public class Service {
     }
 
     @XmlElement(name = "EmployeeID")
-    public Service getEmployeeID(){
+    public String getEmployeeID(){
         return employeeID;
     }
 
@@ -36,12 +36,12 @@ public class Service {
     }
 
     @XmlElement(name = "StartDate")
-    public String getStartDate(){
+    public StartDate getStartDate(){
         return startDate;
     }
 
     @XmlElement(name = "EndDate")
-    public String getEndDate(){
+    public EndDate getEndDate(){
         return endDate;
     }
 

+ 22 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/StartDate.java

@@ -0,0 +1,22 @@
+package com.management.platform.webservice.po;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.*;
+
+@Data
+@XmlRootElement(name = "EndDate")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class StartDate {
+
+    @XmlAttribute(name = "timeZoneCode")
+    private String timeZoneCode;
+
+    @XmlValue
+    private String StartDate;
+
+    public String gettimeZoneCode() {
+        return timeZoneCode;
+    }
+
+}

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/XmlRequestData.java

@@ -19,6 +19,7 @@ public class XmlRequestData {
 	private ZManageProjectTaskWork zManageProjectTaskWork;
 	private ServiceProductSelectionByElements serviceProductSelectionByElements;
 	private EmployeeTime employeeTime;
+	private String basicMessageHeader;
 
 	@XmlElement(name = "ProcessingConditions")
 	public ProcessingConditions getProcessingConditions() {
@@ -45,4 +46,9 @@ public class XmlRequestData {
 		return employeeTime;
 	}
 
+	@XmlElement(name = "BasicMessageHeader")
+	public String getBasicMessageHeader() {
+		return basicMessageHeader;
+	}
+
 }

+ 4 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/webservice/po/ZManageProjectTaskWork.java

@@ -3,12 +3,13 @@ package com.management.platform.webservice.po;
 import lombok.Data;
 
 import javax.xml.bind.annotation.XmlElement;
+import java.util.List;
 
 @Data
 public class ZManageProjectTaskWork {
 
     private String projectID;
-    private RequestTask task;
+    private List<RequestTask> tasks;
     private String UUID;
 
     @XmlElement(name = "ProjectID")
@@ -17,8 +18,8 @@ public class ZManageProjectTaskWork {
     }
 
     @XmlElement(name = "Task")
-    public RequestTask getTask() {
-        return task;
+    public List<RequestTask> getTasks() {
+        return tasks;
     }
 
     @XmlElement(name = "UUID")

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

@@ -951,13 +951,12 @@
 
     <select id="getPushProjectReportToSap" resultType="java.util.Map">
         select r.id as ReportId, u.job_number as EmployeeID,r.create_date as StartDate,r.create_date as EndDate,r.start_time as StartTime,r.end_time as EndTime,r.working_time as Duration,tg.task_group_code as ProjectElementID,
-        red.code as ServiceProductInternalID,r.content as WorkDescriptionText
+        t.service_id as ServiceProductInternalID,r.content as WorkDescriptionText
         from report r
         left join user u on u.id=r.creator_id
         left join project p on p.id=r.project_id
         left join task t on t.id=r.task_id
         left join task_group tg on tg.id=t.group_id
-        left join report_extra_degree red on red.id=r.degree_id
         where r.state=1
         and r.company_id=#{companyId}
         <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
@@ -995,4 +994,21 @@
     <select id="getReallWorkingTimeByProjectAndGroup" resultType="java.lang.Double">
         SELECT SUM(working_time) as reallyWorkingTime FROM report WHERE project_id = #{projectId} AND group_id = #{taskGroupId}
     </select>
+
+    <select id="getProjectPlanData" resultType="java.util.Map">
+        select p.project_code as ProjectID,tg.task_group_code ProjectTaskID,t.service_id as  ServiceID,u.job_number as EmployeeID,t.plan_hours as PlanWork ,t.start_date as StartDate ,t.end_date as EndDate
+        from task t
+        left join project p on t.project_id = p.id
+        left join task_group tg on tg.id=t.group_id
+        left join task_executor te on te.task_id = t.id
+        left join user u on te.executor_id=u.id
+        where t.company_id=#{companyId}
+        and t.start_date is not null
+        and t.plan_hours is not null
+        and t.service_id is not null
+        and u.job_number is not null
+        <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
+            and t.create_date between #{startDate} and #{endDate}
+        </if>
+    </select>
 </mapper>

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SapProjectServiceMapper.xml

@@ -0,0 +1,18 @@
+<?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.SapProjectServiceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.SapProjectService">
+        <id column="id" property="id" />
+        <result column="service_code" property="serviceCode" />
+        <result column="service_name" property="serviceName" />
+        <result column="company_id" property="companyId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, service_code, service_name, company_id
+    </sql>
+
+</mapper>

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

@@ -30,6 +30,7 @@
         <result column="finish_date" property="finishDate" />
         <result column="start_date" property="startDate" />
         <result column="meeting_id" property="meetingId" />
+        <result column="service_id" property="serviceId" />
     </resultMap>
 
     <resultMap id="timeResultMap" type="com.management.platform.entity.TimeTask" >
@@ -95,7 +96,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, task_desc, creater_id, creater_name, creator_color, executor_id, executor_name, executor_color, task_level, task_status, create_date, end_date, project_id, stages_id, company_id, indate, parent_tid, group_id, seq, plan_hours, task_type, parent_tname, finish_date, start_date, meeting_id
+        id, name, task_desc, creater_id, creater_name, creator_color, executor_id, executor_name, executor_color, task_level, task_status, create_date, end_date, project_id, stages_id, company_id, indate, parent_tid, group_id, seq, plan_hours, task_type, parent_tname, finish_date, start_date, meeting_id, service_id
     </sql>
     <select id="simpleList" resultMap="BaseResultMap">
         select id, name, creater_id, creater_name, creator_color, executor_id, executor_name, executor_color, task_level, task_status, create_date, end_date, project_id, stages_id, company_id, indate, parent_tid, group_id, seq, plan_hours, task_type, parent_tname, finish_date, start_date

+ 19 - 4
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java

@@ -1,13 +1,12 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.entity.Plan;
-import com.management.platform.entity.PlanProcedureTotal;
-import com.management.platform.entity.PlanSteelStampNumber;
-import com.management.platform.entity.ProdProcedureTeam;
+import com.management.platform.entity.*;
 import com.management.platform.service.PlanService;
 import com.management.platform.service.PlanSteelStampNumberService;
+import com.management.platform.service.ReportService;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.transaction.annotation.Transactional;
@@ -38,6 +37,8 @@ public class PlanController {
     private PlanService planService;
     @Resource
     private PlanSteelStampNumberService planSteelStampNumberService;
+    @Resource
+    private ReportService reportService;
 
     @RequestMapping("/list")
     public HttpRespMsg list(String date,String steelStampNumber,@RequestParam(defaultValue = "3") Integer planType,Integer deptId,Integer pageIndex,Integer pageSize,Integer isMob){
@@ -154,5 +155,19 @@ public class PlanController {
     public HttpRespMsg allPlanList(HttpServletRequest request){
         return planService.allPlanList(request);
     }
+
+    @RequestMapping("/deletePlan")
+    public HttpRespMsg deletePlan(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        Plan plan = planService.getById(id);
+        Report one = reportService.getOne(new LambdaQueryWrapper<Report>().eq(Report::getPlanId, id));
+        if(one==null){
+            plan.setIsDelete(1);
+            planService.updateById(plan);
+            return msg;
+        }
+        msg.setError("‘已有员工报工,删除失败");
+        return msg;
+    }
 }
 

+ 8 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Plan.java

@@ -22,7 +22,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-11-16
+ * @since 2023-11-27
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -218,7 +218,7 @@ public class Plan extends Model<Plan> {
     private String createId;
 
     /**
-     * 0-待下发 1-已下发
+     * 0-待下发 1-已下发 2-已中止
      */
     @TableField("status")
     private Integer status;
@@ -241,6 +241,12 @@ public class Plan extends Model<Plan> {
     @TableField("hide_state")
     private Integer hideState;
 
+    /**
+     * 是否删除0-否 1-是
+     */
+    @TableField("is_delete")
+    private Integer isDelete;
+
     @TableField(exist = false)
     private String  steelStampNumber;
 

+ 14 - 4
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/PlanProcedureTotal.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2023-11-20
+ * @since 2023-11-24
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -63,9 +63,6 @@ public class PlanProcedureTotal extends Model<PlanProcedureTotal> {
     @TableField(exist = false)
     private String teamNames;
 
-    @TableField(exist = false)
-    private Integer totalProgress;
-
     @TableField(exist = false)
     private List<ProdProcedureTeam> prodProcedureTeamList;
 
@@ -77,6 +74,19 @@ public class PlanProcedureTotal extends Model<PlanProcedureTotal> {
 
     @TableField(exist = false)
     private boolean cancellationReceive;
+    /**
+     * 计划工序的完成度
+     */
+    @TableField("total_progress")
+    private Integer totalProgress;
+
+    /**
+     * 工序的填报工时
+     */
+    @TableField("total_fill_time")
+    private Double totalFillTime;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 12 - 3
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanProcedureTotalServiceImpl.java

@@ -166,7 +166,7 @@ public class PlanProcedureTotalServiceImpl extends ServiceImpl<PlanProcedureTota
             Stream<String> sorted = list.stream().distinct().sorted();
             List<String> collect = sorted.collect(Collectors.toList());
             //如果钢印号有其他人已经填过了,就不显示
-            List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id", "steel_num_array").eq("plan_id", planId));
+            List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id", "steel_num_array","create_date", "creator_id").eq("plan_id", planId));
             List<String> filledSteelNumList=new ArrayList<>();
 
             for (Report report : reportList) {
@@ -179,8 +179,17 @@ public class PlanProcedureTotalServiceImpl extends ServiceImpl<PlanProcedureTota
                     filledSteelNumList.addAll(Arrays.asList(split));
                 }
             }
-            List<String> collect1 = collect.stream().filter(item -> !filledSteelNumList.contains(item)).collect(Collectors.toList());
-            prodProcedureTeam.put("planSteelStampNumberList",collect1);
+//            List<String> collect1 = collect.stream().filter(item -> !filledSteelNumList.contains(item)).collect(Collectors.toList());
+            List<HashMap> steelMapList = new ArrayList<>();
+            for (String s : collect) {
+                HashMap map = new HashMap();
+                map.put("number", s);
+                if (filledSteelNumList.contains(s)) {
+                    map.put("disabled", true);
+                }
+                steelMapList.add(map);
+            }
+            prodProcedureTeam.put("planSteelStampNumberList",steelMapList);
             msg.setData(prodProcedureTeam);
         }
         return msg;

+ 11 - 8
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java

@@ -112,6 +112,7 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         format.setMinimumFractionDigits(2);
         queryWrapper.eq(Plan::getCompanyId,companyId);
         queryWrapper.ne(Plan::getStatus,2);
+        queryWrapper.eq(Plan::getIsDelete,0);
         if(planType!=2){
             queryWrapper.eq(Plan::getPlanType,0);
         }else {
@@ -384,9 +385,10 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
                 totalWorkingHours=totalWorkingHours.multiply(new BigDecimal(plan.getNum()));
                 p.setTotalWorkingHours(totalWorkingHours.doubleValue());
                 if(oldPlanProcedureTotals.size()>0){
-                    boolean b = oldPlanProcedureTotals.stream().anyMatch(fs -> fs.getPlanId().equals(plan.getId()) && fs.getProdProcedureId().equals(prodProcedure.getId()));
-                    if(b){
-                        continue;
+                    Optional<PlanProcedureTotal> b = oldPlanProcedureTotals.stream().filter(fs -> fs.getPlanId().equals(plan.getId()) && fs.getProdProcedureId().equals(prodProcedure.getId())).findAny();
+                    //存在更新表数据
+                    if(b.isPresent()){
+                        p.setId(b.get().getId());
                     }
                 }
                 planProcedureTotals.add(p);
@@ -404,7 +406,7 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
                 planProcedureTotals.add(p);
             }
         }
-        planProcedureTotalService.saveBatch(planProcedureTotals);
+        planProcedureTotalService.saveOrUpdateBatch(planProcedureTotals);
         List<PlanProcedureTotal> totals = planProcedureTotals.stream().filter(ps -> ps.getPlanId().equals(plan.getId())).collect(Collectors.toList());
         if(totals.size()>0){
             double sum = totals.stream().filter(t->t.getTotalWages()!=null).mapToDouble(PlanProcedureTotal::getTotalWages).sum();
@@ -1166,11 +1168,12 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
                                         .stream().map(User::getName).collect(Collectors.joining(","));
                                 ps.setTeamNames(userNames);
                             }
-                            int sum = procedureTeams.stream().filter(pt -> pt.getPlanProcedureId().equals(ps.getId())).mapToInt(ProdProcedureTeam::getProgress).sum();
+//                            int sum = procedureTeams.stream().filter(pt -> pt.getPlanProcedureId().equals(ps.getId())).mapToInt(ProdProcedureTeam::getProgress).sum();
                             /*所有进度之和*/
-                            BigDecimal bigDecimal=new BigDecimal(sum);
-                            bigDecimal=bigDecimal.divide(new BigDecimal(ps.getTeamIds().split(",").length),RoundingMode.HALF_UP);
-                            ps.setTotalProgress(bigDecimal.intValue());
+//                            BigDecimal bigDecimal=new BigDecimal(sum);
+//                            bigDecimal=bigDecimal.divide(new BigDecimal(ps.getTeamIds().split(",").length),RoundingMode.HALF_UP);
+                            //数据已经算好存储好了
+//                            ps.setTotalProgress(bigDecimal.intValue());
                             if(procedureTeamList.stream().anyMatch(pl->pl.getProgress()>0&&pl.getStatus()==4)){
                                 ps.setNeedAddCircle(true);
                             }

+ 13 - 8
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -235,8 +235,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 });
             }
         }
-        //更新自己执行的工序上的进度
+        //更新自己执行的工序上的数据
         prodProcedureTeamMapper.updateById(prodProcedureTeam);
+        //计算该计划工序的总完成工时和完成度
+        Double workingTime = reportMapper.selectOne(new QueryWrapper<Report>().select("sum(working_time) as working_time").eq("plan_id", planProcedureTotal.getPlanId()).eq("prod_procedure_id", planProcedureTotal.getProdProcedureId())).getWorkingTime();
+        if (workingTime == null) {
+            workingTime = 0.0;
+        }
+        planProcedureTotal.setTotalFillTime(workingTime);
+        planProcedureTotal.setTotalProgress((int)(workingTime / planProcedureTotal.getTotalWorkingHours()) * 100);
+        planProcedureTotalMapper.updateById(planProcedureTotal);
         return httpRespMsg;
     }
 
@@ -311,6 +319,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         for (ReportVO m : list) {
                             double t = m.getWorkingTime();
                             reportTime += t;
+                            System.out.println("t:"+t);
                             total = total.add(m.getCost());
                         }
 
@@ -320,7 +329,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         map.put("state", state);
                     }
                 }
-
                 List<Integer> allVisibleDeptIdList = getAllVisibleDeptIdList(user, null);
                 //需要看可见部门(部门主要负责人和其他负责人以及查看本部门工时权限)所有人员的日报
                 if (allVisibleDeptIdList.size() > 0) {
@@ -348,15 +356,17 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             //再根据人分别获取当天的报告
                             List<ReportVO> rList = new ArrayList<ReportVO>();
                             BigDecimal total = new BigDecimal(0);
+                            double reportTime = 0;
                             for (ReportVO report : reportList) {
                                 if (report.getCreatorId().equals((String)memb.get("id"))) {
                                     rList.add(report);
+                                    reportTime += report.getWorkingTime();
                                     total = total.add(report.getCost());
                                 }
                             }
                             memb.put("data", rList);
                             memb.put("cost", total);
-                            double reportTime = 0;
+
                             if (rList.size() > 0) {
                                 int state = 1;
                                 memb.put("state", state);
@@ -399,15 +409,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     for (Map<String, Object> map : nameList) {
                         //再根据人分别获取当天的报告
                         List<ReportVO> list = new ArrayList<ReportVO>();
-//                        BigDecimal total = new BigDecimal(0);
                         for (ReportVO report : reportList) {
                             if (report.getCreatorId().equals((String)map.get("id"))) {
                                 list.add(report);
-//                                total = total.add(report.getCost());
                             }
                         }
                         map.put("data", list);
-//                        map.put("cost", total);
                         double reportTime = reportList.stream().filter(r->r.getCreatorId().equals((String)map.get("id"))).mapToDouble(ReportVO::getWorkingTime).sum();
                         if (list.size() > 0) {
                             int state = 1;
@@ -418,8 +425,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             }
-
-
             httpRespMsg.data = nameList;
         } catch (NullPointerException e) {
             e.printStackTrace();

+ 2 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/PlanMapper.xml

@@ -37,11 +37,12 @@
         <result column="vehicle_num_start" property="vehicleNumStart" />
         <result column="vehicle_num_end" property="vehicleNumEnd" />
         <result column="hide_state" property="hideState" />
+        <result column="is_delete" property="isDelete" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, product_scheduling_num, product_id, product_name, project_code, company_id, num, main_process, station_id, station_name, foreman_id, foreman_name, plan_type, start_date, end_date, plan_total_wages, progress, task_name, task_type_id, task_type_name, check_type, task_change_notice_num, plan_man_num, plan_work_hour, money_of_job, describtion, version_number, create_time, create_id, status, vehicle_num_start, vehicle_num_end, hide_state
+        id, product_scheduling_num, product_id, product_name, project_code, company_id, num, main_process, station_id, station_name, foreman_id, foreman_name, plan_type, start_date, end_date, plan_total_wages, progress, task_name, task_type_id, task_type_name, check_type, task_change_notice_num, plan_man_num, plan_work_hour, money_of_job, describtion, version_number, create_time, create_id, status, vehicle_num_start, vehicle_num_end, hide_state, is_delete
     </sql>
 
 </mapper>

+ 3 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/PlanProcedureTotalMapper.xml

@@ -9,11 +9,13 @@
         <result column="prod_procedure_id" property="prodProcedureId" />
         <result column="total_wages" property="totalWages" />
         <result column="total_working_hours" property="totalWorkingHours" />
+        <result column="total_progress" property="totalProgress" />
+        <result column="total_fill_time" property="totalFillTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, plan_id, prod_procedure_id, total_wages, total_working_hours
+        id, plan_id, prod_procedure_id, total_wages, total_working_hours, total_progress, total_fill_time
     </sql>
 
 </mapper>

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProdProcedureTeamMapper.xml

@@ -42,7 +42,7 @@
 
     <select id="getFillProcedureDetail" resultType="java.util.HashMap" >
         SELECT a.*, plan_procedure_total.plan_id, plan_procedure_total.prod_procedure_id, date_format(plan.`start_date`,'%Y-%m-%d') as start_date, date_format(plan.`end_date`,'%Y-%m-%d') as end_date, plan.`plan_type`,
-               plan.`product_scheduling_num`,plan.task_type_name,plan.task_name,plan.task_change_notice_num,
+               plan.`product_scheduling_num`,plan.task_type_name,plan.task_name,plan.task_change_notice_num,plan.num,
                product.`name` AS product_name,prod_procedure.name AS procedure_name, if(plan.plan_type=0,prod_procedure.check_type, plan.check_type) as check_type, plan.station_id
         FROM prod_procedure_team a
                  left join plan_procedure_total on plan_procedure_total.id = a.plan_procedure_id

+ 4 - 7
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ReportMapper.xml

@@ -153,11 +153,12 @@
     </select>
 
     <select id="getPersonWorkHoursWagesDetail" resultType="java.util.Map">
-        select r.*,DATE_FORMAT(r.create_date,'%Y%m%d') as createDate,pp.name as procedureName,(case  when pp.check_type=0 then '自检' when pp.check_type=1 then '互检' else '专检' end) as checkType,
+        select r.cost,r.working_time,ppt.total_progress as progress,DATE_FORMAT(r.create_date,'%Y%m%d') as createDate,pp.name as procedureName,(case  when pp.check_type=0 then '自检' when pp.check_type=1 then '互检' else '专检' end) as checkType,
         p.name as productName,DATE_FORMAT(plan.start_date,'%Y%m%d') as planStartDate,DATE_FORMAT(plan.end_date,'%Y%m%d') as planEndDate ,
         plan.task_change_notice_num as taskName,plan.plan_type as planType,u.name as checkerName,u2.name as creatorName
         from report r
         left join prod_procedure pp on r.prod_procedure_id=pp.id
+        left join plan_procedure_total ppt on ppt.prod_procedure_id=pp.id
         left join product p on p.id=r.product_id
         left join plan on plan.id=r.plan_id
         left join user u on r.checker_id=u.id
@@ -183,12 +184,10 @@
 
     <select id="getProcedureRealTimeProgressList" resultType="java.util.Map">
         select a.id as pptId,b.id as planId,b.plan_type as planType,(Case when b.plan_type=0 then b.product_scheduling_num else b.task_change_notice_num end) as taskName,
-        c.name as procedureName,u.name as userName,d.work_time as planWorkTime,(select SUM(working_time) from report where user_procedure_team_id = d.id) as nowWorkTime,d.progress
+        c.name as procedureName,a.total_working_hours as planWorkTime,a.total_fill_time as nowWorkTime,a.total_progress as progress
         from plan_procedure_total a
         left join plan b on a.plan_id=b.id
         left join prod_procedure c on a.prod_procedure_id=c.id
-        left join prod_procedure_team d on a.id=d.plan_procedure_id
-        left join user u on u.id=d.user_id
         where b.company_id=#{companyId}
         <if test="userId!=null and userId!=''">
             and d.user_id=#{userId}
@@ -211,12 +210,10 @@
     <select id="getProcedureRealTimeProgressCount" resultType="java.lang.Integer">
         select count(1) from (
         select a.id as pptId,b.id as planId,b.plan_type as planType,(Case when b.plan_type=0 then b.product_scheduling_num else b.task_change_notice_num end) as taskName,
-        c.name as procedureName,u.name as userName,d.work_time as planWorkTime,(select SUM(working_time) from report where user_procedure_team_id = d.id) as nowWorkTime,d.progress
+        c.name as procedureName,a.total_working_hours as planWorkTime,a.total_fill_time as nowWorkTime,a.total_progress as progress
         from plan_procedure_total a
         left join plan b on a.plan_id=b.id
         left join prod_procedure c on a.prod_procedure_id=c.id
-        left join prod_procedure_team d on a.id=d.plan_procedure_id
-        left join user u on u.id=d.user_id
         where b.company_id=#{companyId}
         <if test="userId!=null and userId!=''">
             and d.user_id=#{userId}

+ 16 - 5
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/fillReport.vue

@@ -2,7 +2,7 @@
   <div class="distribution">
     <van-nav-bar title="报工" left-text="返回" @click-left="back" fixed left-arrow />
     <div class="distribution_header">
-      <div>{{ reportForm.product_name }}</div>
+      <div>{{ reportForm.product_name }}<span style="float:right;color:#20a0ff;">{{reportDate  }}</span> </div>
       <div>{{ reportForm.plan_type == 0 ? reportForm.product_scheduling_num : reportForm.task_change_notice_num }}</div>
       <div>{{ reportForm.start_date }}至{{ reportForm.end_date }}</div>
     </div>
@@ -16,8 +16,8 @@
             <template>
               <div style="float:right;" v-if="reportForm.planSteelStampNumberList&&reportForm.planSteelStampNumberList.length>0">
                 <van-checkbox-group v-model="reportForm.checkedSteelNum" direction="horizontal">
-                  <van-checkbox style="padding:5px;" :name="item" @click="onCheckChange"
-                    v-for="(item, index) in reportForm.planSteelStampNumberList" :key="index">{{ item }}</van-checkbox>
+                  <van-checkbox style="padding:5px;" :name="item.number" @click="onCheckChange" :disabled="item.disabled" 
+                    v-for="(item, index) in reportForm.planSteelStampNumberList" :key="index">{{ item.number }}</van-checkbox>
                 </van-checkbox-group>
               </div>
               <div v-else>无</div>
@@ -25,7 +25,7 @@
           </van-cell>
           <van-cell title="当日完成件数">
             <template>
-              <van-stepper v-model="reportForm.finishNum" step="0.1" :min="0" :max="1000" />
+              <van-stepper v-model="reportForm.finishNum" step="0.1" :min="0" :max="reportForm.num" @change="onFinishNumChange"/>
             </template>
           </van-cell>
           <van-cell title="完成全部工作" >
@@ -77,6 +77,7 @@ export default {
   },
   data() {
     return {
+      reportDate: null,
       checkerOptionList: [],
       checkerShow: false,
       user: JSON.parse(localStorage.userInfo),
@@ -93,9 +94,16 @@ export default {
   watch: {},
   created() { },
   mounted() {
+    this.reportDate = this.$route.query.date;
     this.getMyPlanProcedureList();
   },
   methods: {
+    onFinishNumChange() {
+      //件数发生改变时,检测如果和计划总件数一样,则算完成
+      if (this.reportForm.finishNum == this.reportForm.num) {
+          this.$set(this.reportForm, 'isFinish',true);
+      } 
+    },
     back() {
       this.$router.go(-1);
     },
@@ -171,6 +179,9 @@ export default {
       if(reportBoolean == 'true') {
         params.createDate = date
       }
+      if (this.reportDate) {
+        params.createDate = this.reportDate;
+      }
       this.$axios.post("/plan-procedure-total/getFillProcedureDetail", params)
         .then(res => {
           if (res.code == "ok") {
@@ -187,7 +198,7 @@ export default {
         }).catch(err => { this.$toast.clear(); });
     },
     steelNumFilter(){
-      this.reportForm.planSteelStampNumberList=this.oldPlanSteelStampNumberList.filter(item => item.includes(this.inputSteelNum));
+      this.reportForm.planSteelStampNumberList=this.oldPlanSteelStampNumberList.filter(item => item.number.includes(this.inputSteelNum));
     },
 
     //打开报工页面

+ 110 - 59
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/workView.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="distribution">
     <van-nav-bar :title="reportBoolean ? '查看报工' : '报工'" left-text="返回" @click-left="back" fixed left-arrow />
-    <div class="distribution_con contentRoll">
+    <div class="distribution_con contentRoll flex-column">
       <!-- 报工 -->
       <div v-if="!reportBoolean">
         <van-field v-model="vehicleNum" type="digit" label="车辆序号" @blur="getMyPlanProcedureList()" />
@@ -20,64 +20,75 @@
       </div>
       <!-- 内容 -->
       <van-empty v-if="myPlanProcedureList.length == 0">暂无待报工任务</van-empty>
-      <div v-for="(prod, prodIndex) in myPlanProcedureList" :key="prodIndex">
-        <div class="distribution_header">
-          <div class="textDis">
-            <span>{{ prod.plan_type == 0 ? prod.product_name : prod.task_name }}</span>
-            <span v-if="reportBoolean">{{ prod.userName }}</span>
+      <div class="flex1 myPlanProcedureListClass">
+        <div v-for="(prod, prodIndex) in myPlanProcedureList" :key="prodIndex" class="flex1 myPlanProcedureListClass">
+          <!-- 报工 -->
+          <div class="distribution_header" v-if="!reportBoolean">
+            <div class="textDis">
+              <span>{{ prod.plan_type == 0 ? prod.product_name : prod.task_name }}</span>
+            </div>
+            <div v-if="prod.plan_type == 0">{{ prod.product_scheduling_num }}</div>
+            <div>{{ dateBack(prod.start_date) }}-{{ dateBack(prod.end_date) }}</div>
+            <div v-if="prod.vehicle_num_start && prod.vehicle_num_end">{{ prod.vehicle_num_start }}-{{ prod.vehicle_num_end
+            }}</div>
           </div>
-          <div v-if="prod.plan_type == 0">{{ prod.product_scheduling_num }}</div>
-          <div>{{ prod.start_date.replace(/-/g, '') }}-{{ !prod.end_date ? "" : prod.end_date.replace(/-/g, '') }}</div>
-          <div v-if="prod.vehicle_num_start && prod.vehicle_num_end">{{ prod.vehicle_num_start }}-{{ prod.vehicle_num_end
-          }}</div>
-        </div>
-        <div class="distribution_box" v-for="item, index in prod.procedureList" :key="index" @click="reportItem(item, prod)">
-          <!-- 状态 -->
-          <div class="statusLeft" :style="`background: ${statusColor[item.status]}`" v-if="item.status"></div>
-          <div>
-            <van-row>
-              <van-col span="19">{{ prod.plan_type == 0 ? item.procedure_name : prod.task_change_notice_num }}</van-col>
-              <van-col span="5" style="text-align:right;"><span style="color:goldenrod;font-size:16px;">{{ item.work_time
-              }}</span> <span style="font-size:12px;">分钟</span></van-col>
-            </van-row>
-            <div style="margin-top:10px;text-align: center;">
-              <van-row gutter="20">
-                <!-- <van-col span="8">
-                  <div class="valueCls">
-                    {{ item.progress }}%
-                  </div>
-                  <div class="labelCls">
-                    进度
-                  </div>
-                </van-col> -->
-                <van-col span="8">
-                  <div class="valueCls" v-if="reportBoolean">
-                    {{ (item.finishNum && item.finishNum) ? item.finishNum : 0 }}
-                  </div>
-                  <div class="valueCls" v-if="!reportBoolean">
-                    {{ item.num ? item.num : 0 }}
-                  </div>
-                  <div class="labelCls">
-                    件数
-                  </div>
-                </van-col>
-                <van-col span="8">
-                  <div class="valueCls">
-                    {{ checkTypeTxt[prod.plan_type == 0 ? item.check_type : item.plan_check_type] }}
-                  </div>
-                  <div class="labelCls">
-                    质检方式
-                  </div>
-                </van-col>
-                <van-col span="8">
-                  <div class="valueCls">
-                    {{ item.checker_name ? item.checker_name : '待设置' }}
-                  </div>
-                  <div class="labelCls">
-                    质检人
-                  </div>
-                </van-col>
+          <!-- 查看报工 -->
+          <div v-if="reportBoolean" class="marginRePor">
+            <div>总时长:<span>{{ +prod.reportTime + 0 }}</span> <i>分钟</i></div>
+            <div>{{ prod.userName }}</div>
+          </div>
+
+          <!-- 列表内容 -->
+          <div class="distribution_box" v-for="item, index in prod.procedureList" :key="index" @click="reportItem(item, prod)">
+            <!-- 状态 -->
+            <div class="statusLeft" :style="`background: ${statusColor[item.status]}`" v-if="item.status"></div>
+            <div v-if="reportBoolean" class="marginBtnPro">{{ item.productName }}</div>
+            <div v-if="reportBoolean" class="marginBtnPro">{{ item.productSchedulingNum }}</div>
+            <div>
+              <van-row>
+                <van-col span="19">{{ prod.plan_type == 0 ? item.procedure_name : prod.task_change_notice_num }}</van-col>
+                <van-col span="5" style="text-align:right;"><span style="color:goldenrod;font-size:16px;">{{ item.work_time
+                }}</span> <span style="font-size:12px;">分钟</span></van-col>
               </van-row>
+              <div style="margin-top:10px;text-align: center;">
+                <van-row gutter="20">
+                  <!-- <van-col span="8">
+                    <div class="valueCls">
+                      {{ item.progress }}%
+                    </div>
+                    <div class="labelCls">
+                      进度
+                    </div>
+                  </van-col> -->
+                  <van-col span="8">
+                    <div class="valueCls" v-if="reportBoolean">
+                      {{ (item.finishNum && item.finishNum) ? item.finishNum : 0 }}
+                    </div>
+                    <div class="valueCls" v-if="!reportBoolean">
+                      {{ item.num ? item.num : 0 }}
+                    </div>
+                    <div class="labelCls">
+                      件数
+                    </div>
+                  </van-col>
+                  <van-col span="8">
+                    <div class="valueCls">
+                      {{ checkTypeTxt[prod.plan_type == 0 ? item.check_type : item.plan_check_type] }}
+                    </div>
+                    <div class="labelCls">
+                      质检方式
+                    </div>
+                  </van-col>
+                  <van-col span="8">
+                    <div class="valueCls">
+                      {{ item.checker_name ? item.checker_name : '待设置' }}
+                    </div>
+                    <div class="labelCls">
+                      质检人
+                    </div>
+                  </van-col>
+                </van-row>
+              </div>
             </div>
           </div>
         </div>
@@ -231,7 +242,7 @@ export default {
             plan_name: item.planName,
             product_name: item.productName,
             product_scheduling_num: item.productSchedulingNum,
-            start_date: item.startDate.join('-'),
+            start_date: item.startDate,
             task_change_notice_num: item.taskChangeNoticeNum,
             task_name: item.taskName,
             task_type_name: item.taskTypeName,
@@ -251,11 +262,14 @@ export default {
             id: item.id,
             userProcedureTeamId: item.userProcedureTeamId,
             status: item.status,
-            createDate: item.createDate
+            createDate: item.createDate,
+            productSchedulingNum: item.productSchedulingNum,
+            productName: item.productName
           })
         }
         obj.procedureList = arr
         obj.userName = data[j].name
+        obj.reportTime = data[j].reportTime
         newList.push(obj)
       }
       return newList
@@ -309,6 +323,17 @@ export default {
       if(this.crewMember.length > 1) {
         this.popupShow = true
       }
+    },
+    // 数组日期回显
+    dateBack(date) {
+      let type = typeof date
+      if(type == 'string') {
+        return date
+      }
+      if (date && date.length > 0) {
+        return date.join('-')
+      }
+      return ''
     }
   },
 };
@@ -318,6 +343,32 @@ export default {
 * {
   box-sizing: border-box;
 }
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+.flex1 {
+  flex: 1;
+}
+.myPlanProcedureListClass {
+  overflow: auto;
+  margin-top: 10px;
+}
+.marginRePor {
+  margin: 12px 0;
+  display: flex;
+  justify-content: space-between;
+  span {
+    color: goldenrod;
+  }
+  i {
+    font-size: 12px;
+    font-style: normal;
+  }
+}
+.marginBtnPro {
+  margin-bottom: 10px;
+}
 .statusLeft {
   position: absolute;
   width: 10px;

+ 36 - 1
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponent.vue

@@ -82,6 +82,7 @@
         <el-table-column label="操作" :fixed="'right'">
           <template slot-scope="scope">
             <div @click="editPlan(scope.row)" class="colorText">编辑</div>
+            <div @click="deletePlan(scope.row.id)" class="colorText">删除</div>
             <div v-if="jisuanDate(scope.row.startDate) > 30" @click="hidePlan(scope.row.id, scope.row.hideState)"
               class="colorText">{{ scope.row.hideState == 0 ? '隐藏' : '取消隐藏' }}</div>
           </template>
@@ -1014,7 +1015,41 @@ export default {
           );
         }
       });
-    }
+    },
+    //删除计划
+    deletePlan(id) {
+      this.$alert('该计划将被删除','是否删除该计划', {
+        confirmButtonText: '确定',
+        callback: action => {
+          this.http.post(
+            "/plan/deletePlan",
+            {
+              id: id,
+            },
+            (res) => {
+              if (res.code == "ok") {
+                this.$message({
+                  message: '删除成功',
+                  type: "success",
+                });
+              } else {
+                this.$message({
+                  message: res.msg,
+                  type: "error",
+                });
+              }
+              this.getTableData()
+            },
+            (error) => {
+              this.$message({
+                message: error,
+                type: "error",
+              });
+            }
+          );
+        }
+      });
+    },
   },
 };
 </script>

+ 12 - 10
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue

@@ -76,13 +76,13 @@
     <div ref="staff" style="margin: 5px;">
         <div class="staff" ref="tabless" :style="'width:'+(windowWidth - 430)+'px'">
             <!-- 人员工时工价表 -->
-            <el-table v-if="ins == 0"  key="1" border :data="personWorkHoursWagesList" highlight-current-row v-loading="listLoading" :height="+tableHeight - 1" style="width: 100%;">
-                <el-table-column align="center" prop="departmentCascade" label="部门名称" min-width="150">
+            <el-table v-if="ins == 0"  :key="plondelas" border :data="personWorkHoursWagesList" highlight-current-row v-loading="listLoading" :height="+tableHeight - 1" style="width: 100%;">
+                <el-table-column align="center" prop="departmentCascade" label="部门名称" min-width="150" fixed="left">
                   <template slot-scope="scope">
                     {{scope.row.departmentCascade}}
                   </template>
                 </el-table-column>
-                <el-table-column align="center" prop="name" label="人员" min-width="250"></el-table-column>
+                <el-table-column align="center" prop="name" label="人员" min-width="250" fixed="left"></el-table-column>
                 <el-table-column v-for="(item, index) in personWorkHoursWagesHead" :key="index" :label="item" align="center" min-width="250">
                     <template slot-scope="scope">
                         <div v-for="(items, indexs) in scope.row.personWorkHoursWages" :key="indexs" @click="showReportDetail(scope.row,item)" class="colorText">
@@ -107,7 +107,7 @@
                   </template>
                 </el-table-column>
                 <el-table-column align="center" prop="procedureName" label="工序" min-width="250"></el-table-column>
-                <el-table-column align="center" prop="userName" label="人员" min-width="150"></el-table-column>
+                <!-- <el-table-column align="center" prop="userName" label="人员" min-width="150"></el-table-column> -->
                 <el-table-column align="center" prop="planWorkTime" label="计划工时" min-width="250">
                   <template slot-scope="scope" v-if="scope.row.planWorkTime">{{scope.row.planWorkTime}}分钟</template>
                 </el-table-column>
@@ -546,8 +546,9 @@ export default {
       productId:"",
       productList:[],
       vehicleNum:"",
-      steelNum:""
+      steelNum:"",
 
+      plondelas: 100, 
     };
   },
   computed: {},
@@ -753,6 +754,7 @@ export default {
             this.personWorkHoursWagesHead=res.data.header
             this.simpleDateChoose=this.personWorkHoursWagesHead[0]
             this.total=res.data.total
+            this.plondelas++
           } else {
             this.$message({
               message: res.msg,
@@ -1037,21 +1039,21 @@ export default {
         url += "/exportPersonWorkHoursWorkTime";
         sl.startDate=this.rangeDatas[0];
         sl.endDate=this.rangeDatas[1];
-        sl.deptId=this.departmentIdArray[0];
+        sl.deptId=this.departmentIdArray[this.departmentIdArray.length-1];
         sl.userId=this.userId;
     } else if (this.ins == 1) {
         fName = '工序实时进度表_' + '.xlsx';
         url += "/exportProcedureRealTimeProgressList";
         sl.startDate=this.rangeDatas[0];
         sl.endDate=this.rangeDatas[1];
-        sl.deptId=this.departmentIdArray[0];
+        sl.deptId=this.departmentIdArray[this.departmentIdArray.length-1];
         sl.userId=this.userId;
     }else if (this.ins == 2) {
         fName = '报工详情表_' + '.xlsx';
         url += "/exportWorkReportQuery";
         sl.startDate=this.rangeDatas[0];
         sl.endDate=this.rangeDatas[1];
-        sl.deptId=this.departmentIdArray[0];
+        sl.deptId=this.departmentIdArray[this.departmentIdArray.length-1];
         sl.userId=this.userId;
         sl.vehicleNum=this.vehicleNum;
         sl.steelNum=this.steelNum;
@@ -1061,14 +1063,14 @@ export default {
         url += "/exportPlanRealTimeProgressList";
         sl.startDate=this.rangeDatas[0];
         sl.endDate=this.rangeDatas[1];
-        sl.deptId=this.departmentIdArray[0];
+        sl.deptId=this.departmentIdArray[this.departmentIdArray.length-1];
         sl.userId=this.userId;
     } else if (this.ins == 4) {
         fName = '部门生产统计表_' + '.xlsx';
         url += "/exportDpetStatisticsProgressList";
         sl.startDate=this.rangeDatas[0];
         sl.endDate=this.rangeDatas[1];
-        sl.deptId=this.departmentIdArray[0];
+        sl.deptId=this.departmentIdArray[this.departmentIdArray.length-1];
     }
         this.http.post(url, sl,
         res => {

+ 35 - 2
fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue

@@ -42,7 +42,17 @@
                     </el-option>
                 </el-select>
             </el-form-item>
-            <el-form-item :label="$t('taskdefinition')" prop="name">
+            <el-form-item v-if="this.user.companyId==3092" :label="$t('taskdefinition')" prop="serviceId">
+                <el-select filterable  v-model="addForm.serviceId" placeholder="请选择任务内容">
+                    <el-option
+                    v-for="item in sapServiceList"
+                    :key="item.serviceCode"
+                    :label="item.serviceName+'-'+item.serviceCode"
+                    :value="item.serviceCode">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item v-else  :label="$t('taskdefinition')" prop="name">
                 <el-input v-model="addForm.name" :maxlength="40" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" :placeholder="$t('enterthetaskcontent')" clearable></el-input>
             </el-form-item>
             <!-- {{timelabel}}{{mileageCup}} -->
@@ -716,6 +726,7 @@ export default {
         },
         taskRules : {
             name: [{ required: true, message: this.$t('enterthetaskcontent'), trigger: "blur" }],
+            serviceId: [{ required: true, message: '请选择任务内容', trigger: "blur" }],
             projectId: [{ required: true, message: '请选择所属项目', trigger: "blur" }],
             groupId: [{ required: true, message: '请选择所属任务分组', trigger: "blur" }],
             stagesId: [{ required: true, message: '请选择所属任务列表', trigger: "blur" }],
@@ -830,7 +841,8 @@ export default {
         dynamicTab: true,
         dailyList: [],
         meetingId: '',
-        integrationProjectList: []
+        integrationProjectList: [],
+        sapServiceList:[]
     };
   },
   computed: {},
@@ -841,6 +853,7 @@ export default {
     this.triggerEvent(this.integrationTask)
     this.gstimhour = [this.user.timeType.allday]
     this.gstimday = [1]
+    this.getSapServiceList()
 
     this.timess()
   },
@@ -1941,6 +1954,26 @@ export default {
 
         this.$emit('closeBounced', {taskLineClickAbs: true, items: row})
     },
+    //获取SAP项目服务数据列表
+    getSapServiceList(){
+        this.http.post('/sap-project-service/sapServiceList', {},
+        res => {
+            if(res.code == "ok"){
+                this.sapServiceList=res.data
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        })
+    },
     // 列表的上传按钮
     uploadFileClick(item){
         console.log("upload",item.file);

+ 2 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -57,7 +57,7 @@
                     </div>
                 </el-form-item>
                 <el-form-item >
-                    <div style="margin-left: 80px">
+                    <div style="margin-left: 20px">
                         <el-select v-model="dateType" style="width:120px;" size="small" slot="prepend" :placeholder="$t('defaultText.pleaseChoose')">
                             <el-option :label="$t('starttimes')" :value="0" @click.native="hiddens(1)"></el-option>
                             <el-option :label="$t('deadline')" :value="1" @click.native="hiddens(1)"></el-option>
@@ -352,7 +352,7 @@
 }
 .autodatespan{
     padding: 1.5px 2.5px;
-    width: 73px;
+    width: 90px;
     height: 16px;
     line-height: 16px;
     text-align: center;

+ 9 - 2
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -2271,11 +2271,18 @@ import timetoolVue from '../timetool/timetool.vue';
                         if(res.code == "ok") {
                             this.$toast.clear();
                             if(res.msg!=null){
-                                this.$toast.success(res.msg);                                    
+                                this.$dialog.alert({
+                                    message: res.msg,
+                                }).then(() => {
+                                    // on close
+                                    this.$router.push("/index");
+                                });
                             }else{
                                 this.$toast.success(this.isDraft==0?'提交成功':'暂存成功');
+                                setTimeout(()=> {
+                                    that.$router.push("/index");
+                                }, 1000);
                             }
-                            this.$router.push("/index");
                         } else {
                             this.$toast.clear();
                             this.$toast.fail((this.isDraft==0?'提交失败':'暂存失败')+':'+res.msg);

+ 68 - 7
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue

@@ -19,7 +19,13 @@
                     type="default"
                     size="mini"
                     @click="switchWeek(item,index)"
-                    :disabled="canSelect(item)">{{weekArr[index]}}</van-button>
+                    :disabled="canSelect(item)" v-if="user.timeType.enableNewWeeklyfill != 1">{{weekArr[index]}}</van-button>
+                    <van-button
+                    class="selectgxbtn"
+                    type="default"
+                    size="mini"
+                    @click="switchWeek(item,index)"
+                    :disabled="canSelect(item)" v-if="user.timeType.enableNewWeeklyfill == 1">{{ weekText(dateRange[index]) }}</van-button>
                 </van-grid-item>
                 <van-grid-item v-if="weekIndex != 7">
                     <van-button type="default" size="mini" class="selectgxbtn" @click="addWeekIndex()" icon="plus" v-if="user.timeType.enableNewWeeklyfill != 1"></van-button>
@@ -484,6 +490,16 @@
             };
         },
         methods: {
+            // 获取地址上的参数
+            getUrlKey(name) {
+                return (
+                    decodeURIComponent(
+                        (new RegExp("[?|&]" + name + "=" + "([^&;]+?)(&|#|;|$)").exec(
+                            location.href
+                        ) || [, ""])[1].replace(/\+/g, "%20")
+                    ) || null
+                );
+            },
             getRecentlyProject() {
                 this.$axios.post('/project/nearProject',{})
                 .then(res => {
@@ -666,6 +682,7 @@
                 // }else{
                 //     this.weekIndex = 5
                 // }
+                const { enableNewWeeklyfill } = this.user.timeType // 针对物奇
                 if(this.user.timeType.alertNonWorkday) {
                     if(this.user.timeType.alertNonWorkday == '110' || this.user.timeType.alertNonWorkday == '10') {
                         this.weekIndex = 7
@@ -678,6 +695,17 @@
                 }
 
                 let nowDate = new Date()
+
+                console.log(nowDate, '<=== nowDate')
+                // 针对物奇
+                if(enableNewWeeklyfill == 1) {
+                    const urldate = this.getUrlKey('date')
+                    if(urldate) {
+                        nowDate = new Date(urldate)
+                    }
+                }
+                
+
                 let nowWeekday = nowDate.getDay()
 
                 let shuldDate
@@ -691,15 +719,16 @@
 
                 // 时间段数组
                 let date = new Date(shuldDate.getFullYear(),shuldDate.getMonth(),shuldDate.getDate()-shuldDate.getDay()+1)
-
-                const { enableNewWeeklyfill } = this.user.timeType // 针对物奇
+                console.log(this.formatDate(date), '<=== date', this.formatDate(shuldDate), this.formatDate(nowWeekday))
                 this.dateRange = []
-                if(enableNewWeeklyfill) {
+
+                if(enableNewWeeklyfill) { // 针对物奇
                     let { data } = await this.$axios.post('/report/getWeeklyFillReportData', {
                         targetDate: this.formatDate(date)
                     })
                     let { dateList } = data
                     this.dateRange = dateList.map(item => new Date(item.date))
+                    this.dateText = [dateList[0].date, dateList[dateList.length - 1].date]
                 } else {
                     for(let i=0;i<this.weekIndex;i++){
                         this.dateRange.push(new Date(date.getFullYear(),date.getMonth(),date.getDate()+i))
@@ -717,7 +746,10 @@
 
                 let startDateStr = startDate.getFullYear() + '-' + (startDateM < 10 ? '0' + startDateM : startDateM) + '-' + (startDateD < 10 ? '0' + startDateD : startDateD)
                 let endDateStr = endDate.getFullYear() + '-' + (endDateM < 10 ? '0' + endDateM : endDateM) + '-' + (endDateD < 10 ? '0' + endDateD : endDateD)
-                this.dateText = [startDateStr,endDateStr]
+
+                if(enableNewWeeklyfill != 1) {
+                    this.dateText = [startDateStr,endDateStr]
+                }
 
                 this.form = []
                 for(let i=0;i<this.weekIndex;i++){
@@ -2008,8 +2040,19 @@
                     // this.flgLg = true
                     if(res.code == "ok") {
                         this.$toast.clear();
-                        this.$toast.success(this.isDraft==0?'提交成功':'暂存成功');
-                        this.$router.push("/index");
+                        if(res.msg!=null){
+                            this.$dialog.alert({
+                                message: res.msg,
+                            }).then(() => {
+                                // on close
+                                this.$router.push("/index");
+                            });
+                        }else{
+                            this.$toast.success(this.isDraft==0?'提交成功':'暂存成功');
+                            setTimeout(()=> {
+                                that.$router.push("/index");
+                            }, 1000);
+                        }
                     } else {
                         this.$toast.clear();
                         this.$toast.fail((this.isDraft==0?'提交失败':'暂存失败')+':'+res.msg);
@@ -2229,6 +2272,15 @@
                     )
                 });
             },
+            weekText(item) {
+                return this.getWeekDay(item)
+            },
+            // 中国标准时间转成周几
+            getWeekDay(date) {
+                var week = new Date(date).getDay();
+                var weekArr = ['日', '一', '二', '三', '四', '五', '六'];
+                return '周' + weekArr[week];
+            },
             // 中国标准时间转成YYYY-MM-DD
             formatDate(date) {
                 if (!date) {
@@ -2254,6 +2306,15 @@
         },
         
         mounted() {
+            this.getUrlKey('date')
+            const { enableNewWeeklyfill } = this.user.timeType // 针对物奇
+            // if(enableNewWeeklyfill == 1) {
+            //     const urldate = this.getUrlKey('date')
+            //     if(urldate) {
+            //         this.nowTime = this.formatTime(urldate)
+            //         console.log(this.nowTime, '时间')
+            //     }
+            // }
             this.timeRange = []
             for(let i=0.5; i<=20; i+=0.5){
                 this.timeRange.push(i)

+ 17 - 6
fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

@@ -252,12 +252,23 @@ export default {
         },
         // 去填写日报
         toWriteReport() {
-            this.$router.push({
-                path: '/edit',
-                query: {
-                    date: this.nowTime
-                }
-            });
+            if(this.user.companyId == '1071') {
+                //物奇要填到按周填报
+                this.$router.push({
+                    path: '/weekEdit',
+                    query: {
+                        date: this.nowTime
+                    }
+                });
+            } else {
+                this.$router.push({
+                    path: '/edit',
+                    query: {
+                        date: this.nowTime
+                    }
+                });
+            }
+            
         }
     },
     mounted() {