From 40b7f4a7f493cfa5d8b2531d99d7ef8f5a9d5f0a Mon Sep 17 00:00:00 2001 From: xuhy <3313886187@qq.com> Date: 星期三, 27 十一月 2024 14:41:05 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java | 159 ++++--- UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java | 14 UserZYTravel/guns-admin/src/main/resources/application.yml | 41 - UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java | 12 DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java | 16 UserZYTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java | 37 + DriverZYTravel/guns-admin/src/main/resources/logback-spring.xml | 319 +++++++++++---- UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml | 14 DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java | 4 DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java | 4 UserZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java | 6 DriverZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java | 6 DriverZYTravel/guns-core/src/main/resources/default-config.properties | 2 DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java | 16 UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java | 81 ++- UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java | 16 UserZYTravel/guns-core/src/main/resources/default-config.properties | 2 DriverZYTravel/guns-admin/src/main/resources/application.yml | 40 - DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java | 2 UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java | 6 DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java | 34 + UserZYTravel/guns-admin/src/main/resources/logback-spring.xml | 319 +++++++++++---- UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java | 15 23 files changed, 719 insertions(+), 446 deletions(-) diff --git a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java index c51ae9c..4baa3cb 100644 --- a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java +++ b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java @@ -778,7 +778,7 @@ //写入相应的文件 PrintWriter out = new PrintWriter(new FileWriter(file)); orderPositions.add(orderPosition); - System.err.println("存储新数据:" + JSON.toJSONString(orderPositions)); +// System.err.println("存储新数据:" + JSON.toJSONString(orderPositions)); out.write(JSON.toJSONString(orderPositions)); out.flush(); out.close(); diff --git a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java index 3f162df..c26438b 100644 --- a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java +++ b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java @@ -323,101 +323,104 @@ // 结束服务时查询轨迹,计算距离 Driver driver = driverService.selectById(orderPrivateCar.getDriverId()); - String tid = gdFalconUtil.selectTerminal(driver.getPhone()); - String result = gdFalconUtil.selectTrack(tid, orderPrivateCar.getTrackId(),1); - - JSONObject jsonObject = JSONObject.parseObject(result); - JSONArray tracks = jsonObject.getJSONArray("tracks"); - Integer counts = jsonObject.getInteger("counts"); - JSONArray points = new JSONArray(); - // 如果一单轨迹点数大于999,需进行分页查询,将所有的点查询出 - if(counts > 999){ - int i = counts%999; - for (int j = 1; j < i + 1; j++) { - String res = gdFalconUtil.selectTrack(tid, orderPrivateCar.getTrackId(),1); - JSONObject jsonObject1 = JSONObject.parseObject(res); - JSONArray tracks1 = jsonObject1.getJSONArray("tracks"); - Object ob = tracks1.get(0); + double sum = 0; + try { + String tid = gdFalconUtil.selectTerminal(driver.getPhone()); + String result = gdFalconUtil.selectTrack(tid, orderPrivateCar.getTrackId(),1); + + JSONObject jsonObject = JSONObject.parseObject(result); + JSONArray tracks = jsonObject.getJSONArray("tracks"); + Integer counts = jsonObject.getInteger("counts"); + JSONArray points = new JSONArray(); + // 如果一单轨迹点数大于999,需进行分页查询,将所有的点查询出 + if(counts > 999){ + int i = counts%999; + for (int j = 1; j < i + 1; j++) { + String res = gdFalconUtil.selectTrack(tid, orderPrivateCar.getTrackId(),1); + JSONObject jsonObject1 = JSONObject.parseObject(res); + JSONArray tracks1 = jsonObject1.getJSONArray("tracks"); + Object ob = tracks1.get(0); + String obs = JSONObject.toJSONString(ob); + JSONObject object = JSONObject.parseObject(obs); + JSONArray point = object.getJSONArray("points"); + points.addAll(point); + } + } + // 轨迹点数小于999,一页查询出即可 + if(counts > 0 && counts < 999){ + Object ob = tracks.get(0); String obs = JSONObject.toJSONString(ob); JSONObject object = JSONObject.parseObject(obs); JSONArray point = object.getJSONArray("points"); points.addAll(point); } - } - // 轨迹点数小于999,一页查询出即可 - if(counts > 0 && counts < 999){ - Object ob = tracks.get(0); - String obs = JSONObject.toJSONString(ob); - JSONObject object = JSONObject.parseObject(obs); - JSONArray point = object.getJSONArray("points"); - points.addAll(point); - } - - System.out.println("轨迹坐标点=====:"+points); - String toLonLat = ""; - double sum = 0; - List<OrderPosition> orderPositions = new ArrayList<>(); - for (Object o : points) { - String s = JSONObject.toJSONString(o); - JSONObject obj = JSONObject.parseObject(s); - String fromLonLat = obj.getString("location"); - String[] split = fromLonLat.split(","); - Long locatetime = obj.getLong("locatetime"); - Date date = new Date(locatetime); - if(date.after(orderPrivateCar.getStartServiceTime()) && date.before(orderPrivateCar.getEndServiceTime())){ - // 封装定位文件里的单个定位对象 - OrderPosition orderPosition = new OrderPosition(); - orderPosition.setOrderId(orderId); - orderPosition.setOrderType(1); - orderPosition.setDriverId(orderPrivateCar.getDriverId()); - orderPosition.setLat(split[1]); - orderPosition.setLon(split[0]); - orderPosition.setAltitude("0"); - orderPosition.setDirectionAngle("0"); - //先计算里程,在存储最新位置 - orderPosition.setInsertTime(new Date()); - orderPositions.add(orderPosition); + + String toLonLat = ""; + List<OrderPosition> orderPositions = new ArrayList<>(); + for (Object o : points) { + String s = JSONObject.toJSONString(o); + JSONObject obj = JSONObject.parseObject(s); + String fromLonLat = obj.getString("location"); + String[] split = fromLonLat.split(","); + Long locatetime = obj.getLong("locatetime"); + Date date = new Date(locatetime); + if(date.after(orderPrivateCar.getStartServiceTime()) && date.before(orderPrivateCar.getEndServiceTime())){ + // 封装定位文件里的单个定位对象 + OrderPosition orderPosition = new OrderPosition(); + orderPosition.setOrderId(orderId); + orderPosition.setOrderType(1); + orderPosition.setDriverId(orderPrivateCar.getDriverId()); + orderPosition.setLat(split[1]); + orderPosition.setLon(split[0]); + orderPosition.setAltitude("0"); + orderPosition.setDirectionAngle("0"); + //先计算里程,在存储最新位置 + orderPosition.setInsertTime(new Date()); + orderPositions.add(orderPosition); + if(StringUtils.hasLength(fromLonLat) && StringUtils.hasLength(toLonLat)){ + String[] from = fromLonLat.split(","); + String[] to = toLonLat.split(","); + GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0])); + GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(to[1]), Double.valueOf(to[0])); + double WGS84 = getDistanceMeter(source, target, Ellipsoid.WGS84); + sum += WGS84; + } + toLonLat = fromLonLat; + } + } + + //存储轨迹 + // 将数据存储到文件中 + File file = new File(filePath + orderId + "_" + 1 + ".txt"); + if(!file.exists()){ + file.getParentFile().mkdirs(); + file.createNewFile(); + } + //写入相应的文件 + PrintWriter out = new PrintWriter(new FileWriter(file)); + out.write(JSON.toJSONString(orderPositions)); + out.flush(); + out.close(); + }catch (Exception e){ + e.printStackTrace(); + System.err.println("查询高德轨迹出错,使用本地轨迹计算"); + List<OrderPosition> list = orderPositionService.queryPosition(orderId, 1); + String fromLonLat = ""; + for (OrderPosition orderPosition : list) { + String toLonLat = orderPosition.getLon() + "," + orderPosition.getLat(); if(StringUtils.hasLength(fromLonLat) && StringUtils.hasLength(toLonLat)){ String[] from = fromLonLat.split(","); String[] to = toLonLat.split(","); GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0])); GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(to[1]), Double.valueOf(to[0])); double WGS84 = getDistanceMeter(source, target, Ellipsoid.WGS84); - System.err.println("WGS84坐标系计算结果:"+WGS84 + "米"); sum += WGS84; } - toLonLat = fromLonLat; + fromLonLat = toLonLat; } } - - //存储轨迹 - // 将数据存储到文件中 - File file = new File(filePath + orderId + "_" + 1 + ".txt"); - if(!file.exists()){ - file.getParentFile().mkdirs(); - file.createNewFile(); - } - //写入相应的文件 - PrintWriter out = new PrintWriter(new FileWriter(file)); - out.write(JSON.toJSONString(orderPositions)); - out.flush(); - out.close(); - orderPrivateCar.setMileage(sum); orderPrivateCar.setIsAbnormal(0); - - //获取预估里程,使用预估里程作为行驶里程计算金额 -// String origins = orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(); -// String destination = orderPrivateCar.getGetoffLon() + "," + orderPrivateCar.getGetoffLat(); -// Map<String, String> distance = gdMapElectricFenceUtil.getDistance(origins, destination, 1); -// Double distance1 = Double.valueOf(distance.get("distance")); -// if(distance1 - sum > 1000){ -// orderPrivateCar.setMileage(distance1); -// orderPrivateCar.setIsAbnormal(1); -// }else{ -// orderPrivateCar.setMileage(sum); -// orderPrivateCar.setIsAbnormal(0); -// } break; } this.updateById(orderPrivateCar); diff --git a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java index 5a6223c..2e223a4 100644 --- a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java +++ b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderPositionServiceImpl.java @@ -65,7 +65,7 @@ //写入相应的文件 PrintWriter out = new PrintWriter(new FileWriter(file)); orderPositions.add(orderPosition); - System.err.println("存储新数据:" + JSON.toJSONString(orderPositions)); +// System.err.println("存储新数据:" + JSON.toJSONString(orderPositions)); out.write(JSON.toJSONString(orderPositions)); out.flush(); out.close(); @@ -124,7 +124,7 @@ if(ToolUtil.isNotEmpty(sb.toString())){ list = JSONArray.parseArray(sb.toString(), OrderPosition.class); } - System.err.println("坐标:" + sb); +// System.err.println("坐标:" + sb); return list; } } diff --git a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java index 6f02900..db17f79 100644 --- a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java +++ b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java @@ -93,7 +93,7 @@ JSONObject data = jsonObject.getJSONObject("data"); String status = data.getString("status"); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "创建电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "创建电子围栏"); // if(status.equals("0")){//创建成功 // GDFence gdFence = new GDFence(); @@ -153,7 +153,7 @@ JSONObject jsonObject = JSON.parseObject(forObject); JSONObject data = jsonObject.getJSONObject("data"); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏"); if(ToolUtil.isNotEmpty(center)){//圆形电子围栏 JSONArray rs_list = data.getJSONArray("rs_list"); @@ -192,7 +192,7 @@ JSONArray rs_list = data.getJSONArray("rs_list"); jsonArray.addAll(rs_list); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏"); //判断是否有分页 int total_record = data.getIntValue("total_record"); @@ -285,7 +285,7 @@ String s = restTemplate.patchForObject(url, formEntity, String.class); System.out.println(s); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "更新电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "更新电子围栏"); } @@ -323,7 +323,7 @@ } System.out.println("检测:" + forObject); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/status", "电子围栏监控"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/status", "电子围栏监控"); return ids; } @@ -337,7 +337,7 @@ restTemplate.delete("https://restapi.amap.com/v4/geofence/meta?key={1}&gid={2}", key, gid); System.out.println("删除:" ); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "删除电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "删除电子围栏"); return true; } @@ -357,7 +357,7 @@ JSONObject jsonObject = JSON.parseObject(forObject); String status = jsonObject.getString("status"); - gdInterfaceService.saveData("https://restapi.amap.com/v3/distance", "查询两点间的距离"); +// gdInterfaceService.saveData("https://restapi.amap.com/v3/distance", "查询两点间的距离"); if(status.equals("1")){ JSONArray results = jsonObject.getJSONArray("results"); @@ -387,7 +387,7 @@ JSONObject jsonObject = JSON.parseObject(forObject); String status = jsonObject.getString("status"); - gdInterfaceService.saveData("https://restapi.amap.com/v3/direction/driving", "获取路径规划"); +// gdInterfaceService.saveData("https://restapi.amap.com/v3/direction/driving", "获取路径规划"); if(status.equals("1")){ JSONObject route = jsonObject.getJSONObject("route"); diff --git a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java index 5dc65e0..498cda5 100644 --- a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java +++ b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java @@ -62,7 +62,7 @@ String status = jsonObject.getString("status"); List<String> list = new ArrayList<>(); - gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度"); +// gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度"); if(status.equals("1")){ JSONArray geocodes = jsonObject.getJSONArray("geocodes"); @@ -90,7 +90,7 @@ JSONObject jsonObject = JSON.parseObject(forObject); Map<String, String> map = new HashMap<>(); - gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/regeo", "经纬度转行政区域"); +// gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/regeo", "经纬度转行政区域"); if(jsonObject.getString("status").equals("1")){ JSONObject regeocode = jsonObject.getJSONObject("regeocode"); diff --git a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java index ccdede4..8a14f3c 100644 --- a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java +++ b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java @@ -1,6 +1,8 @@ package com.stylefeng.guns.modular.system.util; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; @@ -438,7 +440,7 @@ Double Speed = 0D; if(orderPositions != null && orderPositions.size() > 1){ Map<String, String> distance = gdMapElectricFenceUtil.getDistance(orderPositions.get(orderPositions.size() - 1).getLon() + "," + orderPositions.get(orderPositions.size() - 1).getLat(), - orderPositions.get(orderPositions.size() - 0).getLon() + "," + orderPositions.get(orderPositions.size() - 0).getLat(), 0); + orderPositions.get(orderPositions.size() - 1).getLon() + "," + orderPositions.get(orderPositions.size() - 1).getLat(), 0); Speed = distance != null ? Double.valueOf(distance.get("distance")) / 1000 : 0D; } Integer state = 4; @@ -478,13 +480,18 @@ header.put("Accept", "*/*"); header.put("Accept-Encoding", "gzip"); header.put("Accept-Charset", "utf-8"); - String result = null; try { - result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/positionDriver", map, header,"form").toString(); + HttpRequest post = HttpUtil.createPost(path + "ministryOfTransport/positionDriver"); + post.header("Connection", "keep-alive"); + post.header("Content-Type", "application/x-www-form-urlencoded"); + post.header("Accept", "*/*"); + post.header("Accept-Encoding", "gzip"); + post.header("Accept-Charset", "utf-8"); + post.body(JSON.toJSONString(map)); + post.execute(); } catch (Exception e) { e.printStackTrace(); } - System.err.println("-----------------------------驾驶员定位信息------------------------:" + result); } @@ -508,7 +515,7 @@ Double Speed = 0D; if(orderPositions != null && orderPositions.size() > 1){ Map<String, String> distance = gdMapElectricFenceUtil.getDistance(orderPositions.get(orderPositions.size() - 1).getLon() + "," + orderPositions.get(orderPositions.size() - 1).getLat(), - orderPositions.get(orderPositions.size() - 0).getLon() + "," + orderPositions.get(orderPositions.size() - 0).getLat(), 0); + orderPositions.get(orderPositions.size() - 1).getLon() + "," + orderPositions.get(orderPositions.size() - 1).getLat(), 0); Speed = distance != null ? Double.valueOf(distance.get("distance")) / 1000 : 0D; } Integer state = 4; @@ -542,19 +549,18 @@ jsonObject.put("OrderId", orderNum);//订单编号(非营运状态下填"0") Map<String, Object> map = new HashMap<>(); map.put("positionVehicle", jsonObject.toJSONString()); - Map<String, String> header = new HashMap<>(); - header.put("Connection", "keep-alive"); - header.put("Content-Type", "application/x-www-form-urlencoded"); - header.put("Accept", "*/*"); - header.put("Accept-Encoding", "gzip"); - header.put("Accept-Charset", "utf-8"); - String result = null; try { - result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/positionVehicle", map, header,"form").toString(); + HttpRequest post = HttpUtil.createPost(path + "ministryOfTransport/positionVehicle"); + post.header("Connection", "keep-alive"); + post.header("Content-Type", "application/x-www-form-urlencoded"); + post.header("Accept", "*/*"); + post.header("Accept-Encoding", "gzip"); + post.header("Accept-Charset", "utf-8"); + post.body(JSON.toJSONString(map)); + post.execute(); } catch (Exception e) { e.printStackTrace(); } - System.err.println("----------------------------车辆定位信息---------------------------:" + result); } diff --git a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java index 594073f..2582e2f 100644 --- a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java +++ b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java @@ -12,6 +12,8 @@ import com.stylefeng.guns.modular.system.model.OrderPosition; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; @@ -36,6 +38,8 @@ */ @Component public class PushUtil { + + private Logger log = LoggerFactory.getLogger(PushUtil.class); @Autowired private RestTemplate internalRestTemplate; @@ -99,7 +103,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } @@ -133,7 +137,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } @@ -280,7 +284,7 @@ //计算预计距离和剩余时间 String value = redisUtil.getValue("DRIVER" + String.valueOf(driverId)); if(null == value || "".equals(value)){ - System.err.println("司机没有上传位置信息"); +// System.err.println("司机没有上传位置信息"); return; } @@ -362,7 +366,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } @@ -432,7 +436,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } @@ -469,7 +473,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } diff --git a/DriverZYTravel/guns-admin/src/main/resources/application.yml b/DriverZYTravel/guns-admin/src/main/resources/application.yml index 2d34417..8db4c0a 100644 --- a/DriverZYTravel/guns-admin/src/main/resources/application.yml +++ b/DriverZYTravel/guns-admin/src/main/resources/application.yml @@ -2,7 +2,7 @@ port: 8007 guns: - swagger-open: true #是否开启swagger (true/false) + swagger-open: false #是否开启swagger (true/false) kaptcha-open: false #是否开启登录时验证码 (true/false) # file-upload-path: d:/tmp #文件上传目录(不配置的话为java.io.tmpdir目录) spring-session-open: false #是否开启spring session,如果是多机环境需要开启(true/false) @@ -13,7 +13,7 @@ application: name: driver-server profiles: - active: "@spring.active@" + active: produce mvc: static-path-pattern: /static/** view: @@ -30,9 +30,9 @@ mybatis-plus: typeAliasesPackage: com.stylefeng.guns.modular + configuration: + log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl -log: - path: guns-logs eureka: client: @@ -46,7 +46,6 @@ ################# 测试环境 ################### spring: - profiles: local datasource: url: jdbc:mysql://localhost:3306/zytravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai username: root @@ -66,37 +65,6 @@ dataSourceNames: - dataSourceGuns - dataSourceBiz - ---- - -spring: - profiles: dev - datasource: - url: jdbc:mysql://127.0.0.1:3306/guns?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: root - db-name: guns #用来搜集数据库的所有表 - filters: wall,mergeStat - ---- - -spring: - profiles: test - datasource: - url: jdbc:mysql://127.0.0.1:3306/guns?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: root - filters: wall,mergeStat - ---- - -spring: - profiles: produce - datasource: - url: jdbc:mysql://127.0.0.1:3306/guns?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: root - filters: wall,mergeStat --- diff --git a/DriverZYTravel/guns-admin/src/main/resources/logback-spring.xml b/DriverZYTravel/guns-admin/src/main/resources/logback-spring.xml index e8f66d9..e6ce5b4 100644 --- a/DriverZYTravel/guns-admin/src/main/resources/logback-spring.xml +++ b/DriverZYTravel/guns-admin/src/main/resources/logback-spring.xml @@ -1,99 +1,230 @@ <?xml version="1.0" encoding="UTF-8"?> -<configuration> - - <!--定义日志存放的位置--> - <springProperty scope="context" name="gunsLogPath" source="log.path" - defaultValue="guns-logs"/> - - <!-- ****************************************************************************************** --> - <!-- ****************************** 本地开发只在控制台打印日志 ************************************ --> - <!-- ****************************************************************************************** --> - <springProfile name="local"> - - <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> - <!--encoder 默认配置为PatternLayoutEncoder--> - <encoder> - <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> - <charset>utf-8</charset> - </encoder> - </appender> - +<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 --> +<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true --> +<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> +<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> +<configuration scan="true" scanPeriod="10 seconds"> + <contextName>logback</contextName> + + <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 --> + <property name="log.path" value="D:/web/log/driver"/> + + <!--0. 日志格式和颜色渲染 --> + <!-- 彩色日志依赖的渲染类 --> + <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> + <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> + <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> + <!-- 彩色日志格式 --> + <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> + + <!--1. 输出到控制台--> + <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> + <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>debug</level> + </filter> + <encoder> + <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> + <!-- 设置字符集 --> + <charset>UTF-8</charset> + </encoder> + </appender> + + <!--2. 输出到文档--> + <!-- 2.1 level为 DEBUG 日志,时间滚动输出 --> + <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/debug.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> <!-- 设置字符集 --> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- 日志归档 --> + <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档只记录debug级别的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>debug</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 2.2 level为 INFO 日志,时间滚动输出 --> + <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/info.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- 每天日志归档路径以及格式 --> + <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档只记录info级别的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>info</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 2.3 level为 WARN 日志,时间滚动输出 --> + <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/warn.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> <!-- 此处设置字符集 --> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档只记录warn级别的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>warn</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 2.4 level为 ERROR 日志,时间滚动输出 --> + <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/error.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> <!-- 此处设置字符集 --> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档只记录ERROR级别的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>ERROR</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 2.5 所有 除了DEBUG级别的其它高于DEBUG的 日志,记录到一个文件 --> + <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/all.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> <!-- 此处设置字符集 --> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${log.path}/all-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档记录除了DEBUG级别的其它高于DEBUG的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>DEBUG</level> + <onMatch>DENY</onMatch> + <onMismatch>ACCEPT</onMismatch> + </filter> + </appender> + + <!-- + <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 + 以及指定<appender>。<logger>仅有一个name属性, + 一个可选的level和一个可选的addtivity属性。 + name:用来指定受此logger约束的某一个包或者具体的某一个类。 + level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, + 还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。 + 如果未设置此属性,那么当前logger将会继承上级的级别。 + addtivity:是否向上级logger传递打印信息。默认是true。 + <logger name="org.springframework.web" level="info"/> + <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> + --> + + <!-- + root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 + level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, + 不能设置为INHERITED或者同义词NULL。默认是DEBUG + 可以包含零个或多个元素,标识这个appender将会添加到这个logger。 + --> + + <!-- 4 最终的策略: + 基本策略(root级) + 根据profile在启动时, logger标签中定制化package日志级别(优先级高于上面的root级)--> + <springProfile name="dev"> <root level="info"> - <appender-ref ref="STDOUT"/> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="DEBUG_FILE" /> + <appender-ref ref="INFO_FILE" /> + <appender-ref ref="WARN_FILE" /> + <appender-ref ref="ERROR_FILE" /> + <appender-ref ref="ALL_FILE" /> </root> - - <logger name="com.stylefeng.guns" level="debug" additivity="false"> - <appender-ref ref="STDOUT"/> - </logger> - + <logger name="com.baomidou.mybatisplus" level="info"/> + <logger name="com.stylefeng.guns.modular.system.dao" level="info"/> + <logger name="business-log" level="warn"/> + </springProfile> + + <springProfile name="fat"> + <root level="info"> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="DEBUG_FILE" /> + <appender-ref ref="INFO_FILE" /> + <appender-ref ref="WARN_FILE" /> + <appender-ref ref="ERROR_FILE" /> + <appender-ref ref="ALL_FILE" /> + </root> + <logger name="com.baomidou.mybatisplus" level="info"/> + <logger name="com.stylefeng.guns.modular.system.dao" level="info"/> + <logger name="business-log" level="warn"/> + </springProfile> + + <springProfile name="produce"> + <root level="info"> + <!-- 生产环境最好不配置console写文件 --> + <appender-ref ref="DEBUG_FILE" /> + <appender-ref ref="INFO_FILE" /> + <appender-ref ref="WARN_FILE" /> + <appender-ref ref="ERROR_FILE" /> + <appender-ref ref="ALL_FILE" /> + </root> + <logger name="com.baomidou.mybatisplus" level="info"/> + <logger name="com.stylefeng.guns.modular.system.dao" level="info"/> + <logger name="business-log" level="warn"/> </springProfile> - <!-- ****************************************************************************************** --> - <!-- ********************** 放到服务器上不管在什么环境都只在文件记录日志 **************************** --> - <!-- ****************************************************************************************** --> - <springProfile name="!local"> - - <!-- 日志记录器,日期滚动记录 --> - <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> - <!-- 正在记录的日志文件的路径及文件名 --> - <file>${gunsLogPath}/log_error.log</file> - <!-- 日志记录器的滚动策略,按日期,按大小记录 --> - <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> - <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 - 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> - <fileNamePattern>${gunsLogPath}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> - <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, - 命名日志文件,例如log-error-2013-12-21.0.log --> - <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> - <maxFileSize>2MB</maxFileSize> - </timeBasedFileNamingAndTriggeringPolicy> - </rollingPolicy> - <!-- 追加方式记录日志 --> - <append>true</append> - <!-- 日志文件的格式 --> - <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> - <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> - <charset>utf-8</charset> - </encoder> - <!-- 此日志文件只记录error级别的 --> - <filter class="ch.qos.logback.classic.filter.LevelFilter"> - <level>error</level> - <onMatch>ACCEPT</onMatch> - <onMismatch>DENY</onMismatch> - </filter> - </appender> - - <!-- 日志记录器,日期滚动记录 --> - <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender"> - <!-- 正在记录的日志文件的路径及文件名 --> - <file>${gunsLogPath}/log_total.log</file> - <!-- 日志记录器的滚动策略,按日期,按大小记录 --> - <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> - <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 - 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> - <fileNamePattern>${gunsLogPath}/total/log-total-%d{yyyy-MM-dd}.%i.log</fileNamePattern> - <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, - 命名日志文件,例如log-error-2013-12-21.0.log --> - <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> - <maxFileSize>2MB</maxFileSize> - </timeBasedFileNamingAndTriggeringPolicy> - </rollingPolicy> - <!-- 追加方式记录日志 --> - <append>true</append> - <!-- 日志文件的格式 --> - <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> - <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> - <charset>utf-8</charset> - </encoder> - </appender> - - <root level="info"> - <appender-ref ref="FILE_ERROR"/> - <appender-ref ref="FILE_ALL"/> - </root> - - </springProfile> - -</configuration> - - +</configuration> \ No newline at end of file diff --git a/DriverZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java b/DriverZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java index 17ffd3a..8c81e34 100644 --- a/DriverZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java +++ b/DriverZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java @@ -20,11 +20,11 @@ private String driverClassName = "com.mysql.cj.jdbc.Driver"; - private Integer initialSize = 2; + private Integer initialSize = 100; - private Integer minIdle = 1; + private Integer minIdle = 100; - private Integer maxActive = 20; + private Integer maxActive = 1000; private Integer maxWait = 60000; diff --git a/DriverZYTravel/guns-core/src/main/resources/default-config.properties b/DriverZYTravel/guns-core/src/main/resources/default-config.properties index 8d458f7..3166d4a 100644 --- a/DriverZYTravel/guns-core/src/main/resources/default-config.properties +++ b/DriverZYTravel/guns-core/src/main/resources/default-config.properties @@ -22,7 +22,7 @@ # \u5F00\u542F\u7684\u8BDD\uFF0C\u5EF6\u65F6\u52A0\u8F7D\u4E00\u4E2A\u5C5E\u6027\u65F6\u4F1A\u52A0\u8F7D\u8BE5\u5BF9\u8C61\u5168\u90E8\u5C5E\u6027\uFF0C\u5426\u5219\u6309\u9700\u52A0\u8F7D\u5C5E\u6027 mybatis-plus.configuration.multipleResultSetsEnabled=true # \u6253\u5370sql\u8BED\u53E5,\u8C03\u8BD5\u7528 -mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ########################## beetl\u9ED8\u8BA4\u914D\u7F6E ########################### diff --git a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java index 062c112..a006a68 100644 --- a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java +++ b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java @@ -33,6 +33,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; @@ -369,7 +370,19 @@ Driver driver = null; int m = 0; int index = 0; + + // 查询预约单 + List<Integer> driverIds = drivers.stream().map(Driver::getId).collect(Collectors.toList()); + List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11); for(int j = 0; j < drivers.size(); j++){ + Driver driver1 = drivers.get(j); + // 判断该司机是否有30分钟内预约单 + long count = orderPrivateCarss.stream().filter(orderPrivateCar1 -> driver1.getId().equals(orderPrivateCar1.getDriverId()) + && DateUtil.dateToLocalDateTime(orderPrivateCar1.getTravelTime()).minusMinutes(30).isBefore(LocalDateTime.now()) + && DateUtil.dateToLocalDateTime(orderPrivateCar1.getTravelTime()).isAfter(LocalDateTime.now())).count(); + if(count > 0){ + continue; + } String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId()); if(null != value){ // Map<String, String> distance1 = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 0);//计算距离 @@ -931,6 +944,10 @@ @Override public ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception { + String value = redisUtil.getValue(orderId + "_status_1"); + if(ToolUtil.isNotEmpty(value) && "8".equals(value)){ + return ResultUtil.error("订单已完成支付,不允许重复支付", ""); + } OrderPrivateCar orderPrivateCar = this.selectById(orderId); if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){ return ResultUtil.error("订单已完成支付,不允许重复支付", ""); @@ -938,8 +955,7 @@ if(orderPrivateCar.getState() != 7){ return ResultUtil.error("订单不在待支付状态,不允许支付", ""); } - String code = orderId + "_1_" + UUIDUtil.getRandomCode(5); - PaymentRecord query3 = paymentRecordService.query(1, null, null, orderId, 1, payType, null); + PaymentRecord query3 = paymentRecordService.query(1, null, null, orderId, 1, null, 1); if(null != query3){ ResultUtil<Map<String, Object>> resultUtil1 = payMoneyUtil.queryWXOrder("", query3.getSerialNumber(), "JSAPI"); if (resultUtil1.getCode() == 200) { @@ -958,12 +974,14 @@ String s = resultUtil1.getData().get("trade_state").toString(); if ("REFUND".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s)) { payMoneyUtil.closeWXOrder(query3.getSerialNumber()); + paymentRecordService.deleteById(query3.getId()); } if ("SUCCESS".equals(s) || "ACCEPT".equals(s)) { return ResultUtil.error("不允许重复支付"); } if ("NOTPAY".equals(s) || "USERPAYING".equals(s)) { payMoneyUtil.closeWXOrder(query3.getSerialNumber()); + paymentRecordService.deleteById(query3.getId()); } } } @@ -982,7 +1000,7 @@ UserCouponRecord userCouponRecord = null; if(null != couponId){ userCouponRecord = userCouponRecordService.selectById(couponId); - if(userCouponRecord.getCompanyId() != orderPrivateCar.getCompanyId()){ + if(userCouponRecord.getCompanyId().compareTo(orderPrivateCar.getCompanyId()) != 0){ return ResultUtil.error("优惠券不能用于此订单", ""); } if(userCouponRecord.getState() == 2){ @@ -1029,19 +1047,24 @@ if(ToolUtil.isEmpty(userInfo.getAppletsOpenId())){ return ResultUtil.error("未授权微信,无法完成支付"); } + String code = orderId + "_1_" + UUIDUtil.getRandomCode(5); if(payType == 1){//微信支付 resultUtil = payMoneyUtil.weixinpay("完成订单",orderId +"", code,orderMoney+"","/base/wxPayOrderTaxi","JSAPI",userInfo.getAppletsOpenId()); if(resultUtil.getCode()==200){ - paymentRecordService.saveData(1, null, null, orderId, 1, 1, orderMoney, null, 1, code);//添加预支付数据 + paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, null, 1, code);//添加预支付数据 + long millis = System.currentTimeMillis(); new Thread(()->{ - int num = 1; - int min = 5000; - int w = 0; - while (num <= 10) { + long time = millis; + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + //订单创建后15分钟 + while ((System.currentTimeMillis() - time) <= 900000) { try { - w += min * num; - OrderPrivateCar orderPrivateCar1 = orderPrivateCarMapper.selectById(orderId); - if (orderPrivateCar1.getState() != 7) { + String value1 = redisUtil.getValue(orderId + "_status_1"); + if(ToolUtil.isNotEmpty(value1) && "8".equals(value1)){ break; } ResultUtil<Map<String, Object>> resultUtil2 = payMoneyUtil.queryWXOrder("", code, "JSAPI"); @@ -1057,7 +1080,7 @@ * ACCEPT--已接收,等待扣款 */ String s = resultUtil2.getData().get("trade_state").toString(); - if ("REFUND".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s) || num == 10) { + if ("REFUND".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s)) { break; } if ("SUCCESS".equals(s) || "ACCEPT".equals(s)) { @@ -1066,15 +1089,20 @@ break; } if ("NOTPAY".equals(s) || "USERPAYING".equals(s)) { - Thread.sleep(w); - num++; } - } else { - Thread.sleep(w); - num++; } + Thread.sleep(5000); }catch (Exception e){ e.printStackTrace(); + } + } + String value1 = redisUtil.getValue(orderId + "_status_1"); + if(ToolUtil.isNotEmpty(value1) && "7".equals(value1)){ + //关闭订单,不允许支付 + payMoneyUtil.closeWXOrder(code); + PaymentRecord paymentRecord = paymentRecordService.selectOne(new EntityWrapper<PaymentRecord>().eq("serialNumber", code)); + if(null != paymentRecord){ + paymentRecordService.deleteById(paymentRecord.getId()); } } }).start(); @@ -1086,7 +1114,7 @@ if(payType == 2) {//支付宝支付 resultUtil = payMoneyUtil.alipay("完成订单","完成订单", "",code,orderMoney+"","/base/aliPayOrderTaxi"); if (resultUtil.getCode()==200) { - paymentRecordService.saveData(1, null, null, orderId, 1, 2, orderMoney, null, 1, code);//添加预支付数据 + paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, null, 1, code);//添加预支付数据 } else { resultUtil = ResultUtil.error("支付失败", ""); } @@ -1316,14 +1344,16 @@ } @Override - public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception { - OrderPrivateCar orderPrivateCar = this.selectById(id); - if(orderPrivateCar.getState() != 7){ - return; - } - PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), 1, type, 1); + @Transactional(rollbackFor = Exception.class) + public synchronized void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception { + PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), 1, type, null); if(null != query){ + String value = redisUtil.getValue(order_id + "_status_1"); + if(ToolUtil.isNotEmpty(value) && "8".equals(value)){ + return; + } //添加交易明细 + OrderPrivateCar orderPrivateCar = this.selectById(id); transactionDetailsService.saveData(orderPrivateCar.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId()); orderPrivateCar.setState(8); orderPrivateCar.setPayType(type); @@ -1350,10 +1380,11 @@ userRedPacketRecordService.updateById(userRedPacketRecord); } - query.setState(2); query.setCode(order_id); paymentRecordService.updateById(query); + redisUtil.setStrValue(order_id + "_status_1", "8"); + if(orderPrivateCar.getIsplatPay()==1){ //添加已收入明细 Company company = companyService.selectById(orderPrivateCar.getCompanyId()); diff --git a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java index 21e60ec..f49fcfe 100644 --- a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java +++ b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java @@ -93,7 +93,7 @@ JSONObject data = jsonObject.getJSONObject("data"); String status = data.getString("status"); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "创建电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "创建电子围栏"); // if(status.equals("0")){//创建成功 // GDFence gdFence = new GDFence(); @@ -153,7 +153,7 @@ JSONObject jsonObject = JSON.parseObject(forObject); JSONObject data = jsonObject.getJSONObject("data"); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏"); if(ToolUtil.isNotEmpty(center)){//圆形电子围栏 JSONArray rs_list = data.getJSONArray("rs_list"); @@ -192,7 +192,7 @@ JSONArray rs_list = data.getJSONArray("rs_list"); jsonArray.addAll(rs_list); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏"); //判断是否有分页 int total_record = data.getIntValue("total_record"); @@ -285,7 +285,7 @@ String s = restTemplate.patchForObject(url, formEntity, String.class); System.out.println(s); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "更新电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "更新电子围栏"); } @@ -323,7 +323,7 @@ } System.out.println("检测:" + forObject); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/status", "电子围栏监控"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/status", "电子围栏监控"); return ids; } @@ -337,7 +337,7 @@ restTemplate.delete("https://restapi.amap.com/v4/geofence/meta?key={1}&gid={2}", key, gid); System.out.println("删除:" ); - gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "删除电子围栏"); +// gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "删除电子围栏"); return true; } @@ -358,7 +358,7 @@ JSONObject jsonObject = JSON.parseObject(forObject); String status = jsonObject.getString("status"); - gdInterfaceService.saveData("https://restapi.amap.com/v3/distance", "查询两点间的距离"); +// gdInterfaceService.saveData("https://restapi.amap.com/v3/distance", "查询两点间的距离"); if(status.equals("1")){ JSONArray results = jsonObject.getJSONArray("results"); @@ -388,7 +388,7 @@ JSONObject jsonObject = JSON.parseObject(forObject); String status = jsonObject.getString("status"); - gdInterfaceService.saveData("https://restapi.amap.com/v3/direction/driving", "获取路径规划"); +// gdInterfaceService.saveData("https://restapi.amap.com/v3/direction/driving", "获取路径规划"); if(status.equals("1")){ JSONObject route = jsonObject.getJSONObject("route"); diff --git a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java index 5ef0699..dcc2a8d 100644 --- a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java +++ b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java @@ -62,7 +62,7 @@ String status = jsonObject.getString("status"); List<String> list = new ArrayList<>(); - gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度"); +// gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度"); if(status.equals("1")){ JSONArray geocodes = jsonObject.getJSONArray("geocodes"); @@ -86,7 +86,7 @@ String status = jsonObject.getString("status"); List<String> list = new ArrayList<>(); - gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度"); +// gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度"); if(status.equals("1")){ JSONArray geocodes = jsonObject.getJSONArray("geocodes"); @@ -115,7 +115,7 @@ JSONObject jsonObject = JSON.parseObject(forObject); Map<String, String> map = new HashMap<>(); - gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/regeo", "经纬度转行政区域"); +// gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/regeo", "经纬度转行政区域"); if(jsonObject.getString("status").equals("1")){ JSONObject regeocode = jsonObject.getJSONObject("regeocode"); diff --git a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java index 30f0fc0..eb2213c 100644 --- a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java +++ b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java @@ -345,8 +345,9 @@ //将结果xml解析成map body1 = body1.replaceAll("<!\\[CDATA\\[",""); body1 = body1.replaceAll("]]>", ""); + System.err.println("调起支付结果-------------->" + body1); try { - map1 = this.xmlToMap(body1, "UTF-8"); + map1 = PayMoneyUtil.xmlToMap(body1, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (DocumentException e) { @@ -366,7 +367,7 @@ map2.put("nonceStr", map1.get("nonce_str")); map2.put("package", "prepay_id=" + prepay_id); map2.put("signType", "MD5"); - map2.put("timeStamp", new Date().getTime() + ""); + map2.put("timeStamp", System.currentTimeMillis() + ""); String s2 = this.weixinSignature(map2); map2.put("prepay_id", prepay_id); @@ -386,7 +387,7 @@ map3.put("package", "Sign=WXPay"); map3.put("partnerid", mchId); map3.put("prepayid", prepay_id); - map3.put("timestamp", new Date().getTime() / 1000); + map3.put("timestamp", System.currentTimeMillis() / 1000); String s1 = this.weixinSignature(map3); map3.put("sign", s1); System.err.println(map3); @@ -394,11 +395,11 @@ } return null; }else{ - System.err.println(map1.get("err_code_des")); + System.err.println("调起支付异常-------------->" + map1.get("err_code_des")); return ResultUtil.error(map1.get("err_code_des")); } }else{//签名错误,请检查后再试1----1602881362 - System.err.println(map1.get("return_msg") + appid + "----" + mchId); + System.err.println("调起支付异常-------------->" + map1.get("return_msg") + appid + "----" + mchId); return ResultUtil.error(map1.get("return_msg"), new JSONObject()); } } @@ -416,7 +417,7 @@ String param = this.getParam(request); param = param.replaceAll("<!\\[CDATA\\[",""); param = param.replaceAll("]]>", ""); - Map<String, String> map = this.xmlToMap(param, "UTF-8"); + Map<String, String> map = PayMoneyUtil.xmlToMap(param, "UTF-8"); String return_code = map.get("return_code"); if("SUCCESS".equals(return_code)){ String result_code = map.get("result_code"); @@ -819,7 +820,7 @@ body1 = body1.replaceAll("<!\\[CDATA\\[",""); body1 = body1.replaceAll("]]>", ""); try { - map1 = this.xmlToMap(body1, "UTF-8"); + map1 = PayMoneyUtil.xmlToMap(body1, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (DocumentException e) { diff --git a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java index fc04ad9..7891507 100644 --- a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java +++ b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java @@ -8,6 +8,8 @@ import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -27,6 +29,8 @@ */ @Component public class PushUtil { + + private Logger log = LoggerFactory.getLogger(PushUtil.class); @Autowired private RestTemplate internalRestTemplate; @@ -86,7 +90,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } @@ -121,7 +125,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } @@ -290,7 +294,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } @@ -320,7 +324,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } @@ -357,7 +361,7 @@ String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ - System.err.println(jsonObject1.getString("msg")); + log.error(jsonObject1.getString("msg")); } } diff --git a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml index d65166f..ead31b6 100644 --- a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml +++ b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml @@ -19,19 +19,7 @@ <select id="query" resultType="PaymentRecord"> - select - id as id, - category as category, - userId as userId, - `type` as `type`, - orderId as orderId, - orderType as orderType, - payType as payType, - amount as amount, - code as code, - state as state, - insertTime as insertTime - from t_payment_record where category = #{category} + select * from t_payment_record where category = #{category} <if test="null != userId"> and userId = #{userId} </if> diff --git a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java index 3948088..6222a56 100644 --- a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java +++ b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java @@ -1,6 +1,7 @@ package com.stylefeng.guns.modular.taxi.service.impl; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.stylefeng.guns.modular.system.util.RedisUtil; import com.stylefeng.guns.modular.taxi.dao.PaymentRecordMapper; import com.stylefeng.guns.modular.taxi.model.PaymentRecord; import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService; @@ -15,6 +16,9 @@ @Resource private PaymentRecordMapper paymentRecordMapper; + + @Resource + private RedisUtil redisUtil; @@ -31,11 +35,6 @@ @Override public Integer saveData(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType, Integer payType, Double amount, String code, Integer state, String serialNumber) throws Exception { - //先删除现有数据避免重复 - PaymentRecord query = paymentRecordMapper.query(category, userId, type, orderId, orderType, payType, state); - if(null != query){ - this.deleteById(query.getId()); - } PaymentRecord paymentRecord = new PaymentRecord(); paymentRecord.setCategory(category); paymentRecord.setUserId(userId); @@ -49,6 +48,9 @@ paymentRecord.setInsertTime(new Date()); paymentRecord.setSerialNumber(serialNumber); this.insert(paymentRecord); + if(state == 1){ + redisUtil.setStrValue(orderId + "_status_" + orderType, "7", 3600); + } return paymentRecord.getId(); } diff --git a/UserZYTravel/guns-admin/src/main/resources/application.yml b/UserZYTravel/guns-admin/src/main/resources/application.yml index 142a295..a6d8277 100644 --- a/UserZYTravel/guns-admin/src/main/resources/application.yml +++ b/UserZYTravel/guns-admin/src/main/resources/application.yml @@ -2,7 +2,7 @@ port: 8006 guns: - swagger-open: true #是否开启swagger (true/false) + swagger-open: false #是否开启swagger (true/false) kaptcha-open: false #是否开启登录时验证码 (true/false) # file-upload-path: d:/tmp #文件上传目录(不配置的话为java.io.tmpdir目录) spring-session-open: false #是否开启spring session,如果是多机环境需要开启(true/false) @@ -13,7 +13,7 @@ application: name: user-server profiles: - active: "@spring.active@" + active: produce mvc: static-path-pattern: /static/** view: @@ -30,9 +30,8 @@ mybatis-plus: typeAliasesPackage: com.stylefeng.guns.modular - -log: - path: guns-logs + configuration: + log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl eureka: client: @@ -52,7 +51,6 @@ ################# 测试环境 ################### spring: - profiles: local datasource: url: jdbc:mysql://localhost:3306/zytravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai username: root @@ -71,37 +69,6 @@ dataSourceNames: - dataSourceGuns - dataSourceBiz - ---- - -spring: - profiles: dev - datasource: - url: jdbc:mysql://127.0.0.1:3306/guns?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: root - db-name: guns #用来搜集数据库的所有表 - filters: wall,mergeStat - ---- - -spring: - profiles: test - datasource: - url: jdbc:mysql://127.0.0.1:3306/guns?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: root - filters: wall,mergeStat - ---- - -spring: - profiles: produce - datasource: - url: jdbc:mysql://127.0.0.1:3306/guns?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: root - filters: wall,mergeStat --- diff --git a/UserZYTravel/guns-admin/src/main/resources/logback-spring.xml b/UserZYTravel/guns-admin/src/main/resources/logback-spring.xml index e8f66d9..4ed01f8 100644 --- a/UserZYTravel/guns-admin/src/main/resources/logback-spring.xml +++ b/UserZYTravel/guns-admin/src/main/resources/logback-spring.xml @@ -1,99 +1,230 @@ <?xml version="1.0" encoding="UTF-8"?> -<configuration> - - <!--定义日志存放的位置--> - <springProperty scope="context" name="gunsLogPath" source="log.path" - defaultValue="guns-logs"/> - - <!-- ****************************************************************************************** --> - <!-- ****************************** 本地开发只在控制台打印日志 ************************************ --> - <!-- ****************************************************************************************** --> - <springProfile name="local"> - - <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> - <!--encoder 默认配置为PatternLayoutEncoder--> - <encoder> - <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> - <charset>utf-8</charset> - </encoder> - </appender> - +<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 --> +<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true --> +<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> +<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> +<configuration scan="true" scanPeriod="10 seconds"> + <contextName>logback</contextName> + + <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 --> + <property name="log.path" value="D:/web/log/user"/> + + <!--0. 日志格式和颜色渲染 --> + <!-- 彩色日志依赖的渲染类 --> + <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> + <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> + <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> + <!-- 彩色日志格式 --> + <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> + + <!--1. 输出到控制台--> + <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> + <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>debug</level> + </filter> + <encoder> + <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> + <!-- 设置字符集 --> + <charset>UTF-8</charset> + </encoder> + </appender> + + <!--2. 输出到文档--> + <!-- 2.1 level为 DEBUG 日志,时间滚动输出 --> + <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/debug.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> <!-- 设置字符集 --> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- 日志归档 --> + <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档只记录debug级别的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>debug</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 2.2 level为 INFO 日志,时间滚动输出 --> + <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/info.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- 每天日志归档路径以及格式 --> + <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档只记录info级别的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>info</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 2.3 level为 WARN 日志,时间滚动输出 --> + <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/warn.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> <!-- 此处设置字符集 --> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档只记录warn级别的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>warn</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 2.4 level为 ERROR 日志,时间滚动输出 --> + <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/error.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> <!-- 此处设置字符集 --> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档只记录ERROR级别的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>ERROR</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 2.5 所有 除了DEBUG级别的其它高于DEBUG的 日志,记录到一个文件 --> + <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <!-- 正在记录的日志文档的路径及文档名 --> + <file>${log.path}/all.log</file> + <!--日志文档输出格式--> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + <charset>UTF-8</charset> <!-- 此处设置字符集 --> + </encoder> + <!-- 日志记录器的滚动策略,按日期,按大小记录 --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${log.path}/all-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>100MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <!--日志文档保留天数--> + <maxHistory>180</maxHistory> + </rollingPolicy> + <!-- 此日志文档记录除了DEBUG级别的其它高于DEBUG的 --> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>DEBUG</level> + <onMatch>DENY</onMatch> + <onMismatch>ACCEPT</onMismatch> + </filter> + </appender> + + <!-- + <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 + 以及指定<appender>。<logger>仅有一个name属性, + 一个可选的level和一个可选的addtivity属性。 + name:用来指定受此logger约束的某一个包或者具体的某一个类。 + level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, + 还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。 + 如果未设置此属性,那么当前logger将会继承上级的级别。 + addtivity:是否向上级logger传递打印信息。默认是true。 + <logger name="org.springframework.web" level="info"/> + <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> + --> + + <!-- + root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 + level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, + 不能设置为INHERITED或者同义词NULL。默认是DEBUG + 可以包含零个或多个元素,标识这个appender将会添加到这个logger。 + --> + + <!-- 4 最终的策略: + 基本策略(root级) + 根据profile在启动时, logger标签中定制化package日志级别(优先级高于上面的root级)--> + <springProfile name="dev"> <root level="info"> - <appender-ref ref="STDOUT"/> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="DEBUG_FILE" /> + <appender-ref ref="INFO_FILE" /> + <appender-ref ref="WARN_FILE" /> + <appender-ref ref="ERROR_FILE" /> + <appender-ref ref="ALL_FILE" /> </root> - - <logger name="com.stylefeng.guns" level="debug" additivity="false"> - <appender-ref ref="STDOUT"/> - </logger> - + <logger name="com.baomidou.mybatisplus" level="info"/> + <logger name="com.stylefeng.guns.modular.system.dao" level="info"/> + <logger name="business-log" level="warn"/> + </springProfile> + + <springProfile name="fat"> + <root level="info"> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="DEBUG_FILE" /> + <appender-ref ref="INFO_FILE" /> + <appender-ref ref="WARN_FILE" /> + <appender-ref ref="ERROR_FILE" /> + <appender-ref ref="ALL_FILE" /> + </root> + <logger name="com.baomidou.mybatisplus" level="info"/> + <logger name="com.stylefeng.guns.modular.system.dao" level="info"/> + <logger name="business-log" level="warn"/> + </springProfile> + + <springProfile name="produce"> + <root level="info"> + <!-- 生产环境最好不配置console写文件 --> + <appender-ref ref="DEBUG_FILE" /> + <appender-ref ref="INFO_FILE" /> + <appender-ref ref="WARN_FILE" /> + <appender-ref ref="ERROR_FILE" /> + <appender-ref ref="ALL_FILE" /> + </root> + <logger name="com.baomidou.mybatisplus" level="info"/> + <logger name="com.stylefeng.guns.modular.system.dao" level="info"/> + <logger name="business-log" level="warn"/> </springProfile> - <!-- ****************************************************************************************** --> - <!-- ********************** 放到服务器上不管在什么环境都只在文件记录日志 **************************** --> - <!-- ****************************************************************************************** --> - <springProfile name="!local"> - - <!-- 日志记录器,日期滚动记录 --> - <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> - <!-- 正在记录的日志文件的路径及文件名 --> - <file>${gunsLogPath}/log_error.log</file> - <!-- 日志记录器的滚动策略,按日期,按大小记录 --> - <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> - <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 - 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> - <fileNamePattern>${gunsLogPath}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> - <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, - 命名日志文件,例如log-error-2013-12-21.0.log --> - <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> - <maxFileSize>2MB</maxFileSize> - </timeBasedFileNamingAndTriggeringPolicy> - </rollingPolicy> - <!-- 追加方式记录日志 --> - <append>true</append> - <!-- 日志文件的格式 --> - <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> - <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> - <charset>utf-8</charset> - </encoder> - <!-- 此日志文件只记录error级别的 --> - <filter class="ch.qos.logback.classic.filter.LevelFilter"> - <level>error</level> - <onMatch>ACCEPT</onMatch> - <onMismatch>DENY</onMismatch> - </filter> - </appender> - - <!-- 日志记录器,日期滚动记录 --> - <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender"> - <!-- 正在记录的日志文件的路径及文件名 --> - <file>${gunsLogPath}/log_total.log</file> - <!-- 日志记录器的滚动策略,按日期,按大小记录 --> - <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> - <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 - 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> - <fileNamePattern>${gunsLogPath}/total/log-total-%d{yyyy-MM-dd}.%i.log</fileNamePattern> - <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, - 命名日志文件,例如log-error-2013-12-21.0.log --> - <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> - <maxFileSize>2MB</maxFileSize> - </timeBasedFileNamingAndTriggeringPolicy> - </rollingPolicy> - <!-- 追加方式记录日志 --> - <append>true</append> - <!-- 日志文件的格式 --> - <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> - <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> - <charset>utf-8</charset> - </encoder> - </appender> - - <root level="info"> - <appender-ref ref="FILE_ERROR"/> - <appender-ref ref="FILE_ALL"/> - </root> - - </springProfile> - -</configuration> - - +</configuration> \ No newline at end of file diff --git a/UserZYTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java b/UserZYTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java new file mode 100644 index 0000000..2bf3187 --- /dev/null +++ b/UserZYTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java @@ -0,0 +1,37 @@ +//package com.stylefeng.guns; +// +//import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; +//import com.stylefeng.guns.modular.system.util.PayMoneyUtil; +//import com.stylefeng.guns.modular.system.util.ResultUtil; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.junit4.SpringRunner; +// +//import java.util.Map; +// +///** +// * @author zhibing.pu +// * @Date 2024/9/24 9:24 +// */ +//@RunWith(SpringRunner.class) +//@SpringBootTest +//public class GunsApplicationTest { +// +// @Autowired +// private PayMoneyUtil payMoneyUtil; +// +// @Autowired +// private IOrderPrivateCarService orderPrivateCarService; +// +// +// @Test +// public void test(){ +// try { +// orderPrivateCarService.payPrivateCarOrder(1, 37630, null, 1); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } +// } +//} diff --git a/UserZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java b/UserZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java index 17ffd3a..8c81e34 100644 --- a/UserZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java +++ b/UserZYTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java @@ -20,11 +20,11 @@ private String driverClassName = "com.mysql.cj.jdbc.Driver"; - private Integer initialSize = 2; + private Integer initialSize = 100; - private Integer minIdle = 1; + private Integer minIdle = 100; - private Integer maxActive = 20; + private Integer maxActive = 1000; private Integer maxWait = 60000; diff --git a/UserZYTravel/guns-core/src/main/resources/default-config.properties b/UserZYTravel/guns-core/src/main/resources/default-config.properties index 8d458f7..3166d4a 100644 --- a/UserZYTravel/guns-core/src/main/resources/default-config.properties +++ b/UserZYTravel/guns-core/src/main/resources/default-config.properties @@ -22,7 +22,7 @@ # \u5F00\u542F\u7684\u8BDD\uFF0C\u5EF6\u65F6\u52A0\u8F7D\u4E00\u4E2A\u5C5E\u6027\u65F6\u4F1A\u52A0\u8F7D\u8BE5\u5BF9\u8C61\u5168\u90E8\u5C5E\u6027\uFF0C\u5426\u5219\u6309\u9700\u52A0\u8F7D\u5C5E\u6027 mybatis-plus.configuration.multipleResultSetsEnabled=true # \u6253\u5370sql\u8BED\u53E5,\u8C03\u8BD5\u7528 -mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ########################## beetl\u9ED8\u8BA4\u914D\u7F6E ########################### -- Gitblit v1.7.1