xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java
@@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -22,7 +23,7 @@ return new XpOperationUserClient() { @Override public R<List<XpOperationsUser>> listByIds(List<Long> ids) { public R<List<XpOperationsUser>> listByIds(Collection<Long> ids) { log.error("批量查询运维人员用户信息失败,原因: {}", cause.getMessage()); // 降级返回空列表 return R.ok(new ArrayList<>()); xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpVehicleModelClientFallbackFactory.java
New file @@ -0,0 +1,31 @@ package com.xiaopeng.api.factory.maintenance; import com.xiaopeng.api.feignClient.maintenance.XpVehicleModelClient; import com.xiaopeng.api.model.maintenance.XpVehicleModel; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import java.util.Collection; import java.util.List; @Slf4j @Component public class XpVehicleModelClientFallbackFactory implements FallbackFactory<XpVehicleModelClient> { @Override public XpVehicleModelClient create(Throwable cause) { return new XpVehicleModelClient() { @Override public R<List<XpVehicleModel>> listByIds(Collection<String> ids) { log.error("获取车型数据失败, 异常: {}",cause.getMessage(), cause); return R.fail("获取车型数据失败:" + cause.getMessage()); } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpFleetOperationsClientFallbackFactory.java
@@ -1,6 +1,7 @@ package com.xiaopeng.api.factory.vehicleConvoy; import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient; import com.xiaopeng.api.model.vehicleConvoy.XpFleet; import com.xiaopeng.api.model.vehicleConvoy.XpFleetOperations; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; @@ -30,6 +31,12 @@ } @Override public R<List<XpFleet>> getFleetByUserId(Long id) { log.error("根据人员id 获取所属车队,人员ID: {},原因: {}", id, cause.getMessage()); return R.ok(new ArrayList<>()); } @Override public R<List<Long>> getFleetIdsByUserId(Long userId) { log.error("根据人员ID获取车队信息失败 {}", cause.getMessage()); return R.fail("根据人员ID获取车队信息失败"); xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java
@@ -1,20 +1,19 @@ package com.xiaopeng.api.feignClient.account; import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO; import com.xiaopeng.api.factory.account.XpAppUserClientFallbackFactory; import com.xiaopeng.api.factory.account.XpOperationUserClientFallbackFactory; import com.xiaopeng.api.model.account.XpOperationsRole; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.Collection; import java.util.List; /** @@ -32,7 +31,7 @@ * @return 用户列表 */ @PostMapping("/logan/inner/xpOperationsUser/listByIds") R<List<XpOperationsUser>> listByIds(@RequestBody List<Long> ids); R<List<XpOperationsUser>> listByIds(@RequestBody Collection<Long> ids); /** * 根据ID查询运维用户信息 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpVehicleModelClient.java
New file @@ -0,0 +1,30 @@ package com.xiaopeng.api.feignClient.maintenance; import com.xiaopeng.api.factory.maintenance.XpVehicleModelClientFallbackFactory; import com.xiaopeng.api.model.maintenance.XpVehicleModel; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.Collection; import java.util.List; @FeignClient(contextId = "XpVehicleModelClient", value = ServiceNameConstantsEnum.XP_MAINTENANCE_SERVICE, fallbackFactory = XpVehicleModelClientFallbackFactory.class) public interface XpVehicleModelClient { /** * 根据ID列表批量查询打卡地址 */ @PostMapping("/logan/inner/xpVehicleModel/listByIds") R<List<XpVehicleModel>> listByIds(@RequestBody Collection<String> ids); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpFleetOperationsClient.java
@@ -1,7 +1,7 @@ package com.xiaopeng.api.feignClient.vehicleConvoy; import com.xiaopeng.api.factory.vehicleConvoy.XpFleetOperationsClientFallbackFactory; import com.xiaopeng.api.factory.vehicleConvoy.XpFleetVehicleClientFallbackFactory; import com.xiaopeng.api.model.vehicleConvoy.XpFleet; import com.xiaopeng.api.model.vehicleConvoy.XpFleetOperations; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; @@ -33,6 +33,15 @@ R<List<Long>> getVehicleByUserId(@PathVariable("id") Long id); /** * 根据人员id 获取所属车队 * * @param id 运维人员id * @return 车辆isd */ @GetMapping("/logan/inner/fleet-operations/getFleetByUserId/{id}") R<List<XpFleet>> getFleetByUserId(@PathVariable("id") Long id); /** * 根据运维人员ID查询关联的车队ID列表 * * @param userId 运维人员ID xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpPasswordFreePolicy.java
New file @@ -0,0 +1,84 @@ 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 io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import java.time.LocalDateTime; /** *免密支付策略 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("xp_password_free_policy") @ApiModel(value="XpPasswordFreePolicy 对象", description="免密支付策略") public class XpPasswordFreePolicy extends BaseModel { @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "省份名称") private String provinceName; @ApiModelProperty(value = "省份code") private String provinceCode; @ApiModelProperty(value = "城市名称") private String cityName; @ApiModelProperty(value = "城市code") private String cityCode; @ApiModelProperty(value = "最大重试次数") @Min(value = 0L, message = "最大重试次数不能小于0") @Max(value = 10L, message = "最大重试次数不能大于10") private Integer maxRetriesNumber; @ApiModelProperty(value = "重试间隔(秒)") private Integer retriesInterval; @ApiModelProperty(value = "重试失败后是否发送通知(0=否,1=是)") private Boolean sendNotification; @ApiModelProperty(value = "预估金额与实际金额差异大于x%,乘客端触发二次确认弹框") @Min(value = 0, message = "金额差异阈值能小于0") @Max(value = 1001L, message = "金额差异阈值不能大于1000") private Integer differenceRatio; @ApiModelProperty(value = "状态(1=启用,2=禁用)") private Integer status; public String getStatusName() { if(status != null){ if(status == 1){ return "启用"; }else if(status == 2){ return "禁用"; } } return ""; } @ApiModelProperty(value = "区域id") private String areaId; @ApiModelProperty(value = "区域名称") @TableField(exist = false) private String areaName; @ApiModelProperty(value = "有效期开始时间") private LocalDateTime validTimeStart; @ApiModelProperty(value = "有效期结束时间") private LocalDateTime validTimeEnd; @ApiModelProperty(value = "长期有效") private Boolean validTimeLong; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpPointSituationReport.java
@@ -32,7 +32,19 @@ */ @ApiModelProperty("现场情况(1=正常,2=异常)") @TableField("field_situation") private String fieldSituation; private Integer fieldSituation; public String getFieldSituationName() { if(fieldSituation != null){ if(fieldSituation == 1){ return "正常"; }else if(fieldSituation == 2){ return "异常"; } } return ""; } /** * 现场照片JSON数组 */ @@ -53,6 +65,7 @@ /** * 现场情况上报时间 */ @ApiModelProperty("现场情况上报时间") @TableField("reporting_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime reportingTime; xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpPricing.java
@@ -35,6 +35,10 @@ @TableField("vehicle_model") private String vehicleModel; @ApiModelProperty(value = "车型名称") @TableField(exist = false) private String vehicleModelName; @ApiModelProperty(value = "渠道") @TableField("channel") private String channel; xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpPasswordFreePolicyQuery.java
New file @@ -0,0 +1,27 @@ package com.xiaopeng.api.query.operation; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.common.core.web.page.BasePage; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; @Data public class XpPasswordFreePolicyQuery extends BasePage { @ApiModelProperty(value = "城市名称") private String cityName; @ApiModelProperty(value = "有效期开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTimeStart; @ApiModelProperty(value = "有效期结束时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTimeEnd; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpPointSituationReportQuery.java
New file @@ -0,0 +1,52 @@ package com.xiaopeng.api.query.operation; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.common.core.web.page.BasePage; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; import java.util.List; @Data public class XpPointSituationReportQuery extends BasePage { private Long id; private List<Long> ids; @ApiModelProperty(value = "点位名称") private String pointName; @ApiModelProperty(value = "点位编号唯一") private String pointNumber; @ApiModelProperty(value = "点位状态值") private String pointStatusValue; /** * 现场情况(1=正常,2=异常) */ @ApiModelProperty("现场情况(1=正常,2=异常)") private Integer fieldSituation; /** * 上报运维id */ @TableField("operations_user_id") private Long operationsUserId; /** * 现场情况上报时间 */ @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/vo/operation/XpPointSituationReportVo.java
New file @@ -0,0 +1,50 @@ package com.xiaopeng.api.vo.operation; import com.baomidou.mybatisplus.annotation.TableField; import com.xiaopeng.api.model.operation.XpPointSituationReport; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class XpPointSituationReportVo extends XpPointSituationReport { @ApiModelProperty(value = "点位名称") private String pointName; @ApiModelProperty(value = "点位编号唯一") private String pointNumber; @ApiModelProperty(value = "运营状态 1=待启用 2=启用中 3=已停用 4=已失效") private Integer operationStatus; @ApiModelProperty(value = "点位类型 1=运营点位 2=测试点位") private Integer pointType; @ApiModelProperty(value = "验证状态 1=待验证、2=验证中、3=已验证 4验证失败 5待生效") private Integer verificationStatus; @ApiModelProperty(value = "点位状态名称") private String pointStatusName; @ApiModelProperty(value = "点位状态值") private String pointStatusValue; /** * 上报运维名称 */ @ApiModelProperty(value = "上报运维名称") private String operationsUserName; /** * 上报运维人车队名 */ @ApiModelProperty(value = "上报运维人车队名") private String operationsUserFleetName; } xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -57,4 +57,5 @@ com.xiaopeng.api.factory.pushMessage.SubscribeMessageClientFallbackFactory com.xiaopeng.api.factory.account.UserSubscribeMessageClientFallbackFactory com.xiaopeng.api.factory.operation.XpTradingStrategyClientFallbackFactory com.xiaopeng.api.factory.operation.XpActicityClientFallbackFactory com.xiaopeng.api.factory.operation.XpActicityClientFallbackFactory com.xiaopeng.api.factory.maintenance.XpVehicleModelClientFallbackFactory xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleModelController.java
@@ -1,5 +1,6 @@ package com.xiaopeng.maintenance.controller; import cn.hutool.core.collection.CollUtil; import com.xiaopeng.api.feignClient.operation.XpPricingClient; import com.xiaopeng.api.model.maintenance.XpVehicleModel; import com.xiaopeng.common.core.domain.R; @@ -14,6 +15,7 @@ import javax.annotation.Resource; import javax.validation.Valid; import java.util.ArrayList; import java.util.List; @Slf4j @@ -34,6 +36,18 @@ PageInfo<XpVehicleModel> pageInfo = xpVehicleModelService.pageList(query); return R.ok(pageInfo); } @PostMapping("/logan/inner/xpVehicleModel/listByIds") @ApiOperation(value = "根据ID列表批量查询", tags = {"内部接口"}) public R<List<XpVehicleModel>> listByIds(@RequestBody List<String> ids) { if (CollUtil.isEmpty(ids)) { return R.ok(new ArrayList<>()); } return R.ok(xpVehicleModelService.listByIds(ids)); } @ApiOperation(value = "根据ID查询", tags = "管理后台-车型根据ID查询") @GetMapping("/logan/inner/xpVehicleModel/getById") public R<XpVehicleModel> getById(@RequestParam String id) { xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPasswordFreePolicyController.java
New file @@ -0,0 +1,89 @@ package com.xiaopeng.operation.controller; import com.xiaopeng.api.model.operation.XpPasswordFreePolicy; import com.xiaopeng.api.query.operation.XpPasswordFreePolicyQuery; import com.xiaopeng.api.vo.account.LoginUser; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.common.security.service.TokenService; import com.xiaopeng.operation.service.XpPasswordFreePolicyService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.time.LocalDateTime; @Slf4j @RestController @RequestMapping("") @Api(tags = "免密支付策略") public class XpPasswordFreePolicyController { @Resource private XpPasswordFreePolicyService xpPasswordFreePolicyService; @Resource private TokenService tokenService; /** * 分页查询路线规划配置列表 */ @ApiOperation(value = "免密支付策略分页列表", tags = {"管理后台-交易定价-免密支付策略"}, response = XpPasswordFreePolicy.class) @PostMapping("/api/v1/passwordFreePolicy/pageList") public R<PageInfo<XpPasswordFreePolicy>> pageList(@RequestBody XpPasswordFreePolicyQuery query) { PageInfo<XpPasswordFreePolicy> pageInfo = xpPasswordFreePolicyService.pageList(query); return R.ok(pageInfo); } /** * 新增路线规划配置 */ @ApiOperation(value = "新增免密支付策略", tags = {"管理后台-交易定价-免密支付策略"}) @PostMapping("/api/v1/passwordFreePolicy/add") public R<?> add(@Valid @RequestBody XpPasswordFreePolicy dto) { LoginUser loginUser = tokenService.getLoginUser(); dto.setCreateBy(loginUser.getUsername()); dto.setCreateTime(LocalDateTime.now()); xpPasswordFreePolicyService.save(dto); return R.ok(); } /** * 编辑路线规划配置 */ @ApiOperation(value = "编辑免密支付策略", tags = {"管理后台-交易定价-免密支付策略"}) @PostMapping("/api/v1/passwordFreePolicy/edit") public R<?> edit(@Valid @RequestBody XpPasswordFreePolicy dto) { // 1. 查询原记录是否存在 XpPasswordFreePolicy routePlan = xpPasswordFreePolicyService.getById(dto.getId()); if (routePlan == null) { throw new ServiceException("数据不存在"); } LoginUser loginUser = tokenService.getLoginUser(); dto.setUpdateBy(loginUser.getUsername()); dto.setUpdateTime(LocalDateTime.now()); xpPasswordFreePolicyService.updateById(dto); return R.ok(); } /** * 删除路线规划配置 */ @ApiOperation(value = "删除免密支付策略", tags = {"管理后台-管理后台-交易定价-免密支付策略"}) @DeleteMapping("/api/v1/passwordFreePolicy/deleteById/{id}") public R<?> deleteById(@PathVariable Long id) { xpPasswordFreePolicyService.deleteById(id); return R.ok(); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPointSituationReportController.java
@@ -1,20 +1,34 @@ package com.xiaopeng.operation.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import com.xiaopeng.api.model.account.SysUser; import com.xiaopeng.api.model.operation.XpPasswordFreePolicy; import com.xiaopeng.api.model.operation.XpPointSituationReport; import com.xiaopeng.api.query.operation.XpPointSituationReportQuery; import com.xiaopeng.api.vo.account.LoginOperationUser; import com.xiaopeng.api.vo.operation.XpPointSituationReportVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.WebUtils; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.common.security.service.TokenService; import com.xiaopeng.operation.exportExcle.XpPointSituationReportExportExcel; import com.xiaopeng.operation.service.IXpPointSituationReportService; import com.xiaopeng.operation.vo.XpAgreementVo; 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 org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("") @@ -28,8 +42,76 @@ /** * 分页查询路线规划配置列表 */ @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}") public R<?> getdetail(@PathVariable Long id) { xpPointSituationReportService.getdetail(id); return R.ok(); } /** * 删除路线规划配置 */ @ApiOperation(value = "删除现场情况上报", tags = {"管理后台-运维-现场情况上报"}) @DeleteMapping("/api/v1/pointSituationReport/deleteById/{id}") public R<?> deleteById(@PathVariable Long id) { xpPointSituationReportService.deleteById(id); return R.ok(); } @ApiOperation(value = "导出现场情况上报", tags = {"管理后台-运维-现场情况上报"}) @PostMapping(value = "/api/v1/pointSituationReport/exportExcels") public void exportExcels(@RequestBody XpPointSituationReportQuery query) { List<XpPointSituationReportVo> exportList = xpPointSituationReportService.exportList(query); List<XpPointSituationReportExportExcel> exportExcels = new ArrayList<>(); long sequence = 1L; for (XpPointSituationReportVo bean : exportList) { XpPointSituationReportExportExcel exportExcel = new XpPointSituationReportExportExcel(); BeanUtils.copyProperties(bean,exportExcel); exportExcel.setId(sequence++); LocalDateTime time = bean.getReportingTime(); exportExcel.setReportingTimeStr(time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); exportExcels.add(exportExcel); } SysUser sysUser = tokenService.getLoginUser().getSysUser(); //1.获取excel模板 Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpPointSituationReportExportExcel.class, exportExcels); HttpServletResponse response = WebUtils.response(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); ServletOutputStream outputStream = null; try { String fileName = URLEncoder.encode("现场情况上报列表.xls", "utf-8"); response.setHeader("Content-dispodition", "attachment;filename=" + fileName); outputStream = response.getOutputStream(); workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } @ApiOperation(value = "现场情况上报", tags = {"运维APP-站点管理"}, response = XpPointSituationReport.class) @PostMapping("/maintenance-app/api/v1/pointSituationReport/addPointSituationReport") xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPricingController.java
@@ -6,6 +6,8 @@ import com.xiaopeng.api.dto.map.RouteAndFareDto; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.feignClient.account.UserResourcesClient; import com.xiaopeng.api.feignClient.maintenance.XpVehicleModelClient; import com.xiaopeng.api.model.maintenance.XpVehicleModel; import com.xiaopeng.api.model.operation.XpPricing; import com.xiaopeng.api.model.operation.XpWhitelist; import com.xiaopeng.api.vo.operation.RouteAndFareVo; @@ -27,8 +29,11 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.ArrayList; import java.util.List; /** * <p> @@ -51,6 +56,9 @@ private final IXpWhitelistService xpWhitelistService; private final XpOpenCityService xpOpenCityService; private final ImageTagProcessor imageTagProcessor; @Resource private XpVehicleModelClient xpVehicleModelClient; public XpPricingController(XpPricingService xpPricingService, IXpGeoQueryEntityService xpGeoQueryEntityService, UserResourcesClient userResourcesClient, IXpWhitelistService xpWhitelistService, XpRegionService xpRegionService, XpOpenCityService xpOpenCityService, ImageTagProcessor imageTagProcessor) { this.xpPricingService = xpPricingService; @@ -206,6 +214,11 @@ String cityName = xpOpenCityService.getNameWithCityName(pricing.getCityId()); pricing.setCityName(cityName); R<List<XpVehicleModel>> listR = xpVehicleModelClient.listByIds(new ArrayList<String>(){{add(pricing.getVehicleModel());}}); if(listR != null && listR.getData() != null) { XpVehicleModel xpVehicleModel = listR.getData().get(0); pricing.setVehicleModelName(xpVehicleModel.getName()); } String priceRule = pricing.getPriceRule(); if (priceRule != null && priceRule.contains("<img")) { xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpPointSituationReportExportExcel.java
New file @@ -0,0 +1,46 @@ package com.xiaopeng.operation.exportExcle; import cn.afterturn.easypoi.excel.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value="现场情况上报导出") public class XpPointSituationReportExportExcel { @ApiModelProperty(value = "序号") @Excel(name = "序号",width = 20) private Long id; @ApiModelProperty(value = "点位ID") @Excel(name = "点位ID",width = 20) private String pointNumber; @ApiModelProperty(value = "点位名称") @Excel(name = "点位名称",width = 20) private String pointName; @ApiModelProperty(value = "点位状态名称") @Excel(name = "状态",width = 20) private String pointStatusName; @ApiModelProperty(value = "现场情况(1=正常,2=异常)") @Excel(name = "现场情况",width = 20) private String fieldSituationName; /** * 现场情况说明 */ @ApiModelProperty("现场情况说明") @Excel(name = "现场情况说明",width = 20) private String sceneDescription; @ApiModelProperty(value = "上报运维名称") @Excel(name = "上报人",width = 20) private String operationsUserName; @ApiModelProperty("上报时间") @Excel(name = "序号",width = 20) private String reportingTimeStr; } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/mapper/XpPasswordFreePolicyMapper.java
New file @@ -0,0 +1,30 @@ package com.xiaopeng.operation.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xiaopeng.api.model.operation.XpPasswordFreePolicy; import com.xiaopeng.api.query.operation.XpPasswordFreePolicyQuery; import com.xiaopeng.api.query.operation.XpPointSituationReportQuery; import com.xiaopeng.api.vo.operation.XpPointSituationReportVo; import com.xiaopeng.common.core.web.page.PageInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface XpPasswordFreePolicyMapper extends BaseMapper<XpPasswordFreePolicy> { /** * 分页查询路线规划配置列表 * * @param pageInfo 分页信息 * @param query 查询条件 * @return 路线规划配置列表 */ List<XpPasswordFreePolicy> pageList(@Param("pageInfo") PageInfo<XpPasswordFreePolicy> pageInfo, @Param("query") XpPasswordFreePolicyQuery query); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/mapper/XpPointSituationReportMapper.java
@@ -2,6 +2,29 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xiaopeng.api.model.operation.XpPointSituationReport; import com.xiaopeng.api.query.operation.XpPointSituationReportQuery; import com.xiaopeng.api.vo.operation.XpPointSituationReportVo; import com.xiaopeng.common.core.web.page.PageInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface XpPointSituationReportMapper extends BaseMapper<XpPointSituationReport> { /** * 分页查询路线规划配置列表 * * @param pageInfo 分页信息 * @param query 查询条件 * @return 路线规划配置列表 */ List<XpPointSituationReportVo> pageList(@Param("pageInfo") PageInfo<XpPointSituationReportVo> pageInfo, @Param("query") XpPointSituationReportQuery query); List<XpPointSituationReportVo> pageList(@Param("query") XpPointSituationReportQuery query); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpPointSituationReportService.java
@@ -2,6 +2,18 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.api.model.operation.XpPointSituationReport; import com.xiaopeng.api.query.operation.XpPointSituationReportQuery; import com.xiaopeng.api.vo.operation.XpPointSituationReportVo; import com.xiaopeng.common.core.web.page.PageInfo; import java.util.List; public interface IXpPointSituationReportService extends IService<XpPointSituationReport> { PageInfo<XpPointSituationReportVo> pageList(XpPointSituationReportQuery query); XpPointSituationReportVo getdetail(Long id); List<XpPointSituationReportVo> exportList(XpPointSituationReportQuery query); void deleteById(Long id); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpPasswordFreePolicyService.java
New file @@ -0,0 +1,14 @@ package com.xiaopeng.operation.service; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.api.model.operation.XpPasswordFreePolicy; import com.xiaopeng.api.query.operation.XpPasswordFreePolicyQuery; import com.xiaopeng.common.core.web.page.PageInfo; public interface XpPasswordFreePolicyService extends IService<XpPasswordFreePolicy> { PageInfo<XpPasswordFreePolicy> pageList(XpPasswordFreePolicyQuery query); void deleteById(Long id); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPasswordFreePolicyServiceImpl.java
New file @@ -0,0 +1,45 @@ package com.xiaopeng.operation.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.model.operation.XpPasswordFreePolicy; import com.xiaopeng.api.query.operation.XpPasswordFreePolicyQuery; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.operation.mapper.XpPasswordFreePolicyMapper; import com.xiaopeng.operation.service.XpPasswordFreePolicyService; import org.springframework.stereotype.Service; import java.util.List; @Service public class XpPasswordFreePolicyServiceImpl extends ServiceImpl<XpPasswordFreePolicyMapper, XpPasswordFreePolicy> implements XpPasswordFreePolicyService { @Override public PageInfo<XpPasswordFreePolicy> pageList(XpPasswordFreePolicyQuery query) { // 创建分页对象 PageInfo<XpPasswordFreePolicy> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); // 调用Mapper查询 List<XpPasswordFreePolicy> list = this.baseMapper.pageList(pageInfo, query); // 设置结果 pageInfo.setRecords(list); return pageInfo; } @Override public void deleteById(Long id) { // 1. 检查记录是否存在 XpPasswordFreePolicy bean = this.getById(id); if (bean == null) { throw new ServiceException("密支付策略配置不存在"); } // 2. 逻辑删除(MyBatis-Plus自动处理) this.removeById(id); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointSituationReportServiceImpl.java
@@ -1,12 +1,138 @@ package com.xiaopeng.operation.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.feignClient.account.XpOperationUserClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.model.operation.XpPointSituationReport; import com.xiaopeng.api.model.vehicleConvoy.XpFleet; import com.xiaopeng.api.query.operation.XpPointSituationReportQuery; import com.xiaopeng.api.vo.operation.XpPointSituationReportVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.operation.mapper.XpPointSituationReportMapper; import com.xiaopeng.operation.service.IXpPointSituationReportService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; @Service public class XpPointSituationReportServiceImpl extends ServiceImpl<XpPointSituationReportMapper, XpPointSituationReport> implements IXpPointSituationReportService { @Autowired private XpOperationUserClient xpOperationUserClient; @Resource private XpFleetOperationsClient xpFleetOperationsClient; @Override public PageInfo<XpPointSituationReportVo> pageList(XpPointSituationReportQuery query) { // 创建分页对象 PageInfo<XpPointSituationReportVo> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); // 调用Mapper查询 List<XpPointSituationReportVo> list = this.baseMapper.pageList(pageInfo, query); extracted(list); // 设置结果 pageInfo.setRecords(list); return pageInfo; } private void extracted(List<XpPointSituationReportVo> list) { if(!list.isEmpty()){ // 收集所有运维人员ID Set<Long> operationsUserIds = list.stream() .map(XpPointSituationReportVo::getOperationsUserId) .filter(Objects::nonNull) .collect(Collectors.toSet()); // 批量查询操作人信息 Map<Long, String> userNameMap = new HashMap<>(); if (!CollectionUtils.isEmpty(operationsUserIds)) { R<List<XpOperationsUser>> userResult = xpOperationUserClient.listByIds(operationsUserIds); List<XpOperationsUser> users = userResult.getData(); if (!CollectionUtils.isEmpty(users)) { userNameMap = users.stream() .collect(Collectors.toMap(XpOperationsUser::getId, XpOperationsUser::getNickName)); } } for (XpPointSituationReportVo bean : list) { if (userNameMap.containsKey(bean.getOperationsUserId())){ bean.setOperationsUserName(userNameMap.get(bean.getOperationsUserId())); } if(bean.getOperationStatus() != null){//运营状态 1=待启用 2=启用中 3=已停用 4=已失效 if(bean.getOperationStatus() == 1){ bean.setPointStatusName("待启用"); }else if(bean.getOperationStatus() == 2){ bean.setPointStatusName("启用中"); }else if(bean.getOperationStatus() == 3){ bean.setPointStatusName("已停用"); }else if(bean.getOperationStatus() == 4){ bean.setPointStatusName("已失效"); } } } } } @Override public XpPointSituationReportVo getdetail(Long id) { XpPointSituationReportQuery query = new XpPointSituationReportQuery(); query.setId(id); List<XpPointSituationReportVo> list = this.baseMapper.pageList(query); if(list.isEmpty()){ throw new ServiceException("未查询该数据"); } XpPointSituationReportVo bean = list.get(0); // 批量查询操作人信息 R<List<XpOperationsUser>> userResult = xpOperationUserClient.listByIds(new ArrayList<Long>(){{ add(bean.getOperationsUserId()); }} ); List<XpOperationsUser> users = userResult.getData(); if (CollectionUtils.isEmpty(users)) { throw new ServiceException("未查询该运维人员"); } Map<Long, String> userNameMap = users.stream() .collect(Collectors.toMap(XpOperationsUser::getId, XpOperationsUser::getNickName)); bean.setOperationsUserName(userNameMap.get(bean.getOperationsUserId())); R<List<XpFleet>> fleetByUserId = xpFleetOperationsClient.getFleetByUserId(bean.getOperationsUserId()); if(fleetByUserId.getCode() != R.SUCCESS || fleetByUserId.getData().isEmpty()){ throw new ServiceException("未查询该车队"); } bean.setOperationsUserFleetName(fleetByUserId.getData().get(0).getFleetName()); return bean; } @Override public List<XpPointSituationReportVo> exportList(XpPointSituationReportQuery query) { List<XpPointSituationReportVo> list = this.baseMapper.pageList(query); extracted(list); return list; } @Override public void deleteById(Long id) { // 1. 检查记录是否存在 XpPointSituationReport bean = this.getById(id); if (bean == null) { throw new ServiceException("密支付策略配置不存在"); } // 2. 逻辑删除(MyBatis-Plus自动处理) this.removeById(id); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
@@ -13,9 +13,10 @@ import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.feignClient.account.XpAppUserClient; import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient; import com.xiaopeng.api.feignClient.maintenance.XpVehicleModelClient; import com.xiaopeng.api.feignClient.map.XpMapClient; import com.xiaopeng.api.feignClient.order.XpOrderClient; import com.xiaopeng.api.model.account.XpAppUser; import com.xiaopeng.api.model.maintenance.XpVehicleModel; import com.xiaopeng.api.model.operation.*; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.vo.account.UserCouponVo; @@ -33,14 +34,14 @@ import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.operation.constant.I18nKeyConstant; import com.xiaopeng.operation.dto.*; import com.xiaopeng.operation.job.base.QuartzManager; import com.xiaopeng.operation.job.base.TimeJobType; import com.xiaopeng.operation.job.jobs.DynamicPricingCheckJob; import com.xiaopeng.operation.mapper.*; import com.xiaopeng.operation.query.PricingPageListQuery; import com.xiaopeng.operation.service.IXpGeoQueryEntityService; import com.xiaopeng.operation.service.XpPointService; import com.xiaopeng.operation.service.XpPricingService; import com.xiaopeng.operation.job.base.QuartzManager; import com.xiaopeng.operation.job.base.TimeJobType; import com.xiaopeng.operation.job.jobs.DynamicPricingCheckJob; import com.xiaopeng.operation.utils.XpPricingUtil; import com.xiaopeng.operation.utils.holiday.HolidayUtil; import com.xiaopeng.operation.utils.map.FastDistanceCalculator; @@ -103,6 +104,8 @@ private XpElectronicFenceAreaMapper xpElectronicFenceAreaMapper; @Resource private XpVehicleModelClient xpVehicleModelClient; @Resource private XpWhitelistMapper xpWhitelistMapper; @@ -680,6 +683,23 @@ Page<PricingPageListVO> page = this.baseMapper.pageList(pageInfo, query); pageInfo.setRecords(page.getRecords()); pageInfo.setTotal(page.getTotal()); if(page.getRecords() != null){ Set<String> vehicleModelIds = page.getRecords().stream().map(PricingPageListVO::getVehicleModel).collect(Collectors.toSet()); R<List<XpVehicleModel>> listR = xpVehicleModelClient.listByIds(vehicleModelIds); if(listR != null && listR.getData() != null){ List<XpVehicleModel> vehicleModels = listR.getData(); Map<String, XpVehicleModel> vehicleModelMap = new HashMap<>(); for (XpVehicleModel vehicleModel : vehicleModels) { vehicleModelMap.put(vehicleModel.getId().toString(), vehicleModel); } for (PricingPageListVO record : page.getRecords()) { XpVehicleModel xpVehicleModel = vehicleModelMap.get(record.getVehicleModel()); if(xpVehicleModel != null){ record.setVehicleModelName(xpVehicleModel.getName()); } } } } return pageInfo; } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/vo/PricingPageListVO.java
@@ -24,6 +24,9 @@ @ApiModelProperty(value = "车型") private String vehicleModel; @ApiModelProperty(value = "车型名称") private String vehicleModelName; @ApiModelProperty(value = "使用城市") private String useCity; xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpPasswordFreePolicyMapper.xml
New file @@ -0,0 +1,23 @@ <?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.XpPasswordFreePolicyMapper"> <!-- 分页查询路线规划配置列表 --> <select id="pageList" resultType="com.xiaopeng.api.model.operation.XpPasswordFreePolicy"> SELECT a.* FROM xp_password_free_policy as a WHERE a.is_deleted = 0 <if test="query.cityName != null and query.cityName != ''"> AND a.city_name LIKE CONCAT('%', #{query.cityName}, '%') </if> <if test="query.createTimeStart != null"> AND a.create_time >= #{query.createTimeStart} </if> <if test="query.createTimeEnd != null"> AND a.create_time <= #{query.createTimeEnd} </if> ORDER BY a.create_time DESC </select> </mapper> xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpPointSituationReportMapper.xml
@@ -2,4 +2,49 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xiaopeng.operation.mapper.XpPointSituationReportMapper"> <!-- 分页查询路线规划配置列表 --> <select id="pageList" resultType="com.xiaopeng.api.vo.operation.XpPointSituationReportVo"> SELECT a.*,b.point_name,b.point_number,b.point_type,b.operation_status,b.verification_status FROM xp_point_situation_report as a 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} </if> <if test="query.ids != null and query.ids.size() > 0"> AND a.id IN <foreach collection="query.ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </if> <if test="query.pointName != null and query.pointName != ''"> AND b.point_name LIKE CONCAT('%', #{query.pointName}, '%') </if> <if test="query.pointNumber != null and query.pointNumber != ''"> AND b.point_number LIKE CONCAT('%', #{query.pointNumber}, '%') </if> <if test="query.fieldSituation != null and query.fieldSituation != ''"> AND a.field_situation = #{query.fieldSituation} </if> <if test="query.operationsUserId != null and query.operationsUserId != ''"> AND a.operations_user_id = #{query.operationsUserId} </if> <if test="query.reportingTimeStart != null"> AND a.reporting_time >= #{query.reportingTimeStart} </if> <if test="query.reportingTimeEnd != null"> AND a.reporting_time <= #{query.reportingTimeEnd} </if> ORDER BY a.create_time DESC </select> </mapper> xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetOperationsController.java
@@ -56,6 +56,25 @@ } /** * 根据人员id 获取所属车队 * * @param id 运维人员id * @return 车辆isd */ @GetMapping("/logan/inner/fleet-operations/getFleetByUserId/{id}") public R<List<XpFleet>> getFleetByUserId(@PathVariable("id") Long id){ List<Long> fleetIds = xpFleetOperationsService.lambdaQuery().eq(XpFleetOperations::getOperationsUserId, id) .list().stream().map(XpFleetOperations::getFleetId).collect(Collectors.toList()); if (CollectionUtils.isEmpty(fleetIds)){ return R.ok(new ArrayList<>()); } List<XpFleet> xpFleets = xpFleetService.listByIds(fleetIds); return R.ok(xpFleets); } /** * 根据运维人员ID查询关联的车队ID列表(内部接口) * * @param userId 运维人员ID