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.exception.BusinessException; import com.doumee.core.haikang.model.HKConstants; import com.doumee.core.haikang.model.param.BaseResponse; import com.doumee.core.haikang.model.param.request.OrgAddRequest; import com.doumee.core.haikang.model.param.request.OrgDelRequest; import com.doumee.core.haikang.model.param.request.ParkListRequest; import com.doumee.core.haikang.model.param.respose.OrgOrUserAddResponse; import com.doumee.core.haikang.model.param.respose.OrgOrUserAddSuccessResponse; import com.doumee.core.haikang.model.param.respose.OrgUpdateFailureResponse; import com.doumee.core.haikang.model.param.respose.ParkListResponse; import com.doumee.core.haikang.service.HKService; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.dao.business.CompanyMapper; 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.Parks; import com.github.yulichang.query.MPJQueryWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; 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 public class HkSyncOrgUserServiceImpl extends HkSyncBaseServiceImpl { @Autowired private CompanyMapper companyMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; /** * 同步海康组织信息 * @return */ @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) .orderByDesc(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_INDEX+UUID.randomUUID().toString()); model.setOrgName(c.getName()); model.setOrgCode(c.getCode()); model.setOrgIndexCode(c.getHkParentId()); return model; } /** * 对海康删除组织信息 * @param delIds * @param date */ private void doHkDeleteOrg(List delIds,List delHkIds, Date date) { OrgDelRequest request = new OrgDelRequest(); request.setIndexCodes((String[]) delHkIds.toArray()); 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()){ 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(){ } }