一、 需求分析
1. 根據客戶要求,客戶的hr系統會向我們公司的費控系統提供一個員工、公司、部門的接口的信息,然後我們根據信息來做插入信息和修改信息的操作。
2. 不管是插入還是更新操作,對單筆記錄都要進行記錄操作,同時要給配置的人發送郵件提醒。
3. 不管是新增或變更信息,最後的結果是成功還是失敗,都要發送郵件。
4. 每天5點的時候同步信息接口,自動執行。
二、 表結構分析
客戶提供的接口信息如下:
員工接口表:
數據庫名 | 表名 | 表註釋 | 字段名 | 字段註釋 | 數據類型 | 是否允許爲空 | 示例 | 測試數據 | 備註說明 |
fec_mdata | sys_employee_interface | 員工基本信息接口表 | employee_code | 工號 | varchar(10) | 否 | 01538 | 09998 | HR系統的員工工號 |
full_name | 姓名 | varchar(50) | 否 | 測試 | ZK | ||||
郵箱 | 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 * * ? *