package com.doumee.service.business.impl.hksync; 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.core.constants.ResponseStatus; import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest; import com.doumee.core.exception.BusinessException; import com.doumee.core.haikang.model.HKConstants; import com.doumee.core.haikang.model.HKTools; import com.doumee.core.haikang.model.param.BaseResponse; import com.doumee.core.haikang.model.param.request.*; import com.doumee.core.haikang.model.param.respose.*; import com.doumee.core.haikang.service.HKService; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.ImageBase64Util; import com.doumee.dao.business.CompanyMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.ParksMapper; import com.doumee.dao.business.join.CompanyJoinMapper; import com.doumee.dao.business.model.Company; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Parks; import com.doumee.service.business.ERPSyncService; import com.github.yulichang.query.MPJQueryWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.checkerframework.checker.units.qual.C; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; /** * 海康组织人员通过步Service实现 * @author 江蹄蹄 * @date 2023/11/30 15:33 */ @Service @Slf4j public class HkSyncOrgUserServiceImpl extends HkSyncBaseServiceImpl { @Autowired private CompanyMapper companyMapper; @Autowired private MemberMapper memberMapper; @Autowired private ERPSyncService erpSyncService; @Autowired private SystemDictDataBiz systemDictDataBiz; /** * 同步海康组织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息 */ @Override public void syncOrgData(){ if(Constants.DEALING_HK_ORG){ return ; } Constants.DEALING_HK_ORG =true; try { //查询所有需要同步的企业数据 String rootOrgId = systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_CODE).getCode(); List list = companyMapper.selectList(new QueryWrapper() .select("*,(select b.hk_id from company b where company.erp_parent_id = b.id limit 1) as hkParentId") .lambda() .eq(Company::getHkStatus,Constants.ZERO) .orderByAsc(Company::getErpDate)); if(list ==null || list.size()==0){ return; } Date date = new Date(); List addList = new ArrayList<>(); List updateList = new ArrayList<>(); List delIds = new ArrayList<>(); List delHKIds = new ArrayList<>(); for(Company c : list){ if(StringUtils.isBlank(c.getErpParentId())){ //如果是erp顶层组织,默认再海康根组织下创建组织 c.setHkParentId(rootOrgId); } if(StringUtils.isBlank(c.getHkParentId())){ //如果上级海康部门还没同步,则此次不处理 continue; } if(StringUtils.isBlank(c.getHkId())){ //如果新增同步數據 if(Constants.equalsInteger(Constants.ONE,c.getIsdeleted())){ //删除的组织,不做处理,海康状态更新为不处理,下次不再处理这个记录 c.setHkStatus(Constants.TWO); companyMapper.updateById(c); continue ; } OrgAddRequest m = getOrgAddModel(c,rootOrgId); addList.add(m); c.setHkId(m.getOrgIndexCode()); updateList.add(c); }else{ //删除的数据,进行删除 delIds.add(c.getId()); delHKIds.add(c.getHkId()); //删除海康原有的数据,再新增组织 OrgAddRequest m = getOrgAddModel(c,rootOrgId); addList.add(m); c.setHkId(m.getOrgIndexCode()); updateList.add(c); } } //处理删除数据 doHkDeleteOrg(delIds,delHKIds,date); //处理新增数据 doHkAddOrg(updateList,addList); }catch (Exception e){ e.printStackTrace(); }finally { Constants.DEALING_HK_ORG =false; } } /** * 处理批量新增的海康数据,更新同步数据状态 * @param updateList * @param addList */ private void doHkAddOrg(List updateList, List addList) { Date date = new Date(); BaseResponse result = HKService.addBatchOrg(addList); if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){ OrgOrUserAddResponse data = result.getData(); if(data.getSuccesses()!=null && data.getSuccesses().size()>0){ //处理新增成功的数据,修改海康同步状态 for(OrgOrUserAddSuccessResponse r :data.getSuccesses()){ Integer index = getCompanyId(updateList,r.getOrgIndexCode()); if(index!=null){ companyMapper.update(null,new UpdateWrapper().lambda() .set(Company::getHkStatus,Constants.ONE) .set(Company::getHkDate,date) .set(Company::getHkId,r.getOrgIndexCode()) .eq(Company::getId, index) ); } } } } } private Integer getCompanyId(List updateList, String orgIndexCode) { if(updateList!=null && StringUtils.isNotBlank(orgIndexCode)){ for(Company c : updateList){ if(StringUtils.equals(c.getHkId(),orgIndexCode)){ return c.getId(); } } } return null; } private OrgAddRequest getOrgAddModel(Company c,String rootOrgId) { OrgAddRequest model = new OrgAddRequest(); model.setOrgIndexCode(HKConstants.RES_ORG_INDEX+UUID.randomUUID().toString().replace("-","")); model.setOrgName(c.getName()); // model.setOrgCode(c.getCode()); model.setParentIndexCode(c.getHkParentId()); return model; } /** * 对海康删除组织信息 * @param delIds * @param date */ private void doHkDeleteOrg(List delIds,List delHkIds, Date date) { if(delHkIds.size() == 0){ return; } OrgDelRequest request = new OrgDelRequest(); request.setIndexCodes( delHkIds.toArray(new String[]{})); BaseResponse> result = HKService.delBatchOrg(request); if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){ List fIds = new ArrayList<>(); if(result.getData()!=null){ for(OrgUpdateFailureResponse r : result.getData()){ if(!r.getCode().equals("0x00072001")){ //不存在的也算删除成功 fIds.add(r.getOrgIndexCode());//删除失败的数据集合 } } } //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕) companyMapper.update(null,new UpdateWrapper().lambda() .set(Company::getHkStatus,Constants.ONE) .set(Company::getHkDate,date) .in(Company::getId, delIds) .notIn(fIds.size()>0,Company::getHkId, fIds)); } } /** * 同步海康人员信息 * @return */ @Override public void syncUserData(){ if(Constants.DEALING_HK_USER){ return ; } Constants.DEALING_HK_USER =true; try { //查询所有需要同步的企业数据 List list = memberMapper.selectList(new QueryWrapper() .lambda() .eq(Member::getHkStatus,Constants.ZERO) .orderByAsc(Member::getErpDate)); if(list ==null || list.size()==0){ return; } Date date = new Date(); String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode(); for(Member c : list){ if( c.getCompanyId() == null){ //如果没有组织不做处理 continue; } UserAddRequest addHkModel = new UserAddRequest(); if(StringUtils.isBlank(c.getHkId())){ //如果新增同步數據 if(Constants.equalsInteger(Constants.ONE,c.getIsdeleted())){ //删除的组织,不做处理,海康状态更新为不处理,下次不再处理这个记录 c.setHkStatus(Constants.TWO); memberMapper.updateById(c); continue ; } addHkModel = getUserAddModel(c,path); c.setHkId(addHkModel.getPersonId()); }else{ //删除海康原有的数据,再新增组织 addHkModel = getUserAddModel(c,path); c.setHkId(addHkModel.getPersonId()); } if(addHkModel == null){ //如果人脸数据不正确,下载失败等原因 noticeErpFail(c,Constants.ZERO,"人脸照片不存在,获取失败!"); continue; } //处理删除数据(删除之前下发的海康人员信息,然后新增) doHkDeleteUser(c.getId(),c.getHkId(),date); //处理新增数据 BaseResponse result = HKService.addUser(addHkModel); if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE) && result.getData()!=null){ c.setFaceId(result.getData().getFaceId()); memberMapper.updateById(c); }else{ noticeErpFail(c,Constants.ZERO,"人员信息同步安防平台失败,请修正后重试!"+result.getCode()+result.getMsg()); } } }catch (Exception e){ e.printStackTrace(); }finally { Constants.DEALING_HK_USER =false; } } /** * 通知erp系统,人员下发同步信息状态失败 * @param c * @param type * @param s */ private void noticeErpFail(Member c, int type, String s) { UserFailRequest r = new UserFailRequest(); r.setUserId(c.getErpId()); r.setInfo(s); r.setType(type); //通知ERP人脸数据不正确 erpSyncService.noticeUserFail(r); } /** * 对海康删除组织信息 * @param id * @param date */ private void doHkDeleteUser(Integer id,String delHkIds, Date date) { if(StringUtils.isBlank(delHkIds)){ return; } UserDelRequest request = new UserDelRequest(); request.setPersonIds(new String[]{delHkIds}); BaseResponse> result = HKService.delBatchUser(request); if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){ List fIds = new ArrayList<>(); if(result.getData()!=null && result.getData().size()>0){ log.info("海康删除用户失败:==============="+result.getData().get(0).getPersonId()); /* for(UserDelResponse r : result.getData()){ if(!r.getCode().equals("0x00072001")){ //不存在的也算删除成功 fIds.add(r.getPersonId());//删除失败的数据集合 } }}*/ }else{ //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕) companyMapper.update(null,new UpdateWrapper().lambda() .set(Company::getHkStatus,Constants.ONE) .set(Company::getHkDate,date) .in(Company::getId, id)); } } } private UserAddRequest getUserAddModel(Member c,String path) { UserAddRequest model = new UserAddRequest(); model.setOrgIndexCode(c.getCompanyHkId()); model.setPersonId(HKConstants.RES_USER_INDEX+UUID.randomUUID().toString().replace("-", "")); model.setGender(Constants.formatIntegerNum(c.getSex())+""); model.setPersonName(c.getName()); if(StringUtils.isNotBlank(c.getFaceImg())){ model.setFaces(new ArrayList<>()); UserAddFaceRequest face = new UserAddFaceRequest(); String imageBase = ImageBase64Util.Image2Base64(path+c.getFaceImg()); if(face.getFaceData() == null){ //人脸数据不正确, return null; } model.getFaces().add(face); } return model; } }