电子围栏

This commit is contained in:
majian314
2025-10-14 11:59:12 +08:00
parent e18b00ad89
commit 8d94b3c30b
9 changed files with 145 additions and 80 deletions

View File

@ -83,6 +83,8 @@ public class ZcElectronicFenceController extends BaseController
{
ZcRentCarRule zcRentCarRule = new ZcRentCarRule();
zcRentCarRule.setStatus("0");
// 查询未绑定电子围栏套餐
zcRentCarRule.setExtend1("0");
List<ZcRentCarRule> rentCarRuleList = zcRentCarRuleService.selectZcRentCarRuleList(zcRentCarRule);
mmap.put("rentCarRuleList", rentCarRuleList);
return prefix + "/add";

View File

@ -74,7 +74,7 @@ public class ZcRentCarRule extends BaseEntity
/** 删除标志0代表存在 2代表删除 */
private String delFlag;
/** 扩展字段1 */
/** 绑定电子围栏 */
private String extend1;
/** 扩展字段2 */
@ -96,7 +96,10 @@ public class ZcRentCarRule extends BaseEntity
private boolean flag = false;
@Transient
private String operatingCompanyName;
@Transient
private String queryFenceRule;
public void setId(Long id)
{
this.id = id;
@ -304,6 +307,14 @@ public class ZcRentCarRule extends BaseEntity
this.flag = flag;
}
public String getQueryFenceRule() {
return queryFenceRule;
}
public void setQueryFenceRule(String queryFenceRule) {
this.queryFenceRule = queryFenceRule;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@ -2,6 +2,7 @@ package com.ruoyi.operation.mapper;
import java.util.List;
import com.ruoyi.operation.domain.ZcRentCarRule;
import org.apache.ibatis.annotations.Param;
/**
* 租车计费规则Mapper接口
@ -59,4 +60,17 @@ public interface ZcRentCarRuleMapper
* @return 结果
*/
public int deleteZcRentCarRuleByIds(String[] ids);
/**
* 根据套餐ids绑定电子围栏
* @param ids
* @return
*/
public int updateZcRentCarRuleBindFence(@Param("ids") List<Long> ids, @Param("fenceId") Long fenceId);
/**
* 根据电子围栏id 取消与套餐绑定
* @param fenceId
* @return
*/
public int updateZcRentCarRuleUnbindFence(@Param("fenceId") Long fenceId);
}

View File

@ -51,6 +51,19 @@ public interface IZcRentCarRuleService
*/
public int updateZcRentCarRule(List<Long> carModelIds, ZcRentCarRule zcRentCarRule);
/**
* 根据套餐ids绑定电子围栏
* @param rentCarRuleIds
* @return
*/
public int updateZcRentCarRuleBindFence(List<Long> rentCarRuleIds,Long fenceId);
/**
* 根据电子围栏id 取消与套餐绑定
* @param fenceId
* @return
*/
public int updateZcRentCarRuleUnbindFence(Long fenceId);
/**
* 批量删除租车计费规则
*

View File

@ -5,6 +5,7 @@ import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.operation.domain.ZcCarModelPackage;
import com.ruoyi.operation.mapper.ZcElectronicFenceRuleMapper;
import com.ruoyi.operation.service.IZcRentCarRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@ -29,6 +30,8 @@ public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
private ZcElectronicFenceMapper zcElectronicFenceMapper;
@Autowired
private ZcElectronicFenceRuleMapper zcElectronicFenceRuleMapper;
@Autowired
private IZcRentCarRuleService zcRentCarRuleService;
/**
* 查询电子围栏
*
@ -77,8 +80,9 @@ public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
}
if (!zcElectronicFenceRuleList.isEmpty()) {
zcElectronicFenceRuleMapper.batchInsert(zcElectronicFenceRuleList);
}
zcRentCarRuleService.updateZcRentCarRuleBindFence(zcElectronicFence.getRentCarRuleIds(),zcElectronicFence.getId());
}
return rows;
}
@ -94,7 +98,8 @@ public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
{
zcElectronicFence.setUpdateTime(DateUtils.getNowDate());
zcElectronicFenceMapper.deleteZcElectronicFenceRuleByElectronicFenceId(zcElectronicFence.getId());
zcRentCarRuleService.updateZcRentCarRuleUnbindFence(zcElectronicFence.getId());
// 保存关联表 ZcRentCarRuleBattery 数据
List<ZcElectronicFenceRule> zcElectronicFenceRuleList = new ArrayList<>();
for (Long rentCarRuleId : zcElectronicFence.getRentCarRuleIds()) {
@ -106,6 +111,7 @@ public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
}
if (!zcElectronicFenceRuleList.isEmpty()) {
zcElectronicFenceRuleMapper.batchInsert(zcElectronicFenceRuleList);
zcRentCarRuleService.updateZcRentCarRuleBindFence(zcElectronicFence.getRentCarRuleIds(), zcElectronicFence.getId());
}
return zcElectronicFenceMapper.updateZcElectronicFence(zcElectronicFence);

View File

@ -92,6 +92,9 @@ public class ZcRentCarRuleServiceImpl implements IZcRentCarRuleService
{
ZcRentCarRule zcRentCarRule = new ZcRentCarRule();
zcRentCarRule.setStatus("0");
// 查询未绑定电子围栏套餐 和 当前绑定的套餐
zcRentCarRule.setQueryFenceRule("0");
zcRentCarRule.setExtend1(fenceId.toString());
List<ZcRentCarRule> rentCarRuleList = zcRentCarRuleMapper.selectZcRentCarRuleList(zcRentCarRule);
ZcElectronicFenceRule fenceRule = new ZcElectronicFenceRule();
fenceRule.setElectronicFenceId(fenceId);
@ -153,6 +156,16 @@ public class ZcRentCarRuleServiceImpl implements IZcRentCarRuleService
return flag;
}
@Override
public int updateZcRentCarRuleBindFence(List<Long> rentCarRuleIds,Long fenceId) {
return zcRentCarRuleMapper.updateZcRentCarRuleBindFence(rentCarRuleIds,fenceId);
}
@Override
public int updateZcRentCarRuleUnbindFence(Long fenceId) {
return zcRentCarRuleMapper.updateZcRentCarRuleUnbindFence(fenceId);
}
/**
* 批量删除租车计费规则
*

View File

@ -57,6 +57,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="operatingCompanyId != null and operatingCompanyId != ''"> and a.operating_company_id = #{operatingCompanyId}</if>
<if test="status != null and status != ''"> and a.status = #{status}</if>
<if test="isDefault != null and isDefault != ''"> and a.is_default = #{isDefault}</if>
<if test="extend1 != null and extend1 != '' and queryFenceRule == null"> and a.extend1 = #{extend1}</if>
<if test="queryFenceRule != null and queryFenceRule != '' and queryFenceRule == 0 ">
and (a.extend1 = '0' OR a.extend1 = #{extend1})
</if>
</where>
order by a.update_time desc
</select>
@ -158,6 +162,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim>
where id = #{id}
</update>
<update id="updateZcRentCarRuleBindFence">
update zc_rent_car_rule set extend1 = #{fenceId} where id in
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</update>
<update id="updateZcRentCarRuleUnbindFence">
update zc_rent_car_rule set extend1 = '0' where extend1 = #{fenceId}
</update>
<delete id="deleteZcRentCarRuleById" parameterType="Long">
delete from zc_rent_car_rule where id = #{id}

View File

@ -100,6 +100,7 @@
</div>
<p>提示:<br/>
绘制:鼠标左键点击及移动即可绘制图形<br/>
撤销:鼠标右键点击撤销<br/>
结束绘制:鼠标左键双击即可结束绘制折线、多边形会自动闭合;<br/>
</p>
</div>
@ -350,4 +351,4 @@
window.onload = initMap;
</script>
</body>
</html>
</html>

View File

@ -22,7 +22,7 @@
left: 0px;
right: 0px;
margin: auto;
width: 40px;
width: 90px;
z-index: 1001;
}
@ -50,28 +50,12 @@
background-color: #d5dff2;
}
#marker {
background-image: url('https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/marker_editor.png');
}
#polyline {
background-image: url('https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/polyline.png');
}
#polygon {
background-image: url('https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/polygon.png');
}
#circle {
background-image: url('https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/circle.png');
}
#rectangle {
background-image: url('https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/rectangle.png');
}
#ellipse {
background-image: url('https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/ellipse.png');
#delete {
background-image: url('https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/delete.png');
}
</style>
</head>
@ -93,13 +77,15 @@
<div class="col-sm-8">
<div id="container" class="map-container"></div>
<div id="toolControl">
<div class="toolItem active" id="polygon" title="多边形"></div>
<!-- <div class="toolItem active" id="polygon" title="多边形"></div> -->
<!-- <div class="toolItem" id="delete" onclick="editor.delete();" title="删除"></div> -->
<!-- <div class="toolItem" id="circle" title="圆形"></div>-->
<!-- <div class="toolItem" id="rectangle" title="矩形"></div>-->
<!-- <div class="toolItem" id="ellipse" title="椭圆"></div>-->
</div>
<p>提示:<br/>
绘制:鼠标左键点击及移动即可绘制图形<br/>
撤销:鼠标右键点击撤销<br/>
结束绘制:鼠标左键双击即可结束绘制折线、多边形会自动闭合;<br/>
</p>
@ -108,7 +94,7 @@
<div class="form-group">
<label class="col-sm-2 control-label">围栏坐标地址:</label>
<div class="col-sm-8">
<textarea name="address" class="form-control">[[*{address}]]</textarea>
<textarea id="address" name="address" class="form-control">[[*{address}]]</textarea>
</div>
</div>
<h4 class="form-header h4">关联套餐</h4>
@ -268,83 +254,89 @@
}
});
// 转换函数
function convertCoordinates(coordinates) {
return coordinates.map(coord =>
`new TMap.LatLng(${coord.lat},${coord.lng})`
).join(',\n');
}
function initMap() {
var center = new TMap.LatLng(28.228302, 112.938901);
// 回显已存在的围栏数据
var address = [[${zcElectronicFence.address}]];
address = JSON.parse(address);
const simplePath = address.map(coord => new TMap.LatLng(coord.lat, coord.lng));
// 取第一个经纬度用于初始化地图中心位置
var center;
if (simplePath.length > 0) {
center = simplePath[0];
console.log('使用围栏第一个点作为中心:', center.lat, center.lng);
} else {
center = new TMap.LatLng(28.228302, 112.938901);
console.log('使用默认中心点:', center.lat, center.lng);
}
map = new TMap.Map('container', {
zoom: 12,
center: center,
});
// 初始化几何图形及编辑器
var marker = new TMap.MultiMarker({ map: map });
var polyline = new TMap.MultiPolyline({ map: map });
var polygon = new TMap.MultiPolygon({ map: map });
var circle = new TMap.MultiCircle({ map: map });
var rectangle = new TMap.MultiRectangle({ map: map });
var ellipse = new TMap.MultiEllipse({ map: map });
editor = new TMap.tools.GeometryEditor({
map: map,
overlayList: [
{ overlay: marker, id: 'marker' },
{ overlay: polyline, id: 'polyline' },
{ overlay: polygon, id: 'polygon' },
{ overlay: circle, id: 'circle' },
{ overlay: rectangle, id: 'rectangle' },
{ overlay: ellipse, id: 'ellipse' },
],
actionMode: TMap.tools.constants.EDITOR_ACTION.DRAW,
activeOverlayId: 'polygon',
snappable: true,
});
// 等待编辑器初始化完成后再回显数据
setTimeout(function() {
echoExistingFence(polygon);
}, 500);
// 监听绘制结束事件
editor.on('draw_complete', (geometry) => {
var id = geometry.id;
if (editor.getActiveOverlay().id === 'polygon') {
var geo = polygon.geometries.filter(function (item) {
return item.id === id;
});
console.log('绘制的多边形坐标:', geo[0].paths);
$("#address").val(JSON.stringify(geo[0].paths));
}
// 初始化几何图形及编辑器
editor = new TMap.tools.GeometryEditor({
map, // 编辑器绑定的地图对象
overlayList: [ // 可编辑图层
{
overlay: new TMap.MultiPolygon({
map,
styles: {
highlight: new TMap.PolygonStyle({
color: 'rgba(255, 255, 0, 0.6)'
})
},
geometries: [
{
paths: simplePath
}
]
}),
id: 'polygon',
selectedStyleId: 'highlight'
}
],
actionMode: TMap.tools.constants.EDITOR_ACTION.INTERACT, // 编辑器的工作模式
activeOverlayId: 'polygon', // 激活图层
selectable: true, // 开启点选功能
snappable: true // 开启吸附
});
// 监听删除、修改完成事件
let evtList = ['delete', 'adjust'];
evtList.forEach(evtName => {
editor.on(evtName + '_complete', evtResult => {
console.log(evtName, JSON.stringify(evtResult.paths));
$("#address").val(JSON.stringify(evtResult.paths));
});
});
}
function echoExistingFence(polygon) {
// 回显已存在的围栏数据
var existingAddress = $("#address").val();
console.log("existing address:", existingAddress);
if (existingAddress && existingAddress.trim() !== "") {
try {
var paths = JSON.parse(existingAddress);
console.log("parsed paths:", paths);
// 清除可能已存在的几何图形
polygon.clear();
// 添加几何图形
polygon.addGeometry({
id: "existingPolygon",
styleId: "default",
paths: paths
});
console.log("围栏回显完成");
} catch (e) {
console.error("解析围栏坐标数据失败:", e);
}
}
}
// 初始化地图
window.onload = initMap;
</script>
</body>
</html>
</html>