xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/ISysGroupService.java
@@ -74,6 +74,11 @@ */ void deleteById(Long id); /** * 获取手机号脱敏 * @param phoneNumber * @return */ String getPhoneDesensitization(String phoneNumber); boolean getPhoneDesensitization(); xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysGroupServiceImpl.java
@@ -321,7 +321,11 @@ removeById(id); } /** * 获取手机号脱敏 * @param phoneNumber * @return */ @Override public String getPhoneDesensitization(String phoneNumber){ boolean b = getPhoneDesensitization(); xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpShift.java
@@ -55,4 +55,19 @@ private String restEndTime; @ApiModelProperty(value = "上班最早打卡时间") private String maxStartTime; @ApiModelProperty(value = "上班最晚打卡时间") private String minStartTime; @ApiModelProperty(value = "下班最早结束时间") private String maxEndTime; @ApiModelProperty(value = "下班最晚结束时间") private String minEndTime; @ApiModelProperty(value = "是否跨天") private Boolean crossDay; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpPoint.java
@@ -131,4 +131,8 @@ @TableField("station_sort_no") private Integer stationSortNo; @ApiModelProperty(value = "点位上下车 1仅上车点/ 2 仅下车/ 3上下车均可") private Integer pointOnOff; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/PointListQuery.java
@@ -10,6 +10,10 @@ @Data @ApiModel(value = "点位管理列表查询query") public class PointListQuery extends BasePage { @ApiModelProperty(value = "电子围栏区域id") private List<Long> electronicAreaIds; @ApiModelProperty(value = "查询参数(名称、poi、唯一ID)") private String queryParams; @ApiModelProperty(value = "运营状态 1=待启用 2=启用中 3=已停用 4=已失效") xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpPointSituationReportQuery.java
@@ -34,19 +34,21 @@ /** * 上报运维id */ @TableField("operations_user_id") @ApiModelProperty("上报运维id") private Long operationsUserId; private List<Long> operationsUserIds; @ApiModelProperty("上报运维人名称") private String operationsUserName; /** * 现场情况上报时间 */ @TableField("reporting_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime reportingTimeStart; /** * 现场情况上报时间 */ @TableField("reporting_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime reportingTimeEnd; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpStationQuery.java
@@ -12,6 +12,9 @@ @ApiModelProperty(value = "ids") private List<Long> ids; @ApiModelProperty(value = "所属电子围栏id") private Long electronicId; @ApiModelProperty(value = "城市编码") private String cityCode; xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/ElectronicFenceDetailVo.java
@@ -14,4 +14,24 @@ @ApiModelProperty("电子围栏区域列表") private List<XpElectronicFenceArea> electronicFenceAreas; @ApiModelProperty("点位数量") private Numbers pointsNumbers; @ApiModelProperty("场站数量") private Numbers stationNumbers; @Data public static class Numbers { @ApiModelProperty("总数") public Integer totalNum =0; @ApiModelProperty("草稿") public Integer draft =0; @ApiModelProperty("启动中") public Integer startingUp =0; @ApiModelProperty("待启动") public Integer pendingLaunch =0; @ApiModelProperty("已停用") public Integer disabled =0; @ApiModelProperty("已失效") public Integer expired =0; } } xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -1,12 +1,10 @@ package com.xiaopeng.automaticPilot.controller; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO; import com.xiaopeng.api.dto.map.OrderRouteAndFareDto; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.dto.order.PopOrderDto; @@ -20,7 +18,6 @@ import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.model.order.XpOrder;import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.SystemEventType; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.api.vo.automaticPilot.protobuf.*; @@ -35,7 +32,6 @@ import com.xiaopeng.common.redis.service.RedisService; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.geo.GeoJsonPoint; @@ -46,7 +42,10 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.*; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -324,12 +323,15 @@ long sequence = snowflake.nextId(); MqttPublishDto mqttPublishDto = xpuUtil.cloudCreateOrder(taskListBuilder.build(), dto.getVin(),sequence); //先将车辆修改状态,防止在异步通知之前被其他订单选中 if(!dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.CRUISE_ORDER) && !dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.TEST_CRUISE_ORDER) && mqttPublishDto.getCode()== 200){ // 修改车子为接单状态 xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(dto.getVin(), 1)); // TODO[流量接入] 通过设置的URL发送订单和导航路线给运力 } if(null != mqttPublishDto && mqttPublishDto.getCode() == 200){ xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java
@@ -2,11 +2,7 @@ import com.xiaopeng.api.dto.map.RouteAndFareDto; import com.xiaopeng.api.dto.order.OrderChangeDto; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.operation.RouteAndFareVo; import com.xiaopeng.api.vo.operation.VehiclePositionVo; import com.xiaopeng.api.vo.vehicleConvoy.XpVehicleVO; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.itinerary.service.ActiveOrderService; import com.xiaopeng.itinerary.service.XpPricingService; @@ -14,22 +10,16 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** @@ -81,10 +71,5 @@ activeOrderService.orderChange(dto, uid); return R.ok(); } @Resource private MongoTemplate mongoTemplate; } xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
@@ -107,8 +107,6 @@ return R.ok(xpPricingService.getWaitTime(dto.getLongitude(), dto.getLatitude())); } /** * 播单 */ @@ -134,9 +132,6 @@ saveOrderVo.setOrderId(orderId); return R.ok(saveOrderVo); } /** xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
@@ -7,21 +7,17 @@ import com.xiaopeng.api.dto.operation.ElectronicFenceAreaUpdateStatusDto; import com.xiaopeng.api.dto.operation.ElectronicFenceOperationStrategyValidateDto; import com.xiaopeng.api.dto.operation.ElectronicFenceUpdateDto; 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.model.operation.*; import com.xiaopeng.api.query.operation.ElectronicPageListQuery; import com.xiaopeng.api.query.operation.PointListQuery; import com.xiaopeng.api.query.operation.XpStationQuery; 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.map.constant.I18nKeyConstant; import com.xiaopeng.map.service.XpElectronicFenceAreaService; import com.xiaopeng.map.service.XpElectronicFenceService; import com.xiaopeng.map.service.XpPointService; import com.xiaopeng.map.service.XpRegionService; import com.xiaopeng.map.service.*; import com.xiaopeng.map.utils.OperationStrategyIndex; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -75,6 +71,9 @@ @Autowired private XpPointService xpPointService; @Resource private XpStationService xpStationService; /** * 查询省市管理 */ @@ -157,6 +156,63 @@ List<XpElectronicFenceArea> electronicFenceAreaList = xpElectronicFenceAreaService.lambdaQuery().eq(XpElectronicFenceArea::getElectronicId, id) .list(); res.setElectronicFenceAreas(electronicFenceAreaList); //点位的总数 if(!electronicFenceAreaList.isEmpty()){ PointListQuery query1 = new PointListQuery(); query1.setElectronicAreaIds(electronicFenceAreaList.stream().map(XpElectronicFenceArea::getId).collect(Collectors.toList())); List<XpPoint> pointList = xpPointService.findList(query1); ElectronicFenceDetailVo.Numbers pointsNumbers = new ElectronicFenceDetailVo.Numbers(); if(CollUtil.isNotEmpty(pointList)){ for (XpPoint xpPoint : pointList) { if (xpPoint.getOperationStatus() == 1) { pointsNumbers.setPendingLaunch(pointsNumbers.getPendingLaunch() + 1); } else if (xpPoint.getOperationStatus() == 2) { pointsNumbers.setStartingUp(pointsNumbers.getStartingUp() + 1); } else if (xpPoint.getOperationStatus() == 3) { pointsNumbers.setExpired(pointsNumbers.getExpired() + 1); } else if (xpPoint.getOperationStatus() == 4) { pointsNumbers.setDisabled(pointsNumbers.getDisabled() + 1); } } pointsNumbers.setTotalNum(pointList.size()); } res.setPointsNumbers(pointsNumbers); } //场站总数 XpStationQuery query2 = new XpStationQuery(); query2.setElectronicId(id); List<XpStation> stationList = xpStationService.findList(query2); ElectronicFenceDetailVo.Numbers stationNumbers = new ElectronicFenceDetailVo.Numbers(); if(CollUtil.isNotEmpty(stationList)){ //status 场站状态 0=草稿 1=待启用 2=启用中 3=已停用 4=失效 for (XpStation xpStation : stationList) { switch (xpStation.getStatus()) { case 0: stationNumbers.setDraft(stationNumbers.getDraft() + 1); break; case 1: stationNumbers.setPendingLaunch(stationNumbers.getPendingLaunch() + 1); break; case 2: stationNumbers.setStartingUp(stationNumbers.getStartingUp() + 1); break; case 3: stationNumbers.setDisabled(stationNumbers.getDisabled() + 1); break; case 4: stationNumbers.setExpired(stationNumbers.getExpired() + 1); break; } } stationNumbers.setTotalNum(stationList.size()); } res.setStationNumbers(stationNumbers); return R.ok(res); } xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java
@@ -210,6 +210,7 @@ if (xpPoint == null) { throw new ServiceException("系统异常", I18nKeyConstant.SYSTEM_EXCEPTION); } pointAddDto.setStationSortNo(xpPoint.getStationSortNo()); xpPointService.validatePointNameUnique(pointAddDto.getPointName(), pointAddDto.getId()); BeanUtils.copyProperties(pointAddDto, xpPoint); if (Integer.valueOf(2).equals(pointAddDto.getOperationStatus()) && Integer.valueOf(5).equals(pointAddDto.getVerificationStatus())) { @@ -236,12 +237,10 @@ } xpPoint.setFpElectronicAreaId(null); Integer stationSortNo = xpPoint.getStationSortNo(); //点位在场站内排序 Long stationId = pointAddDto.getStationId(); Integer stationSortNo = pointAddDto.getStationSortNo(); //点位在场站内排序 if(stationId != null && stationId > 0){ if(stationSortNo == null){ stationSortNo = 0; } stationSortNo = 0; } // 使用 lambdaUpdate 确保 pointPictures 为 null 时也能将数据库字段清空 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpStationManagementController.java
@@ -54,13 +54,21 @@ @ApiOperation(value = "场站管理已经启动列表", tags = {"管理后台-运营-场站管理"}) @GetMapping("/findListEnable") public R<List<XpStation>> findListEnable(@RequestParam String cityCode) { public R<List<XpStation>> findListByCityCode(@RequestParam String cityCode) { XpStationQuery query = new XpStationQuery(); query.setCityCode(cityCode); return R.ok( xpStationService.findList(query)); } @ApiOperation(value = "场站管理列表", tags = {"管理后台-运营-场站管理"}) @PostMapping("/findList") public R<List<XpStation>> findList(@RequestBody XpStationQuery query) { List<XpStation> list = xpStationService.findList(query); return R.ok(list); } @ApiOperation(value = "场站管理分页列表", tags = {"管理后台-运营-场站管理"}) @PostMapping("/pageList") public R<PageInfo<XpStation>> pageList(@RequestBody XpStationQuery query) { xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/mapper/XpElectronicFenceAreaMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xiaopeng.api.model.operation.XpElectronicFenceArea; import org.apache.ibatis.annotations.Mapper; /** * <p> @@ -12,6 +13,7 @@ * @author liu * @since 2026-02-03 */ @Mapper public interface XpElectronicFenceAreaMapper extends BaseMapper<XpElectronicFenceArea> { } xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/mapper/XpStationMapper.java
@@ -4,6 +4,7 @@ import com.xiaopeng.api.model.operation.XpStation; import com.xiaopeng.api.query.operation.XpStationQuery; import com.xiaopeng.common.core.web.page.PageInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,6 +17,7 @@ * @author mitao * @since 2026-04-12 */ @Mapper public interface XpStationMapper extends BaseMapper<XpStation> { xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/mapper/XpTestElectronicFenceAreaMapper.java
@@ -2,8 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xiaopeng.api.model.operation.XpElectronicFenceArea; import com.xiaopeng.api.model.operation.XpTestElectronicFenceArea; import org.apache.ibatis.annotations.Mapper; /** * <p> @@ -13,6 +13,7 @@ * @author liu * @since 2026-02-03 */ @Mapper public interface XpTestElectronicFenceAreaMapper extends BaseMapper<XpTestElectronicFenceArea> { } xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/XpPointService.java
@@ -72,6 +72,8 @@ boolean getInTime(LocalTime now, Integer effectivePeriod, String effectiveTimePeriod); List<XpPoint> pointMap(PointMapQuery query); List<XpPoint> findList(PointListQuery query); List<XpPoint> listAll(PointListQuery query); xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java
@@ -62,7 +62,6 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; @@ -370,6 +369,10 @@ List<XpPoint> list = this.baseMapper.pointMap(query); return list; } @Override public List<XpPoint> findList(PointListQuery query) { return this.baseMapper.listAll(query); } @Override public List<XpPoint> listAll(PointListQuery query) { xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpTestElectronicFenceServiceImpl.java
@@ -68,7 +68,7 @@ @Resource private PolygonOverlapService polygonOverlapService; @Resource @Autowired private XpTestElectronicFenceAreaMapper xpElectronicFenceAreaMapper; @Autowired private MongoTemplate mongoTemplate; xp-robotaxi-map-boot/src/main/resources/mapper/XpPointMapper.xml
@@ -72,6 +72,14 @@ select t1.* from xp_point t1 where t1.is_deleted = 0 <if test="query.electronicAreaIds != null and query.electronicAreaIds.size() > 0"> and t1.electronic_area_id in <foreach collection="query.electronicAreaIds" item="id" open="(" separator="," close=")"> #{id} </foreach> </if> <if test="query.cityCode != null and query.cityCode != ''"> and t1.city_code = #{query.cityCode} </if> xp-robotaxi-map-boot/src/main/resources/mapper/XpStationMapper.xml
@@ -19,6 +19,10 @@ #{id} </foreach> </if> <if test="query.electronicId != null"> and a.electronic_id = #{query.electronicId} </if> <if test="query.cityCode != null and query.cityCode != ''"> and a.city_code = #{query.cityCode} </if> xp-robotaxi-map-boot/src/main/resources/mapper/XpTestElectronicFenceAreaMapper.xml
@@ -11,7 +11,7 @@ <result column="area_description" property="areaDescription" /> <result column="area_status" property="areaStatus" /> <result column="fence_points" property="fencePoints" /> <result column="is_deleted" property="isDeleted" /> <result column="is_deleted" property="deleted" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="create_by" property="createBy" /> xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPointSituationReportController.java
@@ -3,7 +3,10 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.hutool.core.util.StrUtil; import com.xiaopeng.api.feignClient.account.XpOperationUserClient; import com.xiaopeng.api.model.account.SysUser; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.model.operation.XpPasswordFreePolicy; import com.xiaopeng.api.model.operation.XpPointSituationReport; import com.xiaopeng.api.query.operation.XpPointSituationReportQuery; @@ -15,9 +18,11 @@ import com.xiaopeng.common.security.service.TokenService; import com.xiaopeng.operation.exportExcle.XpPointSituationReportExportExcel; import com.xiaopeng.operation.service.IXpPointSituationReportService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -29,9 +34,11 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @RestController @RequestMapping("") @Api("现场情况上报") public class XpPointSituationReportController { @Resource @@ -39,6 +46,8 @@ @Resource private TokenService tokenService; @Resource private XpOperationUserClient xpOperationUserClient; @@ -48,19 +57,23 @@ @ApiOperation(value = "现场情况上报分页列表", tags = {"管理后台-运维-现场情况上报"}, response = XpPasswordFreePolicy.class) @PostMapping("/api/v1/pointSituationReport/pageList") public R<PageInfo<XpPointSituationReportVo>> pageList(@RequestBody XpPointSituationReportQuery query) { PageInfo<XpPointSituationReportVo> pageInfo = xpPointSituationReportService.pageList(query); return R.ok(pageInfo); } /** * 删除路线规划配置 * 详情现场情况上报 */ @ApiOperation(value = "详情现场情况上报", tags = {"管理后台-运维-现场情况上报"}) @DeleteMapping("/api/v1/pointSituationReport/getdetail/{id}") @GetMapping("/api/v1/pointSituationReport/getdetail/{id}") public R<?> getdetail(@PathVariable Long id) { xpPointSituationReportService.getdetail(id); return R.ok(); XpPointSituationReportVo detail = xpPointSituationReportService.getdetail(id); return R.ok(detail); } @@ -70,13 +83,27 @@ @ApiOperation(value = "删除现场情况上报", tags = {"管理后台-运维-现场情况上报"}) @DeleteMapping("/api/v1/pointSituationReport/deleteById/{id}") public R<?> deleteById(@PathVariable Long id) { xpPointSituationReportService.deleteById(id); return R.ok(); try { boolean b = xpPointSituationReportService.deleteById(id); if(b){ return R.ok(); } return R.fail("删除失败"); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } @ApiOperation(value = "导出现场情况上报", tags = {"管理后台-运维-现场情况上报"}) @PostMapping(value = "/api/v1/pointSituationReport/exportExcels") public void exportExcels(@RequestBody XpPointSituationReportQuery query) { if(query.getIds().isEmpty()){ return; } List<XpPointSituationReportVo> exportList = xpPointSituationReportService.exportList(query); List<XpPointSituationReportExportExcel> exportExcels = new ArrayList<>(); long sequence = 1L; @@ -113,7 +140,7 @@ } @ApiOperation(value = "现场情况上报", tags = {"运维APP-站点管理"}, response = XpPointSituationReport.class) @ApiOperation(value = "现场情况上报", tags = {"运维APP-现场情况上报"}, response = XpPointSituationReport.class) @PostMapping("/maintenance-app/api/v1/pointSituationReport/addPointSituationReport") public R<?> addPointSituationReport(@RequestBody XpPointSituationReport xpPointSituationReport){ LoginOperationUser loginOperationUser = tokenService.getLoginOperationUser(); xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java
@@ -1,5 +1,6 @@ package com.xiaopeng.operation.controller; import com.xiaopeng.api.model.operation.XpTradingStrategy; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.web.controller.BaseController; import com.xiaopeng.operation.dto.XpTradingStrategyEditDTO; @@ -44,6 +45,8 @@ @ApiOperation(value = "获取交易策略配置", tags = {"inner-交易策略配置"}) @GetMapping("/logan/inner/xpOperationStrategy/getOne") public R<XpTradingStrategyDetailVO> getOne() { // TODO[流量接入] 这里需要判断是哪个三方车队的,获取到对应的交易策略 XpTradingStrategyDetailVO detail = tradingStrategyService.queryDetail(); return R.ok(detail); } @@ -60,4 +63,13 @@ tradingStrategyService.editStrategy(dto); return R.ok(); } @ApiOperation(value = "三方车队的交易策略", tags = {"流量接入-信息录入-设置交易策略"}) @PostMapping("/api/v1/xp-rt/strategy") public R<?> add(@Validated @RequestBody XpTradingStrategy dto) {//创建只接收部分可设置的参数的dto // 通过key认证是哪个三方车队 tradingStrategyService.save(dto); return R.ok(); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpPointSituationReportService.java
@@ -15,5 +15,5 @@ List<XpPointSituationReportVo> exportList(XpPointSituationReportQuery query); void deleteById(Long id); boolean deleteById(Long id); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointSituationReportServiceImpl.java
@@ -1,5 +1,8 @@ package com.xiaopeng.operation.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.feignClient.account.XpOperationUserClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient; @@ -13,6 +16,7 @@ import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.operation.mapper.XpPointSituationReportMapper; import com.xiaopeng.operation.service.IXpPointSituationReportService; import net.bytebuddy.implementation.bytecode.Throw; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -34,6 +38,18 @@ @Override public PageInfo<XpPointSituationReportVo> pageList(XpPointSituationReportQuery query) { //根据 上报运维人名称 查询数据 if(StrUtil.isNotBlank(query.getOperationsUserName())){ R<List<XpOperationsUser>> listR = xpOperationUserClient.listByName(query.getOperationsUserName()); if(CollUtil.isNotEmpty(listR.getData())){ List<Long> operationsUserIds = listR.getData().stream() .map(XpOperationsUser::getId) .collect(Collectors.toList()); query.setOperationsUserIds(operationsUserIds); }else{ query.setOperationsUserIds(ListUtil.toList(0L)); } } // 创建分页对象 PageInfo<XpPointSituationReportVo> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); // 调用Mapper查询 @@ -125,14 +141,14 @@ @Override public void deleteById(Long id) { public boolean deleteById(Long id) { // 1. 检查记录是否存在 XpPointSituationReport bean = this.getById(id); if (bean == null) { throw new ServiceException("密支付策略配置不存在"); throw new ServiceException("点位现场情况上报信息不存在"); } // 2. 逻辑删除(MyBatis-Plus自动处理) this.removeById(id); return super.removeById( bean.getId()); } } xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpPointSituationReportMapper.xml
@@ -12,7 +12,7 @@ inner join xp_point as b on a.point_id = b.id WHERE a.is_deleted = 0 <if test="query.id != null and query.id != ''"> AND b.point_name = #{query.id} AND a.id = #{query.id} </if> <if test="query.ids != null and query.ids.size() > 0"> AND a.id IN @@ -33,6 +33,12 @@ <if test="query.operationsUserId != null and query.operationsUserId != ''"> AND a.operations_user_id = #{query.operationsUserId} </if> <if test="query.operationsUserIds != null and query.operationsUserIds.size() > 0"> AND a.operations_user_id IN <foreach collection="query.operationsUserIds" item="id" open="(" separator="," close=")"> #{id} </foreach> </if> <if test="query.reportingTimeStart != null"> AND a.reporting_time >= #{query.reportingTimeStart} </if> xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgHandler.java
File was deleted xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgSchedule.java
New file @@ -0,0 +1,54 @@ package com.xiaopeng.pushMessage.webSocket.handler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.xiaopeng.api.feignClient.maintenance.XpTaskClient; import com.xiaopeng.api.model.maintenance.XpTask; import com.xiaopeng.pushMessage.webSocket.service.WebSocketUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.HashMap; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @Component @Slf4j //public class TestMsgHandler implements BusinessMsgHandler{ public class TestMsgSchedule { @Resource XpTaskClient xpTaskClient; @Autowired private WebSocketUserService webSocketUserService; @PostConstruct public void setup() { Executors.newSingleThreadScheduledExecutor() .scheduleWithFixedDelay(this::send, 10, 1, TimeUnit.MINUTES); } public void send() { String msg; XpTask xpTask = xpTaskClient.queryInfoByVehicleId(20L).getData(); HashMap<String, Object> ret = new HashMap<>(); ret.put("type", "task"); ret.put("data", xpTask); try { msg = om.writeValueAsString(ret); } catch (JsonProcessingException e) { throw new RuntimeException("Message serialization failed", e); } webSocketUserService.broadcastMessage(msg); } @Autowired ObjectMapper om; @Autowired MongoTemplate mongoTemplate; } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MiniprogramConfigurer.java
@@ -10,7 +10,7 @@ import javax.annotation.Resource; @Slf4j @Configuration //@Configuration public class MiniprogramConfigurer extends WebMvcConfigurerAdapter { @Resource xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
@@ -10,7 +10,10 @@ import com.xiaopeng.vehicleConvoy.model.query.FleetPageQuery; import com.xiaopeng.vehicleConvoy.model.query.FleetUserPageQuery; import com.xiaopeng.vehicleConvoy.model.query.FleetVehiclePageQuery; import com.xiaopeng.vehicleConvoy.model.vo.*; import com.xiaopeng.vehicleConvoy.model.vo.FleetDetailVO; import com.xiaopeng.vehicleConvoy.model.vo.FleetPageVO; import com.xiaopeng.vehicleConvoy.model.vo.FleetUserVO; import com.xiaopeng.vehicleConvoy.model.vo.FleetVehicleVO; import com.xiaopeng.vehicleConvoy.service.IXpFleetOperationsService; import com.xiaopeng.vehicleConvoy.service.IXpFleetService; import io.swagger.annotations.*; @@ -220,4 +223,17 @@ public R<List<XpFleet>> getList() { return R.ok(xpFleetService.list()); } @ApiOperation(value = "品牌信息", tags = {"流量接入-信息录入-品牌展示信息"}) @PostMapping("/api/v1/xp-rt/brand-info") public R<?> JoinUs( @ApiParam(value = "车辆信息", required = true) @RequestBody XpFleet fleet ) { //包含接收订单的URL xpFleetService.save(fleet); return R.ok(); } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetVehicleController.java
@@ -1,12 +1,13 @@ package com.xiaopeng.vehicleConvoy.controller; import com.xiaopeng.api.model.vehicleConvoy.XpFleetVehicle; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @@ -59,4 +60,29 @@ List<Long> vehicleIds = xpFleetVehicleService.listVehicleIdsByFleetId(fleetId); return R.ok(vehicleIds); } @ApiOperation(value = "添加车辆", tags = {"流量接入-信息录入-车辆"}) @PostMapping("/api/v1/xp-rt/vehicle") public R<?> add( @ApiParam(value = "车辆信息", required = true) @RequestBody XpFleetVehicle fleetVehicle ) { xpFleetVehicleService.save(fleetVehicle); return R.ok(); } @Resource MongoTemplate mongoTemplate; @ApiOperation(value = "车辆", tags = {"流量接入-信息录入-车辆"}) @PostMapping("/api/v1/xp-rt/vehicle/position") public R<?> JoinUs( @ApiParam(value = "车辆位置信息", required = true) @RequestBody VehiclePosition vp ) { mongoTemplate.save(vp); return R.ok(); } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -1163,15 +1163,13 @@ return R.ok(vehicleDoorStatus); } @Resource XpVehicleClient xpVehicleClient; /** * 周围车辆点位查询 */ @ApiOperation(value = "周围车辆点位查询", notes = "", tags = {"小程序-周围车辆点位查询"}) @GetMapping("/api/v1/mini-program/vehicle/nearby") @XpClientCheck(checkToken = false) public R<List<XpVehicleVO>> carAround(@RequestParam double lon,@RequestParam double lat) { @XpClientCheck(checkToken = false, checkOtpToken = false) public R<List<XpVehicleVO>> carAround(@RequestParam double lon, @RequestParam double lat) { Point point = new Point(lon, lat); Distance distance = new Distance(3, Metrics.KILOMETERS); @@ -1180,20 +1178,51 @@ .maxDistance(distance.getNormalizedValue()); Query query = new Query(criteria); List<VehiclePositionVo> vehiclePositions = mongoTemplate.find(query, VehiclePositionVo.class); if (CollectionUtils.isEmpty(vehiclePositions)) { return R.ok(new ArrayList<>()); } List<XpVehicleVO> xpVehicleList = vehiclePositions.stream() .sorted(Comparator.comparingDouble(VehiclePositionVo::getDistance)) .map(vp -> { XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vp.getVin()).getData(); XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper<XpVehicle>().eq(XpVehicle::getVehicleVin, vp.getVin())); if (xpVehicle == null) { return null; } XpVehicleVO vo = new XpVehicleVO(); BeanUtils.copyProperties(xpVehicle, vo); vo.setDirection(vp.getCourse()); return vo; }) .filter(v -> v.getState() == 0) .filter(Objects::nonNull) .filter(v -> v.getState() != null && v.getState() == 0) .limit(5) .collect(Collectors.toList()); return R.ok(xpVehicleList); } @ApiOperation(value = "上报车辆位置", notes = "", tags = {"流量接入-上报车辆位置"}) @PostMapping("/api/v1/xp-rt/vehicle/position") public R<List<XpVehicleVO>> pushVehiclePosition(@RequestBody VehiclePosition vp) { // 更新到mongodb,用于被分配订单 // 如果是接单中,更新导航路线 return R.ok(); } /** * {@Link OrderStatusEnum} * @param vp * @return */ @ApiOperation(value = "更新车辆状态", notes = "", tags = {"流量接入-更新车辆状态"}) @PostMapping("/api/v1/xp-rt/vehicle/status") public R<List<XpVehicleVO>> pushVehicleStatus(@RequestBody VehiclePosition vp) { // 前往接驾,等待上车,前往终点,到达终点等待下车,结束订单 // 更新order状态 return R.ok(); } }