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.MemberService; 
 | 
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.apache.shiro.SecurityUtils; 
 | 
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; 
 | 
    } 
 | 
  
 | 
} 
 |