昨天 | Pu Zhibing | ![]() |
昨天 | Pu Zhibing | ![]() |
昨天 | Pu Zhibing | ![]() |
DriverOKTravel/guns-admin/pom.xml
@@ -226,6 +226,14 @@ <artifactId>commons-codec</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build> DriverOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineSiteServiceImpl.java
@@ -16,14 +16,20 @@ import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil; import com.stylefeng.guns.modular.system.util.RedisUtil; import com.stylefeng.guns.modular.system.util.SystemException; import com.stylefeng.guns.modular.system.util.model.GeoFencingPolygon; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.geo.GeoJsonPoint; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @Service @@ -46,9 +52,9 @@ @Autowired private DateUtil dateUtil; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; private MongoTemplate mongoTemplate; @Autowired private RedisUtil redisUtil; @@ -306,12 +312,14 @@ } } if(Integer.valueOf(map.get("type").toString()) == 2){//电子围栏 String gid = map.get("gid").toString(); List<String> list1 = gdMapElectricFenceUtil.monitorElectricFenc("", lonLat); if(list1.contains(gid)){ String[] split = lonLat.split(","); GeoJsonPoint point = new GeoJsonPoint(Double.valueOf(split[0]), Double.valueOf(split[1])); Query query = Query.query(Criteria.where("geoJsonPolygon").intersects(point)); List<GeoFencingPolygon> geoFencingPolygons = mongoTemplate.find(query, GeoFencingPolygon.class); List<Integer> s_sites = geoFencingPolygons.stream().map(GeoFencingPolygon::getSiteId).collect(Collectors.toList()); if(s_sites.contains(siteId)){ return true; } continue; } } return false; DriverOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/model/GeoFencingPolygon.java
New file @@ -0,0 +1,35 @@ package com.stylefeng.guns.modular.system.util.model; import lombok.Data; import org.springframework.data.mongodb.core.geo.GeoJsonPolygon; import org.springframework.data.mongodb.core.index.GeoSpatialIndexType; import org.springframework.data.mongodb.core.index.GeoSpatialIndexed; import org.springframework.data.mongodb.core.mapping.Document; import java.io.Serializable; /** * 地理围栏-多边形 * @author zhibing.pu * @date 2023/4/29 23:53 */ @Data @Document(collection = "geo_fencing") public class GeoFencingPolygon implements Serializable { private static final long serialVersionUID = 4508868382007529971L; private String id; /** * 站点id */ private Integer siteId; /** * 站点名称 */ private String name; /** * 多边形经纬度 */ @GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE) private GeoJsonPolygon geoJsonPolygon; } DriverOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/model/GeoJson.java
New file @@ -0,0 +1,9 @@ package com.stylefeng.guns.modular.system.util.model; import lombok.Data; @Data public class GeoJson { private String type; private Double[] coordinates; } DriverOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/model/LocationQuery.java
New file @@ -0,0 +1,23 @@ package com.stylefeng.guns.modular.system.util.model; import lombok.Data; @Data public class LocationQuery { /** * 当前经纬度[xxx,xxx] **/ private Double[] coordinates; /** * 距离,如:200,500,1,3,5,10,20 **/ private Double distance; /** * 距离单位,如:m,km **/ private String unit; /** * 位置类型:1-景点,2-加油站,3-酒店 **/ private Integer type; } DriverOKTravel/guns-admin/src/main/resources/application.yml
@@ -102,7 +102,12 @@ juhe: #聚合数据 appKey: c4b903ff5624f661d0af962ef8b3f424 # --- spring: data: mongodb: uri: mongodb://127.0.0.1:27017/admin --- jiguang: ManagementOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java
@@ -434,9 +434,23 @@ @ResponseBody @PostMapping("/getAllOrder") public Object getAllOrder(){ List<TOrderTaxi> tOrderTaxis = tOrderTaxiService.selectList(new EntityWrapper<TOrderTaxi>().eq("isDelete", 1)); List<TOrderPrivateCar> tOrderTaxis = itOrderPrivateCarService.selectList(new EntityWrapper<TOrderPrivateCar>().eq("isDelete", 1).in("state", Arrays.asList(6, 7, 8, 9))); List<TOrderCrossCity> tOrderTaxis1 = itOrderCrossCityService.selectList(new EntityWrapper<TOrderCrossCity>().eq("isDelete", 1).in("state", Arrays.asList(6, 7, 8, 9))); List<TOrderLogistics> tOrderTaxis2 = itOrderLogisticsService.selectList(new EntityWrapper<TOrderLogistics>().eq("isDelete", 1).in("state", Arrays.asList(6))); List list = new ArrayList<>(); for(TOrderTaxi t : tOrderTaxis){ for(TOrderPrivateCar t : tOrderTaxis){ Map<String, Object> map = new HashMap<>(); map.put("lon", t.getStartLon()); map.put("lat", t.getStartLat()); list.add(map); } for(TOrderCrossCity t : tOrderTaxis1){ Map<String, Object> map = new HashMap<>(); map.put("lon", t.getStartLon()); map.put("lat", t.getStartLat()); list.add(map); } for(TOrderLogistics t : tOrderTaxis2){ Map<String, Object> map = new HashMap<>(); map.put("lon", t.getStartLon()); map.put("lat", t.getStartLat()); ManagementOKTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_detail.html
@@ -23,7 +23,7 @@ <#label id="orderNum" name="订单编号" value="${item.orderNum}"/> <#label id="travelTimeStr" name="乘车时间" value="${item.travelTimeStr}"/> <#label id="userPhone" name="下单用户手机号" value="${item.userPhone}"/> <#label id="passengersPhone" name="收货人手机号" value="${item.passengersPhone}"/> <#label id="passengersPhone" name="收货人手机号" value="${item.recipientPhone}"/> <#label id="endAddress" name="终点" value="${item.endAddress}"/> <#label id="car" name="接单车辆" value="${item.car}"/> <#label id="cargoNumber" name="物品数量" value="${item.cargoNumber}"/> ManagementOKTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite_edit.html
@@ -3,6 +3,7 @@ <div class="ibox-content"> <div class="form-horizontal" id="siteInfoForm"> <input type="hidden" id="id" name="id" value="${item.id}"> <input type="hidden" id="locationList1" name="locationList1" value='${locationList1}'> <div class="row"> <div class="col-sm-12"> <div class=""> ManagementOKTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement_add.html
@@ -9,10 +9,10 @@ <div class="form-group"> <label class="col-sm-3 control-label">端口类型:</label> <div class="col-sm-9" style="display: flex;align-items: center;"> <div class="radio radio-info radio-inline"> <input type="radio" id="type1" value="1" name="type" checked="" > <label for="type1"> 用户端 </label> </div> <!-- <div class="radio radio-info radio-inline">--> <!-- <input type="radio" id="type1" value="1" name="type" checked="" >--> <!-- <label for="type1"> 用户端 </label>--> <!-- </div>--> <div class="radio radio-success radio-inline"> <input type="radio" id="type2" value="2" name="type" > <label for="type2"> 司机端 </label> ManagementOKTravel/guns-admin/src/main/webapp/static/modular/system/tSite/electricFence.js
@@ -1,15 +1,59 @@ var map = new AMap.Map('container',{ resizeEnable: true, zoom:10 zoom:15 }); setCenterCoordinate(); function setCenterCoordinate() { var locationsStr = $("#locationList1").val(); if ("" != locationsStr && null != locationsStr) { var locations = JSON.parse(locationsStr); var gid = locations[0].coordinate; var path = convertData(gid); var center = path[0]; map.setCenter(center) } } function setElectricFence() { var locationsStr = $("#locationList1").val(); if ("" != locationsStr && null != locationsStr) { var locations = JSON.parse(locationsStr); for (let i = 0; i < locations.length; i++) { console.log(locations[i]) var gid = locations[i].coordinate if (gid == null || gid == "") { continue; } var path = convertData(gid) var polygon = new AMap.Polygon({ path: path, strokeWeight: 1, fillOpacity: 0.4, fillColor: '#00b0ff', strokeColor: '#80d8ff' }); map.add(polygon); } } } function convertData(data) { var coordinates = data.split(';'); var path = []; for (var i = 0; i < coordinates.length; i++) { var coordinate = coordinates[i].split(','); var lng = parseFloat(coordinate[0]); var lat = parseFloat(coordinate[1]); path.push([lng, lat]); } return path; } var value = ""; map.getCity( callback=function (result) { value = result.city; drawBounds(); } callback=function (result) { value = result.city; drawBounds(); } ); @@ -28,7 +72,7 @@ mouseTool.on('draw',function(e){ overlays.push(e.obj); console.log(e.obj.getPath()); switch (name) { case 'polyline':{//折线图 var polyline = e.obj.getPath(); @@ -51,6 +95,10 @@ case 'circle':{//圆形 var center = e.obj.getCenter(); var radius = e.obj.getRadius(); if(radius > 5000){ Feng.error("创建电子围栏失败,圆半径不能大于5000米"); return; } coordinate += center.lng + ',' + center.lat + ';' + radius + "_"; objs.circle.push(e.obj); break; @@ -66,7 +114,7 @@ if(value == ''){ value = '北京市'; } //加载行政区划插件 if(!district){ //实例化DistrictSearch @@ -216,7 +264,7 @@ return; } coordinate = coordinate.substring(0, coordinate.length - 1); } function editAll() { @@ -229,15 +277,15 @@ polyEditor.on('addnode', function(event) { // log.info('触发事件:addnode') }) polyEditor.on('adjust', function(event) { // log.info('触发事件:adjust') }) polyEditor.on('removenode', function(event) { // log.info('触发事件:removenode') }) polyEditor.on('end', function(e) { var polyline = e.target.getPath(); getCoordinate(polyline); @@ -245,24 +293,24 @@ editors.push(polyEditor); polyEditor.open(); } //多边形 for(var i in objs.polygon){ var polygon = objs.polygon[i]; var polyEditor = new AMap.PolyEditor(map, polygon) polyEditor.on('addnode', function(event) { // log.info('触发事件:addnode') }) polyEditor.on('adjust', function(event) { // log.info('触发事件:adjust') }) polyEditor.on('removenode', function(event) { // log.info('触发事件:removenode') }) polyEditor.on('end', function(e) { var polygon = e.target.getPath(); getCoordinate(polygon); @@ -270,17 +318,17 @@ editors.push(polyEditor); polyEditor.open(); } //矩形 for(var i in objs.rectangle){ var rectangle = objs.rectangle[i]; var rectangleEditor = new AMap.RectangleEditor(map, rectangle) rectangleEditor.on('adjust', function(event) { // log.info('触发事件:adjust') }) rectangleEditor.on('end', function(e) { var polygon = e.target.getPath(); getCoordinate(polygon); @@ -288,20 +336,24 @@ editors.push(rectangleEditor); rectangleEditor.open(); } //圆形 for(var i in objs.circle){ var circle = objs.circle[i]; var circleEditor = new AMap.CircleEditor(map, circle) circleEditor.on('move', function(event) { // log.info('触发事件:move') }) circleEditor.on('adjust', function(e) { var radius = e.target.getRadius(); if(radius > 5000){ Feng.error("创建电子围栏失败,圆半径不能大于5000米"); return; } }) circleEditor.on('end', function(e) { var center = e.target.getCenter(); var radius = e.target.getRadius(); @@ -318,4 +370,7 @@ var editor = editors[i]; editor.close(); } } } $(function () { setElectricFence() }) UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -68,6 +68,9 @@ @Resource private UserActivityDiscount1Mapper userActivityDiscount1Mapper; @Resource private UserActivityDiscount2Mapper userActivityDiscount2Mapper; @Resource private SysIntegralMapper sysIntegralMapper; @@ -302,9 +305,9 @@ } //计算折扣 UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId()); UserActivityDiscount2 query2 = userActivityDiscount2Mapper.query(orderCrossCity.getLineId()); if(null != query2){ Double special = query2.getSpecial(); Double special = query2.getDiscount(); orderCrossCity.setDiscount(special); double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); if(orderMoney.compareTo(v) > 0){ UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount2Mapper.java
New file @@ -0,0 +1,16 @@ package com.stylefeng.guns.modular.system.dao; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.stylefeng.guns.modular.system.model.UserActivityDiscount2; import org.apache.ibatis.annotations.Param; /** * @author zhibing.pu * @Date 2025/5/21 10:31 */ public interface UserActivityDiscount2Mapper extends BaseMapper<UserActivityDiscount2>{ UserActivityDiscount2 query(@Param("lineId") Integer lineId); } UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount1Mapper.xml
@@ -27,6 +27,6 @@ a.`enable` as `enable` from t_user_activity_discount1 a left join t_user_activity b on (a.userActivityId = b.id) where now() between a.startTime and a.endTime and b.`status` = 3 and b.companyId = #{companyId} order by b.insertTime desc limit 0,1 where now() between a.startTime and a.endTime and a.enable = 2 and b.`status` = 3 and b.companyId = #{companyId} order by b.insertTime desc limit 0,1 </select> </mapper> UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount2Mapper.xml
New file @@ -0,0 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityDiscount2Mapper"> <select id="query" resultType="com.stylefeng.guns.modular.system.model.UserActivityDiscount2"> select a.* from t_user_activity_discount2 a left join t_user_activity b on (a.userActivityId = b.id) where a.lineId = #{lineId} and now() between a.startTime and a.endTime and a.enable = 2 and b.`status` = 3 order by b.insertTime desc limit 1 </select> </mapper> UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount2.java
New file @@ -0,0 +1,108 @@ package com.stylefeng.guns.modular.system.model; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import java.util.Date; /** * 用户折扣活动 */ @TableName("t_user_activity_discount2") public class UserActivityDiscount2 { /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) @TableField("id") private Integer id; /** * 活动id */ @TableField("userActivityId") private Integer userActivityId; /** * 跨城线路id */ @TableField("lineId") private Integer lineId; /** * 折扣(8.5) */ @TableField("discount") private Double discount; /** * 活动有效开始时间 */ @TableField("startTime") private Date startTime; /** * 活动有效结束时间 */ @TableField("endTime") private Date endTime; /** * 是否启用(1=不启用,2=启用) */ @TableField("enable") private Integer enable; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getUserActivityId() { return userActivityId; } public void setUserActivityId(Integer userActivityId) { this.userActivityId = userActivityId; } public Integer getLineId() { return lineId; } public void setLineId(Integer lineId) { this.lineId = lineId; } public Double getDiscount() { return discount; } public void setDiscount(Double discount) { this.discount = discount; } public Date getStartTime() { return startTime; } public void setStartTime(Date startTime) { this.startTime = startTime; } public Date getEndTime() { return endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } public Integer getEnable() { return enable; } public void setEnable(Integer enable) { this.enable = enable; } }