jiangping
2023-12-18 c18b8f0f12f9c3965fee72ea2ae668c2fc89d908
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java
@@ -4,26 +4,28 @@
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.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.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;
@@ -35,28 +37,31 @@
import java.util.UUID;
/**
 * 海康停车库同步Service实现
 * 海康组织人员通过步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;
    /**
     * 同步海康组织信息
     * @return
     * 同步海康组织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public   void syncOrgData(){
        if(Constants.DEALING_HK_IMG){
        if(Constants.DEALING_HK_ORG){
            return   ;
        }
        Constants.DEALING_HK_IMG =true;
        Constants.DEALING_HK_ORG =true;
        try {
            //查询所有需要同步的企业数据
            String rootOrgId = systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_CODE).getCode();
@@ -64,7 +69,7 @@
                    .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));
                    .orderByAsc(Company::getErpDate));
            if(list ==null || list.size()==0){
                return;
            }
@@ -112,7 +117,7 @@
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            Constants.DEALING_HK_IMG =false;
            Constants.DEALING_HK_ORG =false;
        }
    }
@@ -124,6 +129,7 @@
     */
    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();
@@ -156,10 +162,10 @@
    private OrgAddRequest getOrgAddModel(Company c,String rootOrgId) {
        OrgAddRequest model = new OrgAddRequest();
        model.setOrgIndexCode(HKConstants.RES_INDEX+UUID.randomUUID().toString());
        model.setOrgIndexCode(HKConstants.RES_ORG_INDEX+UUID.randomUUID().toString().replace("-",""));
        model.setOrgName(c.getName());
        model.setOrgCode(c.getCode());
        model.setOrgIndexCode(c.getHkParentId());
//        model.setOrgCode(c.getCode());
        model.setParentIndexCode(c.getHkParentId());
        return  model;
    }
@@ -170,14 +176,20 @@
     * @param date
     */
    private void doHkDeleteOrg(List<Integer> delIds,List<String> delHkIds,  Date date) {
       if(delHkIds.size() == 0){
           return;
       }
        OrgDelRequest request = new OrgDelRequest();
        request.setIndexCodes((String[]) delHkIds.toArray());
        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()){
                    fIds.add(r.getOrgIndexCode());//删除失败的数据集合
                    if(!r.getCode().equals("0x00072001")){
                        //不存在的也算删除成功
                        fIds.add(r.getOrgIndexCode());//删除失败的数据集合
                    }
                }
            }
            //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕)
@@ -195,7 +207,133 @@
     */
    @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;
    }
}