k94314517
2024-01-11 9ffa4aac7e3ae6b268dbc3567a0749a9898c3708
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java
@@ -25,16 +25,13 @@
import com.github.yulichang.query.MPJQueryWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
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 org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.*;
/**
 * 海康组织人员通过步Service实现
@@ -46,16 +43,21 @@
public class HkSyncOrgUserServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private MemberRoleMapper memberRoleMapper;
    @Autowired
    private DeviceRoleMapper deviceRoleMapper;
    @Autowired
    private DeviceMapper deviceMapper;
    @Autowired
    private EmpowerMapper empowerMapper;
    @Autowired
    private MemberCardMapper memberCardMapper;
    @Autowired
    private MemberJoinMapper memberMapper;
    @Autowired
    private ERPSyncService erpSyncService;
    @Autowired
    private DeviceMapper deviceMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
@@ -140,7 +142,7 @@
        if(addList!=null &&addList.size()>0){
            //处理新增
            BaseResponse<OrgOrUserAddResponse> result =  HKService.addBatchOrg(addList);
            if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
            if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
                OrgOrUserAddResponse data = result.getData();
                if(data.getSuccesses()!=null && data.getSuccesses().size()>0){
                    //处理新增成功的数据,修改海康同步状态
@@ -163,7 +165,7 @@
            List<String> error = new ArrayList<>();
            for(OrgEditRequest param : editHkList){
                BaseResponse  result =  HKService.editOrg(param);
                if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
                if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
                    success.add(param.getOrgIndexCode());
                }else{
                    error.add(param.getOrgIndexCode());
@@ -198,7 +200,7 @@
    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.setOrgName(c.getName()+HKConstants.RES_ORG_NAME_INDEX);
//        model.setOrgCode(c.getCode());
        model.setParentIndexCode(c.getHkParentId());
        return  model;
@@ -264,6 +266,7 @@
            List<Member> list = memberMapper.selectJoinList(Member.class,new MPJLambdaWrapper<Member>()
                    .selectAll(Member.class )
                    .selectAs(Company::getHkId,Member::getCompanyHkId)
                    .isNotNull(Member::getFaceImg)
                    .leftJoin(Company.class,Company::getId,Member::getCompanyId)
                    .eq(Member::getHkStatus,Constants.ZERO)
                    .orderByAsc(Member::getErpDate));
@@ -282,14 +285,43 @@
            Constants.DEALING_HK_USER =false;
        }
    }
    public static   List<Integer>  getRoleIdByParam(  Member member,DeviceRoleMapper deviceRoleMapper) {
            //查询数据库存在的权限
            List<DeviceRole> deviceRoleList= deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
                    .eq(DeviceRole::getType,Constants.TWO)
                    .exists("(select b.id from member_role b    where b.ROLE_ID = device_role.ID and b.MEMBER_ID="+member.getId()+")"));
            if(CollectionUtils.isNotEmpty(deviceRoleList)){
                List<MemberRole> memberRoleList = new ArrayList<>();
                String ids = "";
                List<Integer> r = new ArrayList<>();
                for (int i = 0; i < deviceRoleList.size(); i++) {
                    DeviceRole deviceRole =deviceRoleList.get(i);
                    if(i>0){
                        ids += ",";
                    }
                    String doorids =deviceRole.getDoorIds();
                    if(StringUtils.isNotBlank(doorids)){
                        String[] ss = doorids.split(",");
                        try {
                            for(String s :ss){
                                r.add(Integer.parseInt(s));
                            }
                        }catch (Exception e){
                            //脏数据不处理
                        }
                    }
                }
                return  r;
            }
        return  null;
    }
    @Transactional
    private boolean dealMemberInfoBiz(Member c, Date date, String path) {
        if( c.getCompanyId() == null){
            //如果没有组织不做处理
            return  false;
        }
        if(StringUtils.isBlank(c.getHkId())){
        if(!Constants.equalsInteger(Constants.ONE,c.getIsdeleted()) && StringUtils.isBlank(c.getHkId())){
            //如果新增同步數據
            dealUserHkAddBiz(c,date,path);
        }else{
@@ -298,6 +330,146 @@
        }
        return  false;
    }
    private void dealMemberRoleEmpower(Member member ) {
        //处理新增的人员卡片数据(与海康同步)
        List<MemberCard> cards = dealMemberHkCard(member);
        dealMemberRoleEmpowerDo(cards,member,deviceRoleMapper,empowerMapper,deviceMapper);
    }
    public static void dealMemberRoleEmpowerDo(List<MemberCard> cards,Member member , DeviceRoleMapper deviceRoleMapper, EmpowerMapper empowerMapper, DeviceMapper deviceMapper) {
        if(cards == null || cards.size() == 0){
            return;
        }
        List<Integer> doorIds = getRoleIdByParam(member,deviceRoleMapper);
        if(doorIds==null || doorIds.size() == 0){
            return;
        }
        if(StringUtils.isBlank(member.getFaceImg())){
            return;
        }
        List<Integer> deviceIds =new ArrayList<>();//新设备编码集合
        List<Empower> list = new ArrayList<>();//新授权记录集合
        if(Constants.equalsInteger(member.getIsdeleted(),Constants.ZERO)
                && Constants.equalsObject(member.getHkStatus(),Constants.ONE)){
            //如果用户是同步海康成功,添加带下发权限(只管理新增或者编辑的)
            List<Device> deviceList = deviceMapper.selectList(new QueryWrapper<Device>().lambda().in(Device::getId,doorIds));
            if(deviceList == null || deviceList.size() == 0){
                return;
            }
            for (Device deviceRole:deviceList) {
                Empower model = new Empower();
                model.setCreateDate(new Date());
                model.setMemberId(member.getId());
                model.setIsdeleted(Constants.ZERO);
                model.setDeviceId(deviceRole.getId());
                model.setSendStatus(Constants.ZERO);
                model.setSendInfo("待同步安防平台");
                model.setRemark("待同步安防平台");
                model.setStartTime(member.getStartTime());
                model.setEndTime(member.getEndTime());
                //默认给于虚拟卡
                model.setCardNos(Constants.VIRTUAL_CARD_INDEX+member.getId());
                model.setSendType(Constants.ZERO);
                //标记最新的授权设备编码集合
                deviceIds.add(deviceRole.getId());
                list.add(model);
            }
        }
        //待移除权限的设备数据授权记录(针对删除和更新丢失的权限,需要同步下发删除权限)
        empowerMapper.update(null,new UpdateWrapper<Empower>().lambda()
                .eq(Empower::getMemberId,member.getId())
                .set(Empower::getIsdeleted,Constants.ONE)
                .eq(Empower::getIsdeleted,Constants.ZERO)
                .notIn(deviceIds.size()>0,Empower::getDeviceId,deviceIds)
                .set(Empower::getSendStatus,Constants.ZERO));
        //导入新增的授权信息
        if(list.size()>0){
            //直接覆盖重复的设备权限,直接删除即可
            empowerMapper.delete(new UpdateWrapper<Empower>().lambda()
                    .eq(Empower::getMemberId,member.getId())
                    .eq(Empower::getIsdeleted,Constants.ZERO)
                    .in(Empower::getDeviceId,deviceIds) );
            empowerMapper.insertBatchSomeColumn(list);
        }
    }
    /**
     * 对人员带开卡数据进行自动开卡操作
     * @param member
     * @return
     */
    private List<MemberCard> dealMemberHkCard(Member member) {
        List<MemberCard> memberCards = memberCardMapper.selectList(new QueryWrapper<MemberCard>().lambda()
                .eq(MemberCard::getMemberId,member.getId())
                .eq(MemberCard::getType,Constants.TWO)
                .eq(MemberCard::getHkStatus,Constants.ZERO)  );
        if(memberCards==null ||  memberCards.size()==0){
            //没有带处理的数据,直接跳过
            return  getNormalCardList(member,memberCardMapper);
        }
        List<Integer> allCodes = new ArrayList<>();
        List<String> doneCodes = new ArrayList<>();
        CardBingdingRequest param = new CardBingdingRequest();
        if(member.getStartTime() !=null && member.getEndTime()!=null){
            param.setStartDate(DateUtil.getISO8601Timestamp(member.getStartTime()));
            param.setEndDate(DateUtil.getISO8601Timestamp(member.getEndTime()));
        }
        param.setCardList(new ArrayList<>());
        for(MemberCard m : memberCards){
            allCodes.add(m.getId());
            if(StringUtils.isBlank(m.getCode())){
                continue;
            }
            CardInfoRequest cr = new CardInfoRequest();
            cr.setCardNo(m.getCode());
            cr.setOrgIndexCode(member.getCompanyHkId());
            cr.setPersonId(member.getHkId());
            cr.setCardType(m.getType());
            param.getCardList().add(cr);
        }
        //处理新增数据
        BaseResponse<List<CardInfoResponse>> result =  HKService.cardBingding(param);
        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE) ){
            if(result.getData()!=null ){
                for(CardInfoResponse r : result.getData()){
                    doneCodes.add(r.getCardNo());
                }
            }
        }
        if(doneCodes.size()>0){
            memberCardMapper.update(null,new UpdateWrapper<MemberCard>().lambda()
                    .eq(MemberCard::getMemberId,member.getId())
                    .eq(MemberCard::getHkStatus,Constants.ZERO)
                    .set(MemberCard::getHkStatus,Constants.ONE)
                    .set(MemberCard::getHkDate,new Date())
                    .set(MemberCard::getRemark,"开卡成功")
                    .in(MemberCard::getCode,doneCodes));
        }
        memberCardMapper.update(null,new UpdateWrapper<MemberCard>().lambda()
                .eq(MemberCard::getMemberId,member.getId())
                .eq(MemberCard::getHkStatus,Constants.ZERO)
                .set(MemberCard::getHkStatus,Constants.TWO)
                .set(MemberCard::getRemark,"开卡失败")
                .set(MemberCard::getHkDate,new Date())
                .notIn(doneCodes.size()>0,MemberCard::getCode,doneCodes)
                .in(MemberCard::getId,allCodes));
       return   getNormalCardList(member,memberCardMapper);
    }
    public static   List<MemberCard> getNormalCardList(Member member,MemberCardMapper memberCardMapper) {
       return memberCardMapper.selectList(new QueryWrapper<MemberCard>().lambda()
                .eq(MemberCard::getMemberId,member.getId())
                .eq(MemberCard::getType,Constants.TWO)
                .eq(MemberCard::getStatus,Constants.MemberCard.normal)
                .eq(MemberCard::getHkStatus,Constants.ONE)  );
    }
    /**
     *  如果之前已经和海康同步,则更新用户数据以及人脸数据(可能新增人脸 也可能更新人脸)
@@ -312,6 +484,9 @@
            boolean r = doHkDeleteUser(c.getId(),c.getHkId(),date);
            c.setHkStatus(r?Constants.ONE:Constants.TWO);
            c.setRemark(r?null:"删除海康人员信息失败!");
            c.setIsdeleted(r? Constants.ONE: Constants.ZERO);//删除失败,恢复数据
            //删除所有绑定的卡片信息
            memberCardMapper.delete(new QueryWrapper<MemberCard>().lambda().eq(MemberCard::getMemberId,c.getId()));
        }else{
            //处理修改数据,并且更新人脸
            UserAddRequest  addHkModel = getUserAddModel(c,path,1);//修改
@@ -334,7 +509,8 @@
                c.setHkStatus(Constants.TWO);
                c.setRemark("人员信息同步安防平台更新失败,请修正后重试!!"+(result!=null?result.getCode()+result.getMsg():""));
            }
            //重新下发权限数据
            dealMemberRoleEmpower(c);
        }
        c.setHkDate(date);
        memberMapper.updateById(c);
@@ -373,6 +549,7 @@
            c.setHkStatus(Constants.ONE);
            c.setHkId(addHkModel.getPersonId());
            memberMapper.updateById(c);
            dealMemberRoleEmpower(c);
            return  true;
        }else{
            noticeErpFail(c,Constants.ZERO,"人员信息同步安防平台失败,请修正后重试!"+result.getCode()+result.getMsg());
@@ -392,7 +569,7 @@
    private String dealMemberFace(Member c,String path) {
        if(StringUtils.isBlank(c.getFaceId())){
            BaseResponse<FaceAddOrEditesponse> response = HKService.addFace(getFaceAddModel(c,path));
            if(StringUtils.equals(response.getCode(),HKConstants.RESPONSE_SUCCEE)&& response.getData()!=null ){
            if(response !=null && StringUtils.equals(response.getCode(),HKConstants.RESPONSE_SUCCEE)&& response.getData()!=null ){
                return  response.getData().getFaceId();
            }
        }else{
@@ -426,12 +603,12 @@
     */
    private boolean doHkDeleteUser(Integer  id,String delHkIds,  Date date ) {
        if(StringUtils.isBlank(delHkIds)){
            return false;
            return true;
        }
        UserDelRequest request = new UserDelRequest();
        request.setPersonIds(new String[]{delHkIds});
        BaseResponse<List<UserDelResponse>> result =  HKService.delBatchUser(request);
        if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
            List<String> fIds = new ArrayList<>();
            //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕)
            if(result.getData()!=null && result.getData().size()>0){