Переглянути джерело

数据迁移 自定义填报数据导出

yurk 2 роки тому
батько
коміт
785611ae8c
12 змінених файлів з 444 додано та 28 видалено
  1. 9 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyController.java
  2. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java
  3. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyService.java
  4. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportExtraDegreeService.java
  5. 173 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyServiceImpl.java
  6. 29 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java
  7. 10 5
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyController.java
  8. 16 9
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/Report.java
  9. 19 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/CustomerInfoMapper.java
  10. 16 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectAuditorMapper.java
  11. 4 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/service/CompanyService.java
  12. 160 7
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/service/impl/CompanyServiceImpl.java

+ 9 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyController.java

@@ -1,8 +1,10 @@
 package com.management.platform.controller;
 
 
+import com.management.platform.service.CompanyService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -16,6 +18,11 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/company")
 public class CompanyController {
-
+    @Autowired
+    private CompanyService companyService;
+    @RequestMapping("/dataMigration")
+    public HttpRespMsg dataMigration(Integer oldCompanyId,Integer targetCompanyId){
+       return companyService.dataMigration(oldCompanyId,targetCompanyId);
+    }
 }
 

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java

@@ -204,5 +204,9 @@ public class ReportExtraDegreeController {
     public HttpRespMsg importData(HttpServletRequest request, MultipartFile file){
        return reportExtraDegreeService.importData(request,file);
     }
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(HttpServletRequest request){
+        return reportExtraDegreeService.exportData(request);
+    }
 }
 

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyService.java

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.management.platform.entity.Company;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
 
 /**
  * <p>
@@ -12,5 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2020-01-13
  */
 public interface CompanyService extends IService<Company> {
-
+    HttpRespMsg dataMigration(Integer oldCompanyId, Integer targetCompanyId);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportExtraDegreeService.java

@@ -18,4 +18,6 @@ import javax.servlet.http.HttpServletRequest;
 public interface ReportExtraDegreeService extends IService<ReportExtraDegree> {
 
     HttpRespMsg importData(HttpServletRequest request, MultipartFile file);
+
+    HttpRespMsg exportData(HttpServletRequest request);
 }

+ 173 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyServiceImpl.java

@@ -1,11 +1,20 @@
 package com.management.platform.service.impl;
 
-import com.management.platform.entity.Company;
-import com.management.platform.mapper.CompanyMapper;
-import com.management.platform.service.CompanyService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.*;
+import com.management.platform.util.HttpRespMsg;
+import com.mysql.cj.util.StringUtils;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  *  服务实现类
@@ -16,5 +25,165 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> implements CompanyService {
-
+    @Resource
+    private CompanyMapper companyMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private ProjectService projectService;
+    @Resource
+    private ReportMapper reportMapper;
+    @Resource
+    private CustomerInfoMapper customerInfoMapper;
+    @Resource
+    private ParticipationMapper participationMapper;
+    @Resource
+    private ParticipationService participationService;
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private DepartmentService departmentService;
+    @Resource
+    private ProjectAuditorMapper projectAuditorMapper;
+    @Resource
+    private ProjectAuditorService projectAuditorService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private ReportService reportService;
+    @Override
+    public HttpRespMsg dataMigration(Integer oldCompanyId,Integer targetCompanyId) {
+        HttpRespMsg msg=new HttpRespMsg();
+        List<User> oldUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", oldCompanyId));
+        List<User> targetUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", targetCompanyId));
+        List<Department> oldDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", oldCompanyId));
+        List<Department> targetDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", targetCompanyId));
+        //处理部门负责人
+        List<User> updateUserList=new ArrayList<>();
+        List<Department> updateDepartmentList=new ArrayList<>();
+        for (Department oldDepartment : oldDepartmentList) {
+            for (Department targetDepartment : targetDepartmentList) {
+                if(oldDepartment.getDepartmentName().equals(targetDepartment.getDepartmentName())){
+                    if(oldDepartment.getManagerId()!=null){
+                        Optional<User> oldUser = oldUserList.stream().filter(ou -> ou.getId().equals(oldDepartment.getManagerId())).findFirst();
+                        Optional<User> targetUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(oldUser.get().getDingdingUserid())).findFirst();
+                        targetDepartment.setManagerId(targetUser.get().getId());
+                        targetUser.get().setDepartmentId(targetDepartment.getDepartmentId());
+                        targetUser.get().setDepartmentName(targetDepartment.getDepartmentName());
+                        updateUserList.add(targetUser.get());
+                        updateDepartmentList.add(targetDepartment);
+                    }
+                }
+            }
+        }
+        userService.updateBatchById(updateUserList);
+        departmentService.updateBatchById(updateDepartmentList);
+        List<String> ids=new ArrayList<>();
+        //获取在目标公司也存在的人员
+        for (User targetUser : targetUserList) {
+            for (User oldUser : oldUserList) {
+                if(targetUser.getDingdingUserid().equals(oldUser.getDingdingUserid())){
+                    ids.add(oldUser.getId());
+                }
+            }
+        }
+        List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("user_id", ids));
+        //取项目id  按照项目参与人
+        List<Integer> projectIds = participationList.stream().map(pc -> pc.getProjectId()).collect(Collectors.toList());
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", projectIds));
+        List<Project> targetProjectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", targetCompanyId));
+        List<String> list = targetProjectList.stream().map(tp -> tp.getProjectCode()).collect(Collectors.toList());
+        List<ProjectAuditor> oldProjectAuditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().in("project_id", projectIds));
+        //处理相关项目
+        List<Project> newProjectList=new ArrayList<>();
+        List<ProjectAuditor> newProjectAuditorList=new ArrayList<>();
+        List<Participation> newParticipationList=new ArrayList<>();
+        for (Project pro: projectList) {
+            //此前的项目负责人不存在当前组织架构
+            Optional<User> inchargerUser = oldUserList.stream().filter(ou -> ou.getId().equals(pro.getInchargerId())).findFirst();
+            boolean flag = targetUserList.stream().anyMatch(tu -> tu.getDingdingUserid().equals(inchargerUser.get().getDingdingUserid()));
+            if(!flag){
+                msg.setError("当前项目["+pro.getProjectName()+"]负责人["+inchargerUser.get().getName()+"]不存在");
+                return msg;
+            }else {
+                Optional<User> targetInchargerUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(inchargerUser.get().getDingdingUserid())).findFirst();
+                pro.setInchargerId(targetInchargerUser.get().getId());
+            }
+            //在新公司创建相同的客户信息
+            /*CustomerInfo customerInfo = customerInfoMapper.selectById(pro.getCustomerId());
+            customerInfo.setId(null);
+            customerInfo.setCompanyId(targetCompanyId);
+            customerInfoMapper.insert(customerInfo);
+            pro.setCustomerId(customerInfo.getId());*/
+            List<ProjectAuditor> projectAuditorList = oldProjectAuditorList.stream().filter(pa -> pa.getProjectId().equals(pro.getId())).collect(Collectors.toList());
+            Optional<User> creatorUser = oldUserList.stream().filter(ou -> ou.getName().equals("李婷婷")).findFirst();
+            Optional<User> targetCreatorUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(creatorUser.get().getDingdingUserid())).findFirst();
+            pro.setCreatorId(targetCreatorUser.get().getId());
+            //当前项目的相关参与人
+            List<String> userList = participationList.stream().filter(pc -> pc.getProjectId().equals(pro.getId())).collect(Collectors.toList()).stream().map(o -> o.getUserId()).collect(Collectors.toList());
+            pro.setId(null);
+            pro.setCompanyId(targetCompanyId);
+            if(list.contains(pro.getProjectCode())){
+                continue;
+            }
+            newProjectList.add(pro);
+            //处理项目审核人
+            for (ProjectAuditor projectAuditor : projectAuditorList) {
+                projectAuditor.setProjectId(pro.getId());
+                projectAuditor.setId(null);
+                Optional<User> first = targetUserList.stream().filter(tu -> tu.getName().equals(projectAuditor.getAuditorName())).findFirst();
+                if(first.isPresent()){
+                    projectAuditor.setAuditorId(first.get().getId());
+                    projectAuditor.setAuditorName(first.get().getName());
+                    newProjectAuditorList.add(projectAuditor);
+                }
+            }
+            for(String s:userList){
+               Participation participation=new Participation();
+               participation.setProjectId(pro.getId());
+                Optional<User> user = oldUserList.stream().filter(ou -> ou.getId().equals(s)).findFirst();
+                Optional<User> targetUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(user.get().getDingdingUserid())).findFirst();
+                participation.setUserId(targetUser.get().getId());
+                newParticipationList.add(participation);
+            }
+        }
+        projectService.saveBatch(newProjectList);
+        projectAuditorService.saveBatch(newProjectAuditorList);
+        participationService.saveBatch(newParticipationList);
+        List<Project> oldProjectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", projectIds));
+        //处理日报
+        List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().in("creator_id", ids));
+        List<Report> changeReportList=new ArrayList<>();
+        for (Report report : reportList) {
+            //项目关联
+            Optional<Project> oldProject = oldProjectList.stream().filter(op -> op.getId().equals(report.getProjectId())).findFirst();
+            Optional<Project> targetProject = projectList.stream().filter(pro -> pro.getProjectCode().equals(oldProject.get().getProjectCode())).findFirst();
+            report.setProjectId(targetProject.get().getId());
+            Optional<User> oldUser = oldUserList.stream().filter(ou -> ou.getId().equals(report.getCreatorId())).findFirst();
+            Optional<User> targetUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(oldUser.get().getDingdingUserid())).findFirst();
+            report.setCreatorId(targetUser.get().getId());
+            //部门数据
+            Optional<Department> oldDepart = oldDepartmentList.stream().filter(od -> od.getDepartmentId().equals(report.getDeptId())).findFirst();
+            Optional<Department> targetDepart = targetDepartmentList.stream().filter(td -> td.getDepartmentName().equals(oldDepart.get().getDepartmentName())).findFirst();
+            report.setDeptId(targetDepart.get().getDepartmentId());
+            //当前审核部门数据
+            Optional<Department> oldAuditDepart = oldDepartmentList.stream().filter(od -> od.getDepartmentId().equals(report.getAuditDeptid())).findFirst();
+            if(oldAuditDepart.isPresent()){
+                Optional<Department> targetAuditDepart =targetDepartmentList.stream().filter(td -> td.getDepartmentName().equals(oldAuditDepart.get().getDepartmentName())).findFirst();
+                report.setAuditDeptid(targetAuditDepart.get().getDepartmentId());
+                report.setAuditDeptManagerid(targetAuditDepart.get().getManagerId());
+            }
+            //是否被驳回
+            if(!StringUtils.isNullOrEmpty(report.getRejectUsername())){
+                Optional<User> rejectUser = targetUserList.stream().filter(tu -> tu.getName().equals(report.getRejectUsername())).findFirst();
+                report.setRejectUserid(rejectUser.get().getId());
+            }
+            report.setCompanyId(targetCompanyId);
+            changeReportList.add(report);
+        }
+        reportService.updateBatchById(changeReportList);
+        return msg;
+    }
 }

+ 29 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java

@@ -3,7 +3,10 @@ package com.management.platform.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.ReportExtraDegree;
+import com.management.platform.entity.TimeType;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.ReportExtraDegreeMapper;
+import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ReportExtraDegreeService;
 import com.management.platform.util.ExcelUtil;
@@ -14,6 +17,7 @@ import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -36,10 +40,14 @@ import java.util.stream.Collectors;
  */
 @Service
 public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeMapper, ReportExtraDegree> implements ReportExtraDegreeService {
+    @Value(value = "${upload.path}")
+    String path;
     @Resource
     ReportExtraDegreeMapper reportExtraDegreeMapper;
     @Resource
     UserMapper userMapper;
+    @Resource
+    TimeTypeMapper timeTypeMapper;
     @Override
     public HttpRespMsg importData(HttpServletRequest request, MultipartFile multipartFile) {
         HttpRespMsg msg=new HttpRespMsg();
@@ -132,4 +140,25 @@ public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeM
             System.out.println(file.delete());
         }
     }
+
+    @Override
+    public HttpRespMsg exportData(HttpServletRequest request) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<ReportExtraDegree> reportExtraDegreeList = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", user.getCompanyId()));
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        List<String> titleList=new ArrayList<>();
+        titleList.add(timeType.getCustomDegreeName()+"名称");
+        List<List<String>> dataList=new ArrayList<>();
+        for (ReportExtraDegree reportExtraDegree : reportExtraDegreeList) {
+            List<String> itemList=new ArrayList<>();
+            itemList.add(reportExtraDegree.getName());
+            dataList.add(itemList);
+        }
+        //生成excel文件导出
+        String fileName = timeType.getCustomDegreeName()+"统计_"+System.currentTimeMillis();
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        httpRespMsg.data = resp;
+        return httpRespMsg;
+    }
 }

+ 10 - 5
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyController.java

@@ -1,31 +1,31 @@
 package com.management.platform.controller;
 
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.management.platform.entity.Company;
 import com.management.platform.entity.CompanyDingding;
-import com.management.platform.entity.VcompanyCustomerContact;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.mapper.CompanyDingdingMapper;
 import com.management.platform.mapper.CompanyMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.CompanyService;
 import com.management.platform.util.HttpRespMsg;
-import org.apache.el.parser.BooleanNode;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.*;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Optional;
@@ -167,5 +167,10 @@ public class CompanyController {
             return error;
         }
     }
+    //数据迁移
+    @RequestMapping("/dataMigration")
+    public HttpRespMsg dataMigration(HttpServletRequest request, Integer oldCompanyId, Integer targetCompanyId,String oldUserName,String targetUserName){
+        return companyService.dataMigration(request,oldCompanyId,targetCompanyId,oldUserName,targetUserName);
+    }
 }
 

+ 16 - 9
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/Report.java

@@ -1,16 +1,9 @@
 package com.management.platform.entity;
 
-import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import java.time.LocalDate;
-import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.List;
-
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.management.platform.entity.vo.WorktimeItem;
 import lombok.Data;
@@ -18,6 +11,13 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+
 /**
  * <p>
  * 
@@ -230,6 +230,13 @@ public class Report extends Model<Report> {
     @TableField("audit_deptid")
     private Integer auditDeptid;
 
+
+    /**
+     * 工时日报所属部门id
+     */
+    @TableField("dept_id")
+    private Integer deptId;
+
     /**
      * 审核流程: 是否是部门审核
      */

+ 19 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/CustomerInfoMapper.java

@@ -0,0 +1,19 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.CustomerInfo;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-07-31
+ */
+public interface CustomerInfoMapper extends BaseMapper<CustomerInfo> {
+
+    public List<CustomerInfo> getAll(Integer companyId);
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectAuditor;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-13
+ */
+public interface ProjectAuditorMapper extends BaseMapper<ProjectAuditor> {
+
+}

+ 4 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/service/CompanyService.java

@@ -4,6 +4,8 @@ import com.management.platform.entity.Company;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.util.HttpRespMsg;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * <p>
  *  服务类
@@ -21,4 +23,6 @@ public interface CompanyService extends IService<Company> {
     HttpRespMsg setExpDate(Integer companyId, String date);
 
     HttpRespMsg setPackageList(Company company);
+
+    HttpRespMsg dataMigration(HttpServletRequest request,Integer oldCompanyId, Integer targetCompanyId,String oldUserName,String targetUserName);
 }

+ 160 - 7
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/service/impl/CompanyServiceImpl.java

@@ -1,20 +1,22 @@
 package com.management.platform.service.impl;
 
-import com.management.platform.entity.Company;
-import com.management.platform.entity.OperationLog;
-import com.management.platform.entity.User;
-import com.management.platform.mapper.CompanyMapper;
-import com.management.platform.mapper.OperationLogMapper;
-import com.management.platform.mapper.UserMapper;
-import com.management.platform.service.CompanyService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
+import com.mysql.cj.util.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -34,6 +36,20 @@ public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> impl
     HttpServletRequest request;
     @Resource
     UserMapper userMapper;
+    @Resource
+    ProjectMapper projectMapper;
+    @Resource
+    ReportMapper reportMapper;
+    @Resource
+    CustomerInfoMapper customerInfoMapper;
+    @Resource
+    ParticipationMapper participationMapper;
+    @Resource
+    DepartmentMapper departmentMapper;
+    @Resource
+    ProjectAuditorMapper projectAuditorMapper;
+    @Resource
+    UserService userService;
 
     @Override
     public HttpRespMsg addMembCount(Integer companyId, int addCount) {
@@ -115,4 +131,141 @@ public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> impl
         saveLog(str);
         return new HttpRespMsg();
     }
+
+    @Override
+    public HttpRespMsg dataMigration(HttpServletRequest request,Integer oldCompanyId, Integer targetCompanyId,String oldUserName,String targetUserName) {
+        HttpRespMsg msg=new HttpRespMsg();
+        User oldManager = userMapper.selectOne(new QueryWrapper<User>().eq("name", oldUserName).eq("company_id",oldCompanyId));
+        User targetManager = userMapper.selectOne(new QueryWrapper<User>().eq("name", targetUserName).eq("company_id",targetCompanyId));
+        if(oldManager==null){
+            msg.setError("管理员["+oldUserName+"]不存在");
+            return msg;
+        }
+        if(targetManager==null){
+            msg.setError("管理员["+targetManager+"]不存在");
+            return msg;
+        }
+        if(!oldManager.getDingdingUserid().equals(targetManager.getDingdingUserid())){
+            msg.setError("校验失败,管理员匹配异常");
+            return msg;
+        }
+        List<User> oldUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", oldCompanyId));
+        List<User> targetUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", targetCompanyId));
+        List<Department> oldDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", oldCompanyId));
+        List<Department> targetDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", targetCompanyId));
+        //处理部门负责人
+        List<User> updateUserList=new ArrayList<>();
+        for (Department oldDepartment : oldDepartmentList) {
+            for (Department targetDepartment : targetDepartmentList) {
+                if(oldDepartment.getDepartmentName().equals(targetDepartment.getDepartmentName())){
+                    if(oldDepartment.getManagerId()!=null){
+                        Optional<User> oldUser = oldUserList.stream().filter(ou -> ou.getId().equals(oldDepartment.getManagerId())).findFirst();
+                        Optional<User> targetUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(oldUser.get().getDingdingUserid())).findFirst();
+                        targetDepartment.setManagerId(targetUser.get().getId());
+                        targetUser.get().setDepartmentId(targetDepartment.getDepartmentId());
+                        targetUser.get().setDepartmentName(targetDepartment.getDepartmentName());
+                        updateUserList.add(targetUser.get());
+                        departmentMapper.updateById(targetDepartment);
+                    }
+                }
+            }
+        }
+        List<String> ids=new ArrayList<>();
+        //获取在目标公司也存在的人员
+        for (User targetUser : targetUserList) {
+            for (User oldUser : oldUserList) {
+                if(targetUser.getDingdingUserid().equals(oldUser.getDingdingUserid())){
+                    ids.add(oldUser.getId());
+                }
+            }
+        }
+        List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("user_id", ids));
+        //取项目id  按照项目参与人
+        List<Integer> projectIds = participationList.stream().map(pc -> pc.getProjectId()).collect(Collectors.toList());
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", projectIds));
+        List<Project> targetProjectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", targetCompanyId));
+        List<String> list = targetProjectList.stream().map(tp -> tp.getProjectCode()).collect(Collectors.toList());
+        List<ProjectAuditor> oldProjectAuditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().in("project_id", projectIds));
+        //处理相关项目
+        for (Project pro: projectList) {
+            //此前的项目负责人不存在当前组织架构
+            Optional<User> inchargerUser = oldUserList.stream().filter(ou -> ou.getId().equals(pro.getInchargerId())).findFirst();
+            boolean flag = targetUserList.stream().anyMatch(tu -> tu.getDingdingUserid().equals(inchargerUser.get().getDingdingUserid()));
+            if(!flag){
+                msg.setError("当前项目["+pro.getProjectName()+"]负责人["+inchargerUser.get().getName()+"]不存在");
+                return msg;
+            }else {
+                Optional<User> targetInchargerUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(inchargerUser.get().getDingdingUserid())).findFirst();
+                pro.setInchargerId(targetInchargerUser.get().getId());
+            }
+            /*//在新公司创建相同的客户信息
+            CustomerInfo customerInfo = customerInfoMapper.selectById(pro.getCustomerId());
+            customerInfo.setId(null);
+            customerInfo.setCompanyId(targetCompanyId);
+            customerInfoMapper.insert(customerInfo);
+            pro.setCustomerId(customerInfo.getId());*/
+            List<ProjectAuditor> projectAuditorList = oldProjectAuditorList.stream().filter(pa -> pa.getProjectId().equals(pro.getId())).collect(Collectors.toList());
+            Optional<User> creatorUser = oldUserList.stream().filter(ou -> ou.getName().equals("李婷婷")).findFirst();
+            Optional<User> targetCreatorUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(creatorUser.get().getDingdingUserid())).findFirst();
+            pro.setCreatorId(targetCreatorUser.get().getId());
+            //当前项目的相关参与人
+            List<String> userList = participationList.stream().filter(pc -> pc.getProjectId().equals(pro.getId())).collect(Collectors.toList()).stream().map(o -> o.getUserId()).collect(Collectors.toList());
+            pro.setId(null);
+            pro.setCompanyId(targetCompanyId);
+            if(list.contains(pro.getProjectCode())){
+                continue;
+            }
+            projectMapper.insert(pro);
+            //处理项目审核人
+            for (ProjectAuditor projectAuditor : projectAuditorList) {
+                projectAuditor.setProjectId(pro.getId());
+                projectAuditor.setId(null);
+                Optional<User> first = targetUserList.stream().filter(tu -> tu.getName().equals(projectAuditor.getAuditorName())).findFirst();
+                if(first.isPresent()){
+                    projectAuditor.setAuditorId(first.get().getId());
+                    projectAuditor.setAuditorName(first.get().getName());
+                    projectAuditorMapper.insert(projectAuditor);
+                }
+            }
+            for(String s:userList){
+                Participation participation=new Participation();
+                participation.setProjectId(pro.getId());
+                Optional<User> user = oldUserList.stream().filter(ou -> ou.getId().equals(s)).findFirst();
+                Optional<User> targetUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(user.get().getDingdingUserid())).findFirst();
+                participation.setUserId(targetUser.get().getId());
+                participationMapper.insert(participation);
+            }
+        }
+        List<Project> oldProjectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", projectIds));
+        //处理日报
+        List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().in("creator_id", ids));
+        for (Report report : reportList) {
+            //项目关联
+            Optional<Project> oldProject = oldProjectList.stream().filter(op -> op.getId().equals(report.getProjectId())).findFirst();
+            Optional<Project> targetProject = projectList.stream().filter(pro -> pro.getProjectCode().equals(oldProject.get().getProjectCode())).findFirst();
+            report.setProjectId(targetProject.get().getId());
+            Optional<User> oldUser = oldUserList.stream().filter(ou -> ou.getId().equals(report.getCreatorId())).findFirst();
+            Optional<User> targetUser = targetUserList.stream().filter(tu -> tu.getDingdingUserid().equals(oldUser.get().getDingdingUserid())).findFirst();
+            report.setCreatorId(targetUser.get().getId());
+            //部门数据
+            Optional<Department> oldDepart = oldDepartmentList.stream().filter(od -> od.getDepartmentId().equals(report.getDeptId())).findFirst();
+            Optional<Department> targetDepart = targetDepartmentList.stream().filter(td -> td.getDepartmentName().equals(oldDepart.get().getDepartmentName())).findFirst();
+            report.setDeptId(targetDepart.get().getDepartmentId());
+            //当前审核部门数据
+            Optional<Department> oldAuditDepart = oldDepartmentList.stream().filter(od -> od.getDepartmentId().equals(report.getAuditDeptid())).findFirst();
+            if(oldAuditDepart.isPresent()){
+                Optional<Department> targetAuditDepart =targetDepartmentList.stream().filter(td -> td.getDepartmentName().equals(oldAuditDepart.get().getDepartmentName())).findFirst();
+                report.setAuditDeptid(targetAuditDepart.get().getDepartmentId());
+                report.setAuditDeptManagerid(targetAuditDepart.get().getManagerId());
+            }
+            //是否被驳回
+            if(!StringUtils.isNullOrEmpty(report.getRejectUsername())){
+                Optional<User> rejectUser = targetUserList.stream().filter(tu -> tu.getName().equals(report.getRejectUsername())).findFirst();
+                report.setRejectUserid(rejectUser.get().getId());
+            }
+            report.setCompanyId(targetCompanyId);
+            reportMapper.updateById(report);
+        }
+        return msg;
+    }
 }