package com.xiaopeng.map.controller; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xiaopeng.api.dto.operation.ElectronicFenceAddDto; import com.xiaopeng.api.dto.operation.ElectronicFenceAreaUpdateStatusDto; import com.xiaopeng.api.dto.operation.ElectronicFenceUpdateDto; import com.xiaopeng.api.feignClient.operation.XpElectronicClient; import com.xiaopeng.api.model.operation.XpElectronicFence; import com.xiaopeng.api.model.operation.XpElectronicFenceArea; import com.xiaopeng.api.model.operation.XpPoint; import com.xiaopeng.api.model.operation.XpRegion; import com.xiaopeng.api.query.operation.ElectronicPageListQuery; import com.xiaopeng.api.vo.operation.ElectronicFenceDetailVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.common.core.utils.bean.BeanUtils; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.common.security.service.TokenService; import com.xiaopeng.map.constant.I18nKeyConstant; import com.xiaopeng.map.service.XpElectronicFenceAreaService; import com.xiaopeng.map.service.XpElectronicFenceService; import com.xiaopeng.map.service.XpRegionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType; import org.apache.shardingsphere.transaction.core.TransactionType; import org.locationtech.jts.geom.Coordinate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import static com.xiaopeng.map.service.serviceimpl.XpElectronicFenceServiceImpl.getPinyinInitials; /** *

* 电子围栏 前端控制器 *

* * @author mitao * @since 2026-02-03 */ @RestController @Slf4j @Api(tags = "电子围栏管理") @RequestMapping("/api/v1/electronicFence") public class XpElectronicFenceManagementController { @Resource private XpElectronicFenceService xpElectronicFenceService; @Resource private XpElectronicFenceAreaService xpElectronicFenceAreaService; @Resource private XpRegionService regionService; @Autowired private XpRegionService xpRegionService; /** * 查询省市管理 */ @ApiOperation(value = "查询省市区",response = XpRegion.class) @GetMapping(value = "/getRegion") public R>> geXpRegion() { return R.ok(regionService.getXpRegion()); } @ApiOperation(value = "电子围栏管理列表", response = XpElectronicFence.class) @PostMapping("/pageList") public R> pageList(@RequestBody ElectronicPageListQuery query) { PageInfo pageList = xpElectronicFenceService.pageList(query); return R.ok(pageList); } /** * 电子围栏列表接口 * * @return 电子围栏列表 */ @ApiOperation(value = "电子围栏列表接口", tags = {"运维APP-车辆管理"}) @GetMapping("/api/v1/electronicFence/list") public R> vehicleMap() { List list = xpElectronicFenceService.list(); return R.ok(list); } /** * 新增电子围栏 */ @PostMapping("/add") @ApiOperation(value = "新增电子围栏") public R add(@Validated @RequestBody ElectronicFenceAddDto dto) { return xpElectronicFenceService.addElectronic(dto); } /** * 修改状态 */ @PostMapping("/updateStatus") @ResponseBody @ApiOperation(value = "修改状态") public R updateStatus(@RequestBody ElectronicFenceAreaUpdateStatusDto dto) { XpElectronicFenceArea electronicFenceArea = xpElectronicFenceAreaService.getById(dto.getId()); if (electronicFenceArea == null) { throw new ServiceException( "围栏构成不存在,请刷新重试", I18nKeyConstant.FENCE_STRUCTURE_NOT_EXIST ); } xpElectronicFenceAreaService.updateById(electronicFenceArea); return R.ok(); } /** * 电子围栏详情 */ @PostMapping("/queryById") @ApiOperation(value = "电子围栏详情") public R queryById(@RequestParam("id")Long id) { ElectronicFenceDetailVo res = new ElectronicFenceDetailVo(); XpElectronicFence electronicFence = xpElectronicFenceService.getById(id); if (electronicFence == null) { throw new ServiceException( "电子围栏不存在,请刷新重试", I18nKeyConstant.FENCE_NOT_EXIST ); } BeanUtils.copyProperties(electronicFence, res); List electronicFenceAreaList = xpElectronicFenceAreaService.lambdaQuery().eq(XpElectronicFenceArea::getElectronicId, id) .list(); res.setElectronicFenceAreas(electronicFenceAreaList); return R.ok(res); } /** * 编辑电子围栏 */ @PostMapping("/edit") @ApiOperation(value = "编辑电子围栏") public R edit(@Validated @RequestBody ElectronicFenceUpdateDto dto) { return xpElectronicFenceService.editElectronic(dto); } /** * 复制电子围栏 */ @PostMapping("/copy") @ApiOperation(value = "复制电子围栏") @Transactional @ShardingSphereTransactionType(TransactionType.BASE) public R copy(@RequestParam("id") Integer id) { XpElectronicFence electronicFence = xpElectronicFenceService.getById(id); if (electronicFence.getStatus()==2){ throw new ServiceException( "当前电子围栏状态为启用中,不可复制", I18nKeyConstant.FENCE_STATUS_CANNOT_COPIED ); } electronicFence.setElectronicName("副本_"+electronicFence.getElectronicName()); electronicFence.setId(null); electronicFence.setStatus(0); List electronicFenceAreaList = xpElectronicFenceAreaService.lambdaQuery().eq(XpElectronicFenceArea::getElectronicId, id) .list(); //根据经纬度获取当前城市code // 生成围栏id 规则:城市首字母-类型简写-4位自增流水号(如 SZ-OP-001),支持复制;数据停用或删除后,流水号不回收 XpRegion xpRegion = xpRegionService.getOne(new LambdaQueryWrapper() .eq(XpRegion::getCode, electronicFence.getCityCode())); String name = xpRegion.getName(); // 根据城市中文名,截取前两位的首字母并且大写 // 截取前两个字符 String prefix = name.substring(0, 2); // 获取拼音首字母并大写 String result = getPinyinInitials(prefix).toUpperCase(); xpElectronicFenceService.save(electronicFence); electronicFence.setElectronicNumber(result + "-OP-" + String.format("%04d", electronicFence.getId())); xpElectronicFenceService.updateById(electronicFence); for (XpElectronicFenceArea area : electronicFenceAreaList) { area.setId(null); area.setElectronicId(electronicFence.getId()); area.setAreaStatus(2); area.setAreaName("副本_"+area.getAreaName()); } xpElectronicFenceAreaService.saveBatch(electronicFenceAreaList); return R.ok(electronicFence.getId()); } /** * 根据ID列表批量查询电子围栏 * * @param electronicIdSet * @return */ @PostMapping("/listByIds") R> listByIds(@RequestBody Collection electronicIdSet) { if (CollUtil.isEmpty(electronicIdSet)) { return R.ok(Collections.emptyList()); } return R.ok(xpElectronicFenceService.listByIds(electronicIdSet)); } @ApiOperation(value = "获取已启用的电子围栏列表",tags = {"管理后台-在库车辆管理"}) @GetMapping("/available/list") R> getAvailableList(){ return R.ok(xpElectronicFenceService.getAvailableList()); } @ApiOperation(value = "获取不分页的电子围栏列表",tags = {"管理后台-在库车辆管理"}) @GetMapping("/list") R> getList(){ return R.ok(xpElectronicFenceService.getList()); } /** * 批量查询电子围栏 * @param fenceIds * @return */ @PostMapping("/inner/xpElectronicFence/selectBatchIds") public R> selectBatchIds(@RequestBody List fenceIds){ List xpElectronicFences = xpElectronicFenceService.listByIds(fenceIds); return R.ok(xpElectronicFences); } /** * 根据ID查询电子围栏 * @param fenceId * @return */ @GetMapping("/inner/xpElectronicFence/selectById") public R selectById(@RequestParam String fenceId){ XpElectronicFence xpElectronicFence = xpElectronicFenceService.getById(fenceId); return R.ok(xpElectronicFence); } }