package com.boying.controller.car; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.boying.common.R; import com.boying.common.SystemConfigProperties; import com.boying.entity.*; import com.boying.service.*; import com.boying.util.DateUtilOther; import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import io.swagger.models.auth.In; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; /** * Servlet implementation class PlateServlet */ @Controller @RequestMapping("/car1") @RequiredArgsConstructor public class PlateServlet extends HttpServlet { private static final long serialVersionUID = 1L; private final SystemConfigProperties systemConfigProperties; private final StringRedisTemplate redisTemplate; private final ParkService parkService; private final OutParkService outParkService; private final EnterParkService enterParkService; private final BarrierService barrierService; private final TicketService ticketService; private final CostRuleService costRuleService; private final LedShowService ledShowService; private final WhiteListService whiteListService; /** * 回复开闸 */ protected void open(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/json"); PrintWriter out = response.getWriter(); out.println("{\"Response_AlarmInfoPlate\":{\"info\":\"ok\",\"content\":\"...\",\"is_pay\":\"true\"}}"); out.flush(); out.close(); } //转码 public static String deCode(String str) { try { byte[] b = str.getBytes("UTF-8");//���� String sa = new String(b);//����:��ʲô�ַ����������ʲô�ַ������� //String sa = new String(str.getBytes()); return sa; } catch (Exception e) { e.printStackTrace(); return ""; } } protected void noOpen(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/json"); PrintWriter out = response.getWriter(); out.println("{\"Response_AlarmInfoPlate\":{\"info\":\"error\",\"content\":\"...\",\"is_pay\":\"false\"}}"); out.flush(); out.close(); } @PostMapping("/status") public void heart(String serialno,HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { Barrier barrier = barrierService.findByCode(serialno); Park park = parkService.getById(barrier.getParkId()); String redis = redisTemplate.opsForValue().get("park_up_" + park.getId()); String redisnum = redisTemplate.opsForValue().get("car_park_" + park.getId()); if(StringUtils.isBlank(redis) || redis.equals("false")){ return; } if(barrier!=null){ if(barrier.getType2()==1){ open(request,response); if(barrier.getType() == 1){ int i = Integer.parseInt(redisnum); i++; redisTemplate.opsForValue().set("car_park_" + park.getId(),Integer.toString(i),30, TimeUnit.DAYS); }else if(barrier.getType() == 0){ int i = Integer.parseInt(redisnum); i--; if(i<0){ redisTemplate.opsForValue().set("car_park_" + park.getId(),"0",30, TimeUnit.DAYS); redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS); }else { redisTemplate.opsForValue().set("car_park_" + park.getId(),Integer.toString(i),30, TimeUnit.DAYS); redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS); } } barrier.setType2(0); barrier.setUpdateTime(LocalDateTime.now()); barrierService.saveOrUpdate(barrier); //outLedShowDefault(barrier.getCode(),barrier.getParkId()); return; } barrier.setStatus(0); barrier.setUpdateTime(LocalDateTime.now()); barrierService.saveOrUpdate(barrier); OutPark outPark = outParkService.count4(barrier.getId()); if(outPark!=null){ open(request,response); if(barrier.getType() == 0){ int i = Integer.parseInt(redisnum); i--; if(i<0){ redisTemplate.opsForValue().set("car_park_" + park.getId(),"0",30, TimeUnit.DAYS); redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS); }else { redisTemplate.opsForValue().set("car_park_" + park.getId(),Integer.toString(i),30, TimeUnit.DAYS); redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS); } } outPark.setStatus2(1); outParkService.saveOrUpdate(outPark); //outLedShowDefault(barrier.getCode(),barrier.getParkId()); }else{ noOpen(request,response); } } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ @PostMapping("/PlateServlet") protected void info(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String s= ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss"); BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8")); String str = ""; String lineStr = ""; while((str = reader.readLine()) != null){ lineStr += str; } System.out.println("获取到的道闸推送数据为:"+lineStr); JSONObject jsonObject1 = JSON.parseObject(lineStr); JSONObject alarmInfoPlate = jsonObject1.getJSONObject("AlarmInfoPlate"); JSONObject result = alarmInfoPlate.getJSONObject("result"); JSONObject plateResult = result.getJSONObject("PlateResult"); String carNo = plateResult.get("license").toString(); String code = alarmInfoPlate.get("serialno").toString(); try { JsonParser parser=new JsonParser(); do { JsonObject jsonObject=(JsonObject) parser.parse(lineStr); if( jsonObject == null || jsonObject.isJsonNull() ) { break; } JsonObject jsonInfoPlate = jsonObject.get("AlarmInfoPlate").getAsJsonObject(); if( jsonInfoPlate == null || jsonInfoPlate.isJsonNull() ) { break; } JsonObject jsonResult = jsonInfoPlate.get("result").getAsJsonObject(); if( jsonResult == null || jsonResult.isJsonNull() ) { break; } JsonObject jsonPlateResult = jsonResult.get("PlateResult").getAsJsonObject(); if( jsonPlateResult == null || jsonPlateResult.isJsonNull() ) { break; } String license = jsonPlateResult.get("license").getAsString();//车牌号 if( license == null || license == "") { break; } String serialno = jsonInfoPlate.get("serialno").getAsString();//摄像机序列号 if( serialno == null || serialno == "" ) { break; } System.out.println("编号:"+serialno+"设备识别到了:"+license); String format = sdf.format(new Date()); s+= format+",车牌号为:"+license+",serialno为:"+code+" "; Barrier barrier = barrierService.findByCode(code); System.out.println("查询到道闸为:"+barrier); if(barrier==null){ s+="查询道闸为空\n"; }else{ if(barrier.getType()==0){ //noOpen(request,response); outPark(license, barrier.getId(), barrier.getParkId()); s+=license+"-保存出场记录\n"; }else{ String num = redisTemplate.opsForValue().get("car_park_" + barrier.getParkId()); if(StringUtils.isBlank(num)){ num = "0"; redisTemplate.opsForValue().set("car_park_" + barrier.getParkId(),num,30, TimeUnit.DAYS); redisTemplate.opsForValue().set("park_up_" + barrier.getParkId(),"true",30, TimeUnit.DAYS); } Park byId = parkService.getById(barrier.getParkId()); if(Integer.parseInt(num) >= byId.getNum() ){ //led显示 Boolean aBoolean = inLedFullShow(code, license,barrier.getParkId()); noOpen(request,response); }else { //led显示 Boolean aBoolean = inLedShow(code, license,barrier.getParkId()); if(aBoolean){ //入场抬杆 open(request, response); enterPark(license,barrier.getId(),barrier.getParkId()); s+=license+"-保存入场记录\n"; } } } } writeTxt(s); }while(false); } catch (Exception e) { System.out.println("无入场记录"); s+=" ,查询场内记录异常"; writeTxt(s); } } private void writeTxt( String txt) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); try { FileWriter f = new FileWriter(systemConfigProperties.getLogPath()+sdf.format(new Date())+".txt",true); BufferedWriter bw=new BufferedWriter(f); bw.write(txt); bw.newLine(); bw.close(); } catch(Exception e) { System.out.println("打印错误"); } } public void enterPark(String carNo,Integer barrierId,Integer parkId) { Park park = parkService.getById(parkId); int num = 0; String s = redisTemplate.opsForValue().get("car_park_" + parkId); if(park != null){ num = park.getNum(); if(s !=null){ if(Integer.parseInt(s) >= num){ redisTemplate.opsForValue().set("park_up_" + parkId,"false",30, TimeUnit.DAYS); return; } }else { s= "0"; redisTemplate.opsForValue().set("car_park_" + parkId,s,30, TimeUnit.DAYS); redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS); } } enterParkService.deleteByCarNo(carNo,parkId); EnterPark enterPark = new EnterPark(); enterPark.setCarNo(carNo); enterPark.setBarrierId(barrierId); enterPark.setParkId(parkId); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(Ticket::getCarNo,enterPark.getCarNo()) .eq(Ticket::getPayStatus,1); List tickets = ticketService.list(wrapper); if(tickets.size()>0){ enterPark.setStatus(1);//发现有违章 } enterParkService.saveOrUpdate(enterPark); Barrier barrier = barrierService.getById(barrierId); barrier.setType2(1); barrierService.saveOrUpdate(barrier); } public double outPark(String carNo,Integer barrierId,Integer parkId) { double money = 0.0; EnterPark enterPark = null; String toDayHrMinSec = null; OutPark outPark = new OutPark(); outPark.setCarNo(carNo); outPark.setParkId(parkId); outPark.setBarrierId(barrierId); outPark.setCreateTime(LocalDateTime.now()); outPark.setCode(System.currentTimeMillis()+""); List byCarNo = enterParkService.findByCarNo(carNo,parkId); if(byCarNo.size() == 0){ System.out.println(carNo+"未发现场内车辆"); }else{ enterPark = byCarNo.get(0); System.out.println("入场记录:"+enterPark); outPark.setEnterTime(enterPark.getCreateTime()); try { long l = outPark.getCreateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli() - enterPark.getCreateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli(); outPark.setTime(l/(1000*60)); toDayHrMinSec = DateUtilOther.millisToDayHrMinSec(l/(1000*60)); money = costRuleService.getMoney(parkId, outPark.getEnterTime(), outPark.getCreateTime(), 1); } catch (ParseException e) { e.printStackTrace(); } } //outPark.setPrice(Double.valueOf(String.format("%.1f", money))); outPark.setPrice(money); outPark.setStatus3(findTicket(carNo)); outParkService.saveOrUpdate(outPark); Barrier barrier =barrierService.getById(barrierId); barrier.setCarNo(carNo); //led展示 if(toDayHrMinSec == null){ toDayHrMinSec = "不足两小时"; } //判断是否在白名单 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(WhiteList::getCarNo,carNo); List all = whiteListService.list(wrapper); if(all.size() >0){ for(WhiteList w : all){ if(w.getType()==0){ outLedShow2(barrier.getCode(),barrier.getCarNo(),"月租车",toDayHrMinSec,barrier.getParkId()); barrier.setType2(1); barrierService.saveOrUpdate(barrier); OutPark byCarNoAndBarrierId = outParkService.findByCarNoAndBarrierId(carNo, barrierId); byCarNoAndBarrierId.setStatus(1); outParkService.saveOrUpdate(byCarNoAndBarrierId); return 0.0; }else{ if(w.getParkIds()!=null){ if(w.getEndTime()!=null){ String parkIds = w.getParkIds(); String[] split = parkIds.split(","); for (String s : split) { int pid = Integer.parseInt(s); if(pid == outPark.getParkId() && System.currentTimeMillis() wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(Ticket::getCarNo,carNo) .eq(Ticket::getPayStatus,1); List tickets = ticketService.list(wrapper); if(tickets.size()>0){ return 1; }else{ return 0; } } public Boolean inLedShow(String ledId,String carNo,Integer parkId){ String num = redisTemplate.opsForValue().get("car_park_" + parkId); Park byId = parkService.getById(parkId); int i = byId.getNum() - Integer.parseInt(num); if(i<0){ i = 0; } String carType = ""; String carDay = ""; Barrier barrier = barrierService.findByCode(ledId); WhiteList byCarNo = whiteListService.getByCarNo(carNo); if(byCarNo == null){ carType = "临时车"; }else { if (byCarNo.getType() == 0){ //白名单永久车辆 carType = "月租车"; }else { //白名单固定停车场车辆 if(byCarNo.getParkId().equals(barrier.getParkId())){ carType = "月租车"; long l = (byCarNo.getEndTime().getTime() - byCarNo.getStartTime().getTime()) / (24 * 3600 * 1000); carDay = "有效期还有"+l+"天"; } } } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); LedShow ledShow = new LedShow(); ledShow.setLedId(ledId); ledShow.setNumber(parkId); ledShow.setStatus(1); ledShow.setType(2); ledShow.setName(barrier.getName()); ledShow.setIsDefault(1); ledShow.setPassword("boying_ffpark"); ledShow.setTimeStamp(sdf.format(new Date())); ledShow.setColor1(1); ledShow.setColor2(2); ledShow.setColor3(1); ledShow.setColor4(2); ledShow.setContent1(carNo); ledShow.setContent2(carType); ledShow.setContent3("车位剩余:"+i); ledShow.setContent4(carDay); ledShow.setDisMode1(0); ledShow.setDisMode2(0); ledShow.setDisMode3(1); ledShow.setDisMode4(1); ledShow.setStatus1(0); ledShow.setStatus2(0); ledShow.setStatus3(0); ledShow.setStatus4(0); if(barrier.getIpAddress() != null){ ledShow.setIpAddress(barrier.getIpAddress()); } if(barrier.getPort() != 0){ ledShow.setPort(barrier.getPort()); } ledShow.setVoiceContent(carNo+carType+"欢迎进场"); return ledShowService.save(ledShow); } public Boolean inLedFullShow(String ledId, String carNo, Integer parkId){ String carType = ""; String carDay = ""; Barrier barrier = barrierService.findByCode(ledId); WhiteList byCarNo = whiteListService.getByCarNo(carNo); if(byCarNo == null){ carType = "临时车"; }else { if (byCarNo.getType() == 0){ //白名单永久车辆 carType = "月租车"; }else { //白名单固定停车场车辆 if(byCarNo.getParkId().equals(barrier.getParkId())){ carType = "月租车"; long l = (byCarNo.getEndTime().getTime() - byCarNo.getStartTime().getTime()) / (24 * 3600 * 1000); carDay = "有效期还有"+l+"天"; } } } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); LedShow ledShow = new LedShow(); ledShow.setLedId(ledId); ledShow.setNumber(parkId); ledShow.setStatus(1); ledShow.setType(2); ledShow.setName(barrier.getName()); ledShow.setIsDefault(1); ledShow.setPassword("boying_ffpark"); ledShow.setTimeStamp(sdf.format(new Date())); ledShow.setColor1(1); ledShow.setColor2(2); ledShow.setColor3(1); ledShow.setColor4(2); ledShow.setContent1(carNo); ledShow.setContent2(carType); ledShow.setContent3("车位已满"); ledShow.setContent4("请驶离"); ledShow.setDisMode1(0); ledShow.setDisMode2(0); ledShow.setDisMode3(1); ledShow.setDisMode4(1); ledShow.setStatus1(0); ledShow.setStatus2(0); ledShow.setStatus3(0); ledShow.setStatus4(0); if(barrier.getIpAddress() != null){ ledShow.setIpAddress(barrier.getIpAddress()); } if(barrier.getPort() != 0){ ledShow.setPort(barrier.getPort()); } ledShow.setVoiceContent("车位已满请驶离"); return ledShowService.save(ledShow); } public Boolean outLedShow(String ledId,String carNo,Double price,String timeStamp,Integer parkId){ Barrier barrier = barrierService.findByCode(ledId); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); LedShow ledShow = new LedShow(); ledShow.setLedId(ledId); ledShow.setNumber(parkId); ledShow.setStatus(1); ledShow.setType(2); ledShow.setName(barrier.getName()); ledShow.setIsDefault(1); ledShow.setPassword("boying_ffpark"); ledShow.setTimeStamp(sdf.format(new Date())); ledShow.setColor1(1); ledShow.setColor2(2); ledShow.setColor3(1); ledShow.setColor4(2); ledShow.setContent1(carNo); ledShow.setContent2("停车"+timeStamp); ledShow.setContent3("交费"+price+"元"); ledShow.setContent4("禁止闯杆"); ledShow.setDisMode1(0); ledShow.setDisMode2(1); ledShow.setDisMode3(1); ledShow.setDisMode4(0); ledShow.setStatus1(0); ledShow.setStatus2(0); ledShow.setStatus3(0); ledShow.setStatus4(0); if(barrier.getIpAddress() != null){ ledShow.setIpAddress(barrier.getIpAddress()); } if(barrier.getPort() != 0){ ledShow.setPort(barrier.getPort()); } ledShow.setVoiceContent(carNo+"停车"+timeStamp+"交费"+price+"元"); return ledShowService.save(ledShow); } public Boolean outLedShow2(String ledId,String carNo,String text,String timeStamp,Integer parkId){ Barrier barrier = barrierService.findByCode(ledId); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); LedShow ledShow = new LedShow(); ledShow.setLedId(ledId); ledShow.setNumber(parkId); ledShow.setStatus(1); ledShow.setType(2); ledShow.setName(barrier.getName()); ledShow.setIsDefault(1); ledShow.setPassword("boying_ffpark"); ledShow.setTimeStamp(sdf.format(new Date())); ledShow.setColor1(1); ledShow.setColor2(2); ledShow.setColor3(1); ledShow.setColor4(2); ledShow.setContent1(carNo); ledShow.setContent2("停车"+timeStamp); ledShow.setContent3(text); ledShow.setContent4("禁止闯杆"); ledShow.setDisMode1(0); ledShow.setDisMode2(1); ledShow.setDisMode3(1); ledShow.setDisMode4(0); ledShow.setStatus1(0); ledShow.setStatus2(0); ledShow.setStatus3(0); ledShow.setStatus4(0); if(barrier.getIpAddress() != null){ ledShow.setIpAddress(barrier.getIpAddress()); } if(barrier.getPort() != 0){ ledShow.setPort(barrier.getPort()); } ledShow.setVoiceContent(carNo+"停车"+timeStamp); return ledShowService.save(ledShow); } public Boolean outLedShowDefault(String ledId,Integer parkId){ Barrier barrier = barrierService.findByCode(ledId); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); LedShow ledShow = new LedShow(); ledShow.setLedId(ledId); ledShow.setNumber(parkId); ledShow.setStatus(1); ledShow.setType(2); ledShow.setName(barrier.getName()); ledShow.setIsDefault(1); ledShow.setPassword("boying_ffpark"); ledShow.setTimeStamp(sdf.format(new Date())); ledShow.setColor1(1); ledShow.setColor2(1); ledShow.setColor3(1); ledShow.setColor4(1); ledShow.setContent1("欢迎光临"); ledShow.setContent2("一车一杆"); ledShow.setContent3("减速慢行"); ledShow.setContent4("安全行驶"); ledShow.setDisMode1(0); ledShow.setDisMode2(0); ledShow.setDisMode3(0); ledShow.setDisMode4(0); ledShow.setStatus1(0); ledShow.setStatus2(0); ledShow.setStatus3(0); ledShow.setStatus4(0); if(barrier.getIpAddress() != null){ ledShow.setIpAddress(barrier.getIpAddress()); } if(barrier.getPort() != 0){ ledShow.setPort(barrier.getPort()); } ledShow.setVoiceContent(""); return ledShowService.save(ledShow); } }