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<Company> list = companyMapper.selectList(new QueryWrapper<Company>()
|
.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<OrgAddRequest> addList = new ArrayList<>();
|
List<Company> updateList = new ArrayList<>();
|
List<Integer> delIds = new ArrayList<>();
|
List<String> 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<Company> updateList, List<OrgAddRequest> addList) {
|
Date date = new Date();
|
|
BaseResponse<OrgOrUserAddResponse> 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<Company>().lambda()
|
.set(Company::getHkStatus,Constants.ONE)
|
.set(Company::getHkDate,date)
|
.set(Company::getHkId,r.getOrgIndexCode())
|
.eq(Company::getId, index) );
|
}
|
}
|
}
|
}
|
}
|
|
private Integer getCompanyId(List<Company> 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<Integer> delIds,List<String> delHkIds, Date date) {
|
if(delHkIds.size() == 0){
|
return;
|
}
|
OrgDelRequest request = new OrgDelRequest();
|
request.setIndexCodes( delHkIds.toArray(new String[]{}));
|
BaseResponse<List<OrgUpdateFailureResponse>> result = HKService.delBatchOrg(request);
|
if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
|
List<String> 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<Company>().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<Member> list = memberMapper.selectList(new QueryWrapper<Member>()
|
.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<UserAddResponse> 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<List<UserDelResponse>> result = HKService.delBatchUser(request);
|
if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
|
List<String> 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<Company>().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;
|
|
}
|
|
|
}
|