wang-hao-jie
2022-08-25 57dcc73636bb7d8dce89c808eb8cc988a7512264
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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
package com.ruoyi;
 
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.IdUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.station.domain.*;
import com.ruoyi.station.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
 
@RestController
@RequestMapping("iclock/")
public class AllController {
 
    @Autowired
    private IMjWorkUserService workUserService;
    @Autowired
    private IMjHeadsUsersService headsUsersService;
    @Autowired
    private IMjWorkOrderService workOrderService;
    @Autowired
    private IMjUserAxService userAxService;
    @Autowired
    private IMjFingerprintReadHeadService fingerprintReadHeadService;
    @Autowired
    private IMjDoorService doorService;
    @Autowired
    private IMjOpenHnweService openHnweService;
    @Autowired
    private IMjVisitLogService visitLogService;
    @Autowired
    private IMjStatisticService statisticService;
 
    //判断是否开这个门。
    //@RequestMapping(value = "/open")
    public int open(String userId,String ip){
        int openNum = 0;
//        MjVisitLog visitLog3 = new MjVisitLog();
//        visitLog3.setId(IdUtils.fastSimpleUUID());
//        visitLog3.setUserName(userId+" "+ip);
//        visitLog3.setDelFlag(1);
//        visitLogService.insertMjVisitLog(visitLog3);
//        MjWorkUser workUser = new MjWorkUser();
//        workUser.setUserId(userId);
        MjWorkUser mjWorkUsers = workUserService.selectMjWorkUserById(Long.valueOf(userId));
 
        MjFingerprintReadHead fingerprintReadHead = new MjFingerprintReadHead();
        fingerprintReadHead.setIpOrOther(ip);
        List<MjFingerprintReadHead> mjFingerprintReadHeads = fingerprintReadHeadService.selectMjFingerprintReadHeadList(fingerprintReadHead);
        if(mjFingerprintReadHeads.size()==0){
            return -1;
        }
        String headId = mjFingerprintReadHeads.get(0).getId();
        if(StringUtils.isEmpty(headId)){
            //System.out.println("没找到读头");
            return -1;
        }
 
        if(mjWorkUsers!=null){
            MjHeadsUsers mjHeadsUsers = new MjHeadsUsers();
            mjHeadsUsers.setUserId(Long.valueOf(mjWorkUsers.getId()));
            mjHeadsUsers.setHeadId(headId);
            List<MjHeadsUsers> mjHeadsUsers1 = headsUsersService.selectMjHeadsUsersList(mjHeadsUsers);//找到读头用户表中的
 
            int flag1=0;
            int flag2=0;
            for(MjHeadsUsers user:mjHeadsUsers1){
                if(user.getAuthorizeType()==1){//如果是临时授权
                    flag1++;
                    if(user.getMainUser()==1){//如果是负责人
                        flag2++;
                    }
                }
            }
            if(flag2>0){//有A权限,则不考虑组授权
                int flag2Open = 0;
                for(MjHeadsUsers user:mjHeadsUsers1){
                    if(user.getAuthorizeType()==1){//如果是临时授权
                        if(user.getMainUser()==1){//如果是负责人
                            MjWorkOrder mjWorkOrder = workOrderService.selectMjWorkOrderById(user.getOrderId());
                            if(mjWorkOrder.getOpenMode()!=1){//如果是A模式
                                if(flag2Open==0){
                                    //System.out.println("临时授权A模式直接开门");
                                    flag2Open++;
                                    openDoor(user);
                                    openNum++;
                                    addStatis(2);
                                }
                            }else{
                                /*********如果是AX模式,且这个人是A,则把X的人员全部放到一个中间表,等待X人员按指纹********/
                                addUserAx(user,ip);
                            }
                        }else{
                            /*********是AX模式,且这个人是X,则在临时表找找是否有此人********/
                            //findUserAx(user,ip);
 
                            MjUserAx userAx = new MjUserAx();
                            userAx.setHeadIp(ip);
                            userAx.setXuserId(user.getUserId().toString());
                            List<MjUserAx> mjUserAxes = userAxService.selectMjUserAxList(userAx);
                            if(mjUserAxes.size()>0){
                                if(flag2Open==0) {
                                    //System.out.println("如果是X,在临时库里找到后开门");
                                    flag2Open++;
                                    openDoor(user);
                                    openNum++;
                                    addStatis(3);
                                }
                            }
                        }
                    }
                }
            }else{
                if(flag1>0){//只有X权限,也不考虑组授权
                    int flag2Open = 0;
                    for(MjHeadsUsers user:mjHeadsUsers1){
                        if(user.getAuthorizeType()==1){//如果是临时授权
                            /*********是AX模式,且这个人是X,则在临时表找找是否有此人********/
                            //findUserAx(user,ip);
                            if(user.getAuthorizeStatus()==0){
                                if(flag2Open==0){
                                    //System.out.println("临时授权A模式直接开门");
                                    flag2Open++;
                                    openDoor(user);
                                    openNum++;
                                    addStatis(2);
                                }
                            }else{
                                MjUserAx userAx = new MjUserAx();
                                userAx.setHeadIp(ip);
                                userAx.setXuserId(user.getUserId().toString());
                                List<MjUserAx> mjUserAxes = userAxService.selectMjUserAxList(userAx);
                                if(mjUserAxes.size()>0){
                                    if(flag2Open>0) {
                                        break;
                                    }else{
                                        //System.out.println("如果是X,在临时库里找到后开门");
                                        flag2Open++;
                                        openDoor(user);
                                        openNum++;
                                        addStatis(3);
                                    }
                                }
                            }
                        }
                    }
                }else{
                    MjHeadsUsers mjHeadsUsers5 = new MjHeadsUsers();
                    mjHeadsUsers5.setUserId(Long.valueOf(mjWorkUsers.getId()));
                    mjHeadsUsers5.setAuthorizeType(1);
                    List<MjHeadsUsers> zu = headsUsersService.selectMjHeadsUsersList(mjHeadsUsers5);//找到读头用户表中的
                    if(zu.size()==0){
                        for(MjHeadsUsers user:mjHeadsUsers1){
                            if(user.getAuthorizeType()==0){//是组授权
                                //System.out.println("组授权开门");
                                openDoor(user);
                                openNum++;
                                addStatis(1);
                                break;
                            }
                        }
                    }
                }
            }
            //}
        }
        return openNum;
    }
 
    private void addVistisLog(MjWorkUser mjWorkUsers, MjFingerprintReadHead mjFingerprintReadHead,MjHeadsUsers headsUsers) {
        MjVisitLog visitLog = new MjVisitLog();
        visitLog.setId(IdUtils.fastSimpleUUID());
        visitLog.setUserName(mjWorkUsers.getUserName());
        visitLog.setDeptId(mjWorkUsers.getDeptId());
        visitLog.setDeptName(mjWorkUsers.getDeptName());
        visitLog.setDoorId(mjFingerprintReadHead.getDoorId());
        visitLog.setDoorName(mjFingerprintReadHead.getDoorName());
        visitLog.setDirection(mjFingerprintReadHead.getDirection());
        visitLog.setAreaName(mjFingerprintReadHead.getAreaName());
        visitLog.setOrganizationId(mjWorkUsers.getOrganizationId());
        visitLog.setOrganizationName(mjWorkUsers.getOrganizationName());
        visitLog.setWorkOrderId(headsUsers.getOrderId());
        if(headsUsers.getAuthorizeType()==1){
            MjWorkOrder mjWorkOrder = workOrderService.selectMjWorkOrderById(headsUsers.getOrderId());
            visitLog.setWorkOrderName(mjWorkOrder.getTaskName());
        }
        visitLogService.insertMjVisitLog(visitLog);
    }
 
    //把X人员加入临时表
    public void addUserAx(MjHeadsUsers headsUsers,String ip){
        MjHeadsUsers shu = new MjHeadsUsers();
        shu.setOrderId(headsUsers.getOrderId());
        shu.setMainUser(0);
        List<MjHeadsUsers> headUserList = headsUsersService.selectMjHeadsUsersList(shu);//找到读头用户表中的
        for(MjHeadsUsers hu:headUserList){
            MjUserAx userAx = new MjUserAx();
            userAx.setId(IdUtils.fastSimpleUUID());
            userAx.setXuserId(hu.getUserId().toString());
            userAx.setHeadIp(ip);
            userAxService.insertMjUserAx(userAx);
        }
    }
 
    //在临时表找找有没有X这个人
    public void findUserAx(MjHeadsUsers headsUsers,String ip){
        MjUserAx userAx = new MjUserAx();
        userAx.setHeadIp(ip);
        userAx.setXuserId(headsUsers.getUserId().toString());
        List<MjUserAx> mjUserAxes = userAxService.selectMjUserAxList(userAx);
        if(mjUserAxes.size()>0){
            //System.out.println("如果是X,在临时库里找到后开门");
            openDoor(headsUsers);
            addStatis(3);
        }
    }
 
    //开门
    public void openDoor(MjHeadsUsers headsUsers){
        String headId = headsUsers.getHeadId();
        MjFingerprintReadHead mjFingerprintReadHead = fingerprintReadHeadService.selectMjFingerprintReadHeadById(headId);
        MjDoor mjDoor = doorService.selectMjDoorById(mjFingerprintReadHead.getDoorId());
        MjOpenHnwe openHnwe = new MjOpenHnwe();
        openHnwe.setId(IdUtils.fastSimpleUUID());
        openHnwe.setHnweId(mjDoor.getHnweId());
        openHnwe.setHnweIp(mjDoor.getHnweIp());
        openHnweService.insertMjOpenHnwe(openHnwe);
 
        MjWorkUser workUser = workUserService.selectMjWorkUserById(headsUsers.getUserId());
        addVistisLog(workUser,mjFingerprintReadHead,headsUsers);
    }
 
    public void addStatis(int type){
        //List<MjStatistic> mjStatistics = statisticService.selectMjStatisticList(null);
        MjStatistic mjStatistic = statisticService.selectMjStatisticById("1");
        if(mjStatistic!=null){
            //MjStatistic mjStatistic = mjStatistics.get(0);
            if(type==1){//组
                mjStatistic.setTeamopen(mjStatistic.getTeamopen()+1);
            }
            if(type==2){//临
                mjStatistic.setOrderopen1(mjStatistic.getOrderopen1()+1);
            }
            if(type==3){//Ax
                mjStatistic.setOrderopen2(mjStatistic.getOrderopen2()+1);
            }
            statisticService.updateMjStatistic(mjStatistic);
        }
    }
 
    @GetMapping("cdata")
    public void findByType(String SN, String options, String pushver, String language, String pushcommkey, HttpServletResponse response, String PushOptionsFlag) throws IOException {
        //System.out.println("信息交互");
        String s = initOptions(SN,null);
        response.getWriter().write(s);
    }
 
    @RequestMapping(value = "/cdata")
    public void handleRtData(HttpServletRequest request, HttpServletResponse response, String SN, String table) throws UnsupportedEncodingException {
        //System.out.println("设备上传上来的数据...."+data+"....table..."+table);
        request.setCharacterEncoding("gbk");
        String data = "";
        //System.out.println("设备的实时记录是......."+data+"....table名字为:"+table);
 
        ByteArrayOutputStream bos = null;
        byte[] b= new byte[1024];
        try {
            InputStream is = request.getInputStream();
            bos = new ByteArrayOutputStream();
            int len = 0;
            while((len=is.read(b))!=-1){
                bos.write(b,0,len);
            }
 
            data = new String(bos.toByteArray(),"gbk");
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(data.indexOf("xFace600")!=-1){
            return;
        }
        MjVisitLog visitLog3 = new MjVisitLog();
        visitLog3.setId(IdUtils.fastSimpleUUID());
        visitLog3.setUserName(request.getRemoteHost()+"==="+data+" table="+table);
        visitLog3.setDelFlag(1);
        visitLogService.insertMjVisitLog(visitLog3);
        //System.out.println("设备的实时记录是......."+data);
        String[] dataArray = data.split("\n");
//        int num = dataArray.length;
//
//        System.out.println("获取到的考勤记录数量为.,.............."+num);
        //System.out.println("读头ip:"+request.getRemoteHost());
        for(String datas:dataArray){
            String[] s = datas.split("\t");
//            //System.out.println("用户id:"+s[0]);
//            String logTime = s[1];
//            Date date = DateUtils.dateTime("yyyy-MM-dd HH:mm:ss",logTime);
//            Date date2 = new Date();
//            long l = date2.getTime() - date.getTime();
            //if(l<1000*60){
            int open = 0;
            try {
                open = open(s[0], request.getRemoteHost());//判断是否开门
 
            } catch (Exception e) {
 
            }finally {
                //visitLog3.setDoorId(open+"次"+Long.valueOf(l).toString());
                visitLog3.setDoorId(open+"次");
                visitLogService.updateMjVisitLog(visitLog3);
            }
            //}
        }
        try {
            response.getWriter().write("OK");
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
    public static byte[] getRequestPostBytes(HttpServletRequest request)
            throws IOException {
        int contentLength = request.getContentLength();
        if(contentLength<0){
            return null;
        }
        byte buffer[] = new byte[contentLength];
        for (int i = 0; i < contentLength;) {
 
            int readlen = request.getInputStream().read(buffer, i,
                    contentLength - i);
            if (readlen == -1) {
                break;
            }
            i += readlen;
        }
        return buffer;
    }
    /***
     * Get request query string, form method : post
     *
     * @param request
     * @return
     * @throws IOException
     */
    public static String getRequestPostStr(HttpServletRequest request)
            throws IOException {
        byte buffer[] = getRequestPostBytes(request);
        String charEncoding = request.getCharacterEncoding();
        if (charEncoding == null) {
            charEncoding = "UTF-8";
        }
        String s = new String(buffer, charEncoding);
        return s;
    }
 
    private String initOptions(String sn,String PushOptionsFlag) {
        StringBuffer devOptions = new StringBuffer();
        devOptions.append("GET OPTION FROM: "+sn);
        // + "\nStamp=" + devInfo.devInfoJson.getString("Stamp")
        devOptions.append("\nATTLOGStamp=0");
        devOptions.append("\nOPERLOGStamp=0");
        devOptions.append("\nBIODATAStamp=0");
        devOptions.append("\nATTPHOTOStamp=0");
        devOptions.append("\nErrorDelay=10");//断网重连
        devOptions.append("\nDelay=30");//心跳间隔
        devOptions.append("\nTimeZone=8");//时区
        devOptions.append("\nRealtime=1");//实时上传
        devOptions.append("\nServerVer=3.0.1");//这个必须填写
        devOptions.append("\nPushProtVer=2.4.1");
        devOptions.append("\nTransFlag=100000000000");//  1-12二进制位 分别代表以上含义
        //System.out.println("PushOptionsFlag============="+PushOptionsFlag);
        if (PushOptionsFlag!=null&&PushOptionsFlag.equals("1"))
        {
            // 支持参数单独获取的才要把需要获取的参数回传给设备 modifeid by max 20170926
            devOptions.append("\nPushOptions=RegDeviceType,FingerFunOn,FaceFunOn,FPVersion,FaceVersion,NetworkType,HardwareId3,HardwareId5,HardwareId56,LicenseStatus3,LicenseStatus5,LicenseStatus56");
        }
        devOptions.append("\n");
        return devOptions.toString();
    }
 
/*********只有一个人的情况下********/
//            if(mjHeadsUsers1.size()==1){
//                    MjHeadsUsers mjHeadsUsers2 = mjHeadsUsers1.get(0);
//
//                    if(mjHeadsUsers2.getAuthorizeType()==0){
//                    System.out.println("组授权开门");
//                    }else{
//                    MjWorkOrder mjWorkOrder = workOrderService.selectMjWorkOrderById(mjHeadsUsers2.getOrderId());
//                    if(mjWorkOrder.getOpenMode()==0){
//                    System.out.println("临时授权A模式直接开门");
//                    }else{
//                    if(mjHeadsUsers2.getMainUser()==1){
//                    /*********如果是AX模式,且这个人是A,则把X的人员全部放到一个中间表,等待X人员按指纹********/
//                    addUserAx(mjHeadsUsers2,ip);
//                    }else{
//                    /*********如果是AX模式,且这个人是X,则在临时表找找是否有此人********/
//                    findUserAx(mjHeadsUsers2,ip);
//                    }
//                    }
//                    }
//                    }else{
//                    /*********多个人的情况下********/
}