分佈式XxlJob開發實戰之員工、公司、部門接口表同步開發

 

一、 需求分析

       1. 根據客戶要求,客戶的hr系統會向我們公司的費控系統提供一個員工、公司、部門的接口的信息,然後我們根據信息來做插入信息和修改信息的操作。

       2. 不管是插入還是更新操作,對單筆記錄都要進行記錄操作,同時要給配置的人發送郵件提醒。

       3. 不管是新增或變更信息,最後的結果是成功還是失敗,都要發送郵件。

       4. 每天5點的時候同步信息接口,自動執行。 

 

二、 表結構分析

       客戶提供的接口信息如下:

        員工接口表:

數據庫名 表名 表註釋 字段名 字段註釋  數據類型 是否允許爲空 示例 測試數據 備註說明
fec_mdata sys_employee_interface 員工基本信息接口表 employee_code 工號 varchar(10) 01538 09998 HR系統的員工工號
full_name 姓名 varchar(50) 測試 ZK  
email 郵箱 varchar(100) [email protected] [email protected]  
direct_manager 直屬領導工號 varchar(50) 06017 01538  
duty_code 職務code varchar(10) 01 01 普通員工=01、分公司總經理=02、董事長=03、
CEO=04、CFO=05
entry_date 入職日期 timestamp 2020/1/4 2020/1/4  
status 新增或變更 varchar(1) N N A-新增,U-更新、N-未插入
created_source 數據來源 varchar(50) MANUAL MANUAL HR,MANUAL
                   
fec_mdata sys_employee_position_interface 員工崗位信息接口表 employee_code 工號 varchar(10) 01538 09998 HR系統的員工工號
primary_flag 是否主崗位 varchar(1) Y Y Y 是,N 否
hr_company_name hr公司名稱 varchar(100) 天津分公司 總部 該字段需要插入費控系統中的機構代碼
hr_department_name hr部門名稱 varchar(100) 銀保-天津分公司 企業發展部-總公司 該字段需要插入費控系統中的部門代碼

 

          公司接口表:  sys_company_interface

         

company_code 公司code varchar(100) NULL ZB JS009 該字段將被用於費控系統中的機構代碼
company_name 公司名稱 varchar(100) NULL 總部 江蘇三級機構 該字段將被用於費控系統中的機構描述
company_level 公司級別 varchar(100) NULL First_level Third_level 總部=First_level、分公司=Second_level、
三級公司=Third_level、四級公司=Fourth_level
parent_company_code 上級公司代碼 varchar(50) NULL null JS 該字段需插入費控系統中已有的機構代碼
entry_date 生效日期 timestamp NULL 2020/1/4 2020/1/4  
created_source 數據來源 varchar(50) NULL MANUAL MANUAL HR,MANUAL

          部門接口表:  sys_department_interface

       

字段名 字段註釋  數據類型 默認值 是否允許爲空 示例 測試數據 備註說明
department_code 部門code varchar(100) NULL ZB020 JS020 該字段將被用於費控系統中的部門代碼
department_name 部門名稱 varchar(100) NULL Finance-總部 Finance-江蘇三級機構 該字段將被用於費控系統中的部門描述
company_code 所屬公司code varchar(100) NULL ZB JS009 該字段需插入費控系統中已有的機構代碼
department_type 部門類型 varchar(50) NULL 01 01 後援=01;渠道=02;渠道(T4)=03
entry_date 生效日期 timestamp NULL 2020/1/4 2020/1/4  
created_source 數據來源 varchar(50) NULL MANUAL MANUAL HR,MANUAL

 

        hr公司名和費控公司映射表:  sys_company_inteface_mapping

    

DROP TABLE IF EXISTS `sys_company_interface_mapping`;
CREATE TABLE `sys_company_interface_mapping`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `company_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '費控公司代碼',
  `company_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '費控公司名稱',
  `hr_company_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'hr公司名稱',
  `version_number` int(11) NOT NULL COMMENT '版本號',
  `created_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建日期',
  `created_by` bigint(20) NOT NULL COMMENT '創建用戶ID',
  `last_updated_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最後更新日期',
  `last_updated_by` bigint(20) NOT NULL COMMENT '最後更新用戶ID',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1265563134299119668 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

 

        hr部門名和費控部門映射表:  sys_department_interface_mapping

DROP TABLE IF EXISTS `sys_department_interface_mapping`;
CREATE TABLE `sys_department_interface_mapping`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `department_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '費控部門的代碼',
  `department_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '費控部門的名稱',
  `hr_department_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'hr部門的名稱',
  `company_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '費控公司代碼',
  `company_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '費控公司名稱',
  `version_number` int(11) NOT NULL COMMENT '版本號',
  `created_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建日期',
  `created_by` bigint(20) NOT NULL COMMENT '創建用戶ID',
  `last_updated_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '-',
  `last_updated_by` bigint(20) NOT NULL COMMENT '最後更新用戶ID',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1265566237231874260 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

 

 

三、代碼實現

         1.  繼承IJobHandler用於自定義的處理器:
         

package com.hand.hcf.app.mdata.job;

import com.hand.hcf.app.mdata.contact.service.EmployeeInterfaceService;
import com.sun.net.httpserver.Authenticator;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import static com.xxl.job.core.biz.model.ReturnT.SUCCESS;

/**
 * EmployeeHandler
 *
 * @Auther: zhengbing.zhang
 * @Date:2020/5/11
 * @remark
 */
@JobHandler(value="EmployeeInterfaceHandler")
@Component
public class EmployeeHandler  extends IJobHandler {



    @Autowired
    EmployeeInterfaceService employeeInterfaceService;


    @Override
    public ReturnT<String> execute(String... strings) throws Exception {
        XxlJobLogger.log("開始獲取員工信息...");
        ResultDTO resultDTO= employeeInterfaceService.insertOrUpdateEmploee();
        XxlJobLogger.log("獲取員工信息結束!總共獲取員工信息"+resultDTO.getTotalNum()+"條!"+"成功:"+resultDTO.getSuccessNum()+"條"+",失敗:"+resultDTO.getFailNum()+"條");
        return SUCCESS;
    }
}

 

 

具體實現:

       1) 只查詢出,員工表和崗位表status爲"N"的記錄進行處理。  sql如下:

SELECT e.*,o.primary_flag,o.hr_company_name,o.hr_department_name 
from sys_employee_interface e  
join sys_employee_position_interface o on  e.employee_code=o.employee_code  
where e.status="N" and o.status="N"
   

       2)期間需要進行一些校驗,如果不滿足校驗,那麼就失敗,狀態爲N的時候將其更新爲F。 如果成功了,那麼將status更新爲"Y"

       3) 使用LinkedHashMap來固定郵件信息的順序。

    

     4) 郵件工具類:

       另外在郵件裏使用表格的形式,需要指定一下xml的配置:

     

String  header="<![CDATA[<html><head></head><body><h2>費控系統員工信息新增或變更(失敗)!您好,費控系統接收新員工信息數據失敗,請系統管理員通知相關用戶進行後續信息處理,新增或變更員工信息數據如下:</h2>";

             然後拼接上表格里的內容,就能實現在郵件裏出來表格信息了,效果如上!  

package com.hand.hcf.app.mdata.contact.utils;

import com.hand.hcf.app.client.org.SysCodeValueCO;
import com.hand.hcf.app.mdata.client.com.CompanyCO;
import com.hand.hcf.app.mdata.contact.domain.Contact;
import com.hand.hcf.app.mdata.department.domain.Department;
import com.hand.hcf.app.mdata.externalApi.FecPeripheralInterface;
import com.xxl.job.core.log.XxlJobLogger;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * EmailUtil
 *
 * @Auther: zhengbing.zhang
 * @Date:2020/5/15
 * @remark
 */


@Component
public class EmailUtil {

    @Autowired
    private FecPeripheralInterface fecPeripheralInterface;

    public  void sendEmail(String subject,String header ,Map<String,String> map, String emailTo,String fail) {

        /**
         * 獲取郵件的收件人值列表
         */
        Set<String> lines = map.keySet();

        StringBuilder content = new StringBuilder();
        content.append(header);
        if (!StringUtils.isEmpty(fail)){
            content.append("<h2>失敗原因:"+fail+"</h2>");
        }
        content.append("<table border=\"1\" style=\"border-collapse: collapse;border: 1px solid #ccc;\">");
        for(String key:lines){
            content.append("<tr>");
            content.append("<td>" + key + "</td>"); //第一列
            content.append("<td>" + map.get(key) + "</td>"); //第二列
            content.append("</tr>");
        }
        content.append("]]>");

        if (StringUtils.isEmpty(emailTo)){
            XxlJobLogger.log(content+"沒有配置收件人!");
        }else{
            fecPeripheralInterface.sendEmailToEft(subject,content.toString(),emailTo);
            XxlJobLogger.log("郵件發送成功!");
        }
    }

    /**
     * 給財務複審人員發郵件
     */
    public void sendCheckMail(List<Contact> contacts,Department department, CompanyCO companyCO) {
        //包含Finance給發財務複審發郵件。
        String subject="部門Code包含Finance";
        String   content="部門代碼爲:"+department.getDepartmentCode()+"部門名稱爲;"+department.getName();
        String   emailTo="";
        //獲取到該公司下的所有財務審覈崗
        if (CollectionUtils.isNotEmpty(contacts)){
            for (Contact c:contacts){
                emailTo=c.getEmail()+",";
            }
            XxlJobLogger.log("給財務複審的員工發郵件");
            fecPeripheralInterface.sendEmailToEft(subject,content,emailTo);
            XxlJobLogger.log("郵件發送成功!");
        }else{
            XxlJobLogger.log(companyCO.getName()+"沒有財務複覈崗!");
        }
    }

}

             5) 鑑於每次都要給處理的每天信息發送郵件,那麼可以使用共有的變量FailCheck和fail, 分別用來判斷是否處理失敗和拼接失敗原因的。  每次for循環後,需要將共有的變量恢復至默認和將字符串清空,要不然下次循環會繼續使用,會發生掩蓋上次處理結果的情況。 

  

  //發郵件
                senEmail(failCheck, map, toEmails, fail.toString(), e);
                //清空失敗原因
                fail.setLength(0);
                baseMapper.updateStatusById(e.getId(), e.getStatus());
                //更新崗位表的狀態
                baseMapper.updatePositionStatusByEmoloyeeCode(e.getEmployeeCode(), e.getStatus());
                //恢復
                failCheck=false;

        6) 核心實現如下:  

package com.hand.hcf.app.mdata.contact.service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.hand.hcf.app.client.org.OrganizationClient;
import com.hand.hcf.app.client.org.OrganizationInterface;
import com.hand.hcf.app.client.org.SysCodeValueCO;
import com.hand.hcf.app.client.user.UserCO;
import com.hand.hcf.app.client.user.UserClient;
import com.hand.hcf.app.mdata.base.util.OrgInformationUtil;
import com.hand.hcf.app.mdata.client.com.CompanyCO;
import com.hand.hcf.app.mdata.client.contact.ContactCO;
import com.hand.hcf.app.mdata.company.domain.Company;
import com.hand.hcf.app.mdata.company.service.CompanyService;
import com.hand.hcf.app.mdata.contact.domain.Contact;
import com.hand.hcf.app.mdata.contact.domain.EmployeeInterface;
import com.hand.hcf.app.mdata.contact.domain.EmployeePositionInterface;
import com.hand.hcf.app.mdata.contact.domain.UserRole;
import com.hand.hcf.app.mdata.contact.dto.EmployeeInfoDTO;
import com.hand.hcf.app.mdata.contact.persistence.ContactMapper;
import com.hand.hcf.app.mdata.contact.persistence.EmployeeInterfaceMapper;
import com.hand.hcf.app.mdata.contact.persistence.EmployeePositionInterfaceMapper;
import com.hand.hcf.app.mdata.contact.utils.EmailUtil;
import com.hand.hcf.app.mdata.contact.utils.StringBuilderUtil;
import com.hand.hcf.app.mdata.department.domain.Department;
import com.hand.hcf.app.mdata.department.domain.DepartmentUser;
import com.hand.hcf.app.mdata.department.service.DepartmentService;
import com.hand.hcf.app.mdata.department.service.DepartmentUserService;
import com.hand.hcf.app.mdata.doubleposition.domin.DoublePosition;
import com.hand.hcf.app.mdata.doubleposition.service.DoublePositionService;
import com.hand.hcf.app.mdata.externalApi.FecBaseInterface;
import com.hand.hcf.app.mdata.externalApi.FecPeripheralInterface;
import com.hand.hcf.app.mdata.externalApi.HcfOrganizationInterface;
import com.hand.hcf.app.mdata.job.ResultDTO;
import com.hand.hcf.core.service.BaseService;
import com.xxl.job.core.log.XxlJobLogger;
import jdk.nashorn.internal.parser.JSONParser;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.StringUtils;

import java.text.SimpleDateFormat;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * EmployeeInterfaceService
 *
 * @Auther: zhengbing.zhang
 * @Date:2020/5/11
 * @remark
 */
@Service
public class EmployeeInterfaceService extends BaseService<EmployeeInterfaceMapper, EmployeeInterface> {


    @Autowired
    private ContactService contactService;

    @Autowired
    private EmployeePositionInterfaceMapper employeePositionInterfaceMapper;

    @Autowired
    private CompanyService companyService;

    @Autowired
    private DepartmentService departmentService;

    @Autowired
    private DepartmentUserService departmentUserService;

    @Autowired
    private DoublePositionService doublePositionService;

    @Autowired
    private FecBaseInterface baseInterface;

    @Autowired
    private OrganizationInterface organizationInterface;


    @Autowired
    private HcfOrganizationInterface hcfOrganizationInterface;

    @Autowired
    private EmailUtil emailUtil;

    @Autowired
    private StringBuilderUtil stringBuilderUtil;

    @Autowired
    UserClient userClient;


    @Transactional(rollbackFor = Exception.class,propagation= Propagation.REQUIRED)
    public ResultDTO insertOrUpdateEmploee() {

        List<EmployeeInfoDTO> allEmployee= baseMapper.selectAllInfo();

        List<Contact> contactList=new ArrayList<>();
        int successNum=0;
        int failNum=0;
        //使用LinkedMap來固定順序

        StringBuilder fail=new StringBuilder();
        //再次轉換爲信息map
        Boolean failCheck=false;
        //更新
        List<Contact> updateContacts=new ArrayList<>();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        if (CollectionUtils.isNotEmpty(allEmployee)){
            List<SysCodeValueCO> toEmails=organizationInterface.listSysValueByCodeConditionByEnabled("sys_employee_interface_email",true);
            for (EmployeeInfoDTO e:allEmployee){
                String employeeCode = e.getEmployeeCode();
                Map<String, String> map = new LinkedHashMap<>();
                /**
                 * 將員工信息加入到map中,在郵件中打印出來
                 */
                ZonedDateTime dateTime = e.getEntryDate();
                String entryDate = dateTime.format(formatter);
                map.put("工號", e.getEmployeeCode());
                map.put("姓名", e.getFullName());
                map.put("郵箱", e.getEmail());
                map.put("直屬領導工號", e.getDirectManager());
                map.put("職務code", e.getDutyCode());
                map.put("入職日期", entryDate);
                map.put("數據來源", e.getCreatedSource());
                map.put("是否在職", e.getOnJob());
                map.put("狀態", e.getStatus());
                map.put("hr公司名稱",e.getHrCompanyName());
                map.put("hr部門名稱",e.getHrDepartmentName());

                  map.put("是否主崗位", e.getPrimaryFlag());


                //先查是否存在映射關係,如果有的話,就執行插入操作,如果沒有發送郵件
                List<EmployeeInfoDTO> dtos=baseMapper.selectEmployeeInfo(e.getEmployeeCode());
                if (dtos.size()==0){
                    failCheck=true;
                    fail.append("該員工不存在映射關係!工號:"+e.getEmployeeCode());
                }else {
                    /**
                     * 驗證是否有主崗位信息
                     */
                    EmployeeInfoDTO e1=dtos.get(0);
                    map.put("公司代碼", e1.getCompanyCode());
                    map.put("公司名稱", companyService.getByCompanyCode(e1.getCompanyCode()).getName());
                    map.put("部門代碼", e1.getDepartmentCode());
                    map.put("部門名稱", departmentService.getDepartment(e1.getDepartmentCode()).getName());
                    Integer count = employeePositionInterfaceMapper.selectCount(new EntityWrapper<EmployeePositionInterface>()
                            .eq("employee_code", employeeCode)
                            .eq("primary_flag", e.getPrimaryFlag()));
                    if (count < 1) {
                        XxlJobLogger.log(e.getEmployeeCode() + "沒有主崗位信息!");
                        //給管理員發郵件
                        fail.append(e.getEmployeeCode() + "沒有主崗位信息!");
                        //從值列表中查出待發
                        failCheck = true;
                    }

                    Contact contact = contactService.selectOne(new EntityWrapper<Contact>().eq("employee_id", employeeCode));
                    if (contact == null) {
                        //員工
                        String directManager = e.getDirectManager();
                        CompanyCO company = companyService.getByCompanyCode(e1.getCompanyCode());
                        Contact contact1 = new Contact();
                        BeanUtils.copyProperties(e1, contact1);
                        Long companyId = null;
                        if (company != null) {
                            companyId = company.getId();
                            contact1.setCompanyId(companyId);
                        } else {
                            fail.append("員工" + e.getEmployeeCode() + "公司不存在!公司代碼爲:" + e1.getCompanyCode());
                            failCheck = true;
                        }
                        Department department = departmentService.selectOne(new EntityWrapper<Department>()
                                .eq("department_code", e1.getDepartmentCode()));
                        Long departmentId = null;
                        if (department != null) {
                            departmentId = department.getId();
                            if (department.getName().toLowerCase().contains("finance")) {
                                List<Contact> contacts = baseMapper.selectAllCheckByRole(companyId);
                                emailUtil.sendCheckMail(contacts, department, company);
                            }
                        } else {
                            fail.append("部門不存在!部門代碼爲:" + e1.getDepartmentCode());
                            failCheck = true;
                        }

                        UserCO user = new UserCO();
                        //保存至User表,以保證新增的用戶可以登錄進來
                        user.setLogin(e.getEmployeeCode());
                        user.setLanguage(OrgInformationUtil.getCurrentLanguage());
                        user.setTenantId(0L);
                        user.setPhoneNumber(null);
                        user.setEmail(e.getEmail());
                        user.setUserName(e.getFullName());
                        user.setRemark(null);
                        user.setTenantId(0L);
                        user.setLanguage("zh_cn");
                        try {
                            user = hcfOrganizationInterface.saveUser(user);
                            //設置一個默認角色,普通員工
                            UserRole userRole = new UserRole();
                            userRole.setRoleId(1169167757858390018L);
                            userRole.setUserId(user.getId());
                            userRole.setValidDateFrom(ZonedDateTime.now());
                            userRole.setDataAuthorityId(1169177142518685698L);
                            baseInterface.createUserRole(userRole);
                        } catch (Exception error) {
                            fail.append("插入用戶信息失敗!" + error.getMessage());
                            failCheck = true;
                            //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        }

                        contact1.setUserOid(user.getUserOid());
                        contact1.setId(null);
                        contact1.setUserId(user.getId());
                        contact1.setEmployeeId(e.getEmployeeCode());
                        contact1.setTenantId(0L);
                        contact1.setStatus("Y".equals(e.getOnJob()) ? 1001 : 1003);
                        if ("N".equals(e.getOnJob())) {
                            contact1.setEmployeeId(contact1.getEmployeeId() + "_LEAVED");
                            userClient.updateUserLeaveOffice(user.getId());
                        }
                        contact1.setEntryDate(dateTime);
                        Contact directManagerContact = contactService.selectOne(new EntityWrapper<Contact>().eq("employee_id", directManager));
                        if (directManagerContact != null) {
                            contact1.setDirectManager(directManagerContact == null ? null : directManagerContact.getUserOid());
                        } else {
                            fail.append("員工上級領導不存在!上級領導的工號爲:" + directManager);
                            failCheck = true;
                        }
                        //插入員工
                        if (failCheck != true) {
                            contactService.insert(contact1);
                        }
                        contactList.add(contact1);
                        XxlJobLogger.log(contact1.toString());
                        //員工崗位兼崗
                        if ("N".equals(e.getPrimaryFlag().toUpperCase())) {
                            DoublePosition doublePosition = new DoublePosition();
                            doublePosition.setUserId(user.getId().toString());
                            doublePosition.setCompanyId(companyId.toString());
                            doublePosition.setDepartmentId(departmentId.toString());
                            doublePositionService.insert(doublePosition);
                        }
                        //員工部門
                        DepartmentUser departmentUser = new DepartmentUser();
                        departmentUser.setDepartmentId(departmentId);
                        departmentUser.setUserId(user.getId());
                        if (failCheck != true) {
                            departmentUserService.insert(departmentUser);
                        }

                    } else {
                        //存在就更新
                        int versionNumber = contact.getVersionNumber();
                        Long id = contact.getId();
                        BeanUtils.copyProperties(e1, contact);
                        //設置直屬領導的工號
                       Contact directManager= contactService.selectOne(new EntityWrapper<Contact>().eq("employee_id", e1.getDirectManager()));
                       if (directManager!=null){
                           contact.setDirectManager(directManager.getUserOid());
                       }else{
                           fail.append("員工上級領導不存在!上級領導的工號爲:" + e1.getDirectManager());
                           failCheck = true;
                       }

                        contact.setId(id);
                        contact.setVersionNumber(versionNumber);
                        contact.setStatus("Y".equals(e1.getOnJob()) ? 1001 : 1003);
                        if ("N".equals(e1.getOnJob())) {
                            contact.setEmployeeId(contact.getEmployeeId() + "_LEAVED");
                            userClient.updateUserLeaveOffice(contact.getUserId());
                        }
                        Company contactCompany = companyService.selectOne(new EntityWrapper<Company>().eq("company_code", e1.getCompanyCode()));
                        if (contactCompany != null) {
                            contact.setCompanyId(contactCompany.getId());
                        } else {
                            XxlJobLogger.log("員工的公司信息更新失敗:" + e.getCompanyCode() + "對應的公司不存在!");
                        }
                        contactService.updateById(contact);
                        //更新base表裏的數據
                        UserCO user = new UserCO();
                        //保存至User表,以保證新增的用戶可以登錄進來
                        user.setLogin(e1.getEmployeeCode());
                        user.setLanguage(OrgInformationUtil.getCurrentLanguage());
                        user.setTenantId(0L);
                        user.setPhoneNumber(null);
                        user.setEmail(e1.getEmail());
                        user.setUserName(e1.getFullName());
                        user.setRemark(null);
                        user.setTenantId(0L);
                        user.setLanguage("zh_cn");
                        user.setId(contact.getUserId());
                        try {
                            user = hcfOrganizationInterface.saveUser(user);
                            //更新完成
                        } catch (Exception error) {

                        }
                        //更新用戶部門表裏的部門
                        DepartmentUser departmentUser = departmentUserService.selectOne(new EntityWrapper<DepartmentUser>().eq("user_id", contact.getUserId()));
                        if (departmentUser != null) {
                            Department department = departmentService.selectOne(new EntityWrapper<Department>().eq("department_code", e1.getDepartmentCode()));
                            if (department != null) {
                                departmentUser.setDepartmentId(department.getId());
                            }
                            departmentUserService.updateByUserId(departmentUser);
                        }
                        updateContacts.add(contact);
                        XxlJobLogger.log("提示:員工" + e1.getEmployeeCode() + "已經存在!數據將會發生更新");
                        if (failCheck!=true){
                            e.setStatus("U");
                        }
                    }
                }
                if (failCheck == true) {
                    failNum++;
                } else {
                    successNum++;
                }
                //發郵件
                senEmail(failCheck, map, toEmails, fail.toString(), e);
                //清空失敗原因
                fail.setLength(0);
                baseMapper.updateStatusById(e.getId(), e.getStatus());
                //更新崗位表的狀態
                baseMapper.updatePositionStatusByEmoloyeeCode(e.getEmployeeCode(), e.getStatus());
                //恢復
                failCheck=false;
            }

        }
        ResultDTO resultDTO=new ResultDTO();
        resultDTO.setFailNum(failNum);
        resultDTO.setSuccessNum(successNum);
        resultDTO.setTotalNum(failNum+successNum);
        return resultDTO ;
    }

    private void senEmail(Boolean failCheck, Map<String,String> info, List<SysCodeValueCO> maps,String fail,EmployeeInfoDTO e) {
        //發郵件

        StringBuilder emailTo=new StringBuilder();
        if (CollectionUtils.isNotEmpty(maps)){
            for (SysCodeValueCO co:maps){
                emailTo.append(co.getValue()+",");
            }
        }
        String header="";
        String subject="";
        if (!failCheck){
            //插入成功需要給系統管理員發郵件
            if ("N".equals(e.getStatus())){
                e.setStatus("Y");
            }
            subject="費控系統員工信息新增或變更(成功)";
            header="<![CDATA[<html><head></head><body><h2>費控系統員工信息新增或變更(成功)!您好,費控系統已接收新員工信息數據,請系統管理員通知相關用戶進行後續信息新增,新增或變更員工信息數據如下:</h2>";
        }else{
            //插入失敗
            subject="費控系統員工信息新增或變更(失敗)";
            header="<![CDATA[<html><head></head><body><h2>費控系統員工信息新增或變更(失敗)!您好,費控系統接收新員工信息數據失敗,請系統管理員通知相關用戶進行後續信息處理,新增或變更員工信息數據如下:</h2>";
            if ("N".equals(e.getStatus())){
                //同時回滾已經插入的數據記錄,更新不回滾
                e.setStatus("F");
                deleteAllData(e.getEmployeeCode());
            }
        }
        emailUtil.sendEmail(subject,header,info,emailTo.toString(),fail);
    }

    private void deleteAllData(String employeeCode) {

        //根據用戶id來刪除base,contact,departmentUser表

       UserCO user= baseMapper.selectUserByCode(employeeCode);
       if (user!=null){
            Long userId=user.getId();
             baseMapper.deleleteUser(user.getLogin());
           //刪除員工表數據
           Contact contact= contactService
                   .selectOne(new EntityWrapper<Contact>().eq("employee_id",employeeCode));
           if (contact!=null){
              contactService.delete(contact.getId());
           }
           //刪除員工部門表
           DepartmentUser departmentUser=departmentUserService.selectOne(new EntityWrapper<DepartmentUser>().eq("user_id",userId));
           if (departmentUser == null) {
               departmentUserService.deleteById(departmentUser);
           }
           //刪除雙崗位表的數據
           DoublePosition doublePosition= doublePositionService.selectOne(new EntityWrapper<DoublePosition>().eq("user_id",userId));
           if (doublePosition!=null){
               doublePositionService.delete(doublePosition);
           }

       }

    }

}

 

 

四、配置Job

        根據客戶要求,配置 每天5點,Cron表達式爲:   0 0 5 * * ? *

 

   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章