jiangping
2023-12-18 c18b8f0f12f9c3965fee72ea2ae668c2fc89d908
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
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.erp.model.openapi.request.erp.UserFailRequest;
import com.doumee.core.haikang.model.HKConstants;
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.DeviceRoleMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.VisitsMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.DeviceRole;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Visits;
import com.doumee.service.business.ERPSyncService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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 HkSyncVisitServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private VisitsJoinMapper visitsMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private DeviceRoleMapper deviceRoleMapper;
 
    /**
     * 同步海康组织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public  void syncVisitData(){
        if(Constants.DEALING_HK_VISIT){
            return   ;
        }
        Constants.DEALING_HK_VISIT =true;
        List<DeviceRole> roleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
                .eq(DeviceRole::getType, Constants.ONE));
        //标记是否走免登记预约
        String applyType =systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.MDJ_VISIT_REQUIRED).getCode();
        String applyLwType =systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.MDJ_LW_REQUIRED).getCode();
        try {
            //查询所有需要同步的数据
            List<Visits> alllist = getVisitList();
            //按照父级申请分批处理每次申请数据
            List<Visits> list = getParentList(alllist);
            if(list ==null || list.size()==0){
                return;
            }
            Date date = new Date();
            for(Visits c : list) {
                //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段
                String type = Constants.equalsInteger(c.getType(),Constants.ONE)?applyType:applyLwType;
                getUpdateModelByResponse(c,date,type,roleList);
                visitsMapper.updateById(c);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            Constants.DEALING_HK_VISIT =false;
        }
    }
 
    private List<Visits> getParentList(List<Visits> alllist) {
        if(alllist ==null || alllist.size()==0){
            return null;
        }
        List<Visits> list = new ArrayList<>();
 
        for (Visits v : alllist){
            if(v.getParentId() == null){
                v.setVisitsList(getChildListByParentId(v.getId(),alllist));
                list.add(v);
            }
        }
        return  list;
    }
 
    private List<Visits> getChildListByParentId(Integer id, List<Visits> alllist) {
 
        List<Visits> list = new ArrayList<>();
 
        for (Visits v : alllist){
            if(Constants.equalsInteger(v.getParentId(),id)){
                list.add(v);
            }
        }
        return  list;
    }
 
    /**
     * 根据预约返回接口封装申请记录更新字段
     * @param c
     * @param date
     * @param type 0需要登记 1免登记
     */
    private void getUpdateModelByResponse(  Visits c,Date date,String type,List<DeviceRole> roleList ) {
        String code = null;
        String id = null;
        //发起海康预约接口
        if(StringUtils.equals(type,"0")){
            //(需要登记)
            BaseResponse<VisitAppointmentResponse> response =  HKService.visitAppiontment(getHkRequestPara(c,roleList));
        }else{
            //免登记
            BaseResponse<VisitAppointmentMDJResponse> response = HKService.visitAppiontmentMDJ(getHkMDJRequestPara(c) );
        }
 
        if (code!= null && id!=null) {
            //海康下发成功
            c.setHkId( id);//预约标识
            c.setStatus(Constants.VisitStatus.xfSuccess);//下发海康成功
        } else {
            //海康下发成功
            c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败
        }
        c.setHkStatus(Constants.ONE);
        c.setHkDate(date);
    }
 
    private VisitAppointmentMDJRequest getHkMDJRequestPara(Visits c) {
        return  null;
    }
 
    private VisitAppointmentRequest getHkRequestPara(Visits c,List<DeviceRole> roleList ) {
        VisitAppointmentRequest request = new VisitAppointmentRequest();
        request.setVisitStartTime(DateUtil.getISO8601Timestamp(c.getStarttime()));
        request.setVisitEndTime(DateUtil.getISO8601Timestamp(c.getEndtime()));
        request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码
        request.setVisitPurpose(c.getReason());
        request.setVisitorPermissionSet(new VisitAppointmentPermissonRequest());
        //获取权限组集合
        String[] roles = getHkRoles(c.getDoors(),roleList);
        if(roles==null || roles.length ==0){
            //使用默认访客权限组
            request.getVisitorPermissionSet().setDefaultPrivilegeGroupFlag(Constants.ONE+"");
        }else{
            //指定有效海康访客权限组数据
            request.getVisitorPermissionSet().setDefaultPrivilegeGroupFlag(Constants.ZERO+"");
            request.getVisitorPermissionSet().setPrivilegeGroupIds(roles);
        }
        List<VisitAppointmentVistorRequest> infolist = new ArrayList<>();
        //申请人
        infolist.add(getRequestInfoByVisit(c));
        if(c.getVisitsList() != null){
            //随访人
            for(Visits v : c.getVisitsList()){
                infolist.add(getRequestInfoByVisit(v));
            }
        }
        request.setVisitorInfoList(infolist);
        return  request;
    }
 
    private VisitAppointmentVistorRequest getRequestInfoByVisit(Visits c) {
        VisitAppointmentVistorRequest info = new VisitAppointmentVistorRequest();
        info.setVisitorName(c.getName());
        info.setVisitorWorkUnit(c.getCompanyName());
        info.setPhoneNo(c.getPhone());
 
        return info;
    }
 
    private String[] getHkRoles(String doors, List<DeviceRole> roleList) {
        if(StringUtils.isBlank(doors) || roleList.size()==0|| roleList.size()==0){
            return null;
        }
        String[] ids = doors.split(",");
        List<String> roles = new ArrayList<>();
        for (String s : ids){
            for(DeviceRole r : roleList){
                if(StringUtils.isNotBlank(r.getHkId()) && StringUtils.equals(s,r.getId().toString())){
                    roles.add(r.getHkId());
                }
            }
        }
        return  roles.toArray(new String[]{});
    }
 
    /**
     * 查询所有需要同步的数据
     * @return
     */
    private List<Visits> getVisitList() {
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Visits.class);
        queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName)
                .select("t1.hk_id as receptMemberHkId")
                .leftJoin(Member.class,Member::getId,Visits::getReceptMemberId);
        queryWrapper.eq(Visits::getStatus,Constants.VisitStatus.pass)//审批通过
                .eq(Visits::getHkStatus,Constants.ZERO)//未同步到海康
                .orderByAsc(Visits::getCreateDate);
        List<Visits> list = visitsMapper.selectJoinList(Visits.class,queryWrapper);
        return list;
    }
 
}