xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpOfficialPartner.java
New file @@ -0,0 +1,42 @@ package com.xiaopeng.api.model.operation; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.xiaopeng.common.core.web.domain.BaseModel; import lombok.Data; /** * 合作商 */ @Data @TableName("xp_official_partner") public class XpOfficialPartner extends BaseModel { /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 名称 */ private String name; /** * 品牌名称 */ private String brandName; /** * 品牌logo */ private String logoUrl; /** * 应用APPKey */ private String appKey; /** * 应用APPSecret */ private String appSecret; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpPricing.java
@@ -81,15 +81,6 @@ private String dynamicPricingJson; // public XpPricingDynamicPricesVo getDynamicPricingJsonObj() { // if(StringUtils.isNotEmpty(dynamicPricingJson)){ // return JSONObject.parseObject(dynamicPricingJson, XpPricingDynamicPricesVo.class); // } // return null; // } @ApiModelProperty(value = "价格规则") @TableField("price_rule") private String priceRule; @@ -99,4 +90,9 @@ @TableField("is_dynamic_price") private Integer isDynamicPrice; @ApiModelProperty(value = "合作商id") @TableField("official_partner_id") private Integer officialPartnerId; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/vehicleConvoy/XpVehicle.java
@@ -120,6 +120,9 @@ @ApiModelProperty(value = "车辆接单状态 1接单中 0空闲") private Integer state; @ApiModelProperty(value = "合作商ID") private Integer officialPartnerId; @ApiModelProperty(value = "运营区域") @TableField(exist = false) private String electronicName; xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -330,9 +330,6 @@ && mqttPublishDto.getCode()== 200){ // 修改车子为接单状态 xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(dto.getVin(), 1)); // TODO[流量接入] 通过设置的URL发送订单和导航路线给运力 } if(null != mqttPublishDto && mqttPublishDto.getCode() == 200){ xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleModelController.java
@@ -8,6 +8,8 @@ import com.xiaopeng.maintenance.model.query.XpVehicleModelPageQuery; import com.xiaopeng.maintenance.service.IXpVehicleModelService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -138,8 +140,15 @@ @GetMapping("/drainage/v1/vehicleModel/list") @ApiOperation(value = "查询可使用的车型列表", notes = "流量接入-基础信息") @ApiImplicitParams({ @ApiImplicitParam(value = "token", name = "token", required = true, paramType = "header") }) public R<List<XpVehicleModel>> getVehicleModelList() { List<XpVehicleModel> list = xpVehicleModelService.queryList(); return R.ok(list); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOfficialPartnerController.java
New file @@ -0,0 +1,50 @@ package com.xiaopeng.operation.controller; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.operation.service.IXpOfficialPartnerService; import com.xiaopeng.operation.vo.OfficialPartnerVo; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; 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; /** * 引流接口 */ @RestController @RequestMapping("/drainage") public class XpOfficialPartnerController { @Resource private IXpOfficialPartnerService xpOfficialPartnerService; /** * 保存合作商信息 * @param vo * @return */ @PostMapping("/v1/officialPartner/save") @ApiOperation(value = "保存合作商信息", notes = "流量接入-基础信息") @ApiImplicitParams({ @ApiImplicitParam(value = "token", name = "token", required = true, paramType = "header") }) public R<?> save(@RequestBody OfficialPartnerVo vo) { xpOfficialPartnerService.addOfficialPartner(vo); return R.ok(); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPricingController.java
@@ -20,10 +20,14 @@ import com.xiaopeng.operation.query.PricingPageListQuery; import com.xiaopeng.operation.service.*; import com.xiaopeng.operation.utils.ImageTagProcessor; import com.xiaopeng.operation.vo.OfficialPartnerVo; import com.xiaopeng.operation.vo.PricingInfoVo; import com.xiaopeng.operation.vo.PricingPageListVO; import com.xiaopeng.operation.vo.SaveOrderVo; import com.xiaopeng.unifiedverification.interceptor.XpClientCheck; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; @@ -266,4 +270,18 @@ } // /** // * 合作商添加计费策略 todo 现在的版本不支持手动选择车型 // * @param vo // * @return // */ // @PostMapping("/v1/pricing/save") // @ApiOperation(value = "保存计价规则", notes = "流量接入-基础信息") // @ApiImplicitParams({ // @ApiImplicitParam(value = "token", name = "token", required = true, paramType = "header") // }) // public R<?> save(@RequestBody PricingInfoVo vo) { // // return R.ok(); // } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java
@@ -42,8 +42,6 @@ @ApiOperation(value = "获取交易策略配置", tags = {"inner-交易策略配置"}) @GetMapping("/logan/inner/xpOperationStrategy/getOne") public R<XpTradingStrategyDetailVO> getOne() { // TODO[流量接入] 这里需要判断是哪个三方车队的,获取到对应的交易策略 XpTradingStrategyDetailVO detail = tradingStrategyService.queryDetail(); return R.ok(detail); } @@ -58,15 +56,6 @@ @PostMapping("/api/v1/tradingStrategy/edit") public R<?> edit(@Validated @RequestBody XpTradingStrategyEditDTO dto) { 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/mapper/XpOfficialPartnerMapper.java
New file @@ -0,0 +1,7 @@ package com.xiaopeng.operation.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xiaopeng.api.model.operation.XpOfficialPartner; public interface XpOfficialPartnerMapper extends BaseMapper<XpOfficialPartner> { } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpOfficialPartnerService.java
New file @@ -0,0 +1,16 @@ package com.xiaopeng.operation.service; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.api.model.operation.XpOfficialPartner; import com.xiaopeng.operation.vo.OfficialPartnerVo; import org.springframework.web.bind.annotation.RequestBody; public interface IXpOfficialPartnerService extends IService<XpOfficialPartner> { /** * 添加合作商 * @param vo */ void addOfficialPartner(OfficialPartnerVo vo); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpOfficialPartnerServiceImpl.java
New file @@ -0,0 +1,35 @@ package com.xiaopeng.operation.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.model.operation.XpOfficialPartner; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.operation.mapper.XpOfficialPartnerMapper; import com.xiaopeng.operation.service.IXpOfficialPartnerService; import com.xiaopeng.operation.vo.OfficialPartnerVo; import org.springframework.stereotype.Service; @Service public class XpOfficialPartnerServiceImpl extends ServiceImpl<XpOfficialPartnerMapper, XpOfficialPartner> implements IXpOfficialPartnerService { /** * 添加合作商 * @param vo */ @Override public void addOfficialPartner(OfficialPartnerVo vo) { XpOfficialPartner officialPartner = this.getOne(new QueryWrapper<XpOfficialPartner>().eq("app_key", vo.getAppKey()).eq("is_deleted", 0)); if(null == officialPartner){ throw new ServiceException("权限校验失败"); } if(!officialPartner.getAppSecret().equals(vo.getAppSecret())){ throw new ServiceException("权限校验失败"); } XpOfficialPartner xpOfficialPartner = new XpOfficialPartner(); xpOfficialPartner.setName(vo.getName()); xpOfficialPartner.setBrandName(vo.getBrandName()); xpOfficialPartner.setLogoUrl(vo.getLogoUrl()); this.updateById(xpOfficialPartner); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/vo/OfficialPartnerVo.java
New file @@ -0,0 +1,20 @@ package com.xiaopeng.operation.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel("合作商信息") public class OfficialPartnerVo { @ApiModelProperty("合作商名称") private String name; @ApiModelProperty("合作商品牌名称") private String brandName; @ApiModelProperty("合作商品牌logo") private String logoUrl; @ApiModelProperty("应用APPKey") private String appKey; @ApiModelProperty("应用APPSecret") private String appSecret; } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/vo/PricingInfoVo.java
New file @@ -0,0 +1,10 @@ package com.xiaopeng.operation.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel("定价信息") public class PricingInfoVo { } xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpOfficialPartnerMapper.xml
New file @@ -0,0 +1,6 @@ <?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.xiaopeng.operation.mapper.XpOfficialPartnerMapper"> </mapper> xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
@@ -240,28 +240,4 @@ return R.ok(xpFleetService.list()); } @ApiOperation(value = "品牌信息", tags = {"流量接入-信息录入-品牌展示信息"}) @PostMapping("/api/v1/xp-rt/brand-info") public R<?> JoinUs( @ApiParam(value = "车辆信息", required = true) @RequestBody BrandInfo brandInfo ) { //包含接收订单的URL XpFleet xpFleet = new XpFleet(); XpOperationsUser operationsUser = new XpOperationsUser(); operationsUser.setNickName(brandInfo.getOperationsUserName()); operationsUser.setPhoneNumber(brandInfo.getPhoneNumber()); operationsUser.setDeviceType(1); xpFleet.setFleetName(brandInfo.getBrandName()); // xpFleetService.save(fleet); return R.ok(); } XpOperationsUserClient xpOperationsUserClient; } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetVehicleController.java
@@ -60,29 +60,4 @@ 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/info") 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
@@ -42,6 +42,7 @@ import com.xiaopeng.vehicleConvoy.model.importExcel.XpVehicleImportExcel; import com.xiaopeng.vehicleConvoy.model.query.*; import com.xiaopeng.api.vo.vehicleConvoy.XpVehicleVO; import com.xiaopeng.vehicleConvoy.model.vo.VehiclePositionDto; import com.xiaopeng.vehicleConvoy.service.IXpFleetService; import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService; import com.xiaopeng.vehicleConvoy.service.IXpVehicleAnnualRecordService; @@ -746,26 +747,7 @@ } public static void main(String[] args) { String inspectionAttachments = "[{\"id\": \"d57c4ac4-acb0-451b-8e94-70f226331e0c\", \"url\": \"https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/552a3a31-e4dd-4a28-8748-fd8b87dd3055.png\", \"name\": \"测试.jpg\"}]"; if (StringUtils.isNotBlank(inspectionAttachments)) { JSONArray jsonArray = JSONArray.parseArray(inspectionAttachments); for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); if (Objects.isNull(jsonObject)) { continue; } jsonObject.put("url", "downloadUrl"); } String jsonString = JSONArray.toJSONString(jsonArray); System.out.println(jsonString); } } /** * 根据围栏id查询空闲车辆 @@ -1204,35 +1186,24 @@ 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 * 上报车辆实时位置信息 * @param dto * @return */ @ApiOperation(value = "更新车辆状态", notes = "", tags = {"流量接入-更新车辆状态"}) @PostMapping("/api/v1/xp-rt/vehicle/status") public R<List<XpVehicleVO>> pushVehicleStatus(@RequestBody VehiclePosition vp) { // 前往接驾,等待上车,前往终点,到达终点等待下车,结束订单 // 更新order状态 @PostMapping("/drainage/v1/vehicle/reportVehicleLocation") @ApiOperation(value = "上报车辆实时位置信息", notes = "流量接入-基础信息") @ApiImplicitParams({ @ApiImplicitParam(value = "token", name = "token", required = true, paramType = "header") }) public R<?> reportVehicleLocation(@RequestBody VehiclePositionDto dto){ xpVehicleService.reportVehicleLocation(dto); return R.ok(); } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/vo/VehiclePositionDto.java
New file @@ -0,0 +1,61 @@ package com.xiaopeng.vehicleConvoy.model.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.data.mongodb.core.geo.GeoJsonPoint; import org.springframework.data.mongodb.core.index.GeoSpatialIndexType; import org.springframework.data.mongodb.core.index.GeoSpatialIndexed; @Data @ApiModel("车辆位置信息") public class VehiclePositionDto { /** * 车辆VIN */ @ApiModelProperty(value = "车辆VIN") private String vin; /** * 车辆实时位置信息 */ @ApiModelProperty(value = "车辆经度") private Double longitude; @ApiModelProperty(value = "车辆纬度") private Double latitude; /** * 航向,单位:度,北零顺时针。范围:[0-360)。0 => 北, 90 => 东, 180 => 南, 270 => 西 */ @ApiModelProperty("车头北向夹角") private Double course; /** * 海拔 单位米 */ @ApiModelProperty("车辆海拔") private Float alt; /** * 当前速度 */ @ApiModelProperty("车辆速度") private Float speed; /** * 当前电量 */ @ApiModelProperty("车辆电量") private Integer currentElectricity; /** * 综合续航 */ @ApiModelProperty("车辆综合续航") private Float mileageRange; /** * 订单id */ @ApiModelProperty("订单id") private Long orderId; /** * 总里程 */ @ApiModelProperty("总里程") private Long totalOdometer; } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
@@ -5,12 +5,15 @@ import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.operation.VehiclePositionVo; import com.xiaopeng.api.vo.vehicleConvoy.VehicleDoorStatusVo; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.vehicleConvoy.model.dto.*; import com.xiaopeng.vehicleConvoy.model.importExcel.XpVehicleImportExcel; import com.xiaopeng.vehicleConvoy.model.query.*; import com.xiaopeng.api.vo.vehicleConvoy.XpVehicleVO; import com.xiaopeng.vehicleConvoy.model.vo.VehiclePositionDto; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -243,4 +246,11 @@ * @return */ VehicleDoorStatusVo getVehicleDoorStatus(Long orderId); /** * 上报车辆实时位置 * @param dto */ void reportVehicleLocation(VehiclePositionDto dto); } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -38,6 +38,7 @@ import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.api.vo.operation.ElectronicFenceDetailVo; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.api.vo.operation.VehiclePositionVo; import com.xiaopeng.api.vo.vehicleConvoy.*; import com.xiaopeng.common.core.constant.CacheConstants; import com.xiaopeng.common.core.domain.R; @@ -54,6 +55,7 @@ import com.xiaopeng.vehicleConvoy.model.importExcel.XpVehicleImportExcel; import com.xiaopeng.vehicleConvoy.model.query.*; import com.xiaopeng.api.vo.vehicleConvoy.XpVehicleVO; import com.xiaopeng.vehicleConvoy.model.vo.VehiclePositionDto; import com.xiaopeng.vehicleConvoy.service.AsyncVehicleStateService; import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService; import com.xiaopeng.vehicleConvoy.service.IXpVehicleAnnualRecordService; @@ -70,6 +72,7 @@ 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.data.mongodb.core.query.Update; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -1446,4 +1449,43 @@ vo.setTrunk(trunk_ajar_st_new == 5 ? 1 : 0); return vo; } /** * 上报车辆实时位置 * @param dto */ @Override public void reportVehicleLocation(VehiclePositionDto dto) { if(StringUtils.isEmpty(dto.getVin())){ throw new ServiceException("无效数据"); } if(null == dto.getLatitude() || null == dto.getLongitude()){ throw new ServiceException("无效数据"); } XpVehicle vehicle = this.getOne(new QueryWrapper<XpVehicle>().eq("vehicle_vin", dto.getVin()).eq("is_deleted", 0)); if(null == vehicle){ throw new ServiceException("无效数据"); } VehiclePosition vehiclePosition = mongoTemplate.findOne(Query.query(Criteria.where("vin").is(dto.getVin())), VehiclePosition.class); if(null == vehiclePosition){ BeanUtil.copyProperties(dto, vehiclePosition); vehiclePosition.setPoint(new GeoJsonPoint(dto.getLongitude(), dto.getLatitude())); vehiclePosition.setAddTime(System.currentTimeMillis()); mongoTemplate.save(vehiclePosition); }else{ Update update = new Update() .set("point", new GeoJsonPoint(dto.getLongitude(), dto.getLatitude())) .set("course", dto.getCourse()) .set("alt", dto.getAlt()) .set("speed", dto.getSpeed()) .set("currentElectricity", dto.getCurrentElectricity()) .set("mileageRange", dto.getMileageRange()) .set("orderId", dto.getOrderId()) .set("totalOdometer", dto.getTotalOdometer()) .set("addTime", System.currentTimeMillis()); mongoTemplate.updateFirst(new Query(Criteria.where("vin").is(dto.getVin())), update, VehiclePosition.class); } } }