package com.doumee.service.business.impl.hksync.fhk;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.doumee.biz.system.SystemDictDataBiz;
|
import com.doumee.config.DataSyncConfig;
|
import com.doumee.core.constants.ResponseStatus;
|
import com.doumee.core.exception.BusinessException;
|
import com.doumee.core.haikang.model.HKConstants;
|
import com.doumee.core.haikang.model.param.BaseListPageResponse;
|
import com.doumee.core.haikang.model.param.BaseResponse;
|
import com.doumee.core.haikang.model.param.request.TimeRangeListRequest;
|
import com.doumee.core.haikang.model.param.respose.OrgInfoResponse;
|
import com.doumee.core.haikang.model.param.respose.UserInfoResponse;
|
import com.doumee.core.haikang.service.HKService;
|
import com.doumee.core.model.LoginUserInfo;
|
import com.doumee.core.utils.Constants;
|
import com.doumee.core.utils.DESUtil;
|
import com.doumee.core.utils.DateUtil;
|
import com.doumee.dao.business.MemberMapper;
|
import com.doumee.dao.business.dao.CompanyMapper;
|
import com.doumee.dao.business.model.Company;
|
import com.doumee.dao.business.model.Member;
|
import com.doumee.dao.business.vo.CompanyTree;
|
import com.doumee.dao.system.SystemUserMapper;
|
import com.doumee.dao.system.model.SystemUser;
|
import com.doumee.service.business.impl.MemberServiceImpl;
|
import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* 海康组织人员通过步Service实现(自行维护情况)
|
* @author 江蹄蹄
|
* @date 2023/11/30 15:33
|
*/
|
@Service
|
@Slf4j
|
public class HkSyncOrgUserFromSelfServiceImpl extends HkSyncBaseServiceImpl {
|
@Autowired
|
private CompanyMapper companyMapper;
|
|
@Autowired
|
private SystemDictDataBiz systemDictDataBiz;
|
@Autowired
|
private MemberMapper memberMapper;
|
@Autowired
|
private SystemUserMapper systemUserMapper;
|
|
@Autowired
|
private DataSyncConfig dataSyncConfig;
|
|
@Autowired
|
private RedisTemplate<String, Object> redisTemplate;
|
|
/**
|
* 同步海康组织信息到业务系统
|
*/
|
@Override
|
@Transactional
|
public void syncOrgData(LoginUserInfo user ){
|
if(Constants.DEALING_HK_ORG){
|
return ;
|
}
|
Constants.DEALING_HK_ORG =true;
|
try {
|
if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.self){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
|
}
|
TimeRangeListRequest param = null;
|
//获取ERP组织信息(全量同步)
|
boolean hasNext = true;
|
int curTotal = 0;
|
int curPage = 1;
|
|
List<Company> allHkList = new ArrayList<>();
|
while (hasNext){
|
//分页遍历循环查询所有门禁设备数据
|
param = new TimeRangeListRequest();
|
param.setPageNo(curPage);
|
param.setPageSize(100);
|
BaseResponse<BaseListPageResponse<OrgInfoResponse>> response = HKService.orgAllList(param);
|
if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
|
throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
|
}
|
if(response.getData() == null || response.getData().getTotal() ==0){
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
|
}
|
BaseListPageResponse<OrgInfoResponse> r = response.getData();
|
curTotal += 100;
|
if(curTotal >= r.getTotal()){
|
hasNext = false;
|
}
|
if(r.getList() == null || r.getList().size()==0){
|
hasNext =false;
|
}else{
|
allHkList.addAll(getNewOrgModelBYList(r.getList(),user.getId()));
|
}
|
curPage++;
|
}
|
if(allHkList .size() == 0){
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何组织信息!");
|
}
|
companyMapper.delete(new UpdateWrapper<>());//清空原有数据
|
companyMapper.update(null,new UpdateWrapper<Company>().lambda()
|
.eq(Company::getType,Constants.ONE)
|
.eq(Company::getIsdeleted,Constants.ZERO)
|
.set(Company::getIsdeleted,Constants.ONE));//清空原有数据
|
companyMapper.insert(allHkList);//插入新数据
|
dealTreePathInfo(allHkList);//处理树形结果数据
|
}catch (BusinessException e){
|
throw e;
|
}catch (Exception e){
|
throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
|
}finally {
|
Constants.DEALING_HK_ORG =false;
|
}
|
}
|
|
private void dealTreePathInfo(List<Company> allHkList) {
|
List<Company> tree = new CompanyTree(allHkList,DataSyncConfig.origin.hk).buildTree();
|
if(tree!=null || tree.size()>0){
|
for(Company t : tree){
|
t.setCompanyPath(t.getId()+"/");
|
t.setCompanyNamePath(t.getName());
|
companyMapper.updateById(t);
|
dealChildParentId(t,t.getChildList());
|
}
|
}
|
}
|
|
private void dealChildParentId(Company t, List<Company> childList) {
|
if(childList ==null || childList.size()==0){
|
return;
|
}
|
for(Company c : childList){
|
c.setParentId(t.getId());
|
c.setCompanyPath(t.getCompanyPath()+c.getId()+"/");
|
c.setCompanyNamePath(t.getCompanyNamePath()+"/"+c.getName());
|
companyMapper.updateById(c);
|
if(t.getChildList()!=null || t.getChildList().size()==0){
|
//递归处理子集
|
dealChildParentId(c,c.getChildList());
|
}
|
}
|
}
|
|
private List<Company> getNewOrgModelBYList(List<OrgInfoResponse> list, Integer userid) {
|
List<Company> newList = new ArrayList<>();
|
if(list == null || list.size()==0){
|
return newList;
|
}
|
for(OrgInfoResponse model :list){
|
Company c = new Company();
|
c.setHkId(model.getOrgIndexCode());
|
c.setCode(model.getOrgNo());
|
c.setName(model.getOrgName());
|
c.setHkStatus(Constants.ONE);
|
c.setHkDate(new Date());
|
c.setIsdeleted(Constants.ZERO);
|
c.setCreateDate(c.getHkDate());
|
c.setEditDate(DateUtil.getISO8601DateByStr(model.getUpdateTime()));
|
c.setCreator(userid);
|
c.setEditor(userid);
|
c.setStatus(Constants.ZERO);
|
c.setType(Constants.ONE);
|
if(!StringUtils.equals(model.getOrgIndexCode(),systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_CODE).getCode())){
|
c.setHkParentId(model.getParentOrgIndexCode());
|
}
|
newList.add(c);
|
}
|
return newList;
|
}
|
|
/**
|
* 同步海康人员信息
|
* @return
|
*/
|
@Override
|
public void syncUserData(LoginUserInfo user){
|
if(Constants.DEALING_HK_USER){
|
return ;
|
}
|
Constants.DEALING_HK_USER =true;
|
try {
|
if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.self){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
|
}
|
List<Company> companies = companyMapper.selectList(new QueryWrapper<>());
|
if(companies == null || companies.size() == 0){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,请先同步企业组织信息~");
|
}
|
TimeRangeListRequest param = new TimeRangeListRequest();
|
//获取ERP组织信息(全量同步)
|
boolean hasNext = true;
|
int curTotal = 0;
|
int curPage = 1;
|
List<Member> allHkList = new ArrayList<>();
|
List<SystemUser> allUserList = new ArrayList<>();
|
while (hasNext){
|
//分页遍历循环查询所有门禁设备数据
|
param = new TimeRangeListRequest();
|
param.setPageNo(curPage);
|
param.setPageSize(100);
|
BaseResponse<BaseListPageResponse<UserInfoResponse>> response = HKService.userAllList(param);
|
if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
|
throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
|
}
|
if(response.getData() == null || response.getData().getTotal() ==0){
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
|
}
|
BaseListPageResponse<UserInfoResponse> r = response.getData();
|
curTotal += 100;
|
if(curTotal >= r.getTotal()){
|
hasNext = false;
|
}
|
if(r.getList() == null || r.getList().size()==0){
|
hasNext =false;
|
}else{
|
allHkList.addAll(getNewUserModelBYList(r.getList(),companies,user.getId()));
|
}
|
curPage++;
|
}
|
if(allHkList .size() == 0){
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何组织信息!");
|
}
|
memberMapper.update(null,new UpdateWrapper<Member>().lambda()
|
.eq(Member::getType,Constants.TWO)
|
.eq(Member::getIsdeleted,Constants.ZERO)
|
.set(Member::getIsdeleted,Constants.ONE));//清空原有数据
|
systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
|
.eq(SystemUser::getType,Constants.TWO)
|
.eq(SystemUser::getDeleted,Boolean.FALSE)
|
.set(SystemUser::getDeleted,Boolean.TRUE));//清空原有数据
|
memberMapper.insert(allHkList);//插入新数据
|
for(Member c :allHkList){
|
allUserList.add(MemberServiceImpl.createSystemUser(c,systemDictDataBiz));//创建登陆账号
|
}
|
systemUserMapper.insert(allUserList);
|
}catch (BusinessException e){
|
throw e;
|
}catch (Exception e){
|
throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
|
}finally {
|
Constants.DEALING_HK_USER =false;
|
}
|
}
|
|
private List<Member> getNewUserModelBYList(List<UserInfoResponse> list, List<Company> companies,Integer userid) {
|
List<Member> newList = new ArrayList<>();
|
if(list == null || list.size()==0){
|
return newList;
|
}
|
for(UserInfoResponse model :list){
|
Member c = new Member();
|
String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,model.getCertificateNo());
|
c.setIdcardNo(encryptIdNo);
|
c.setIdcardDecode(Constants.getTuominStr(model.getCertificateNo()));
|
c.setIdcardType(getIdcardTypeByHk(model.getCertificateType()));
|
c.setCode(model.getJobNo());
|
c.setPhone(model.getPhoneNo());
|
c.setHkId(model.getPersonId());
|
c.setName(model.getPersonName());
|
c.setHkStatus(Constants.ONE);
|
c.setHkDate(new Date());
|
c.setCanVisit(Constants.ZERO);
|
c.setWorkStatus(Constants.ZERO);
|
c.setHighCheckor(Constants.ZERO);
|
c.setSex(model.getGender());
|
c.setIsdeleted(Constants.ZERO);
|
c.setCreateDate(c.getHkDate());
|
c.setEditDate(DateUtil.getISO8601DateByStr(model.getUpdateTime()));
|
c.setCreator(userid);
|
c.setEditor(userid);
|
c.setStatus(Constants.ZERO);
|
c.setType(Constants.TWO);
|
c.setCompanyId(getCompanyId(companies,model.getOrgIndexCode()));
|
if(model.getPersonPhoto()!=null && model.getPersonPhoto().size()>0){
|
c.setFaceId(model.getPersonPhoto().get(0).getPersonPhotoIndexCode());
|
c.setFaceImg(HKConstants.IMG_INDEX+model.getPersonPhoto().get(0).getPicUri());
|
c.setFaceServerIndexCode(model.getPersonPhoto().get(0).getServerIndexCode());
|
c.setFaceStatus(Constants.ONE);
|
}
|
newList.add(c);
|
}
|
return newList;
|
}
|
|
private Integer getCompanyId(List<Company> companies, String orgIndexCode) {
|
if(companies == null){
|
return null;
|
}
|
for(Company c : companies){
|
if(StringUtils.equals(c.getHkId(),orgIndexCode)){
|
return c.getId();
|
}
|
}
|
return null;
|
}
|
|
/**
|
* //证件类型111:身份证414:护照113:户口簿335:驾驶证131:工作证133:学生证990:其他 ;
|
* // 证件类型 0身份证 1港澳证件 2护照
|
* @param certificateType
|
* @return
|
*/
|
private Integer getIdcardTypeByHk(Integer certificateType) {
|
if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.SHENFENZHENG.getKey())){
|
return 0;
|
}else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.HUZHAO.getKey())){
|
return 2;
|
}else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.JIASHIZHENG.getKey())){
|
return 3;
|
}else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.XUESHENGZHENG.getKey())){
|
return 4;
|
}else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.GONGXUOZHENG.getKey())){
|
return 5;
|
}else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.GONGXUOZHENG.getKey())){
|
return 6;
|
}else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.HUKOUBEN.getKey())){
|
return 7;
|
}else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.QITA.getKey())){
|
return 8;
|
}
|
return null;
|
}
|
|
}
|