| 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.service.business.third.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.dao.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; | 
|     } | 
|   | 
| } |