“mitao”
2026-02-28 53e51ca607340232911bfa277d1ce7d641fb34bc
Merge remote-tracking branch 'origin/master'
12个文件已修改
219 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/AliPushMessageDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpOperationsUserNotification.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpPricingCardVo.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpSchedulingDetailServiceImpl.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/IndexController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpElectronicFenceController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPointManagementController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/AliPushMessageDTO.java
@@ -2,13 +2,13 @@
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Builder
@Accessors(chain = true)
@ApiModel(value = "ali推送消息AliPushMessageDTO")
public class AliPushMessageDTO implements Serializable {
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpOperationsUserNotification.java
@@ -50,4 +50,7 @@
    @ApiModelProperty(value = "是否已读 0-未读 1-已读")
    private Integer readStatus;
    @ApiModelProperty(value = "阿里云推送body内容")
    private String notificationExt;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpPricingCardVo.java
@@ -44,4 +44,9 @@
    @ApiModelProperty(value = "优惠券")
    private String coupon;
    @ApiModelProperty("系统优惠金额")
    private Double systemDiscount;
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -287,7 +287,13 @@
        }
        UserCouponVo userCouponVo = couponResult.getData();
        if (userCouponVo != null) {
            Double money = userCouponVo.getMoney();
            xpPricingCardVo.setCoupon(String.valueOf(userCouponVo.getMoney()));
            if(xpPricingCardVo.getTotalPrice()> money){
                xpPricingCardVo.setSystemDiscount(xpPricingCardVo.getTotalPrice() - money);
            }
        }
        // 8. 构建响应对象
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
@@ -156,7 +156,7 @@
        return xpTaskService.taskDetail(id);
    }
    @ApiOperation(value = "查询车辆不分页列表")
    @PostMapping(" /listVehicle")
    @PostMapping("/listVehicle")
    public R<List<XpVehicle>> listVehicle() {
        List<XpVehicle> vehicles = xpVehicleClient.listVehicle().getData();
        if (vehicles == null){
@@ -177,7 +177,7 @@
    @ApiOperation(value = "事故类型列表", response = XpErrorType.class, tags = "管理后台-车辆管理-运营车辆管理")
    @GetMapping(" /errorTypeTreeList")
    @GetMapping("/errorTypeTreeList")
    public R<List<XpErrorType>> errorTypeTreeList() {
        return xpErrorTypeService.errorTypeList();
    }
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpSchedulingDetailServiceImpl.java
@@ -1,16 +1,24 @@
package com.xiaopeng.maintenance.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO;
import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
import com.xiaopeng.api.feignClient.account.XpOperationUserNotificationClient;
import com.xiaopeng.api.feignClient.maintenance.XpCheckLocationClient;
import com.xiaopeng.api.feignClient.pushMessage.XpAliPushMessageClient;
import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
import com.xiaopeng.api.model.account.XpOperationsUser;import com.xiaopeng.api.model.maintenance.*;
import com.xiaopeng.api.model.account.XpOperationsUser;
import com.xiaopeng.api.model.account.XpOperationsUserNotification;
import com.xiaopeng.api.model.maintenance.*;
import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.NotificationTypeEnum;
import com.xiaopeng.common.core.utils.poi.ExcelUtil;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.maintenance.dto.ExportSchedulingDetailDto;
@@ -36,6 +44,9 @@
import java.time.format.TextStyle;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
 * <p>
@@ -64,6 +75,10 @@
    private XpFleetOperationsClient xpFleetOperationsClient;
    @Resource
    private XpOperationUserClient xpOperationUserClient;
    @Resource
    private XpAliPushMessageClient xpAliPushMessageClient;
    @Resource
    private XpOperationUserNotificationClient xpOperationUserNotificationClient;
    @Override
    public ShiftAttendanceVO shiftAttendance(ShiftAttendanceDTO dto) {
@@ -395,6 +410,10 @@
        //构建排班明细数据
        List<SaveSchedulingDetailVo> datas = vo.getDatas();
        List<XpSchedulingDetail> schedulingDetails = new ArrayList<>();
        //存放推送消息
        List<AliPushMessageDTO> pushMessage = new ArrayList<>();
        //存放通知数据
        List<XpOperationsUserNotification> notifications = new ArrayList<>();
        for (SaveSchedulingDetailVo data : datas) {
            Long fleetId = data.getFleetId();
            List<SaveSchedulingDetailDay> days = data.getDays();
@@ -428,7 +447,12 @@
                            for (XpOperationsUser xpOperationsUser : data1) {
                                String nickName = xpOperationsUser.getNickName();
                                String message = nickName + "请注意," + month + "你的排班由" + xpShift1.getShiftName() + "变更为了" + xpShift2.getShiftName() + "。详情请联系平台管理员。";
                                //构建消息推送对象
                                AliPushMessageDTO aliPushMessageDTO = buildPushMessage(message, xpOperationsUser);
                                pushMessage.add(aliPushMessageDTO);
                                //构建消息存储
                                XpOperationsUserNotification operationsUserNotification = buildXpOperationsUserNotification(message, aliPushMessageDTO.getBody(), xpOperationsUser);
                                notifications.add(operationsUserNotification);
                            }
                        }
                    }
@@ -448,11 +472,74 @@
        if(schedulingDetails.isEmpty()){
            this.saveOrUpdateBatch(schedulingDetails);
        }
        //异步处理消息通知数据
        pushMessage(pushMessage, notifications);
        return R.ok();
    }
    /**
     * 构建推送消息对象
     * @param message
     * @param xpOperationsUser
     * @return
     */
    private AliPushMessageDTO buildPushMessage(String message, XpOperationsUser xpOperationsUser){
        JSONObject body = new JSONObject();
        body.put("content", message);
        body.put("strategy", 4);
        body.put("type", 0);
        body.put("id", 0);
        AliPushMessageDTO aliPushMessageDTO = new AliPushMessageDTO();
        aliPushMessageDTO.setDeviceType(xpOperationsUser.getDeviceType());
        aliPushMessageDTO.setAccount(xpOperationsUser.getPhoneNumber());
        aliPushMessageDTO.setTitle("排班变更提示");
        aliPushMessageDTO.setBody(body.toJSONString());
        aliPushMessageDTO.setPushType("NOTICE");
        return aliPushMessageDTO;
    }
    /**
     * 构建消息存储
     * @param body
     * @param xpOperationsUser
     * @return
     */
    private XpOperationsUserNotification buildXpOperationsUserNotification(String message, String body, XpOperationsUser xpOperationsUser){
        XpOperationsUserNotification operationsUserNotification = new XpOperationsUserNotification();
        operationsUserNotification.setNotificationType(NotificationTypeEnum.SCHEDULE_CHANGED.getCode());
        operationsUserNotification.setNotificationContent(message);
        operationsUserNotification.setOperationsUserId(xpOperationsUser.getId());
        operationsUserNotification.setReadStatus(0);
        operationsUserNotification.setNotificationExt(body);
        return operationsUserNotification;
    }
    /**
     * 异步处理消息推送
     * @param pushMessage
     * @param notifications
     */
    private void pushMessage(List<AliPushMessageDTO> pushMessage, List<XpOperationsUserNotification> notifications) {
        if(pushMessage.isEmpty()){
            return;
        }
        ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
        executor.execute(() -> {
            xpOperationUserNotificationClient.addNotificationBatch(notifications);
            for (AliPushMessageDTO aliPushMessageDTO : pushMessage) {
                xpAliPushMessageClient.pushMessage(aliPushMessageDTO);
            }
        });
    }
    /**
     * 导出排班数据
     * @param month
     * @param response
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/IndexController.java
@@ -40,7 +40,7 @@
    }
    @ApiOperation(value = "点位管理列表", tags = {"运维APP-站点导航"})
    @PostMapping("/list")
    @PostMapping("/api/v1/map/list")
    public R<List<XpPoint>> list(@RequestBody PointListQuery query) {
        return pointClient.list( query);
    }
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
@@ -59,8 +59,8 @@
     */
    @PostMapping("/add")
    @ApiOperation(value = "新增电子围栏")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R add(@Validated @RequestBody ElectronicFenceAddDto dto) {
        return xpElectronicClient.add(dto);
@@ -74,8 +74,8 @@
    @PostMapping("/updateStatus")
    @ResponseBody
    @ApiOperation(value = "修改状态")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R updateStatus(@RequestBody ElectronicFenceAreaUpdateStatusDto dto) {
        return xpElectronicClient.updateStatus(dto);
@@ -97,8 +97,9 @@
    @PostMapping("/edit")
    @ResponseBody
    @ApiOperation(value = "编辑电子围栏")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)    public R edit(@Validated @RequestBody ElectronicFenceUpdateDto dto) {
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R edit(@Validated @RequestBody ElectronicFenceUpdateDto dto) {
        return xpElectronicClient.edit(dto);
    }
@@ -107,8 +108,8 @@
     */
    @PostMapping("/copy")
    @ApiOperation(value = "复制电子围栏")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R<Long> copy(@RequestParam("id") Integer id) {
        return xpElectronicClient.copy(id);
    }
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java
@@ -121,8 +121,8 @@
    @PostMapping("/add")
    @ApiOperation(value = "新增点位")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R add(@Validated  @RequestBody PointAddDto pointAddDto) {
        xpPointClient.add(pointAddDto);
        return R.ok();
@@ -131,9 +131,9 @@
     * 编辑点位
     */
    @PostMapping("/edit")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
    @ApiOperation(value = "编辑点位")
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R edit(@Validated@RequestBody PointUpdateDto pointAddDto) {
        xpPointClient.edit(pointAddDto);
        return R.ok();
@@ -142,10 +142,9 @@
     * 批量删除点位
     */
    @GetMapping("/deletePoint")
    @ResponseBody
    @ApiOperation(value = "删除点位")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R deletePoint(@RequestParam("ids") String ids) {
        xpPointClient.deletePoint(ids);
        return R.ok();
@@ -165,8 +164,8 @@
    @PostMapping("/enableDisable")
    @ResponseBody
    @ApiOperation(value = "启用/禁用")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R enableDisable(@RequestBody XpPointEnableDisableDto dto) {
        return xpPointClient.enableDisable(dto);
    }
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpElectronicFenceController.java
@@ -84,8 +84,8 @@
     */
    @PostMapping("/add")
    @ApiOperation(value = "新增电子围栏")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R add(@Validated @RequestBody ElectronicFenceAddDto dto) {
        return xpElectronicFenceService.addElectronic(dto);
    }
@@ -98,8 +98,8 @@
    @PostMapping("/updateStatus")
    @ResponseBody
    @ApiOperation(value = "修改状态")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R updateStatus(@RequestBody ElectronicFenceAreaUpdateStatusDto dto) {
        XpElectronicFenceArea electronicFenceArea = xpElectronicFenceAreaService.getById(dto.getId());
        if (electronicFenceArea == null) {
@@ -138,8 +138,8 @@
     */
    @PostMapping("/edit")
    @ApiOperation(value = "编辑电子围栏")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R edit(@Validated @RequestBody ElectronicFenceUpdateDto dto) {
        return xpElectronicFenceService.editElectronic(dto);
    }
@@ -149,8 +149,8 @@
     */
    @PostMapping("/copy")
    @ApiOperation(value = "复制电子围栏")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R<Long> copy(@RequestParam("id") Integer id) {
        XpElectronicFence electronicFence = xpElectronicFenceService.getById(id);
        if (electronicFence.getStatus()==2){
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPointManagementController.java
@@ -85,9 +85,9 @@
     */
    @PostMapping("/addPoint")
    @ResponseBody
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
    @ApiOperation(value = "新增点位")
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R add(@Validated  @RequestBody PointAddDto pointAddDto) {
        XpPoint xpPoint = new XpPoint();
        BeanUtils.copyProperties(pointAddDto, xpPoint);
@@ -100,8 +100,8 @@
    @GetMapping("/deletePoint")
    @ResponseBody
    @ApiOperation(value = "删除点位")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R deletePoint(@RequestParam("ids") String ids) {
        xpPointService.removeBatchByIds(Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList()));
        return R.ok();
@@ -111,8 +111,8 @@
     */
    @PostMapping("/editPoint")
    @ApiOperation(value = "编辑点位")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R edit(@Validated@RequestBody PointUpdateDto pointAddDto) {
        XpPoint xpPoint = new XpPoint();
        BeanUtils.copyProperties(pointAddDto, xpPoint);
@@ -132,8 +132,8 @@
     */
    @PostMapping("/enableDisablePoint")
    @ApiOperation(value = "启用/禁用")
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
//    @Transactional
//    @ShardingSphereTransactionType(TransactionType.BASE)
    public R enableDisable(@RequestBody XpPointEnableDisableDto dto) {
        XpPoint xpPoint = xpPointService.getById(dto.getId());
        xpPoint.setOperationStatus(dto.getOperationStatus());
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -1403,7 +1403,7 @@
            useUserCouponDto.setUserCouponId(order.getCouponId());
            xpAppUserCouponClient.useUserCoupon(useUserCouponDto);
        }
// 计算完价格后 挑选优惠券
       // 计算完价格后 挑选优惠券
        GetUserCouponDto getUserCouponDto = new GetUserCouponDto();
        getUserCouponDto.setUserId(Long.valueOf(uid));
        getUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue());
@@ -1415,10 +1415,31 @@
        }
        order.setAppUserId(null);
        baseMapper.updateById(order);
        // 结束后的车辆操作
        if(vehicle!=null){
            // 修改车辆状态
            vehicle.setState(0);
            xpVehicleClient.updateVehicleById(vehicle);
            // 修改mongodb车辆状态
            // 生成新的巡游单子 回到最新巡游的初始起点位置
            XpCruiseOrder xpCruiseOrders = xpCruiseOrderMapper.selectOne(new LambdaQueryWrapper<XpCruiseOrder>().eq(XpCruiseOrder::getVehicleId, vehicle.getId()).eq(XpCruiseOrder::getStatus, 2).orderByDesc(BaseModel::getCreateTime).last("limit 1"));
            int temp=0;
            if(xpCruiseOrders==null){
                temp=1;
                //特殊情况 可能没有产生终止的订单  (到站点就被正常接单了)所以找正常订单
                xpCruiseOrders=xpCruiseOrderMapper.selectOne(new LambdaQueryWrapper<XpCruiseOrder>().eq(XpCruiseOrder::getVehicleId, vehicle.getId()).eq(XpCruiseOrder::getStatus, 3).orderByDesc(BaseModel::getCreateTime).last("limit 1"));
            }
            XpCruiseOrder xpCruiseOrder = new XpCruiseOrder();
            xpCruiseOrder.setVehicleId(vehicle.getId());
            xpCruiseOrder.setFleetId(vehicle.getFleetId());
@@ -1430,10 +1451,19 @@
            xpCruiseOrder.setStartLon(order.getEndLon());
            xpCruiseOrder.setStartLat(order.getEndLat());
            xpCruiseOrder.setEndPointId(xpCruiseOrders.getStartPointId());
            xpCruiseOrder.setEndPointName(xpCruiseOrders.getStartPointName());
            xpCruiseOrder.setEndLon(xpCruiseOrders.getStartLon());
            xpCruiseOrder.setEndLat(xpCruiseOrders.getStartLat());
            // 完成的直接走终点   终止的走起点
            if(temp==0){
                xpCruiseOrder.setEndPointId(xpCruiseOrders.getStartPointId());
                xpCruiseOrder.setEndPointName(xpCruiseOrders.getStartPointName());
                xpCruiseOrder.setEndLon(xpCruiseOrders.getStartLon());
                xpCruiseOrder.setEndLat(xpCruiseOrders.getStartLat());
            }else {
                xpCruiseOrder.setEndPointId(xpCruiseOrders.getEndPointId());
                xpCruiseOrder.setEndPointName(xpCruiseOrders.getEndPointName());
                xpCruiseOrder.setEndLon(xpCruiseOrders.getEndLon());
                xpCruiseOrder.setEndLat(xpCruiseOrders.getEndLat());
            }
            xpCruiseOrder.setStatus(1);
            xpCruiseOrder.setLastOrderId(xpCruiseOrders.getId());