28个文件已修改
9个文件已添加
2959 ■■■■■ 已修改文件
pom.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/Application.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/BarrierController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/BarrierOpenLogController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/CostRuleController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/EnterParkController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/FileInfo2Controller.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/FileInfoController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/LedShowController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/OrderRecordController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/ParkController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/StatisticController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/StreetController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/TicketBlackController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/UserController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/ViolationTypeController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/WhiteListController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/car/MqttSample.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/car/MqttSample2.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/car/PlateServlet2.java 146 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/car/PlateServlet3.java 2034 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/car/PushCallback.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/car/ServerMQTT.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/phone/NoticeController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/phone/PayController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/phone/TicketController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/phone/UpdateAppController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/controller/phone/YCPayController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/entity/EditParkNumLog.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/job/DaPingScheduled.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/job/PayResult2Scheduled.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/mapper/EditParkNumLogMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/service/EditParkNumLogService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/service/impl/EditParkNumLogServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/boying/util/IpUtil.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/logback.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -121,6 +121,32 @@
            <artifactId>signature</artifactId>
            <version>1.1.0.6</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.paho</groupId>
            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
            <version>1.0.2</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.6.14</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>com.led</groupId>-->
<!--            <artifactId>show</artifactId>-->
<!--            <version>0.0.0.1</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>net.sf</groupId>-->
<!--            <artifactId>jni4net</artifactId>-->
<!--            <version>0.8.8.0</version>-->
<!--        </dependency>-->
    </dependencies>
    <build>
src/main/java/com/boying/Application.java
@@ -2,7 +2,7 @@
import cn.hutool.core.io.resource.ClassPathResource;
import net.sf.jni4net.Bridge;
//import net.sf.jni4net.Bridge;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@@ -26,11 +26,11 @@
        SpringApplication.run(Application.class, args);
    }
    @Bean
    public static void getBean() throws IOException {
        Bridge.setVerbose(true);
        Bridge.init();
        File loadDll = new File("LedShow.j4n.dll");
        Bridge.LoadAndRegisterAssemblyFrom(loadDll);
    }
//    @Bean
//    public static void getBean() throws IOException {
//        Bridge.setVerbose(true);
//        Bridge.init();
//        File loadDll = new File("LedShow.j4n.dll");
//        Bridge.LoadAndRegisterAssemblyFrom(loadDll);
//    }
}
src/main/java/com/boying/controller/BarrierController.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.boying.common.R;
import com.boying.entity.Barrier;
@@ -12,6 +13,8 @@
import com.boying.service.OutParkService;
import com.boying.service.ParkService;
import com.boying.util.RedisJsonUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
@@ -22,11 +25,13 @@
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
@RestController
@RequestMapping("ffzf/barrier")
@RequiredArgsConstructor
@Tag(description = "ffzf/barrier" , name = "道闸接口" )
public class BarrierController {
    private final BarrierService barrierService;
@@ -37,6 +42,7 @@
    @PostMapping("findPage")
    @Operation(summary = "根据停车场分页查询道闸" , description = "根据停车场分页查询道闸" )
    public Object findPage(Page page, String parkId) {
        QueryWrapper<Barrier> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -54,6 +60,7 @@
    }
    @PostMapping("save")
    @Operation(summary = "新增道闸" , description = "新增道闸" )
    public Object save(Barrier barrier) {
        barrier.setUpdateTime(LocalDateTime.now());
        barrierService.saveOrUpdate(barrier);
@@ -67,6 +74,7 @@
    }
    @PostMapping("delete")
    @Operation(summary = "删除道闸" , description = "删除道闸" )
    public Object delete(Integer id) {
        Barrier byId = barrierService.getById(id);
        barrierService.removeById(id);
@@ -75,6 +83,7 @@
    }
    @PostMapping("findAll")
    @Operation(summary = "查询所有道闸(APP)" , description = "查询所有道闸(APP)" )
    public Object findAll(Long parkId) {
        if (parkId==null) {
            return R.failed("未发现该停车场");
@@ -86,6 +95,7 @@
    }
    @PostMapping("open")
    @Operation(summary = "手动开闸(废弃)" , description = "手动开闸(废弃)" )
    public Object open(Long barrierId) {
        Barrier b=  barrierService.getById(barrierId);
        if (b==null) {
@@ -104,6 +114,7 @@
    }
    @PostMapping("getByCode")
    @Operation(summary = "根据code查询道闸" , description = "根据code查询道闸" )
    public Object getByCode(String code) {
        Barrier b=  barrierService.findByCode2(code);
        if (b==null) {
@@ -116,6 +127,7 @@
    @PostMapping("openBarrier")
    @Operation(summary = "手持手动开闸" , description = "手持手动开闸" )
    public Object openBarrier(Long barrierId,Integer type,String carNo,String remark) {
        Barrier b=  barrierService.getById(barrierId);
        if (b==null) {
@@ -189,4 +201,33 @@
           }
        }
    }
    @PostMapping("getDisConnect")
    @Operation(summary = "设备掉线通知" , description = "设备掉线通知" )
    public Object getDisConnect() {
        List<Map<String,Object>> resultlist = new ArrayList<>();
        String barrierCodeAll = redisTemplate.opsForValue().get("barrierCode_all");
        if(StringUtils.isBlank(barrierCodeAll)){
            QueryWrapper<Barrier> wrapper = new QueryWrapper<>();
            wrapper.select(" code ");
            List<Barrier> list = barrierService.list(wrapper);
            String collect = list.stream().map(Barrier::getCode).collect(Collectors.joining(","));
            redisTemplate.opsForValue().set("barrierCode_all",collect);
            barrierCodeAll = collect;
        }
        for (String s : barrierCodeAll.split(",")) {
            Barrier barrier = barrierService.findByCode(s);
            long between = ChronoUnit.SECONDS.between(barrier.getUpdateTime(), LocalDateTime.now());
            if(between>121){
                Map<String,Object> map = new HashMap<>();
                map.put("parkName",parkService.getOneById(barrier.getParkId()).getName());
                map.put("type",barrier.getType()==0?"出口":"入口");
                map.put("downTime",barrier.getUpdateTime());
                resultlist.add(map);
            }
        }
        Collections.sort(resultlist, (m1, m2)-> String.valueOf(m2.get("downTime")).compareTo(String.valueOf(m1.get("downTime")))); // lamuda排序
        return R.ok(resultlist);
    }
}
src/main/java/com/boying/controller/BarrierOpenLogController.java
@@ -13,6 +13,8 @@
import com.boying.service.BarrierService;
import com.boying.service.OutParkService;
import com.boying.service.ParkService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
@@ -26,6 +28,7 @@
@RestController
@RequestMapping("ffzf/barrierOpenLog")
@RequiredArgsConstructor
@Tag(description = "ffzf/barrierOpenLog" , name = "手动开闸日志" )
public class BarrierOpenLogController {
    private final BarrierOpenLogService barrierOpenLogService;
@@ -33,6 +36,7 @@
    @PostMapping("findPage")
    @Operation(summary = "分页查询" , description = "分页查询" )
    public Object findPage(Page page, Integer parkId,String carNo) {
        QueryWrapper<BarrierOpenLog> wrapper = new QueryWrapper<>();
        wrapper.lambda()
src/main/java/com/boying/controller/CostRuleController.java
@@ -13,6 +13,8 @@
import com.boying.service.ParkService;
import com.boying.util.DateUtilOther;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -25,18 +27,21 @@
@RestController
@RequestMapping("ffzf/rule")
@RequiredArgsConstructor
@Tag(description = "ffzf/rule" , name = "缴费规则" )
public class CostRuleController{
    private final CostRuleService costRuleService;
    private final ParkService parkService;
    @GetMapping("test")
    @Operation(summary = "测试" , description = "测试" )
    public Object save(String start,String end) throws ParseException {
        double money = costRuleService.getMoney(4, DateUtilOther.stringToLocalDate(start,null), DateUtilOther.stringToLocalDate(end, null), 1);
        return R.ok(money);
    }
    @PostMapping("/findPage")
    @Operation(summary = "分页查询" , description = "分页查询" )
    public Object findPage(Page page,CostRule costRule) {
        QueryWrapper<CostRule> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -51,6 +56,7 @@
        return R.ok(page1);}
    @PostMapping("/save")
    @Operation(summary = "新增规则" , description = "新增规则" )
    public Object save(CostRule costRule) {
        costRuleService.saveOrUpdate(costRule);
        return R.ok("保存成功");
@@ -58,6 +64,7 @@
    @PostMapping("/delete")
    @Operation(summary = "删除规则" , description = "删除规则" )
    public Object delete(Long id) {
        costRuleService.removeById(id);
        return R.ok("删除成功");
src/main/java/com/boying/controller/EnterParkController.java
@@ -14,6 +14,8 @@
import com.boying.service.ParkService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@@ -33,6 +35,7 @@
@RequiredArgsConstructor
@RequestMapping("ffzf/enterpark" )
@Api(value = "enterpark", tags = "入场表管理")
@Tag(description = "ffzf/enterpark" , name = "入场表记录" )
public class EnterParkController {
    private final EnterParkService enterParkService;
@@ -65,6 +68,7 @@
//    }
    @PostMapping("/findPage")
    @Operation(summary = "分页查询" , description = "分页查询" )
    public Object findPage(Page page, String  carNo,Integer parkId,String date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        if(StringUtils.isNotBlank(date)){
@@ -92,6 +96,7 @@
     */
    @ApiOperation(value = "通过id查询", notes = "通过id查询")
    @GetMapping("/{id}" )
    @Operation(summary = "根据id查询" , description = "根据id查询" )
    public R getById(@PathVariable("id" ) Integer id) {
        return R.ok(enterParkService.getById(id));
    }
@@ -103,6 +108,7 @@
     */
    @ApiOperation(value = "新增入场表", notes = "新增入场表")
    @PostMapping
    @Operation(summary = "新增入场" , description = "新增入场" )
    public R save(@RequestBody EnterPark enterPark) {
        return R.ok(enterParkService.save(enterPark));
    }
@@ -114,6 +120,7 @@
     */
    @ApiOperation(value = "修改入场表", notes = "修改入场表")
    @PutMapping
    @Operation(summary = "修改入场" , description = "修改入场" )
    public R updateById(@RequestBody EnterPark enterPark) {
        return R.ok(enterParkService.updateById(enterPark));
    }
@@ -125,6 +132,7 @@
     */
    @ApiOperation(value = "通过id删除入场表", notes = "通过id删除入场表")
    @DeleteMapping("/{id}" )
    @Operation(summary = "删除入场" , description = "删除入场" )
    public R removeById(@PathVariable Integer id) {
        return R.ok(enterParkService.removeById(id));
    }
@@ -136,6 +144,7 @@
     * @return excel 文件流
     */
    @GetMapping("/export")
    @Operation(summary = "导出入场" , description = "导出入场" )
    public List<EnterPark> export(EnterPark enterPark) {
        return enterParkService.list(Wrappers.query(enterPark));
    }
src/main/java/com/boying/controller/FileInfo2Controller.java
@@ -3,6 +3,8 @@
import com.boying.entity.FileInfo;
import com.boying.service.FileInfoService;
import io.lettuce.core.dynamic.annotation.Param;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@@ -14,6 +16,7 @@
@RestController
@RequestMapping("ffzf/fileInfo")
@RequiredArgsConstructor
@Tag(description = "ffzf/fileInfo" , name = "文件上传接口" )
public class FileInfo2Controller {
    private final FileInfoService fileInfoService;
@@ -23,12 +26,14 @@
     * @Param downloadPath 文件路径
     */
    @GetMapping("/download/downloadZip")
    @Operation(summary = "下载zip" , description = "下载zip" )
    public void downloadZip(@Param("downloadPath") String downloadPath, HttpServletRequest request, HttpServletResponse response) {
        //下载图片
        String down = fileInfoService.downloadPathFile(downloadPath, request, response);
    }
    @PostMapping("/download/downloadZips")
    @Operation(summary = "下载多个zip" , description = "下载多个zip" )
    public void downloadZips(String fileIds, HttpServletRequest request, HttpServletResponse response) {
        List<FileInfo> fileInfoList = new ArrayList<>();
        if(fileIds.contains(",")){
@@ -46,17 +51,20 @@
        fileInfoService.downForZip(fileInfoList, request, response);
    }
    @PostMapping("/download/downloadPng")
    @Operation(summary = "下载图片" , description = "下载图片" )
    public void downloadPng(String fileId, HttpServletRequest request, HttpServletResponse response) {
        FileInfo byId = fileInfoService.getById(Integer.parseInt(fileId));
        fileInfoService.downloadPng(byId,request,response);
    }
    @GetMapping("/showImg")
    @Operation(summary = "根据路径预览图片" , description = "根据路径预览图片" )
    public void showImg( String path,HttpServletResponse response) {
        fileInfoService.getFile(path,response);
    }
    @GetMapping("/showImgById/{fileId}")
    @Operation(summary = "根据文件id预览图片" , description = "根据文件id预览图片" )
    public void showImgById(@PathVariable Long fileId,HttpServletResponse response) {
        fileInfoService.getFileById(fileId,response);
    }
src/main/java/com/boying/controller/FileInfoController.java
@@ -6,6 +6,8 @@
import com.boying.service.FileInfoService;
import io.lettuce.core.dynamic.annotation.Param;
import io.swagger.models.auth.In;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@@ -17,6 +19,7 @@
@RestController
@RequestMapping("ffzf/fileinfo")
@RequiredArgsConstructor
@Tag(description = "ffzf/fileinfo" , name = "文件接口(已废弃)" )
public class FileInfoController {
    private final FileInfoService fileInfoService;
@@ -26,12 +29,14 @@
     * @Param downloadPath 文件路径
     */
    @GetMapping("/download/downloadZip")
    @Operation(summary = "下载zip" , description = "下载zip" )
    public void downloadZip(@Param("downloadPath") String downloadPath, HttpServletRequest request, HttpServletResponse response) {
        //下载图片
        String down = fileInfoService.downloadPathFile(downloadPath, request, response);
    }
    @PostMapping("/download/downloadZips")
    @Operation(summary = "下载多个zip" , description = "下载多个zip" )
    public void downloadZips(String fileIds, HttpServletRequest request, HttpServletResponse response) {
        List<FileInfo> fileInfoList = new ArrayList<>();
        if(fileIds.contains(",")){
@@ -49,17 +54,20 @@
        fileInfoService.downForZip(fileInfoList, request, response);
    }
    @PostMapping("/download/downloadPng")
    @Operation(summary = "下载图片" , description = "下载图片" )
    public void downloadPng(String fileId, HttpServletRequest request, HttpServletResponse response) {
        FileInfo byId = fileInfoService.getById(Integer.parseInt(fileId));
        fileInfoService.downloadPng(byId,request,response);
    }
    @GetMapping("/showImg/{filename}")
    @Operation(summary = "根据路径预览图片" , description = "根据路径预览图片" )
    public void showImg(@PathVariable String filename,HttpServletResponse response) {
        fileInfoService.getFile(filename,response);
    }
    @GetMapping("/showImgById/{fileId}")
    @Operation(summary = "根据文件id预览图片" , description = "根据文件id预览图片" )
    public void showImgById(@PathVariable Long fileId,HttpServletResponse response) {
        fileInfoService.getFileById(fileId,response);
    }
src/main/java/com/boying/controller/LedShowController.java
@@ -8,6 +8,7 @@
import com.boying.service.BarrierService;
import com.boying.service.LedShowService;
import com.boying.service.ParkService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
@@ -26,6 +27,7 @@
@RestController
@RequestMapping("ledshow")
@RequiredArgsConstructor
@Tag(description = "ledshow" , name = "led日志(已废弃)" )
public class LedShowController {
    private final LedShowService ledShowService;
src/main/java/com/boying/controller/OrderRecordController.java
@@ -16,6 +16,8 @@
import com.boying.service.UserService;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.GetMapping;
@@ -33,6 +35,7 @@
@RestController
@RequestMapping("ffzf/orderrecord")
@RequiredArgsConstructor
@Tag(description = "ffzf/orderrecord" , name = "订单接口" )
public class OrderRecordController {
    private final OrderRecordService orderRecordService;
@@ -48,6 +51,7 @@
     */
    @ApiOperation(value = "分页查询", notes = "分页查询")
    @PostMapping("/findPage" )
    @Operation(summary = "分页查询" , description = "分页查询" )
    public R getOrderRecordPage(Page page, OrderRecord orderRecord) {
        QueryWrapper<OrderRecord> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -72,6 +76,7 @@
    @PostMapping("/getByCarNo")
    @Operation(summary = "通过车牌号月份分页查询" , description = "通过车牌号月份分页查询" )
    public Object getByCarNo(Page page,String carNo,String month,String phone) {
        List<OrderRecordVo> recordVos = new ArrayList<>();
        QueryWrapper<OrderRecord> wrapper = new QueryWrapper<>();
@@ -100,6 +105,7 @@
    }
    @PostMapping("/findCountPage")
    @Operation(summary = "查询停车场订单金额统计" , description = "查询停车场订单金额统计" )
    public Object findCountPage(Integer parkId,String startTime,String endTime) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        QueryWrapper<OutPark> wrapper = new QueryWrapper<>();
src/main/java/com/boying/controller/ParkController.java
@@ -1,18 +1,24 @@
package com.boying.controller;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.boying.common.R;
import com.boying.entity.EditParkNumLog;
import com.boying.entity.EnterPark;
import com.boying.entity.Park;
import com.boying.entity.User;
import com.boying.service.EditParkNumLogService;
import com.boying.service.EnterParkService;
import com.boying.service.ParkService;
import com.boying.service.UserService;
import com.boying.util.IpUtil;
import com.boying.util.RedisJsonUtil;
import lombok.RequiredArgsConstructor;
import org.apache.catalina.security.SecurityUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
@@ -20,7 +26,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -38,6 +47,7 @@
    private final UserService userService;
    private final RedisJsonUtil redisJsonUtil;
    private final EnterParkService enterParkService;
    private final EditParkNumLogService editParkNumLogService;
    @PostMapping("/findPage")
    public Object findPage(Page page) {
@@ -145,7 +155,7 @@
        }
    }
    @PostMapping("/editParkCarNum")
    public Object editParkCarNum(Park park) {
    public Object editParkCarNum(HttpServletRequest request, Park park) {
        Park byId = parkService.getById(park.getId());
        if(byId == null){
            return R.failed("未查询到该停车场");
@@ -154,11 +164,27 @@
            redisTemplate.opsForValue().set("car_park_" + byId.getId(),park.getCarNum()+"",30, TimeUnit.DAYS);
            redisTemplate.opsForValue().set("park_up_" + byId.getId(),"true",30, TimeUnit.DAYS);
            parkService.updateById(byId);
            String jsonValue = JSON.toJSONString(park);
            redisTemplate.opsForValue().set("park-"+park.getId(), jsonValue);
            String ipAddr = IpUtil.getIpAddr(request);
            int num = byId.getNum();
            int newNum = park.getNum();
            EditParkNumLog numLog = new EditParkNumLog();
            numLog.setIp(ipAddr);
            numLog.setNum(num);
            numLog.setNewNum(newNum);
            numLog.setParkName(byId.getName());
            numLog.setCreateTime(LocalDateTime.now());
            editParkNumLogService.save(numLog);
            return R.ok(null,"修改成功");
        }
    }
    @PostMapping("/getParkCar")
    public Object getParkCar(Page page, Integer parkId,String carNo) {
        QueryWrapper<EnterPark> enterParkQueryWrapper = new QueryWrapper<>();
src/main/java/com/boying/controller/StatisticController.java
@@ -9,6 +9,8 @@
import com.boying.service.StatisticService;
import com.boying.service.StreetLogoService;
import com.boying.service.TicketBlackService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
@@ -30,6 +32,7 @@
@RestController
@RequestMapping("statistic")
@RequiredArgsConstructor
@Tag(description = "statistic" , name = "大屏统计接口" )
public class StatisticController{
    private final StatisticService statisticService;
@@ -40,6 +43,7 @@
    //指挥页面数据
    @PostMapping("/getData1")
    @Operation(summary = "查询所有泊车统计" , description = "查询所有泊车统计" )
    public Object card1() {
        List<Statistic> all = statisticService.list();
        if(all.size() >0){
@@ -50,6 +54,7 @@
    }
    @PostMapping("/getBlackRecord")
    @Operation(summary = "查询所有违法统计" , description = "查询所有违法统计" )
    public Object getList1(Page page) {
        QueryWrapper<TicketBlack> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -58,6 +63,7 @@
    }
    @PostMapping("/getLogo")
    @Operation(summary = "查询所有街道违章统计" , description = "查询所有街道违章统计" )
    public Object getLogo() {
        return R.ok(streetLogoService.list());
    }
src/main/java/com/boying/controller/StreetController.java
@@ -11,6 +11,8 @@
import com.boying.service.StreetReRoadService;
import com.boying.service.StreetService;
import com.boying.util.LngLatUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -27,6 +29,7 @@
@RestController
@RequestMapping("ffzf/street")
@RequiredArgsConstructor
@Tag(description = "ffzf/street" , name = "街道统计" )
public class StreetController {
@@ -35,6 +38,7 @@
    private final StreetLogoService streetLogoService;
    @PostMapping("/findPage")
    @Operation(summary = "分页查询" , description = "分页查询" )
    public Object findPage(Page page, Street street) {
        QueryWrapper<Street> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -43,6 +47,7 @@
    }
    @PostMapping("/save")
    @Operation(summary = "新增街道" , description = "新增街道" )
    public Object save(Street street) {
        QueryWrapper<Street> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -63,6 +68,7 @@
    }
    @PostMapping("/save2")
    @Operation(summary = "新增路" , description = "新增路" )
    public Object save2(StreetReRoad streetReRoad) {
        streetReRoadService.saveOrUpdate(streetReRoad);
        return R.ok();
@@ -70,18 +76,21 @@
    @PostMapping("/delete")
    @Operation(summary = "删除街" , description = "删除街" )
    public Object delete(Long id) {
        streetService.removeById(id);
        return R.ok();
    }
    @PostMapping("/delete2")
    @Operation(summary = "删除路" , description = "删除路" )
    public Object delete2(Long id) {
        streetReRoadService.removeById(id);
        return R.ok();
    }
    @GetMapping("/findById")
    @Operation(summary = "根据id查询(APP)" , description = "根据id查询(APP)" )
    public Object findById(Long id,int type) {
        if(type==0){
            QueryWrapper<StreetReRoad> roadQueryWrapper = new QueryWrapper<>();
@@ -110,6 +119,7 @@
    }
    @GetMapping("/findList")
    @Operation(summary = "查询所有街道和路" , description = "查询所有街道和路" )
    public Object findAll() {
        Map<String,Object> map = new HashMap<>();
        QueryWrapper<Street> wrapper = new QueryWrapper<>();
@@ -125,11 +135,13 @@
    }
    @GetMapping("/findList2")
    @Operation(summary = "查询所有街道" , description = "查询所有街道" )
    public Object findAll2() {
        return R.ok(streetService.list());
    }
    @PostMapping("findLogo")
    @Operation(summary = "查询所有街道违章" , description = "查询所有街道违章" )
    public Object findLogo(String lng ,String lat) {
        List<StreetLogo> all = streetLogoService.list();
        List<StreetLogo> all2 = new ArrayList<>();
src/main/java/com/boying/controller/TicketBlackController.java
@@ -11,6 +11,8 @@
import com.boying.util.FileUtil;
import com.boying.util.NumberToCN;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
@@ -32,6 +34,7 @@
@RestController
@RequestMapping("ffzf/ticketblack")
@RequiredArgsConstructor
@Tag(description = "ffzf/ticketblack" , name = "黑名单表接口" )
public class TicketBlackController {
@@ -43,6 +46,7 @@
    @PostMapping("findPage")
    @Operation(summary = "分页查询" , description = "分页查询" )
    public Object findPage(Page page, TicketBlack ticket){
        QueryWrapper<TicketBlack> wrapper =  new QueryWrapper<>();
        wrapper.lambda()
@@ -53,6 +57,7 @@
    }
    @PostMapping("/save")
    @Operation(summary = "新增黑名单" , description = "新增黑名单" )
    public Object save(TicketBlack ticket) throws IOException{
        QueryWrapper<TicketBlack> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -74,6 +79,7 @@
     */
    @ApiOperation(value = "通过id查询", notes = "通过id查询")
    @GetMapping("/{id}" )
    @Operation(summary = "通过id查询" , description = "通过id查询" )
    public R getById(@PathVariable("id" ) Integer id) {
        TicketBlack byId = ticketBlackService.getById(id);
        return R.ok(byId);
@@ -81,6 +87,7 @@
    @PostMapping("/delete")
    @Operation(summary = "删除黑名单" , description = "删除黑名单" )
    public Object delete(Long id){
        TicketBlack ticket =ticketBlackService.getById(id);
        if(ticket!=null){
@@ -94,6 +101,7 @@
    }
    @PostMapping("/updateById")
    @Operation(summary = "更新黑名单" , description = "更新黑名单" )
    public Object updateById(TicketBlack ticket){
        return R.ok( ticketBlackService.updateById(ticket));
    }
src/main/java/com/boying/controller/UserController.java
@@ -9,6 +9,8 @@
import com.boying.service.ParkService;
import com.boying.service.UserService;
import com.boying.util.LngLatUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.web.bind.annotation.PostMapping;
@@ -25,12 +27,14 @@
@RestController
@RequestMapping("/ffzf/user")
@RequiredArgsConstructor
@Tag(description = "ffzf/user" , name = "用户接口" )
public class UserController{
    private final UserService userService;
    private final ParkService parkService;
    @PostMapping("/findPage")
    @Operation(summary = "分页查询" , description = "分页查询" )
    public Object findPage(User user, Page page) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -39,12 +43,14 @@
    }
    @PostMapping("/findAll")
    @Operation(summary = "查询所有" , description = "查询所有" )
    public Object findAll() {
        return R.ok(userService.list());
    }
    @PostMapping("/save")
    @Operation(summary = "新增用户" , description = "新增用户" )
    public Object save(User user) {
        if(user.getId()==null){
            user.setPassword(user.getLoginName());
@@ -54,12 +60,14 @@
    }
    @PostMapping("/delete")
    @Operation(summary = "删除用户" , description = "删除用户" )
    public Object delete(Long id) {
        userService.removeById(id);
        return R.ok("删除成功");
    }
    @PostMapping("/login")
    @Operation(summary = "登录" , description = "登录" )
    public Object login(String loginName,String password,String lng,String lat) {
        if(StringUtils.isBlank(loginName)||StringUtils.isBlank(password)){
            return R.failed("用户名和密码必填");
@@ -90,6 +98,7 @@
    }
    @PostMapping("updatePassword")
    @Operation(summary = "修改密码" , description = "修改密码" )
    public Object updatePassword(Long userId,String oldPassword,String newPassword) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.lambda()
src/main/java/com/boying/controller/ViolationTypeController.java
@@ -6,17 +6,21 @@
import com.boying.entity.ViolationType;
import com.boying.service.ViolationTypeService;
import io.swagger.models.auth.In;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("ffzf/violationtype")
@RequiredArgsConstructor
@Tag(description = "ffzf/violationtype" , name = "违章类型接口" )
public class ViolationTypeController {
    private final ViolationTypeService violationTypeService;
    @PostMapping("/findPage")
    @Operation(summary = "分页查询" , description = "分页查询" )
    public Object findPage(Page page) {
        QueryWrapper<ViolationType> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -25,23 +29,27 @@
    }
    @PostMapping("/save")
    @Operation(summary = "新增违章类型" , description = "新增违章类型" )
    public Object save(ViolationType violationType) {
        violationTypeService.saveOrUpdate(violationType);
        return R.ok("保存成功");
    }
    @GetMapping("/{id}")
    @Operation(summary = "根据id查询" , description = "根据id查询" )
    public Object getObj(@PathVariable Integer id) {
        return R.ok(violationTypeService.getById(id));
    }
    @PostMapping("/delete")
    @Operation(summary = "删除违章类型" , description = "删除违章类型" )
    public Object delete(Long id) {
        violationTypeService.removeById(id);
        return R.ok("删除成功");
    }
    @PostMapping("/findAll")
    @Operation(summary = "查询所有" , description = "查询所有" )
    public Object findAll() {
        return R.ok(violationTypeService.list());
    }
src/main/java/com/boying/controller/WhiteListController.java
@@ -8,6 +8,8 @@
import com.boying.entity.WhiteList;
import com.boying.service.ParkService;
import com.boying.service.WhiteListService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -17,12 +19,14 @@
@RestController
@RequestMapping("ffzf/whiteList")
@RequiredArgsConstructor
@Tag(description = "ffzf/whiteList" , name = "白名单接口" )
public class WhiteListController{
    private final WhiteListService whiteListService;
    private final ParkService parkService;
    @PostMapping("/findPage")
    @Operation(summary = "分页查询" , description = "分页查询" )
    public Object findPage(Page page, String carNo) {
        QueryWrapper<WhiteList> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -38,6 +42,7 @@
    }
    @PostMapping("/findPageNew")
    @Operation(summary = "分页查询(新)" , description = "分页查询(新)" )
    public Object findPageNew(Page page, String carNo) {
        QueryWrapper<WhiteList> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -64,12 +69,14 @@
    }
    @PostMapping("/save")
    @Operation(summary = "新增白名单" , description = "新增白名单" )
    public Object save(WhiteList whiteList) {
        whiteListService.saveOrUpdate(whiteList);
        return R.ok("保存成功");
    }
    @PostMapping("/delete")
    @Operation(summary = "删除白名单" , description = "删除白名单" )
    public Object delete(Long id) {
        whiteListService.removeById(id);
        return R.ok("删除成功");
src/main/java/com/boying/controller/car/MqttSample.java
New file
@@ -0,0 +1,66 @@
package com.boying.controller.car;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
/**
 * @author kdq
 * @version 1.0.0
 * @ClassName MqttSample.java
 * @Description TODO
 * @createTime 2024年03月19日 16:56:00
 */
public class MqttSample {
    public static void main(String[] args) throws MqttException{
        MqttSample client = new MqttSample();
        client.start();
    }
    //MQTT安装的服务器地址和端口号(本机的ip)
    public static final String HOST = "tcp://39.96.92.240:9092";
    //定义一个主题
    public static final String TOPIC = "/device/message/up/keep_alive";
    //定义MQTT的ID,可以在MQTT服务配置中指定
    private static final String clientid = "client-2";
    private MqttClient client;
    private MqttConnectOptions options;
    private String userName = "mqtt";
    private String passWord = "mqtt";
//    private ScheduledExecutorService scheduler;
    private void start() {
        try {
            // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
            client = new MqttClient(HOST, clientid, new MemoryPersistence());
            // MQTT的连接设置
            options = new MqttConnectOptions();
            // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
            options.setCleanSession(false);
            // 设置连接的用户名
            options.setUserName(userName);
            // 设置连接的密码
            options.setPassword(passWord.toCharArray());
            // 设置超时时间 单位为秒
            options.setConnectionTimeout(10);
            // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
            options.setKeepAliveInterval(20);
            // 设置回调,client.setCallback就可以调用PushCallback类中的messageArrived()方法
            client.setCallback(new PushCallback());
            MqttTopic topic = client.getTopic(TOPIC);
            int qos = 2;
            //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
            options.setWill(topic, "This is yizhu...".getBytes(), qos, true);
            client.connect(options);
            //订阅消息
            int[] Qos  = {qos};
            String[] topic1 = {TOPIC};
            client.subscribe(topic1, Qos);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
src/main/java/com/boying/controller/car/MqttSample2.java
New file
@@ -0,0 +1,69 @@
package com.boying.controller.car;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
/**
 * @author kdq
 * @version 1.0.0
 * @ClassName MqttSample.java
 * @Description TODO
 * @createTime 2024年03月19日 16:56:00
 */
public class MqttSample2 {
    public static void main(String[] args) throws MqttException{
        MqttSample2 client = new MqttSample2();
        client.start();
    }
    //MQTT安装的服务器地址和端口号(本机的ip)
    public static final String HOST = "tcp://39.96.92.240:9092";
    //定义一个主题
    public static final String TOPIC = "/device/message/up/ivs_result";
    //定义MQTT的ID,可以在MQTT服务配置中指定
    private static final String clientid = "client-3";
    private MqttClient client;
    private MqttConnectOptions options;
    private String userName = "mqtt";
    private String passWord = "mqtt";
//    private ScheduledExecutorService scheduler;
    private void start() {
        try {
            // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
            client = new MqttClient(HOST, clientid, new MemoryPersistence());
            // MQTT的连接设置
            options = new MqttConnectOptions();
            // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
            options.setCleanSession(false);
            // 设置连接的用户名
            options.setUserName(userName);
            // 设置连接的密码
            options.setPassword(passWord.toCharArray());
            // 设置超时时间 单位为秒
            options.setConnectionTimeout(10);
            // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
            options.setKeepAliveInterval(20);
            // 设置回调,client.setCallback就可以调用PushCallback类中的messageArrived()方法
            client.setCallback(new PushCallback());
            MqttTopic topic = client.getTopic(TOPIC);
            int qos = 2;
            //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
            options.setWill(topic, "This is yizhu...".getBytes(), qos, true);
            client.connect(options);
            //订阅消息
            int[] Qos  = {qos};
            String[] topic1 = {TOPIC};
            client.subscribe(topic1, Qos);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
src/main/java/com/boying/controller/car/PlateServlet2.java
@@ -16,6 +16,8 @@
import com.google.gson.JsonParser;
import com.sun.media.jfxmedia.track.Track;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -33,6 +35,7 @@
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Base64;
@@ -44,8 +47,9 @@
 * Servlet implementation class PlateServlet
 */
@Controller
@RequestMapping("/car2")
@RequestMapping("/ffzf/car2")
@RequiredArgsConstructor
@Tag(description = "ffzf/car3" , name = "泊车流程接口" )
public class PlateServlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Value("${ffpark.logPath}")
@@ -60,6 +64,7 @@
    private final TicketService ticketService;
    private final CostRuleService costRuleService;
    private final WhiteListService whiteListService;
    private final OutParkLogService outParkLogService;
    private final String LEDURL = "http://192.168.31.212:9988/LedShow/IGetResultDataAllLine";
    /**
@@ -120,20 +125,41 @@
        out.close();
    }
//    protected void easyOpen(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        response.setContentType("text/json");
//        PrintWriter out = response.getWriter();
//        out.println("{\"Response_AlarmInfoPlate\":{\"info\":\"ok\",\"content\":\"...\",\"is_pay\":\"true\",\"ivs_ioctrl\":{\"delay\":800,\"io\":0,\"value\":2}}}");
//        out.flush();
//        out.close();
//    }
    protected void easyOpen(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/json");
        PrintWriter out = response.getWriter();
        out.println("{\"Response_AlarmInfoPlate\":{\"info\":\"ok\",\"content\":\"...\",\"is_pay\":\"true\"}}");
        out.println("{\"Response_AlarmInfoPlate\":{\"ivs_ioctrl\":{\"delay\":1000,\"io\":0,\"value\":2}}}");
        out.flush();
        out.close();
    }
    protected void easyNoOpen(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")
    @Operation(summary = "相机心跳接口" , description = "相机心跳接口" )
    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());
        Park park = parkService.getOneById(barrier.getParkId());
        //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(redisnum)){
            redisnum = "0";
        }
        if(barrier!=null){
            if(barrier.getType2()==1){
                //待开闸
@@ -145,9 +171,11 @@
                    int i = Integer.parseInt(redisnum);
                    i--;
                    if(i<0){
                        String s= "2."+barrier.getCarNo()+"闸机手动启动,场内停车数为"+i+"\n";
                        redisTemplate.opsForValue().set("car_park_" + park.getId(),"0",30, TimeUnit.DAYS);
                        redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS);
                    }else {
                        String s= "2."+barrier.getCarNo()+"闸机手动启动,场内停车数为"+i+"\n";
                        redisTemplate.opsForValue().set("car_park_" + park.getId(),Integer.toString(i),30, TimeUnit.DAYS);
                        redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS);
                    }
@@ -158,31 +186,52 @@
                barrier.setStatus(0);
                barrier.setUpdateTime(LocalDateTime.now());
                barrierService.saveOrUpdate(barrier);
                String jsonValue = JSON.toJSONString(barrier);
                redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue);
                easyOpen(request,response);
            }else {
                //不需开闸
                barrier.setStatus(0);
                barrier.setUpdateTime(LocalDateTime.now());
                barrierService.saveOrUpdate(barrier);
                OutPark outPark = outParkService.count4(barrier.getId());
                if(outPark!=null){
                    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);
                LocalDateTime now = LocalDateTime.now();
                LocalDateTime updateTime = barrier.getUpdateTime();
                Duration duration = Duration.between(updateTime,now);
                long minutes = duration.toMinutes();
                if(minutes>=2){
                    barrier.setStatus(0);
                    barrier.setUpdateTime(LocalDateTime.now());
                    barrierService.saveOrUpdate(barrier);
                }
                String jsonValue = JSON.toJSONString(barrier);
                redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue);
                if(barrier.getType() == 0){
                    OutPark outPark = outParkService.count4(barrier.getId());
                    if(outPark!=null){
                        if(barrier.getType() == 0){
                            int i = Integer.parseInt(redisnum);
                            i--;
                            if(i<0){
                                String s= "2."+outPark.getCarNo()+"缴费完成,场内停车数为"+i+"\n";
                                redisTemplate.opsForValue().set("car_park_" + park.getId(),"0",30, TimeUnit.DAYS);
                                redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS);
                            }else {
                                String s= "2."+outPark.getCarNo()+"缴费完成,场内停车数为"+i+"\n";
                                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);
                        easyOpen(request,response);
                        OutParkLog byOutPark = outParkLogService.getByOutPark(outPark.getCarNo(), outPark.getId());
                        byOutPark.setOpenTime(LocalDateTime.now());
                        outParkLogService.saveOrUpdate(byOutPark);
                        enterParkService.deleteByCarNo(outPark.getCarNo(), barrier.getParkId());
                        redisTemplate.delete("outPark-"+outPark.getBarrierId());
                    }
                    outPark.setStatus2(1);
                    outParkService.saveOrUpdate(outPark);
                    easyOpen(request,response);
                }
                if(barrier.getType() == 1){
                    boolean in = barrierService.getDateDifIn(barrier.getId());
                    boolean in = barrierService.getDateDifIn(park.getId());
                    if(in){
                        inLedShowDefault(park.getId(),request,response);
                    }
@@ -194,12 +243,15 @@
                }
            }
        }else {
            easyNoOpen(request,response);
        }
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    @PostMapping("/PlateServlet")
    @Operation(summary = "车辆识别接口" , description = "车辆识别接口" )
    protected void info(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String s= "";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
@@ -261,29 +313,31 @@
                    s+="查询道闸为空\n";
                }else{
                    if(barrier.getType()==0){
                        easyOpen(request,response);
                        //noOpen(request,response);
                        outPark(license, barrier.getId(), barrier.getParkId(),request,response);
                        s+=license+"-保存出场记录\n";
//                        outPark(license, barrier.getId(), barrier.getParkId(),request,response);
//                        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显示
                            inLedFullShow(code, license,barrier.getParkId(),request,response);
                        }else {
                            //led显示
                            inLedShow(code, license,barrier.getParkId(),request,response);
                            enterPark(license,barrier.getId(),barrier.getParkId());
                            s+=license+"-保存入场记录\n";
                        }
                        easyOpen(request,response);
//                        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显示
//                            inLedFullShow(code, license,barrier.getParkId(),request,response);
//                        }else {
//                            //led显示
//                            inLedShow(code, license,barrier.getParkId(),request,response);
//                            enterPark(license,barrier.getId(),barrier.getParkId());
//                            s+=license+"-保存入场记录\n";
//                        }
                    }
                }
                writeTxt(s);
               // writeTxt(s);
            }while(false);
        }
        catch (Exception e) {
@@ -346,6 +400,8 @@
            enterPark.setStatus(1);//发现有违章
        }
        enterParkService.saveOrUpdate(enterPark);
        String jsonValue = JSON.toJSONString(enterPark);
        redisTemplate.opsForValue().set("enterPark_dif_"+ parkId, jsonValue);
        Barrier barrier = barrierService.getById(barrierId);
        barrier.setType2(1);
@@ -403,6 +459,8 @@
                    byCarNoAndBarrierId.setStatus(1);
                    byCarNoAndBarrierId.setStatus2(1);
                    outParkService.saveOrUpdate(byCarNoAndBarrierId);
                    String jsonValue = JSON.toJSONString(byCarNoAndBarrierId);
                    redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
                    return 0.0;
                }else{
                    if(w.getParkIds()!=null){
@@ -417,6 +475,8 @@
                                    byCarNoAndBarrierId.setStatus(1);
                                    byCarNoAndBarrierId.setStatus2(1);
                                    outParkService.saveOrUpdate(byCarNoAndBarrierId);
                                    String jsonValue = JSON.toJSONString(byCarNoAndBarrierId);
                                    redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
                                    return 0.0;
                                }
                            }
@@ -427,10 +487,14 @@
        }
        if(outPark.getPrice()==0&&outPark.getStatus3()==0){
            System.out.println(outPark.getCarNo()+"该车不需要缴费");
            String jsonValue = JSON.toJSONString(outPark);
            redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
            outLedShow(barrier.getCode(),barrier.getCarNo(),outPark.getPrice(),toDayHrMinSec,barrier.getParkId(),request,response,0);
        }else {
            //需要缴费或者有违章
            System.out.println(outPark.getCarNo()+"该车需要缴费"+outPark.getPrice());
            String jsonValue = JSON.toJSONString(outPark);
            redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
            outLedShow(barrier.getCode(),barrier.getCarNo(),outPark.getPrice(),toDayHrMinSec,barrier.getParkId(),request,response,1);
        }
        barrierService.saveOrUpdate(barrier);
src/main/java/com/boying/controller/car/PlateServlet3.java
@@ -1,1017 +1,1017 @@
package com.boying.controller.car;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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.boying.util.FileUtil;
import com.boying.util.RedisJsonUtil;
import com.boying.util.StringUtil;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import ledshow.CodeUtil;
import ledshow.LedBean;
import ledshow.ResultData;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.web.bind.annotation.ResponseBody;
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.Duration;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Base64;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * Servlet implementation class PlateServlet
 */
@Controller
@RequestMapping("/ffzf/car")
@RequiredArgsConstructor
public class PlateServlet3 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 WhiteListService whiteListService;
    private final FileInfoService fileInfoService;
    private final TicketBlackService ticketBlackService;
    private final OutParkLogService outParkLogService;
   // private final RedisJsonUtil redisJsonUtil;
    private final String LEDURL = "http://192.168.31.212:9988/LedShow/IGetResultDataAllLine";
    /**
     * 回复开闸
     */
    protected void open(HttpServletRequest request, HttpServletResponse response,String data) throws ServletException, IOException {
        response.setContentType("text/json");
        PrintWriter out = response.getWriter();
        String aa = "{" +
                "\"Response_AlarmInfoPlate\": {" +
                "\"info\":\"ok\"," +
                "\"is_pay\":\"true\"," +
                "\"serialData\" :[" +
                "{" +
                "\"serialChannel\":0," +
                "\"data\" : \"" + data + "\"," +
                "\"dataLen\" :" + data.length() +
                "}" +
                "]" +
                "}" +
                "}";
        out.println(aa);
        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,String data) throws IOException {
        response.setContentType("text/json");
        PrintWriter out = response.getWriter();
        String aa = "{" +
                "\"Response_AlarmInfoPlate\": {" +
                "\"serialData\" :[" +
                "{" +
                "\"serialChannel\":0," +
                "\"data\" : \"" + data + "\"," +
                "\"dataLen\" :" + data.length() +
                "}" +
                "]" +
                "}" +
                "}";
        out.println(aa);
        out.flush();
        out.close();
    }
    protected void easyOpen(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/json");
        PrintWriter out = response.getWriter();
        out.println("{\"Response_AlarmInfoPlate\":{\"info\":\"ok\",\"content\":\"...\",\"is_pay\":\"true\"}}");
        out.flush();
        out.close();
    }
    protected void easyOpen2(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/json");
        PrintWriter out = response.getWriter();
        out.println("{\"Response_AlarmInfoPlate\":{\"ivs_ioctrl\":{\"delay\":1000,\"io\":0,\"value\":2}}}");
        out.flush();
        out.close();
    }
    protected void easyNoOpen(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.getOneById(barrier.getParkId());
       // 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(redisnum)){
            redisnum = "0";
        }
        if(barrier!=null){
            if(barrier.getType2()==1){
                //待开闸
                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){
                        String s= "2."+barrier.getCarNo()+"闸机手动启动,场内停车数为"+i+"\n";
                        writeTxt2(s);
                        redisTemplate.opsForValue().set("car_park_" + park.getId(),"0",30, TimeUnit.DAYS);
                        redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS);
                    }else {
                        String s= "2."+barrier.getCarNo()+"闸机手动启动,场内停车数为"+i+"\n";
                        writeTxt2(s);
                        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());
                barrier.setStatus(0);
                barrier.setUpdateTime(LocalDateTime.now());
                barrierService.saveOrUpdate(barrier);
                String jsonValue = JSON.toJSONString(barrier);
                redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue);
                easyOpen(request,response);
            }else {
                //不需开闸
                LocalDateTime now = LocalDateTime.now();
                LocalDateTime updateTime = barrier.getUpdateTime();
                Duration duration = Duration.between(updateTime,now);
                long minutes = duration.toMinutes();
                if(minutes>=2){
                    barrier.setStatus(0);
                    barrier.setUpdateTime(LocalDateTime.now());
                    barrierService.saveOrUpdate(barrier);
                }
                String jsonValue = JSON.toJSONString(barrier);
                redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue);
                if(barrier.getType() == 0){
                    OutPark outPark = outParkService.count4(barrier.getId());
                    if(outPark!=null){
                        if(barrier.getType() == 0){
                            int i = Integer.parseInt(redisnum);
                            i--;
                            if(i<0){
                                String s= "2."+outPark.getCarNo()+"缴费完成,场内停车数为"+i+"\n";
                                writeTxt2(s);
                                redisTemplate.opsForValue().set("car_park_" + park.getId(),"0",30, TimeUnit.DAYS);
                                redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS);
                            }else {
                                String s= "2."+outPark.getCarNo()+"缴费完成,场内停车数为"+i+"\n";
                                writeTxt2(s);
                                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);
                        easyOpen(request,response);
                        OutParkLog byOutPark = outParkLogService.getByOutPark(outPark.getCarNo(), outPark.getId());
                        byOutPark.setOpenTime(LocalDateTime.now());
                        outParkLogService.saveOrUpdate(byOutPark);
                        enterParkService.deleteByCarNo(outPark.getCarNo(), barrier.getParkId());
                        redisTemplate.delete("outPark-"+outPark.getBarrierId());
                    }
                }
                if(barrier.getType() == 1){
                    boolean in = barrierService.getDateDifIn(park.getId());
                    if(in){
                        inLedShowDefault(park.getId(),request,response);
                    }
                }else if(barrier.getType() == 0){
                    boolean out = barrierService.getDateDifOut(barrier.getId());
                    if(out){
                        outLedShowDefault(request,response);
                    }
                }
            }
        }else {
            easyNoOpen(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 = "";
        FileInfo fileInfo = null;
        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 image = plateResult.get("imageFile").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;
                }
                if(StringUtils.isNotBlank(image)){
                    fileInfo = FileUtil.generateBase64StringToFile(image, 1,1);
                    fileInfoService.save(fileInfo);
                }
                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";
                    easyNoOpen(request,response);
                }else{
                    if(barrier.getType()==0){
                        outPark(license, barrier.getId(), barrier.getParkId(),request,response,fileInfo);
                        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显示
                            inLedFullShow(code, license,barrier.getParkId(),request,response);
                        }else {
                            //led显示
                            enterPark(license,barrier.getId(),barrier.getParkId(),fileInfo);
                            inLedShow(code, license,barrier.getParkId(),request,response);
                            s+=license+"-保存入场记录\n";
                        }
                    }
                }
                writeTxt(s);
            }while(false);
        }
        catch (Exception e) {
            System.out.println("无入场记录");
            s+=" ,查询场内记录异常";
            writeTxt(s);
            easyNoOpen(request,response);
        }
    }
    /**
     * 手机号入场
     * @param
     * @return
     */
    @PostMapping("/inParkByPhone" )
    @ResponseBody
    public Object inParkByPhone( EnterPark enterPark){
        Barrier barrier = barrierService.getById(enterPark.getBarrierId());
        if(barrier!=null){
            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() ){
                return R.failed(null,"禁止通行,车位已满");
            }else {
                QueryWrapper<EnterPark> wrapper2 = new QueryWrapper<>();
                wrapper2.lambda()
                        .eq(EnterPark::getBarrierId,barrier.getId())
                        .orderByDesc(EnterPark::getCreateTime)
                        .last(" limit 1");
                EnterPark one = enterParkService.getOne(wrapper2);
                if(one == null){
                    return R.failed("未查询到车辆存在");
                }else {
                    if(one.getCarNo().equals("无牌车")){
                        enterPark.setCreateTime(LocalDateTime.now());
                        QueryWrapper<Ticket> wrapper = new QueryWrapper<>();
                        wrapper.lambda()
                                .eq(Ticket::getCarNo,enterPark.getCarNo())
                                .eq(Ticket::getPayStatus,1);
                        List<Ticket> tickets = ticketService.list(wrapper);
                        if(tickets.size()>0){
                            enterPark.setStatus(1);//发现有违章
                        }
                        enterPark.setIsPay(0);
                        enterPark.setPrice(0);
                        enterParkService.deleteByCarNo(enterPark.getCarNo(),enterPark.getParkId());
                        enterParkService.save(enterPark);
                        barrier.setType2(1);
                        barrierService.updateById(barrier);
                        return R.ok();
                    }else {
                        return R.failed("非法操作");
                    }
                }
            }
        }
        return R.failed(null,"数据异常");
    }
    /**
     * 手机号出场
     * @param
     * @return
     */
    @PostMapping("/outParkByPhone" )
    @ResponseBody
    public Object outParkByPhone(String code2,String carNo){
        Barrier byCode2 = barrierService.findByCode2(code2);
        QueryWrapper<EnterPark> wrapper =new QueryWrapper<>();
        wrapper.lambda()
                .eq(EnterPark::getParkId,byCode2.getParkId())
                .eq(EnterPark::getCarNo,carNo);
        EnterPark one = enterParkService.getOne(wrapper);
        if(one != null){
            double money = 0.0;
            String toDayHrMinSec = null;
            OutPark outPark = new OutPark();
            outPark.setCarNo(carNo);
            outPark.setParkId(one.getParkId());
            outPark.setBarrierId(byCode2.getId());
            outPark.setCreateTime(LocalDateTime.now());
            outPark.setCode(System.currentTimeMillis()+"");
            System.out.println("入场记录:"+one);
            outPark.setEnterTime(one.getCreateTime());
            outPark.setParkName(byCode2.getName());
            if(outPark.getTime() > 0){
                outPark.setTimeStr(DateUtilOther.millisToDayHrMinSec(new Double(outPark.getTime()).longValue()));
            }else {
                outPark.setTimeStr("不足一分钟");
            }
            try {
                long l = outPark.getCreateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli() - one.getCreateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli();
                outPark.setTime(l/(1000*60));
                toDayHrMinSec = DateUtilOther.millisToDayHrMinSec(l/(1000*60));
                money = costRuleService.getMoney(one.getParkId(), outPark.getEnterTime(), outPark.getCreateTime(), 1);
                //入场记录保存一下
                if(one.getIsPay()==1){
                    money = money - one.getPrice();
                }else {
                    one.setPrice(money);
                    one.setIsPay(0);
                    enterParkService.updateById(one);
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
            outPark.setPrice(money);
            outPark.setStatus3(findTicket(carNo));
            outParkService.saveOrUpdate(outPark);
            byCode2.setCarNo(carNo);
            //led展示
            if(toDayHrMinSec == null){
                return R.failed("异常记录");
            }
            if(outPark.getPrice()==0&&outPark.getStatus3()==0){
                System.out.println(outPark.getCarNo()+"该车不需要缴费");
                String s= "1."+byCode2.getCarNo()+"该车不需要缴费\n";
                writeTxt2(s);
                byCode2.setType2(1);
                barrierService.updateById(byCode2);
                return R.ok(outPark);
            }else {
                //需要缴费或者有违章
                System.out.println(outPark.getCarNo()+"该车需要缴费"+outPark.getPrice());
                String s= "1."+byCode2.getCarNo()+"该车需要缴费\n";
                writeTxt2(s);
                barrierService.updateById(byCode2);
                return R.ok(outPark);
            }
        }else {
            return R.failed("未查询到入场记录");
        }
    }
    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("打印错误");
        }
    }
    private void writeTxt2( String txt)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        try
        {
            FileWriter f = new FileWriter(systemConfigProperties.getLogPath()+sdf.format(new Date())+"LED.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,FileInfo fileInfo) {
        TicketBlack black = ticketBlackService.getByCarNo(carNo, 1);
        if(black != null){
            System.out.println("黑名单车辆"+carNo);
        }else {
            enterParkService.deleteByCarNo(carNo,parkId);
            EnterPark enterPark = new EnterPark();
            enterPark.setIsPay(0);
            enterPark.setPrice(0);
            enterPark.setCarNo(carNo);
            enterPark.setBarrierId(barrierId);
            enterPark.setParkId(parkId);
            QueryWrapper<Ticket> wrapper = new QueryWrapper<>();
            wrapper.lambda()
                    .eq(Ticket::getCarNo,enterPark.getCarNo())
                    .eq(Ticket::getPayStatus,1);
            List<Ticket> tickets = ticketService.list(wrapper);
            if(tickets.size()>0){
                enterPark.setStatus(1);//发现有违章
            }
            if(fileInfo != null){
                enterPark.setImgId(fileInfo.getId());
            }
            enterParkService.saveOrUpdate(enterPark);
            String jsonValue = JSON.toJSONString(enterPark);
            redisTemplate.opsForValue().set("enterPark_dif_"+ parkId, jsonValue);
        }
    }
    public double outPark(String carNo,Integer barrierId,Integer parkId,HttpServletRequest request, HttpServletResponse response,FileInfo fileInfo) throws ServletException, IOException {
        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<EnterPark> 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);
                //入场记录保存一下
                if(enterPark.getIsPay() != null && enterPark.getIsPay()==1){
                    money = money - enterPark.getPrice();
                }else {
                    enterPark.setPrice(money);
                    enterPark.setIsPay(0);
                    enterParkService.updateById(enterPark);
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        //outPark.setPrice(Double.valueOf(String.format("%.1f", money)));
        outPark.setPrice(money);
        outPark.setStatus3(findTicket(carNo));
        if(fileInfo != null){
            outPark.setImgId(fileInfo.getId());
        }
        outParkService.saveOrUpdate(outPark);
        Barrier barrier =barrierService.getById(barrierId);
        barrier.setCarNo(carNo);
        //led展示
        if(toDayHrMinSec == null){
            toDayHrMinSec = "入场记录异常,请联系管理员";
        }
        //判断是否在白名单
        QueryWrapper<WhiteList> wrapper = new QueryWrapper<>();
        wrapper.lambda()
                .eq(WhiteList::getCarNo,carNo);
        List<WhiteList> all = whiteListService.list(wrapper);
        if(all.size() >0){
            for(WhiteList w : all){
                if(w.getType()==0){
                    outLedShowYueZu(barrier.getCarNo(),"月租车",parkId,request,response,0);
                    OutPark byCarNoAndBarrierId = outParkService.findByCarNoAndBarrierId(carNo, barrierId);
                    byCarNoAndBarrierId.setStatus(2);
                    byCarNoAndBarrierId.setStatus2(1);
                    outParkService.saveOrUpdate(byCarNoAndBarrierId);
                    barrierService.saveOrUpdate(barrier);
                    String jsonValue2 = JSON.toJSONString(barrier);
                    redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue2);
                    String jsonValue = JSON.toJSONString(byCarNoAndBarrierId);
                    redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
                    return 0.0;
                }else{
                    if(StringUtils.isNotBlank(w.getParkIds())){
                        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()<w.getEndTime().getTime()){
                                    outLedShowYueZu(barrier.getCarNo(),"月租车",parkId,request,response,0);
                                    OutPark byCarNoAndBarrierId = outParkService.findByCarNoAndBarrierId(carNo, barrierId);
                                    byCarNoAndBarrierId.setStatus(2);
                                    byCarNoAndBarrierId.setStatus2(1);
                                    outParkService.saveOrUpdate(byCarNoAndBarrierId);
                                    barrierService.saveOrUpdate(barrier);
                                    String jsonValue2 = JSON.toJSONString(barrier);
                                    redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue2);
                                    String jsonValue = JSON.toJSONString(byCarNoAndBarrierId);
                                    redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
                                    return 0.0;
                                }
                            }
                        }
                    }
                }
            }
        }
        barrierService.saveOrUpdate(barrier);
        String jsonValue2 = JSON.toJSONString(barrier);
        redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue2);
        if(outPark.getPrice()==0&&outPark.getStatus3()==0){
            System.out.println(outPark.getCarNo()+"该车不需要缴费");
            String s= "1."+barrier.getCarNo()+"该车不需要缴费\n";
            writeTxt2(s);
            String jsonValue = JSON.toJSONString(outPark);
            redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
            outLedShow(outPark,barrier.getCode(),barrier.getCarNo(),outPark.getPrice(),toDayHrMinSec,barrier.getParkId(),request,response,0);
        }else {
            //需要缴费或者有违章
            System.out.println(outPark.getCarNo()+"该车需要缴费"+outPark.getPrice());
            String s= "1."+barrier.getCarNo()+"该车需要缴费\n";
            writeTxt2(s);
            OutParkLog byOutPark = outParkLogService.getByOutPark(outPark.getCarNo(), outPark.getId());
            byOutPark.setOutTime(outPark.getCreateTime());
            byOutPark.setParkId(outPark.getParkId());
            outParkLogService.saveOrUpdate(byOutPark);
            String jsonValue = JSON.toJSONString(outPark);
            redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
            outLedShow(outPark,barrier.getCode(),barrier.getCarNo(),outPark.getPrice(),toDayHrMinSec,barrier.getParkId(),request,response,1);
        }
        return money;
    }
    public int findTicket(String carNo){
        QueryWrapper<Ticket> wrapper = new QueryWrapper<>();
        wrapper.lambda()
                .eq(Ticket::getCarNo,carNo)
                .eq(Ticket::getPayStatus,1);
        List<Ticket> tickets = ticketService.list(wrapper);
        if(tickets.size()>0){
            return 1;
        }else{
            return 0;
        }
    }
    public void inLedShow(String ledId,String carNo,Integer parkId,HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        TicketBlack black = ticketBlackService.getByCarNo(carNo, 1);
        if(black != null){
            LedBean ledBean = new LedBean();
            ledBean.setcolor1(0);
            ledBean.setcolor2(0);
            ledBean.setcolor3(0);
            ledBean.setcolor4(0);
            ledBean.setcontent1(carNo);
            ledBean.setcontent2("黑名单车辆");
            ledBean.setcontent3("禁止驶入");
            ledBean.setcontent4("联系管理员");
            ledBean.setdisMode1(0);
            ledBean.setdisMode2(0);
            ledBean.setdisMode3(0);
            ledBean.setdisMode4(0);
            ledBean.setvoiceContent("黑名单车辆"+carNo+",禁止驶入");
            ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
            byte[] dataX = new byte[resultData.getlenth()];
            System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
            String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
            data1 = data1.replaceAll("\r\n", "");
            noOpen(request,response,data1);
        }else {
            String num = redisTemplate.opsForValue().get("car_park_" +  parkId);
            if(num == null){
                num = "0";
            }
            Park byId = parkService.getById(parkId);
            int n = Integer.parseInt(num)+1;
            redisTemplate.opsForValue().set("car_park_" + parkId,Integer.toString(n),30, TimeUnit.DAYS);
            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(StringUtils.isNotBlank(byCarNo.getParkIds()) && byCarNo.getParkIds().contains(barrier.getParkId()+"")){
                        carType = "月租车";
                        long l = (byCarNo.getEndTime().getTime() - byCarNo.getStartTime().getTime()) / (24 * 3600 * 1000);
                        carDay = "有效期还有"+l+"天";
                    }else {
                        carType = "临时车";
                    }
                }
            }
            if(StringUtils.isBlank(carDay) && !carNo.equals("无牌车")){
                carDay = "欢迎光临";
            }else if(StringUtils.isBlank(carDay) && carNo.equals("无牌车")){
                carDay = "拒绝驶入";
            }
            LedBean ledBean = new LedBean();
            ledBean.setcolor1(0);
            ledBean.setcolor2(0);
            ledBean.setcolor3(0);
            ledBean.setcolor4(0);
            ledBean.setcontent1(carNo);
            ledBean.setcontent2(carType);
            ledBean.setcontent3(carDay);
            ledBean.setcontent4("余位:"+i);
            ledBean.setdisMode1(0);
            ledBean.setdisMode2(0);
            ledBean.setdisMode3(0);
            ledBean.setdisMode4(0);
            ledBean.setvoiceContent(carType+","+carNo+","+carDay);
            ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
            byte[] dataX = new byte[resultData.getlenth()];
            System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
            String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
            data1 = data1.replaceAll("\r\n", "");
            if(!carNo.equals("无牌车")){
                open(request,response,data1);//入场开闸
            }else {
                noOpen(request,response,data1);
            }
        }
    }
    public void inLedFullShow(String ledId, String carNo, Integer parkId,HttpServletRequest request, HttpServletResponse response) throws IOException {
        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(StringUtils.isNotBlank(byCarNo.getParkIds()) && byCarNo.getParkIds().contains(barrier.getParkId()+"")){
                    carType = "月租车";
                }else {
                    carType = "临时车";
                }
            }
        }
        LedBean ledBean = new LedBean();
        ledBean.setcolor1(0);
        ledBean.setcolor2(0);
        ledBean.setcolor3(0);
        ledBean.setcolor4(0);
        ledBean.setcontent1(carNo);
        ledBean.setcontent2(carType);
        ledBean.setcontent3("车位已满");
        ledBean.setcontent4("请驶离");
        ledBean.setdisMode1(0);
        ledBean.setdisMode2(0);
        ledBean.setdisMode3(0);
        ledBean.setdisMode4(0);
        ledBean.setvoiceContent("车位已满,请驶离");
        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
        byte[] dataX = new byte[resultData.getlenth()];
        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
        data1 = data1.replaceAll("\r\n", "");
        noOpen(request,response,data1);//入场开闸
    }
    public void outLedShow(OutPark outPark,String ledId,String carNo,Double price,String timeStamp,Integer parkId,HttpServletRequest request, HttpServletResponse response,int type) throws ServletException, IOException {
        String redisnum = redisTemplate.opsForValue().get("car_park_" + parkId);
        Park park = parkService.getById(parkId);
        LedBean ledBean = new LedBean();
        ledBean.setcolor1(0);
        ledBean.setcolor2(0);
        ledBean.setcolor3(0);
        ledBean.setcolor4(0);
        ledBean.setcontent1(carNo);
        ledBean.setcontent2("停车"+timeStamp);
        ledBean.setcontent3("交费"+price+"元");
        ledBean.setcontent4("禁止闯杆");
        ledBean.setdisMode1(0);
        ledBean.setdisMode2(1);
        ledBean.setdisMode3(1);
        ledBean.setdisMode4(0);
        ledBean.setvoiceContent(carNo+"停车"+timeStamp+"交费"+price+"元");
        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
        byte[] dataX = new byte[resultData.getlenth()];
        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
        data1 = data1.replaceAll("\r\n", "");
        if(type == 0){
            if(carNo.equals("无牌车")){
                noOpen(request,response,data1);
            }else {
                if(timeStamp.contains("记录异常")){
                    OutPark by5min = outParkService.findBy5min(carNo, parkId, LocalDateTime.now());
                    if(by5min != null){
                        //开闸
                        open(request,response,data1);
                        enterParkService.deleteByCarNo(carNo, parkId);
                        redisTemplate.opsForValue().set("park_change_in_"+parkId,"true",1, TimeUnit.DAYS);
                        int i = Integer.parseInt(redisnum);
                        i--;
                        if(i<0){
                            String s= "2."+carNo+",场内停车数为0\n";
                            writeTxt2(s);
                            redisTemplate.opsForValue().set("car_park_" + parkId,"0",30, TimeUnit.DAYS);
                            redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
                        }else {
                            String s= "2."+carNo+",场内停车数为"+i+"\n";
                            writeTxt2(s);
                            redisTemplate.opsForValue().set("car_park_" + parkId,Integer.toString(i),30, TimeUnit.DAYS);
                            redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
                        }
                    }else {
                        noOpen(request,response,data1);
                    }
                }else {
                    //开闸
                    open(request,response,data1);
                    //缓存在redis里,心跳接口去抬杆
                    String jsonValue = JSON.toJSONString(outPark);
                    redisTemplate.opsForValue().set("outPark-"+outPark.getBarrierId(), jsonValue);
                    enterParkService.deleteByCarNo(carNo, parkId);
                    redisTemplate.opsForValue().set("park_change_in_"+parkId,"true",1, TimeUnit.DAYS);
                    int i = Integer.parseInt(redisnum);
                    i--;
                    if(i<0){
                        String s= "2."+carNo+",场内停车数为0\n";
                        writeTxt2(s);
                        redisTemplate.opsForValue().set("car_park_" + parkId,"0",30, TimeUnit.DAYS);
                        redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
                    }else {
                        String s= "2."+carNo+",场内停车数为"+i+"\n";
                        writeTxt2(s);
                        redisTemplate.opsForValue().set("car_park_" + parkId,Integer.toString(i),30, TimeUnit.DAYS);
                        redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
                    }
                }
            }
        }else {
            noOpen(request,response,data1);
        }
    }
    public void outLedShowYueZu(String carNo,String text,Integer parkId,HttpServletRequest request, HttpServletResponse response,int type) throws ServletException, IOException{
        String redisnum = redisTemplate.opsForValue().get("car_park_" + parkId);
        LedBean ledBean = new LedBean();
        ledBean.setcolor1(0);
        ledBean.setcolor2(0);
        ledBean.setcolor3(0);
        ledBean.setcolor4(0);
        ledBean.setcontent1(carNo);
        ledBean.setcontent2(text);
        ledBean.setcontent3("减速慢行");
        ledBean.setcontent4("欢迎下次光临");
        ledBean.setdisMode1(0);
        ledBean.setdisMode2(0);
        ledBean.setdisMode3(0);
        ledBean.setdisMode4(1);
        ledBean.setvoiceContent(text+carNo+"欢迎下次光临");
        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
        byte[] dataX = new byte[resultData.getlenth()];
        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
        data1 = data1.replaceAll("\r\n", "");
        if(type == 0){
            //开闸
            open(request,response,data1);
            enterParkService.deleteByCarNo(carNo,parkId);
            redisTemplate.opsForValue().set("park_change_in_"+parkId,"true",1, TimeUnit.DAYS);
            int i = Integer.parseInt(redisnum);
            i--;
            if(i<0){
                String s= "2."+carNo+",场内停车数为0\n";
                writeTxt2(s);
                redisTemplate.opsForValue().set("car_park_" + parkId,"0",30, TimeUnit.DAYS);
                redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
            }else {
                String s= "2."+carNo+",场内停车数为"+i+"\n";
                writeTxt2(s);
                redisTemplate.opsForValue().set("car_park_" + parkId,Integer.toString(i),30, TimeUnit.DAYS);
                redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
            }
        }else {
            noOpen(request,response,data1);
        }
    }
    public void outLedShowDefault(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        LedBean ledBean = new LedBean();
        ledBean.setcolor1(0);
        ledBean.setcolor2(0);
        ledBean.setcolor3(0);
        ledBean.setcolor4(0);
        ledBean.setcontent1("一车一杆");
        ledBean.setcontent2("减速慢行");
        ledBean.setcontent3("无需取卡");
        ledBean.setcontent4("扫码缴费");
        ledBean.setdisMode1(0);
        ledBean.setdisMode2(0);
        ledBean.setdisMode3(0);
        ledBean.setdisMode4(0);
        ledBean.setvoiceContent("");
        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
        byte[] dataX = new byte[resultData.getlenth()];
        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
        data1 = data1.replaceAll("\r\n", "");
        noOpen(request,response,data1);
    }
    public void inLedShowDefault(Integer parkId,HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        String num = redisTemplate.opsForValue().get("car_park_" +  parkId);
        String con3 = "";
        String con4 = "";
        if(num == null){
            num = "0";
        }
        Park byId = parkService.getById(parkId);
        int i = byId.getNum() - Integer.parseInt(num);
        if(i<=0){
            i = 0;
            con3 = "车位已满";
            con4 = "请驶离";
        }else {
            con3 = "排队等候";
            con4 = "余位:"+i;
        }
        LedBean ledBean = new LedBean();
        ledBean.setcolor1(0);
        ledBean.setcolor2(0);
        ledBean.setcolor3(0);
        ledBean.setcolor4(0);
        ledBean.setcontent1("一车一杆");
        ledBean.setcontent2("减速慢行");
        ledBean.setcontent3(con3);
        ledBean.setcontent4(con4);
        ledBean.setdisMode1(0);
        ledBean.setdisMode2(0);
        ledBean.setdisMode3(0);
        ledBean.setdisMode4(0);
        ledBean.setvoiceContent("");
        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
        byte[] dataX = new byte[resultData.getlenth()];
        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
        data1 = data1.replaceAll("\r\n", "");
        noOpen(request,response,data1);
    }
}
//package com.boying.controller.car;
//
//import cn.hutool.http.HttpRequest;
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
//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.boying.util.FileUtil;
//import com.boying.util.RedisJsonUtil;
//import com.boying.util.StringUtil;
//import com.google.gson.JsonObject;
//import com.google.gson.JsonParser;
//import ledshow.CodeUtil;
//import ledshow.LedBean;
//import ledshow.ResultData;
//import lombok.RequiredArgsConstructor;
//import org.springframework.beans.factory.annotation.Autowired;
//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 org.springframework.web.bind.annotation.ResponseBody;
//
//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.Duration;
//import java.time.LocalDateTime;
//import java.time.ZoneOffset;
//import java.util.Base64;
//import java.util.Date;
//import java.util.List;
//import java.util.concurrent.TimeUnit;
//
//
///**
// * Servlet implementation class PlateServlet
// */
//@Controller
//@RequestMapping("/ffzf/car")
//@RequiredArgsConstructor
//public class PlateServlet3 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 WhiteListService whiteListService;
//    private final FileInfoService fileInfoService;
//    private final TicketBlackService ticketBlackService;
//    private final OutParkLogService outParkLogService;
//   // private final RedisJsonUtil redisJsonUtil;
//    private final String LEDURL = "http://192.168.31.212:9988/LedShow/IGetResultDataAllLine";
//
//    /**
//     * 回复开闸
//     */
//    protected void open(HttpServletRequest request, HttpServletResponse response,String data) throws ServletException, IOException {
//        response.setContentType("text/json");
//        PrintWriter out = response.getWriter();
//        String aa = "{" +
//                "\"Response_AlarmInfoPlate\": {" +
//                "\"info\":\"ok\"," +
//                "\"is_pay\":\"true\"," +
//                "\"serialData\" :[" +
//                "{" +
//                "\"serialChannel\":0," +
//                "\"data\" : \"" + data + "\"," +
//                "\"dataLen\" :" + data.length() +
//                "}" +
//                "]" +
//                "}" +
//                "}";
//        out.println(aa);
//        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,String data) throws IOException {
//        response.setContentType("text/json");
//        PrintWriter out = response.getWriter();
//        String aa = "{" +
//                "\"Response_AlarmInfoPlate\": {" +
//                "\"serialData\" :[" +
//                "{" +
//                "\"serialChannel\":0," +
//                "\"data\" : \"" + data + "\"," +
//                "\"dataLen\" :" + data.length() +
//                "}" +
//                "]" +
//                "}" +
//                "}";
//        out.println(aa);
//        out.flush();
//        out.close();
//    }
//
//    protected void easyOpen(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        response.setContentType("text/json");
//        PrintWriter out = response.getWriter();
//        out.println("{\"Response_AlarmInfoPlate\":{\"info\":\"ok\",\"content\":\"...\",\"is_pay\":\"true\"}}");
//        out.flush();
//        out.close();
//    }
//
//    protected void easyOpen2(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        response.setContentType("text/json");
//        PrintWriter out = response.getWriter();
//        out.println("{\"Response_AlarmInfoPlate\":{\"ivs_ioctrl\":{\"delay\":1000,\"io\":0,\"value\":2}}}");
//        out.flush();
//        out.close();
//    }
//
//    protected void easyNoOpen(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.getOneById(barrier.getParkId());
//       // 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(redisnum)){
//            redisnum = "0";
//        }
//        if(barrier!=null){
//            if(barrier.getType2()==1){
//                //待开闸
//                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){
//                        String s= "2."+barrier.getCarNo()+"闸机手动启动,场内停车数为"+i+"\n";
//                        writeTxt2(s);
//                        redisTemplate.opsForValue().set("car_park_" + park.getId(),"0",30, TimeUnit.DAYS);
//                        redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS);
//                    }else {
//                        String s= "2."+barrier.getCarNo()+"闸机手动启动,场内停车数为"+i+"\n";
//                        writeTxt2(s);
//                        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());
//                barrier.setStatus(0);
//                barrier.setUpdateTime(LocalDateTime.now());
//                barrierService.saveOrUpdate(barrier);
//
//                String jsonValue = JSON.toJSONString(barrier);
//                redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue);
//                easyOpen(request,response);
//            }else {
//                //不需开闸
//                LocalDateTime now = LocalDateTime.now();
//                LocalDateTime updateTime = barrier.getUpdateTime();
//                Duration duration = Duration.between(updateTime,now);
//                long minutes = duration.toMinutes();
//                if(minutes>=2){
//                    barrier.setStatus(0);
//                    barrier.setUpdateTime(LocalDateTime.now());
//                    barrierService.saveOrUpdate(barrier);
//                }
//
//                String jsonValue = JSON.toJSONString(barrier);
//                redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue);
//                if(barrier.getType() == 0){
//                    OutPark outPark = outParkService.count4(barrier.getId());
//                    if(outPark!=null){
//                        if(barrier.getType() == 0){
//                            int i = Integer.parseInt(redisnum);
//                            i--;
//                            if(i<0){
//                                String s= "2."+outPark.getCarNo()+"缴费完成,场内停车数为"+i+"\n";
//                                writeTxt2(s);
//                                redisTemplate.opsForValue().set("car_park_" + park.getId(),"0",30, TimeUnit.DAYS);
//                                redisTemplate.opsForValue().set("park_up_" + park.getId(),"true",30, TimeUnit.DAYS);
//                            }else {
//                                String s= "2."+outPark.getCarNo()+"缴费完成,场内停车数为"+i+"\n";
//                                writeTxt2(s);
//                                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);
//                        easyOpen(request,response);
//                        OutParkLog byOutPark = outParkLogService.getByOutPark(outPark.getCarNo(), outPark.getId());
//                        byOutPark.setOpenTime(LocalDateTime.now());
//                        outParkLogService.saveOrUpdate(byOutPark);
//                        enterParkService.deleteByCarNo(outPark.getCarNo(), barrier.getParkId());
//                        redisTemplate.delete("outPark-"+outPark.getBarrierId());
//                    }
//                }
//                if(barrier.getType() == 1){
//                    boolean in = barrierService.getDateDifIn(park.getId());
//                    if(in){
//                        inLedShowDefault(park.getId(),request,response);
//                    }
//                }else if(barrier.getType() == 0){
//                    boolean out = barrierService.getDateDifOut(barrier.getId());
//                    if(out){
//                        outLedShowDefault(request,response);
//                    }
//                }
//            }
//
//        }else {
//            easyNoOpen(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 = "";
//        FileInfo fileInfo = null;
//        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 image = plateResult.get("imageFile").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;
//                }
//
//
//                if(StringUtils.isNotBlank(image)){
//                    fileInfo = FileUtil.generateBase64StringToFile(image, 1,1);
//                    fileInfoService.save(fileInfo);
//                }
//
//
//                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";
//                    easyNoOpen(request,response);
//                }else{
//                    if(barrier.getType()==0){
//                        outPark(license, barrier.getId(), barrier.getParkId(),request,response,fileInfo);
//                        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显示
//                            inLedFullShow(code, license,barrier.getParkId(),request,response);
//                        }else {
//                            //led显示
//                            enterPark(license,barrier.getId(),barrier.getParkId(),fileInfo);
//                            inLedShow(code, license,barrier.getParkId(),request,response);
//                            s+=license+"-保存入场记录\n";
//                        }
//                    }
//                }
//                writeTxt(s);
//            }while(false);
//        }
//        catch (Exception e) {
//            System.out.println("无入场记录");
//            s+=" ,查询场内记录异常";
//            writeTxt(s);
//            easyNoOpen(request,response);
//        }
//    }
//
//    /**
//     * 手机号入场
//     * @param
//     * @return
//     */
//    @PostMapping("/inParkByPhone" )
//    @ResponseBody
//    public Object inParkByPhone( EnterPark enterPark){
//        Barrier barrier = barrierService.getById(enterPark.getBarrierId());
//        if(barrier!=null){
//            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() ){
//                return R.failed(null,"禁止通行,车位已满");
//            }else {
//                QueryWrapper<EnterPark> wrapper2 = new QueryWrapper<>();
//                wrapper2.lambda()
//                        .eq(EnterPark::getBarrierId,barrier.getId())
//                        .orderByDesc(EnterPark::getCreateTime)
//                        .last(" limit 1");
//                EnterPark one = enterParkService.getOne(wrapper2);
//                if(one == null){
//                    return R.failed("未查询到车辆存在");
//                }else {
//                    if(one.getCarNo().equals("无牌车")){
//                        enterPark.setCreateTime(LocalDateTime.now());
//                        QueryWrapper<Ticket> wrapper = new QueryWrapper<>();
//                        wrapper.lambda()
//                                .eq(Ticket::getCarNo,enterPark.getCarNo())
//                                .eq(Ticket::getPayStatus,1);
//                        List<Ticket> tickets = ticketService.list(wrapper);
//                        if(tickets.size()>0){
//                            enterPark.setStatus(1);//发现有违章
//                        }
//                        enterPark.setIsPay(0);
//                        enterPark.setPrice(0);
//                        enterParkService.deleteByCarNo(enterPark.getCarNo(),enterPark.getParkId());
//                        enterParkService.save(enterPark);
//                        barrier.setType2(1);
//                        barrierService.updateById(barrier);
//                        return R.ok();
//                    }else {
//                        return R.failed("非法操作");
//                    }
//                }
//            }
//        }
//        return R.failed(null,"数据异常");
//    }
//
//    /**
//     * 手机号出场
//     * @param
//     * @return
//     */
//    @PostMapping("/outParkByPhone" )
//    @ResponseBody
//    public Object outParkByPhone(String code2,String carNo){
//        Barrier byCode2 = barrierService.findByCode2(code2);
//        QueryWrapper<EnterPark> wrapper =new QueryWrapper<>();
//        wrapper.lambda()
//                .eq(EnterPark::getParkId,byCode2.getParkId())
//                .eq(EnterPark::getCarNo,carNo);
//        EnterPark one = enterParkService.getOne(wrapper);
//        if(one != null){
//            double money = 0.0;
//            String toDayHrMinSec = null;
//            OutPark outPark = new OutPark();
//            outPark.setCarNo(carNo);
//            outPark.setParkId(one.getParkId());
//            outPark.setBarrierId(byCode2.getId());
//            outPark.setCreateTime(LocalDateTime.now());
//            outPark.setCode(System.currentTimeMillis()+"");
//            System.out.println("入场记录:"+one);
//            outPark.setEnterTime(one.getCreateTime());
//            outPark.setParkName(byCode2.getName());
//            if(outPark.getTime() > 0){
//                outPark.setTimeStr(DateUtilOther.millisToDayHrMinSec(new Double(outPark.getTime()).longValue()));
//            }else {
//                outPark.setTimeStr("不足一分钟");
//            }
//            try {
//                long l = outPark.getCreateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli() - one.getCreateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli();
//                outPark.setTime(l/(1000*60));
//                toDayHrMinSec = DateUtilOther.millisToDayHrMinSec(l/(1000*60));
//                money = costRuleService.getMoney(one.getParkId(), outPark.getEnterTime(), outPark.getCreateTime(), 1);
//
//                //入场记录保存一下
//                if(one.getIsPay()==1){
//                    money = money - one.getPrice();
//                }else {
//                    one.setPrice(money);
//                    one.setIsPay(0);
//                    enterParkService.updateById(one);
//                }
//            } catch (ParseException e) {
//                e.printStackTrace();
//            }
//            outPark.setPrice(money);
//            outPark.setStatus3(findTicket(carNo));
//            outParkService.saveOrUpdate(outPark);
//            byCode2.setCarNo(carNo);
//            //led展示
//            if(toDayHrMinSec == null){
//                return R.failed("异常记录");
//            }
//            if(outPark.getPrice()==0&&outPark.getStatus3()==0){
//                System.out.println(outPark.getCarNo()+"该车不需要缴费");
//                String s= "1."+byCode2.getCarNo()+"该车不需要缴费\n";
//                writeTxt2(s);
//                byCode2.setType2(1);
//                barrierService.updateById(byCode2);
//                return R.ok(outPark);
//            }else {
//                //需要缴费或者有违章
//                System.out.println(outPark.getCarNo()+"该车需要缴费"+outPark.getPrice());
//                String s= "1."+byCode2.getCarNo()+"该车需要缴费\n";
//                writeTxt2(s);
//                barrierService.updateById(byCode2);
//                return R.ok(outPark);
//            }
//
//        }else {
//            return R.failed("未查询到入场记录");
//        }
//    }
//
//
//    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("打印错误");
//        }
//    }
//
//    private void writeTxt2( String txt)
//    {
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//        try
//        {
//            FileWriter f = new FileWriter(systemConfigProperties.getLogPath()+sdf.format(new Date())+"LED.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,FileInfo fileInfo) {
//        TicketBlack black = ticketBlackService.getByCarNo(carNo, 1);
//        if(black != null){
//            System.out.println("黑名单车辆"+carNo);
//        }else {
//            enterParkService.deleteByCarNo(carNo,parkId);
//            EnterPark enterPark = new EnterPark();
//            enterPark.setIsPay(0);
//            enterPark.setPrice(0);
//            enterPark.setCarNo(carNo);
//            enterPark.setBarrierId(barrierId);
//            enterPark.setParkId(parkId);
//
//            QueryWrapper<Ticket> wrapper = new QueryWrapper<>();
//            wrapper.lambda()
//                    .eq(Ticket::getCarNo,enterPark.getCarNo())
//                    .eq(Ticket::getPayStatus,1);
//            List<Ticket> tickets = ticketService.list(wrapper);
//            if(tickets.size()>0){
//                enterPark.setStatus(1);//发现有违章
//            }
//            if(fileInfo != null){
//                enterPark.setImgId(fileInfo.getId());
//            }
//            enterParkService.saveOrUpdate(enterPark);
//            String jsonValue = JSON.toJSONString(enterPark);
//            redisTemplate.opsForValue().set("enterPark_dif_"+ parkId, jsonValue);
//
//        }
//    }
//
//    public double outPark(String carNo,Integer barrierId,Integer parkId,HttpServletRequest request, HttpServletResponse response,FileInfo fileInfo) throws ServletException, IOException {
//        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<EnterPark> 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);
//
//                //入场记录保存一下
//                if(enterPark.getIsPay() != null && enterPark.getIsPay()==1){
//                    money = money - enterPark.getPrice();
//                }else {
//                    enterPark.setPrice(money);
//                    enterPark.setIsPay(0);
//                    enterParkService.updateById(enterPark);
//                }
//            } catch (ParseException e) {
//                e.printStackTrace();
//            }
//
//        }
//        //outPark.setPrice(Double.valueOf(String.format("%.1f", money)));
//        outPark.setPrice(money);
//        outPark.setStatus3(findTicket(carNo));
//        if(fileInfo != null){
//            outPark.setImgId(fileInfo.getId());
//        }
//        outParkService.saveOrUpdate(outPark);
//        Barrier barrier =barrierService.getById(barrierId);
//        barrier.setCarNo(carNo);
//        //led展示
//        if(toDayHrMinSec == null){
//            toDayHrMinSec = "入场记录异常,请联系管理员";
//        }
//        //判断是否在白名单
//        QueryWrapper<WhiteList> wrapper = new QueryWrapper<>();
//        wrapper.lambda()
//                .eq(WhiteList::getCarNo,carNo);
//        List<WhiteList> all = whiteListService.list(wrapper);
//        if(all.size() >0){
//            for(WhiteList w : all){
//                if(w.getType()==0){
//                    outLedShowYueZu(barrier.getCarNo(),"月租车",parkId,request,response,0);
//                    OutPark byCarNoAndBarrierId = outParkService.findByCarNoAndBarrierId(carNo, barrierId);
//                    byCarNoAndBarrierId.setStatus(2);
//                    byCarNoAndBarrierId.setStatus2(1);
//                    outParkService.saveOrUpdate(byCarNoAndBarrierId);
//                    barrierService.saveOrUpdate(barrier);
//                    String jsonValue2 = JSON.toJSONString(barrier);
//                    redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue2);
//                    String jsonValue = JSON.toJSONString(byCarNoAndBarrierId);
//                    redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
//                    return 0.0;
//                }else{
//                    if(StringUtils.isNotBlank(w.getParkIds())){
//                        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()<w.getEndTime().getTime()){
//                                    outLedShowYueZu(barrier.getCarNo(),"月租车",parkId,request,response,0);
//                                    OutPark byCarNoAndBarrierId = outParkService.findByCarNoAndBarrierId(carNo, barrierId);
//                                    byCarNoAndBarrierId.setStatus(2);
//                                    byCarNoAndBarrierId.setStatus2(1);
//                                    outParkService.saveOrUpdate(byCarNoAndBarrierId);
//                                    barrierService.saveOrUpdate(barrier);
//                                    String jsonValue2 = JSON.toJSONString(barrier);
//                                    redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue2);
//                                    String jsonValue = JSON.toJSONString(byCarNoAndBarrierId);
//                                    redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
//                                    return 0.0;
//                                }
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        barrierService.saveOrUpdate(barrier);
//        String jsonValue2 = JSON.toJSONString(barrier);
//        redisTemplate.opsForValue().set("barrier-"+barrier.getCode(), jsonValue2);
//        if(outPark.getPrice()==0&&outPark.getStatus3()==0){
//            System.out.println(outPark.getCarNo()+"该车不需要缴费");
//            String s= "1."+barrier.getCarNo()+"该车不需要缴费\n";
//            writeTxt2(s);
//            String jsonValue = JSON.toJSONString(outPark);
//            redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
//            outLedShow(outPark,barrier.getCode(),barrier.getCarNo(),outPark.getPrice(),toDayHrMinSec,barrier.getParkId(),request,response,0);
//        }else {
//            //需要缴费或者有违章
//            System.out.println(outPark.getCarNo()+"该车需要缴费"+outPark.getPrice());
//            String s= "1."+barrier.getCarNo()+"该车需要缴费\n";
//            writeTxt2(s);
//            OutParkLog byOutPark = outParkLogService.getByOutPark(outPark.getCarNo(), outPark.getId());
//            byOutPark.setOutTime(outPark.getCreateTime());
//            byOutPark.setParkId(outPark.getParkId());
//            outParkLogService.saveOrUpdate(byOutPark);
//            String jsonValue = JSON.toJSONString(outPark);
//            redisTemplate.opsForValue().set("outPark_dif_"+ barrierId, jsonValue);
//            outLedShow(outPark,barrier.getCode(),barrier.getCarNo(),outPark.getPrice(),toDayHrMinSec,barrier.getParkId(),request,response,1);
//        }
//        return money;
//    }
//
//    public int findTicket(String carNo){
//        QueryWrapper<Ticket> wrapper = new QueryWrapper<>();
//        wrapper.lambda()
//                .eq(Ticket::getCarNo,carNo)
//                .eq(Ticket::getPayStatus,1);
//        List<Ticket> tickets = ticketService.list(wrapper);
//        if(tickets.size()>0){
//            return 1;
//        }else{
//            return 0;
//        }
//    }
//
//
//    public void inLedShow(String ledId,String carNo,Integer parkId,HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        TicketBlack black = ticketBlackService.getByCarNo(carNo, 1);
//        if(black != null){
//            LedBean ledBean = new LedBean();
//            ledBean.setcolor1(0);
//            ledBean.setcolor2(0);
//            ledBean.setcolor3(0);
//            ledBean.setcolor4(0);
//            ledBean.setcontent1(carNo);
//            ledBean.setcontent2("黑名单车辆");
//            ledBean.setcontent3("禁止驶入");
//            ledBean.setcontent4("联系管理员");
//            ledBean.setdisMode1(0);
//            ledBean.setdisMode2(0);
//            ledBean.setdisMode3(0);
//            ledBean.setdisMode4(0);
//            ledBean.setvoiceContent("黑名单车辆"+carNo+",禁止驶入");
//            ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
//            byte[] dataX = new byte[resultData.getlenth()];
//            System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
//            String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
//            data1 = data1.replaceAll("\r\n", "");
//            noOpen(request,response,data1);
//        }else {
//            String num = redisTemplate.opsForValue().get("car_park_" +  parkId);
//            if(num == null){
//                num = "0";
//            }
//            Park byId = parkService.getById(parkId);
//            int n = Integer.parseInt(num)+1;
//            redisTemplate.opsForValue().set("car_park_" + parkId,Integer.toString(n),30, TimeUnit.DAYS);
//            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(StringUtils.isNotBlank(byCarNo.getParkIds()) && byCarNo.getParkIds().contains(barrier.getParkId()+"")){
//                        carType = "月租车";
//                        long l = (byCarNo.getEndTime().getTime() - byCarNo.getStartTime().getTime()) / (24 * 3600 * 1000);
//                        carDay = "有效期还有"+l+"天";
//                    }else {
//                        carType = "临时车";
//                    }
//                }
//            }
//            if(StringUtils.isBlank(carDay) && !carNo.equals("无牌车")){
//                carDay = "欢迎光临";
//            }else if(StringUtils.isBlank(carDay) && carNo.equals("无牌车")){
//                carDay = "拒绝驶入";
//            }
//
//            LedBean ledBean = new LedBean();
//            ledBean.setcolor1(0);
//            ledBean.setcolor2(0);
//            ledBean.setcolor3(0);
//            ledBean.setcolor4(0);
//            ledBean.setcontent1(carNo);
//            ledBean.setcontent2(carType);
//            ledBean.setcontent3(carDay);
//            ledBean.setcontent4("余位:"+i);
//            ledBean.setdisMode1(0);
//            ledBean.setdisMode2(0);
//            ledBean.setdisMode3(0);
//            ledBean.setdisMode4(0);
//            ledBean.setvoiceContent(carType+","+carNo+","+carDay);
//            ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
//            byte[] dataX = new byte[resultData.getlenth()];
//            System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
//            String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
//            data1 = data1.replaceAll("\r\n", "");
//
//            if(!carNo.equals("无牌车")){
//                open(request,response,data1);//入场开闸
//            }else {
//                noOpen(request,response,data1);
//            }
//        }
//    }
//
//    public void inLedFullShow(String ledId, String carNo, Integer parkId,HttpServletRequest request, HttpServletResponse response) throws IOException {
//        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(StringUtils.isNotBlank(byCarNo.getParkIds()) && byCarNo.getParkIds().contains(barrier.getParkId()+"")){
//                    carType = "月租车";
//                }else {
//                    carType = "临时车";
//                }
//            }
//        }
//
//        LedBean ledBean = new LedBean();
//        ledBean.setcolor1(0);
//        ledBean.setcolor2(0);
//        ledBean.setcolor3(0);
//        ledBean.setcolor4(0);
//        ledBean.setcontent1(carNo);
//        ledBean.setcontent2(carType);
//        ledBean.setcontent3("车位已满");
//        ledBean.setcontent4("请驶离");
//        ledBean.setdisMode1(0);
//        ledBean.setdisMode2(0);
//        ledBean.setdisMode3(0);
//        ledBean.setdisMode4(0);
//        ledBean.setvoiceContent("车位已满,请驶离");
//        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
//        byte[] dataX = new byte[resultData.getlenth()];
//        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
//        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
//        data1 = data1.replaceAll("\r\n", "");
//
//        noOpen(request,response,data1);//入场开闸
//    }
//
//    public void outLedShow(OutPark outPark,String ledId,String carNo,Double price,String timeStamp,Integer parkId,HttpServletRequest request, HttpServletResponse response,int type) throws ServletException, IOException {
//        String redisnum = redisTemplate.opsForValue().get("car_park_" + parkId);
//        Park park = parkService.getById(parkId);
//        LedBean ledBean = new LedBean();
//        ledBean.setcolor1(0);
//        ledBean.setcolor2(0);
//        ledBean.setcolor3(0);
//        ledBean.setcolor4(0);
//        ledBean.setcontent1(carNo);
//        ledBean.setcontent2("停车"+timeStamp);
//        ledBean.setcontent3("交费"+price+"元");
//        ledBean.setcontent4("禁止闯杆");
//        ledBean.setdisMode1(0);
//        ledBean.setdisMode2(1);
//        ledBean.setdisMode3(1);
//        ledBean.setdisMode4(0);
//        ledBean.setvoiceContent(carNo+"停车"+timeStamp+"交费"+price+"元");
//        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
//        byte[] dataX = new byte[resultData.getlenth()];
//        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
//        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
//        data1 = data1.replaceAll("\r\n", "");
//        if(type == 0){
//            if(carNo.equals("无牌车")){
//                noOpen(request,response,data1);
//            }else {
//                if(timeStamp.contains("记录异常")){
//                    OutPark by5min = outParkService.findBy5min(carNo, parkId, LocalDateTime.now());
//                    if(by5min != null){
//                        //开闸
//                        open(request,response,data1);
//                        enterParkService.deleteByCarNo(carNo, parkId);
//                        redisTemplate.opsForValue().set("park_change_in_"+parkId,"true",1, TimeUnit.DAYS);
//                        int i = Integer.parseInt(redisnum);
//                        i--;
//                        if(i<0){
//                            String s= "2."+carNo+",场内停车数为0\n";
//                            writeTxt2(s);
//                            redisTemplate.opsForValue().set("car_park_" + parkId,"0",30, TimeUnit.DAYS);
//                            redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
//                        }else {
//                            String s= "2."+carNo+",场内停车数为"+i+"\n";
//                            writeTxt2(s);
//                            redisTemplate.opsForValue().set("car_park_" + parkId,Integer.toString(i),30, TimeUnit.DAYS);
//                            redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
//                        }
//                    }else {
//                        noOpen(request,response,data1);
//                    }
//                }else {
//                    //开闸
//                    open(request,response,data1);
//
//                    //缓存在redis里,心跳接口去抬杆
//                    String jsonValue = JSON.toJSONString(outPark);
//                    redisTemplate.opsForValue().set("outPark-"+outPark.getBarrierId(), jsonValue);
//
//                    enterParkService.deleteByCarNo(carNo, parkId);
//                    redisTemplate.opsForValue().set("park_change_in_"+parkId,"true",1, TimeUnit.DAYS);
//                    int i = Integer.parseInt(redisnum);
//                    i--;
//                    if(i<0){
//                        String s= "2."+carNo+",场内停车数为0\n";
//                        writeTxt2(s);
//                        redisTemplate.opsForValue().set("car_park_" + parkId,"0",30, TimeUnit.DAYS);
//                        redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
//                    }else {
//                        String s= "2."+carNo+",场内停车数为"+i+"\n";
//                        writeTxt2(s);
//                        redisTemplate.opsForValue().set("car_park_" + parkId,Integer.toString(i),30, TimeUnit.DAYS);
//                        redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
//                    }
//                }
//
//            }
//        }else {
//            noOpen(request,response,data1);
//        }
//
//    }
//
//    public void outLedShowYueZu(String carNo,String text,Integer parkId,HttpServletRequest request, HttpServletResponse response,int type) throws ServletException, IOException{
//        String redisnum = redisTemplate.opsForValue().get("car_park_" + parkId);
//        LedBean ledBean = new LedBean();
//        ledBean.setcolor1(0);
//        ledBean.setcolor2(0);
//        ledBean.setcolor3(0);
//        ledBean.setcolor4(0);
//        ledBean.setcontent1(carNo);
//        ledBean.setcontent2(text);
//        ledBean.setcontent3("减速慢行");
//        ledBean.setcontent4("欢迎下次光临");
//        ledBean.setdisMode1(0);
//        ledBean.setdisMode2(0);
//        ledBean.setdisMode3(0);
//        ledBean.setdisMode4(1);
//        ledBean.setvoiceContent(text+carNo+"欢迎下次光临");
//        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
//        byte[] dataX = new byte[resultData.getlenth()];
//        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
//        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
//        data1 = data1.replaceAll("\r\n", "");
//        if(type == 0){
//            //开闸
//            open(request,response,data1);
//            enterParkService.deleteByCarNo(carNo,parkId);
//            redisTemplate.opsForValue().set("park_change_in_"+parkId,"true",1, TimeUnit.DAYS);
//            int i = Integer.parseInt(redisnum);
//            i--;
//            if(i<0){
//                String s= "2."+carNo+",场内停车数为0\n";
//                writeTxt2(s);
//                redisTemplate.opsForValue().set("car_park_" + parkId,"0",30, TimeUnit.DAYS);
//                redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
//            }else {
//                String s= "2."+carNo+",场内停车数为"+i+"\n";
//                writeTxt2(s);
//                redisTemplate.opsForValue().set("car_park_" + parkId,Integer.toString(i),30, TimeUnit.DAYS);
//                redisTemplate.opsForValue().set("park_up_" + parkId,"true",30, TimeUnit.DAYS);
//            }
//        }else {
//            noOpen(request,response,data1);
//        }
//    }
//
//    public void outLedShowDefault(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//        LedBean ledBean = new LedBean();
//        ledBean.setcolor1(0);
//        ledBean.setcolor2(0);
//        ledBean.setcolor3(0);
//        ledBean.setcolor4(0);
//        ledBean.setcontent1("一车一杆");
//        ledBean.setcontent2("减速慢行");
//        ledBean.setcontent3("无需取卡");
//        ledBean.setcontent4("扫码缴费");
//        ledBean.setdisMode1(0);
//        ledBean.setdisMode2(0);
//        ledBean.setdisMode3(0);
//        ledBean.setdisMode4(0);
//        ledBean.setvoiceContent("");
//        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
//        byte[] dataX = new byte[resultData.getlenth()];
//        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
//        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
//        data1 = data1.replaceAll("\r\n", "");
//        noOpen(request,response,data1);
//    }
//
//    public void inLedShowDefault(Integer parkId,HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//        String num = redisTemplate.opsForValue().get("car_park_" +  parkId);
//        String con3 = "";
//        String con4 = "";
//        if(num == null){
//            num = "0";
//        }
//        Park byId = parkService.getById(parkId);
//        int i = byId.getNum() - Integer.parseInt(num);
//        if(i<=0){
//            i = 0;
//            con3 = "车位已满";
//            con4 = "请驶离";
//        }else {
//            con3 = "排队等候";
//            con4 = "余位:"+i;
//        }
//        LedBean ledBean = new LedBean();
//        ledBean.setcolor1(0);
//        ledBean.setcolor2(0);
//        ledBean.setcolor3(0);
//        ledBean.setcolor4(0);
//        ledBean.setcontent1("一车一杆");
//        ledBean.setcontent2("减速慢行");
//        ledBean.setcontent3(con3);
//        ledBean.setcontent4(con4);
//        ledBean.setdisMode1(0);
//        ledBean.setdisMode2(0);
//        ledBean.setdisMode3(0);
//        ledBean.setdisMode4(0);
//        ledBean.setvoiceContent("");
//        ResultData resultData = CodeUtil.GetResultDataAllLine(ledBean);
//        byte[] dataX = new byte[resultData.getlenth()];
//        System.arraycopy(resultData.getdatas(),0,dataX,0,resultData.getlenth());
//        String data1 = Base64.getMimeEncoder().encodeToString(dataX) + "=";
//        data1 = data1.replaceAll("\r\n", "");
//        noOpen(request,response,data1);
//    }
//
//
//}
src/main/java/com/boying/controller/car/PushCallback.java
New file
@@ -0,0 +1,44 @@
package com.boying.controller.car;
/**
 * @author kdq
 * @version 1.0.0
 * @ClassName PushCallback.java
 * @Description TODO
 * @createTime 2024年03月20日 15:42:00
 */
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
/**
 * 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。
 * 每个客户机标识都需要一个回调实例。在此示例中,构造函数传递客户机标识以另存为实例数据。
 * 在回调中,将它用来标识已经启动了该回调的哪个实例。
 * 必须在回调类中实现三个方法:
 *  public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。
 *  public void connectionLost(Throwable cause)在断开连接时调用。
 *  public void deliveryComplete(MqttDeliveryToken token))
 *  接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
 *  由 MqttClient.connect 激活此回调。
 */
public class PushCallback implements MqttCallback{
    @Override
    public void connectionLost(Throwable cause) {
        // 连接丢失后,一般在这里面进行重连
        System.out.println("连接断开……(可以做重连)");
    }
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("deliveryComplete---------" + token.isComplete());
    }
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // subscribe后得到的消息会执行到这里面
        System.out.println("接收消息主题:" + topic + "  接收消息Qos:" + message.getQos() + "接收消息内容:" + new String(message.getPayload()));
    }
}
src/main/java/com/boying/controller/car/ServerMQTT.java
New file
@@ -0,0 +1,93 @@
package com.boying.controller.car;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
/**
 * @author kdq
 * @version 1.0.0
 * @ClassName ServerMQTT.java
 * @Description TODO
 * @createTime 2024年03月20日 15:43:00
 */
public class ServerMQTT {
    public static void main(String[] args) throws MqttException {
        ServerMQTT server = new ServerMQTT();
        server.message = new MqttMessage();
        server.message.setQos(2);
        server.message.setRetained(true);
        server.message.setPayload("ServerMQTT".getBytes());
        server.publish(server.topic , server.message);
        System.out.println(server.message.isRetained() + "------ratained状态");
    }
    //MQTT安装的服务器地址和端口号
    public static final String HOST = "tcp://39.96.92.240:9092";
    //定义一个主题
    public static final String TOPIC = "/device/message/up/ivs_result";
    //定义MQTT的ID,可以在MQTT服务配置中指定
    private static final String clientid = "client-1";
    private MqttClient client;
    private MqttTopic topic;
    private String userName = "mqtt";
    private String passWord = "mqtt";
    private MqttMessage message;
    /**
     * g构造函数
     */
    public ServerMQTT() throws MqttException {
        // MemoryPersistence设置clientid的保存形式,默认为以内存保存
        client = new MqttClient(HOST, clientid, new MemoryPersistence());
        connect();
    }
    /**
     * l连接服务器
     */
    private void connect() {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setCleanSession(false);
        options.setUserName(userName);
        options.setPassword(passWord.toCharArray());
        // 设置超时时间
        options.setConnectionTimeout(10);
        // 设置会话心跳时间
        options.setKeepAliveInterval(20);
        try {
            client.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable cause) {
                    // 连接丢失后,一般在这里面进行重连
                    System.out.println("连接断开……(可以做重连)");
                }
                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {
                    System.out.println("deliveryComplete---------" + token.isComplete());
                }
                @Override
                public void messageArrived(String topic, MqttMessage message) throws Exception {
                    // subscribe后得到的消息会执行到这里面
                    System.out.println("接收消息主题:" + topic + "  接收消息Qos:" + message.getQos() + "接收消息内容:" + new String(message.getPayload()));
                }
            });
            client.connect(options);
            topic = client.getTopic(TOPIC);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * t推送消息
     */
    public void publish(MqttTopic topic , MqttMessage message) throws MqttPersistenceException, MqttException {
        MqttDeliveryToken token = topic.publish(message);
        token.waitForCompletion();
        System.out.println("message is published completely! " + token.isComplete());
    }
}
src/main/java/com/boying/controller/phone/NoticeController.java
@@ -7,6 +7,8 @@
import com.boying.entity.Park;
import com.boying.service.EnterParkService;
import com.boying.service.ParkService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -17,6 +19,7 @@
@RestController
@RequestMapping("ffzf/notice")
@RequiredArgsConstructor
@Tag(description = "ffzf/notice" , name = "违法通知接口" )
public class NoticeController {
    private final EnterParkService enterParkService;
@@ -24,6 +27,7 @@
    //停车场内有违法的车辆
    @PostMapping("/illegalCar")
    @Operation(summary = "根据id查询停车场内所有违法车辆" , description = "根据id查询停车场内所有违法车辆" )
    public Object illegalCar(Long parkId){
        QueryWrapper<EnterPark> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -35,6 +39,7 @@
    //停车场内有违法的车辆
    @PostMapping("/illegalCar2")
    @Operation(summary = "查询所有停车场内所有违法车辆" , description = "查询所有停车场内所有违法车辆" )
    public Object illegalCar2(){
        QueryWrapper<EnterPark> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -48,8 +53,8 @@
        return R.ok(all);
    }
    //停车场内的车辆 根据状态查询
    @PostMapping("/enterPark")
    @Operation(summary = "停车场内的车辆 根据状态查询" , description = "停车场内的车辆 根据状态查询" )
    public Object enterPark(Integer status, Page page){
        if(status==null){
            Page page1 = enterParkService.page(page);
src/main/java/com/boying/controller/phone/PayController.java
@@ -15,6 +15,8 @@
import com.boying.service.*;
import com.boying.util.HTTPEntityUtil;
import com.google.gson.Gson;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
@@ -45,6 +47,7 @@
@RestController
@RequestMapping("ffzf/ffPay")
@RequiredArgsConstructor
@Tag(description = "ffzf/ffPay" , name = "对接财政支付接口" )
public class PayController extends BaseController {
    private final OrderRecordService orderRecordService;
@@ -67,6 +70,7 @@
    //生成电子缴款码
    @PostMapping("zhiFa")
    @Operation(summary = "执法生成缴款码" , description = "执法生成缴款码" )
    public Object zhiFa(Long id){
        Ticket ticket = ticketService.getById(id);
        if(ticket.getPayStatus()==1){
@@ -168,6 +172,7 @@
    //支付接口通知
    @PostMapping("result")
    @Operation(summary = "缴费结果通知" , description = "缴费结果通知" )
    public String result(HttpServletRequest request, String payKey, String payerTypeCode, String payerNum, String payCode, Double amt, String status, String errorInfo, String sign, String signType) throws Exception{
        try {
           // updateOrderRecord(payCode,status);
@@ -179,6 +184,7 @@
    //生成电子缴款码
    @PostMapping("park2")
    @Operation(summary = "财政缴费更新生成缴款码" , description = "财政缴费更新生成缴款码" )
    public Object park2(Long id){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
        String logs = sdf.format(new Date())+"开始扫码缴费------》\n";
@@ -277,6 +283,7 @@
     * 缴款书
     */
    @PostMapping("park")
    @Operation(summary = "对接邮储生成缴款书" , description = "对接邮储生成缴款书" )
    public Object park(Long id){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
        String logs = sdf.format(new Date())+"开始扫码缴费------》\n";
@@ -389,6 +396,7 @@
     * 获取执法id
     */
    @PostMapping("getZhifaId")
    @Operation(summary = "更新大厅缴款码" , description = "更新大厅缴款码" )
    public Object getZhifaId(){
        QueryWrapper<NowPayOrder> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -407,6 +415,7 @@
     * 缴款书
     */
    @PostMapping("zhifa")
    @Operation(summary = "执法缴费(新)" , description = "执法缴费(新)" )
    public Object zhifa(Long id){
        System.out.println(id+"开始缴费");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
src/main/java/com/boying/controller/phone/TicketController.java
@@ -12,6 +12,8 @@
import com.boying.util.FileUtil;
import com.boying.util.NumberToCN;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
@@ -38,6 +40,7 @@
@RestController
@RequestMapping("ffzf/ticket")
@RequiredArgsConstructor
@Tag(description = "ffzf/ticket" , name = "手持开罚单接口" )
public class TicketController{
@@ -65,6 +68,7 @@
    //图片回显
    @RequestMapping(value = "/showImg", method = RequestMethod.GET)
    @Operation(summary = "图片回显" , description = "图片回显" )
    public void getAwardAsByteArray(HttpServletResponse response, HttpServletRequest request) throws IOException {
        String result = request.getParameter("result");
        InputStream in = null;
@@ -81,6 +85,7 @@
    }
    @PostMapping("findPage")
    @Operation(summary = "分页查询" , description = "分页查询" )
    public Object findPage(Page page, Ticket ticket){
        QueryWrapper<Ticket> wrapper =  new QueryWrapper<>();
        wrapper.lambda()
@@ -94,6 +99,7 @@
    }
    @PostMapping("/save")
    @Operation(summary = "保存罚单" , description = "保存罚单" )
    public Object save(Ticket ticket,HttpServletRequest request) throws IOException{
        String imgStr = "";
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
@@ -164,6 +170,7 @@
    }
    @PostMapping("/save2")
    @Operation(summary = "保存罚单(废弃)" , description = "保存罚单(废弃)" )
    public Object save2(Ticket ticket) throws IOException{
        if(ticket.getUserId()!=null){
            User user = userService.getById(ticket.getUserId());
@@ -194,6 +201,7 @@
     */
    @ApiOperation(value = "通过id查询", notes = "通过id查询")
    @GetMapping("/{id}" )
    @Operation(summary = "通过id查询罚单" , description = "通过id查询罚单" )
    public R getById(@PathVariable("id" ) Integer id) {
        Ticket byId = ticketService.getById(id);
        byId.setContent(violationTypeService.getById(byId.getViolationTypeId()).getContent());
@@ -217,6 +225,7 @@
    @PostMapping("/delete")
    @Operation(summary = "删除罚单" , description = "删除罚单" )
    public Object delete(Long id){
        Ticket ticket =ticketService.getById(id);
        ticket.setStatus(3);
@@ -234,6 +243,7 @@
    }
    @PostMapping("/updateById")
    @Operation(summary = "更新罚单状态" , description = "更新罚单状态" )
    public Object updateById(Ticket ticket){
        if(ticket.getMoney() >0){
            BigDecimal numberOfMoney = new BigDecimal(ticket.getMoney()+"");
@@ -264,6 +274,7 @@
    //与执法对接
    @GetMapping("/getResult")
    @Operation(summary = "与执法平台对接,获取签字结果" , description = "与执法平台对接,获取签字结果" )
    public Object getResult(Ticket ticket){
        ticketService.updateById(ticket);
        return R.ok();
@@ -302,6 +313,7 @@
    }
    @PostMapping("/getZhiFa")
    @Operation(summary = "根据状态查询罚单" , description = "根据状态查询罚单" )
    public Object getZhiFa(Integer status,Page page){
        QueryWrapper<Ticket> wrapper = new QueryWrapper<>();
@@ -313,6 +325,7 @@
    }
    @PostMapping("/getCar")
    @Operation(summary = "获取黑名单车辆" , description = "获取黑名单车辆" )
    public Object getCar(String carNo,Page page,int type){
        QueryWrapper<TicketBlack> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -323,6 +336,7 @@
    }
    @PostMapping("/getCarList")
    @Operation(summary = "根据车牌分页获取罚单" , description = "根据车牌分页获取罚单" )
    public Object getCarList(String carNo,Page page){
        QueryWrapper<Ticket> wrapper = new QueryWrapper<>();
        wrapper.lambda()
@@ -333,6 +347,7 @@
    @PostMapping("/noFound")
    @Operation(summary = "更新罚单状态,增加备注" , description = "更新罚单状态,增加备注" )
    public Object noFound(Long ticketId,String remark){
        Ticket ticket = ticketService.getById(ticketId);
        ticket.setStatus(2);
@@ -342,6 +357,7 @@
    }
    @PostMapping("/getStatisticByYear")
    @Operation(summary = "统计年度罚单" , description = "统计年度罚单" )
    public Object getStatistic(int year){
        Map<String,Object> map = new HashMap<>();
        List<Object> list = new ArrayList<>();
@@ -378,6 +394,7 @@
    }
    @PostMapping("/getOrderList")
    @Operation(summary = "根据年和月统计罚单" , description = "根据年和月统计罚单" )
    public Object getOrderList(int year,int month){
        Date yearFirst = DateUtilOther.getFirstDayOfMonth(year,month);
@@ -391,6 +408,7 @@
    }
    @PostMapping("findById")
    @Operation(summary = "根据id查询" , description = "根据id查询" )
    public Object findById(Long id){
        Ticket ticket = ticketService.getById(id);
        if(ticket.getViolationTypeId()!=null){
@@ -408,6 +426,7 @@
     */
    @ApiOperation(value = "手动缴费", notes = "手动缴费")
    @PostMapping("/jiaofei" )
    @Operation(summary = "手动缴费更新二维码" , description = "手动缴费更新二维码" )
    public R jiaofei(Integer id) {
        Ticket byId = ticketService.getById(id);
        if(byId.getPayStatus() == 1){
@@ -431,6 +450,7 @@
     */
    @ApiOperation(value = "测试对接", notes = "测试对接")
    @GetMapping("/test" )
    @Operation(summary = "测试对接执法平台" , description = "测试对接执法平台" )
    public R test() {
        Ticket byId = ticketService.getById(13);
        byId = ticketService.getNumber(byId);
src/main/java/com/boying/controller/phone/UpdateAppController.java
@@ -3,6 +3,8 @@
import com.boying.common.R;
import com.boying.entity.UpdateApp;
import com.boying.service.UpdateAppService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -13,11 +15,13 @@
@RestController
@RequestMapping("ffzf/updateApp")
@RequiredArgsConstructor
@Tag(description = "ffzf/updateApp" , name = "app更新接口" )
public class UpdateAppController{
    private final UpdateAppService updateAppService;
    @PostMapping("/getUpdateApp")
    @Operation(summary = "获取最新app版本" , description = "获取最新app版本" )
    public Object getUpdateApp(){
        List<UpdateApp> all = updateAppService.list();
        if(all.size()==0){
src/main/java/com/boying/controller/phone/YCPayController.java
@@ -13,6 +13,8 @@
import com.boying.service.*;
import com.boying.util.DateUtilOther;
import com.google.gson.Gson;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.ResponseEntity;
@@ -46,6 +48,7 @@
@RestController
@RequestMapping("/ffzf/api")
@RequiredArgsConstructor
@Tag(description = "ffzf/api" , name = "邮储/邢台银行 对接支付接口" )
public class YCPayController {
    private final OutParkService outParkService;
    private final PayLogService payLogService;
@@ -68,6 +71,7 @@
     * @return
     */
    @GetMapping("/getByQueryId")
    @Operation(summary = "根据出场id获取出场数据" , description = "根据出场id获取出场数据" )
    public Object getByQueryId(Long queryId){
        if(queryId == null){
            return R.failed("参数为空");
@@ -83,6 +87,7 @@
     * 缴款书
     */
    @PostMapping("park")
    @Operation(summary = "邮储申请缴款书" , description = "邮储申请缴款书" )
    public Object park(Long id){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
        OutPark outPark =  outParkService.getById(id);
@@ -152,6 +157,7 @@
     * @return
     */
    @PostMapping("parkJudg")
    @Operation(summary = "判断支付端是否已经申请过支付" , description = "判断支付端是否已经申请过支付" )
    public Object parkJudg(Long id){
        if(id == null){
            return R.failed("未找到数据,请稍后重新点击");
@@ -182,6 +188,7 @@
     * 判断是否缴费
     */
    @PostMapping("parkXT")
    @Operation(summary = "邢台银行申请缴费" , description = "邢台银行申请缴费" )
    public Object parkXT(Long id){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
        OutPark outPark =  outParkService.getById(id);
@@ -256,6 +263,7 @@
     * 阿里缴费
     */
    @PostMapping("payByAli")
    @Operation(summary = "邢台银行支付宝缴费" , description = "邢台银行支付宝缴费" )
    public Object payByAli(Long id){
        OutPark outPark =  outParkService.getById(id);
        String xtyhpay = systemConfigProperties.getXTYHPAY();
@@ -331,6 +339,7 @@
     * 获取微信openid
     */
    @PostMapping("getOpenId")
    @Operation(summary = "邢台银行获取微信用户openid" , description = "邢台银行获取微信用户openid" )
    public Object park(Long id,String code){
        OutPark outPark =  outParkService.getById(id);
        String openIdByCode = wxService.getOpenIdByCode(code);
@@ -342,6 +351,7 @@
     * 微信缴费
     */
    @PostMapping("payByWX")
    @Operation(summary = "邢台银行微信支付" , description = "邢台银行微信支付" )
    public Object payByWX(Long id,String openId){
        System.out.println("开始支付");
        OutPark outPark =  outParkService.getById(id);
@@ -434,6 +444,7 @@
     * @return
     */
    @GetMapping("/result")
    @Operation(summary = "邮储获得支付回调" , description = "邮储获得支付回调" )
    public Object result(Long queryId,int success,int msg){
        OutPark byId = outParkService.getById(queryId);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
@@ -468,6 +479,7 @@
     * @return
     */
    @PostMapping("/getResult")
    @Operation(summary = "邢台银行支付回调接口" , description = "邢台银行支付回调接口" )
    public Object getResult(HttpServletRequest request){
        System.out.println("getResult收到访问");
        String respCode = request.getParameter("respCode");
@@ -522,6 +534,7 @@
     * @return
     */
    @PostMapping ("/checkbill")
    @Operation(summary = "邮储对账接口" , description = "邮储对账接口" )
    public Object checkbill(@RequestBody Map params){
        String checkDate = (String) params.get("checkDate");
        String tranDate = (String) params.get("tranDate");
@@ -543,6 +556,7 @@
     * @return
     */
    @PostMapping ("/checkbillXTYH")
    @Operation(summary = "邢台银行对账接口" , description = "邢台银行对账接口" )
    public Object checkbillXTYH(String date){
        String xtyhpay = systemConfigProperties.getXTYHPAY();
        Map<String,Object> map = new HashMap<>();
@@ -587,6 +601,7 @@
     * @return
     */
    @PostMapping ("/searchPayStatus")
    @Operation(summary = "交易状态查询" , description = "交易状态查询" )
    public Object searchPayStatus(String txnOrderId,String txnOrderTime){
        OutPark outPark = outParkService.findByOrderId(txnOrderId);
        if(outPark == null){
src/main/java/com/boying/entity/EditParkNumLog.java
New file
@@ -0,0 +1,48 @@
package com.boying.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.boying.common.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
/**
 * @author kdq
 * @version 1.0.0
 * @ClassName EditParkNumLog.java
 * @Description TODO
 * @createTime 2024年09月26日 10:25:00
 */
@Data
@TableName("edit_park_num_log")
@javax.persistence.Table(name = "edit_park_num_log")
@Entity
@org.hibernate.annotations.Table(appliesTo = "edit_park_num_log", comment = "修改车位数记录表")
@ApiModel(value = "修改车位数记录表")
public class EditParkNumLog extends BaseEntity<EditParkNumLog> {
    @ApiModelProperty(value = "ip地址")
    @Column(columnDefinition = "varchar(100) comment 'ip地址'")
    private String ip;
    @ApiModelProperty(value = "用户名称")
    @Column(columnDefinition = "varchar(100) comment '用户名称'")
    private String username;
    @ApiModelProperty(value = "原车位数")
    @Column(columnDefinition = "int comment '原车位数'")
    private int num;
    @ApiModelProperty(value = "新车位数")
    @Column(columnDefinition = "int comment '新车位数'")
    private int newNum;
    @ApiModelProperty(value = "停车场名称")
    @Column(columnDefinition = "varchar(100) comment '停车场名称'")
    private String parkName;
}
src/main/java/com/boying/job/DaPingScheduled.java
@@ -29,7 +29,7 @@
    @Autowired
    private TicketBlackService ticketBlackService;
    @Scheduled(cron = "0 0/40 * * * ?")
    //@Scheduled(cron = "0 0/40 * * * ?")
    public void execute() throws IOException {
        System.out.println("开始定时任务-------》");
//        List<TicketBlack> list = ticketBlackService.updateType();
src/main/java/com/boying/job/PayResult2Scheduled.java
@@ -37,7 +37,7 @@
    Boolean taskFlag = false;
    @Scheduled(cron = "0/2 * * * * ?")
    //@Scheduled(cron = "0/2 * * * * ?")
    public void execute() throws Exception {
        if(taskFlag == true){
            System.out.println("正在运行,强制退出-------》");
src/main/java/com/boying/mapper/EditParkNumLogMapper.java
New file
@@ -0,0 +1,17 @@
package com.boying.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.boying.entity.EditParkNumLog;
import com.boying.entity.Park;
import org.apache.ibatis.annotations.Mapper;
/**
 * @author kdq
 * @version 1.0.0
 * @ClassName ParkService.java
 * @Description TODO
 * @createTime 2022年11月20日 10:33:00
 */
@Mapper
public interface EditParkNumLogMapper extends BaseMapper<EditParkNumLog> {
}
src/main/java/com/boying/service/EditParkNumLogService.java
New file
@@ -0,0 +1,16 @@
package com.boying.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.boying.entity.EditParkNumLog;
import com.boying.entity.LedShow;
/**
 * @author kdq
 * @version 1.0.0
 * @ClassName LedShowService.java
 * @Description TODO
 * @createTime 2022年11月21日 08:30:00
 */
public interface EditParkNumLogService extends IService<EditParkNumLog> {
}
src/main/java/com/boying/service/impl/EditParkNumLogServiceImpl.java
New file
@@ -0,0 +1,23 @@
package com.boying.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.boying.entity.EditParkNumLog;
import com.boying.entity.LedShow;
import com.boying.mapper.EditParkNumLogMapper;
import com.boying.mapper.LedShowMapper;
import com.boying.service.EditParkNumLogService;
import com.boying.service.LedShowService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
/**
 * @author kdq
 * @version 1.0.0
 * @ClassName LedShowServiceImpl.java
 * @Description TODO
 * @createTime 2022年11月21日 08:31:00
 */
@Service
@AllArgsConstructor
public class EditParkNumLogServiceImpl extends ServiceImpl<EditParkNumLogMapper, EditParkNumLog> implements EditParkNumLogService {
}
src/main/java/com/boying/util/IpUtil.java
New file
@@ -0,0 +1,111 @@
package com.boying.util;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IpUtil {
    public static String getIpAddr1(HttpServletRequest request) {
        String ipAddress = null;
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if (ipAddress.equals("127.0.0.1")) {
                    // 根据网卡取本机配置的IP
                    InetAddress inet = null;
                    try {
                        inet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    ipAddress = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
            if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
                // = 15
                if (ipAddress.indexOf(",") > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }
        } catch (Exception e) {
            ipAddress = "";
        }
        // ipAddress = this.getRequest().getRemoteAddr();
        return "0:0:0:0:0:0:0:1".equals(ipAddress) ? "127.0.0.1" : ipAddress;
    }
    /**
     * 获取真实ip地址,不返回内网地址
     *
     * @param request
     * @return
     */
    public static String getIpAddr2(HttpServletRequest request) {
        //目前则是网关ip
        String ip = request.getHeader("X-Real-IP");
        if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
            return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
        }
        ip = request.getHeader("X-Forwarded-For");
        if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
            int index = ip.indexOf(',');
            if (index != -1) {
                //只获取第一个值
                return ip.substring(0, index);
            } else {
                return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
            }
        } else {
            //取不到真实ip则返回空,不能返回内网地址。
            return "";
        }
    }
    //其中ip的获取方式
    public static String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Real-IP");
            //LOGGER.error("X-Real-IP:"+ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("http_client_ip");
//            LOGGER.error("http_client_ip:"+ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
//            LOGGER.error("getRemoteAddr:"+ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
//            LOGGER.error("Proxy-Client-IP:"+ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
//            LOGGER.error("WL-Proxy-Client-IP:"+ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
//            LOGGER.error("HTTP_X_FORWARDED_FOR:"+ip);
        }
// 如果是多级代理,那么取第一个ip为客户ip
        if (ip != null && ip.indexOf(",") != -1) {
            ip = ip.substring(ip.lastIndexOf(",") + 1, ip.length()).trim();
//            LOGGER.error("ip:"+ip);
        }
        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
    }
}
src/main/resources/application.yml
@@ -5,7 +5,7 @@
  datasource:
    url: jdbc:mysql://localhost:3306/ffparknew?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    username: root
    password: 2009Boying!@#
    password: rootroot
    driverClassName: com.mysql.cj.jdbc.Driver
    #连接池
    hikari:
@@ -17,7 +17,13 @@
      max-lifetime: 1800000
      connection-timeout: 30000
      connection-test-query: SELECT 1
security:
  oauth2:
    client:
      ignore-urls:
        - /webjars/**
        - /v3/api-docs/**
        - /doc.html
  jpa:
    database: mysql
    show-sql: true
@@ -32,8 +38,8 @@
      max-file-size: 50MB
      max-request-size: 50MB
mybatis-plus:
  #configuration:
    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# slf4j日志配置
logging:
  config: classpath:logback.xml
@@ -77,12 +83,22 @@
  logPath: D:/FFproject/log/
  filePath: D:/FFproject/file/
#项目配置
ffzf:
  ip: http://36.134.129.218:6060/
  loginIp: http://36.134.129.218:9999/auth/oauth/token
  info: api/getInfo
  getNumber: api/getNumber
  #XTYHPAY: http://xiangniupaydev.xtbank.com:28085/ifsp-payweb/SOA/txnAccept
  XTYHPAY: https://xiangniupay.xtbank.com/ifsp-payweb/SOA/txnAccept
  #XTYHRESULT: http://39.96.92.240:8089/ffzf/api/getResult
  XTYHRESULT: http://183.196.93.178:8089/ffzf/api/getResult
  #XTYHMERID: 8202309110000001
  XTYHMERID: 8202308300000015
  XTYHMERNAME: 邯郸市峰峰矿区滏源建设发展有限公司
  XTYHAPPID: wx46e756aed958f895
src/main/resources/logback.xml
@@ -47,7 +47,7 @@
    <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
    <!-- 在这个根包下面的所有日志操作行为的权限都是DEBUG -->
    <logger name="com.boying.scheduled" level="INFO">
    <logger name="com.boying.scheduled" level="DEBUG">
        <!--与上面appender的name要一致-->
        <appender-ref ref="mylog" />
    </logger>