1.处理后台巡游打卡计划多个用户选择
2.处理对接发票字段新增
3.后台巡游打卡计划新增编辑功能
12个文件已修改
249 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpCruiseCheckInRule.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpInvoiceVo.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/XpCruiseCheckInRuleDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRuleService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleInfoVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
@@ -47,7 +47,9 @@
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -129,6 +131,26 @@
    }
    /**
     * 根据ID查询运维用户信息
     * @return 用户列表
     */
    @GetMapping("/logan/inner/xpOperationsUser/queryByIds")
    R<List<XpOperationsUser>> queryByIds(@RequestParam String operationsUserId) {
        List<Long> ids = Arrays.stream(operationsUserId.split(","))
                .map(Long::parseLong)
                .collect(Collectors.toList());
        List<XpOperationsUser> operationsUser = xpOperationsUserService.listByIds(ids);
        for (XpOperationsUser xpOperationsUser : operationsUser) {
            XpOperationsRole role = xpOperationsRoleMapper.selectOne(new QueryWrapper<XpOperationsRole>().eq("operations_user_id", xpOperationsUser.getId()));
            SysRole sysRole = sysRoleService.getById(role.getRoleId());
            xpOperationsUser.setRoleName(sysRole.getRoleName());
            xpOperationsUser.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(xpOperationsUser.getPhoneNumber()));
        }
        return R.ok(operationsUser);
    }
    /**
     * 根据昵称查询运维用户信息
     *
     * @param nickName 昵称
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java
@@ -98,6 +98,12 @@
                log.error("根据id列表获取运维人员列表失败,原因:{}", cause.getMessage());
                return R.fail("根据id列表获取运维人员列表失败)" + cause.getMessage());
            }
            @Override
            public R<List<XpOperationsUser>> queryByIds(String operationsUserId) {
                log.error("根据id查询运维人员用户信息失败,原因: {}", cause.getMessage());
                return R.ok(null);
            }
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java
@@ -114,4 +114,14 @@
    @PostMapping("/logan/inner/xpOperationsUser/pageListByIds")
    R<PageInfo<XpOperationsUserWithRoleVO>> listByQueryIds(@RequestBody OptionalUsersPageListQuery query);
    /**
     * 根据多个id查询运维用户信息
     * @param operationsUserId
     * @return
     */
    @GetMapping("/logan/inner/xpOperationsUser/queryByIds")
    R<List<XpOperationsUser>> queryByIds(@RequestParam String operationsUserId);
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpCruiseCheckInRule.java
@@ -35,7 +35,7 @@
     */
    @TableField("operations_user_id")
    @ApiModelProperty(value = "运维人id")
    private Long operationsUserId;
    private String operationsUserId;
    /**
     * 任务开始时间
     */
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpInvoiceVo.java
@@ -127,17 +127,22 @@
        @ApiModelProperty(value = "行程结束日期,格式:yyyy-MM-dd")
        private String tripEndDate;
        @ApiModelProperty(value = "用户名")
        private String userName;
        @ApiModelProperty(value = "用户账号")
        private String userAccount;
        @ApiModelProperty(value = "行程人手机号")
        private String phone;
        @ApiModelProperty(value = "车型")
        private String carType;
        @ApiModelProperty(value = "上车时间")
        private String pickupTime;
        @ApiModelProperty(value = "城市")
        private String city;
        @ApiModelProperty(value = "下车时间")
        private String dropOffTime;
        @ApiModelProperty(value = "起点")
        private String startPoint;
@@ -148,10 +153,13 @@
        @ApiModelProperty(value = "里程(公里)")
        private String mileage;
        @ApiModelProperty(value = "金额(元)")
        private BigDecimal amount;
        @ApiModelProperty(value = "备注")
        private String remark;
        @ApiModelProperty(value = "原价金额")
        private String oldPrice;
        @ApiModelProperty(value = "币种")
        private String currency;
    }
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java
@@ -133,6 +133,21 @@
        return R.ok();
    }
    @ApiOperation(value = "编辑巡游打卡规则", tags = {"管理后台-巡游打卡规则管理"})
    @PostMapping("/maintenance-admin/api/v1/cruiseCheckInRecord/updateXpCruiseCheckInRule")
    @AdminOperationLog(
            businessType = AdminBusinessType.CRUISE_CHECK_IN_RULE_MANAGEMENT,
            operationType = AdminOperationType.EDIT,
            content = "编辑巡游打卡规则",
            appendRequestData = true
    )
    public R<?> updateXpCruiseCheckInRule(@RequestBody XpCruiseCheckInRuleDto dto){
        xpCruiseCheckInRuleService.updateXpCruiseCheckInRule(dto);
        return R.ok();
    }
    @ApiOperation(value = "删除巡游打卡规则", tags = {"管理后台-巡游打卡规则管理"})
    @PostMapping("/maintenance-admin/api/v1/cruiseCheckInRecord/delXpCruiseCheckInRule/{id}")
    @AdminOperationLog(
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/XpCruiseCheckInRuleDto.java
@@ -12,7 +12,7 @@
@ApiModel
public class XpCruiseCheckInRuleDto extends XpCruiseCheckInRule {
    @ApiModelProperty("关联人id")
    private Long relationId;
    private String relationId;
    @ApiModelProperty("打卡点位id")
    private List<XpCruiseCheckInRuleLocation> points;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRuleService.java
@@ -76,6 +76,11 @@
     * @param dto
     */
    void addXpCruiseCheckInRule(XpCruiseCheckInRuleDto dto);
    /**
     * 编辑巡游打卡规则
     * @param dto
     */
    void updateXpCruiseCheckInRule(XpCruiseCheckInRuleDto dto);
    /**
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
@@ -40,6 +40,7 @@
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -313,9 +314,7 @@
            throw new ServiceException("巡游打卡规则名称已存在");
        }
        // 校验同一运维人员是否已存在有效规则(未删除且非循环模式或时间在有效期内)
        long count = this.count(new LambdaQueryWrapper<XpCruiseCheckInRule>()
                .eq(XpCruiseCheckInRule::getOperationsUserId, dto.getRelationId())
                .eq(XpCruiseCheckInRule::getDeleted, false));
        long count = countByAnyOperationsUserId(dto.getRelationId(), null);
        if (count > 0) {
            throw new ServiceException("该运维人员已存在有效的巡游打卡规则");
        }
@@ -325,6 +324,36 @@
        xpCruiseCheckInRule.setDeleted(false);
        xpCruiseCheckInRule.setOperationsUserId(dto.getRelationId());
        this.save(xpCruiseCheckInRule);
        dto.getPoints().forEach(s->{
            s.setCruiseCheckInRuleId(xpCruiseCheckInRule.getId());
        });
        xpCruiseCheckInRuleLocationService.saveBatch(dto.getPoints());
    }
    /**
     * 编辑巡游打卡规则
     * @param dto
     */
    @Override
    public void updateXpCruiseCheckInRule(XpCruiseCheckInRuleDto dto) {
        XpCruiseCheckInRule one = this.getOne(new QueryWrapper<XpCruiseCheckInRule>().like("name", dto.getName()).ne("id", dto.getId()).eq("is_deleted", 0));
        if(null != one){
            throw new ServiceException("巡游打卡规则名称已存在");
        }
        // 校验同一运维人员是否已存在有效规则(未删除且非循环模式或时间在有效期内)
        long count = countByAnyOperationsUserId(dto.getRelationId(), dto.getId());
        if (count > 0) {
            throw new ServiceException("该运维人员已存在有效的巡游打卡规则");
        }
        XpCruiseCheckInRule xpCruiseCheckInRule = new XpCruiseCheckInRule();
        BeanUtils.copyProperties(dto, xpCruiseCheckInRule);
        xpCruiseCheckInRule.setDeleted(false);
        xpCruiseCheckInRule.setOperationsUserId(dto.getRelationId());
        this.updateById(xpCruiseCheckInRule);
        // 移除原来的id
        xpCruiseCheckInRuleLocationService.remove(new LambdaQueryWrapper<XpCruiseCheckInRuleLocation>().eq(XpCruiseCheckInRuleLocation::getCruiseCheckInRuleId, xpCruiseCheckInRule.getId()));
        dto.getPoints().forEach(s->{
            s.setCruiseCheckInRuleId(xpCruiseCheckInRule.getId());
        });
@@ -353,10 +382,36 @@
        }).collect(Collectors.toList());
        info.setLocationList(collect);
        XpOperationsUser xpOperationsUser = xpOperationsUserClient.queryById(byId.getOperationsUserId()).getData();
        List<XpOperationsUser> xpOperationsUser = xpOperationsUserClient.queryByIds(byId.getOperationsUserId()).getData();
        if(null != xpOperationsUser){
            info.setOperationsUser(xpOperationsUser.getNickName());
            info.setOperationsUser(xpOperationsUser.stream().map(XpOperationsUser::getNickName).collect(Collectors.toList()));
        }
        return info;
    }
    private long countByAnyOperationsUserId(String relationId, Integer excludeRuleId) {
        if (StringUtils.isEmpty(relationId)) {
            return 0;
        }
        List<String> relationIds = Arrays.stream(relationId.split(","))
                .map(String::trim)
                .filter(StringUtils::isNotEmpty)
                .collect(Collectors.toList());
        if (relationIds.isEmpty()) {
            return 0;
        }
        LambdaQueryWrapper<XpCruiseCheckInRule> queryWrapper = new LambdaQueryWrapper<XpCruiseCheckInRule>()
                .eq(XpCruiseCheckInRule::getDeleted, false)
                .and(wrapper -> {
                    wrapper.apply("find_in_set({0}, operations_user_id)", relationIds.get(0));
                    for (int i = 1; i < relationIds.size(); i++) {
                        wrapper.or().apply("find_in_set({0}, operations_user_id)", relationIds.get(i));
                    }
                });
        if (excludeRuleId != null) {
            queryWrapper.ne(XpCruiseCheckInRule::getId, excludeRuleId);
        }
        return this.count(queryWrapper);
    }
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleInfoVo.java
@@ -16,5 +16,5 @@
    private List<CruiseCheckInLocationVo> locationList;
    @ApiModelProperty("关联人名称")
    private String operationsUser;
    private List<String> operationsUser;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -915,11 +915,6 @@
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<OrderStatusFromOrderIdVo> queryOrderStatusFromOrderId(Long orderId) {
        XpOrder order = xpOrderService.getById(orderId);
        OrderStatusFromOrderIdVo orderStatusFromOrderIdVo = new OrderStatusFromOrderIdVo();
        orderStatusFromOrderIdVo.setOrderId(order.getId());
        orderStatusFromOrderIdVo.setStatus(order.getStatus());
        return R.ok( xpOrderService.queryOrderStatusFromOrderId(orderId));
    }
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -4744,7 +4744,7 @@
        if(order.getPayType()==3){
            // 免密查询 如果成功则调用结算
            CreditOrderQueryDto dto = new CreditOrderQueryDto();
            dto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF"));
            dto.setBusinessOrderId(order.getBusinessOrderId());
            dto.setAuthOrderId(order.getAuthOrderId());
            dto.setPayType("13");
            R<CreditOrderQueryVo> creditOrderQueryVoR = xpPayFrontClient.queryCreditOrder(dto);
@@ -4954,17 +4954,46 @@
        ArrayList<XpInvoiceVo> xpInvoiceVoList = new ArrayList<>(list.size());
        R<List<XpVehicle>> r = xpVehicleClient.listByIds(list.stream().map(XpOrder::getVehicleId).collect(Collectors.toList()));
        List<XpVehicle> vehicleList = r.getData();
        // 数据组装
        for (XpOrder xpOrder : list) {
            XpInvoiceVo xpInvoiceVo = new XpInvoiceVo();
            xpInvoiceVo.setUid(xpOrder.getAppUserId().toString());
            xpInvoiceVo.setOrderNo(xpOrder.getOrderNumber());
            xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney());
            BigDecimal orderMoney = xpOrder.getOrderMoney() == null ? BigDecimal.ZERO : xpOrder.getOrderMoney();
            XpInvoiceVo.GoodsDetail goodsDetail = new XpInvoiceVo.GoodsDetail();
            goodsDetail.setProductName("Robotaxi出行服务");
            goodsDetail.setProductCode(null);
            goodsDetail.setProductSpecCode("XE2000398");
            goodsDetail.setProductSpec(null);
            goodsDetail.setProductUnit("次");
            goodsDetail.setQuantity(1);
            goodsDetail.setUnitPrice(orderMoney);
            goodsDetail.setInTaxAmount(orderMoney);
            goodsDetail.setTaxRate(null);
            goodsDetail.setTaxAmount(null);
            goodsDetail.setExTaxAmount(null);
            goodsDetail.setItemId(xpOrder.getOrderNumber());
            goodsDetail.setCouponAmount(xpOrder.getCouponMoney());
            goodsDetail.setCompanyCode("8000");
            xpInvoiceVo.setGoodsDetail(JSON.toJSONString(goodsDetail));
            xpInvoiceVo.setOrderTotalAmount(xpOrder.getPayMoney());
            xpInvoiceVo.setOrderBusAmount(xpOrder.getOrderMoney());
            xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney());
            xpInvoiceVo.setOrderFinishTime(xpOrder.getTripEnd()!=null?String.valueOf(xpOrder.getTripEnd()):"");
            JSONObject extData = new JSONObject();
            extData.put("companyCode", "8000");
            extData.put("realCompanyCode", null);
            extData.put("siteName",null);
            extData.put("pile", null);
            extData.put("payFag", null);
            extData.put("supplierCode", null);
            xpInvoiceVo.setExtData(JSON.toJSONString(extData));
            xpInvoiceVo.setXpInvoiceFlag(true);
            xpInvoiceVo.setInvoiceStatus(xpOrder.getInvoiceStatus());
            XpInvoiceVo.Itinerary itinerary = new XpInvoiceVo.Itinerary();
@@ -4973,15 +5002,11 @@
            itinerary.setTripEndDate(xpOrder.getTripEnd()!=null?xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
            XpVehicle xpVehicle = vehicleList.stream().filter(vehicle -> vehicle.getId().equals(xpOrder.getVehicleId())).findFirst().get();
            itinerary.setCarType(xpVehicle.getVehicleModel());
            itinerary.setTripStartDate(xpOrder.getBoardingTime()!=null?xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
            itinerary.setCity(xpOrder.getCityName());
            itinerary.setStartPoint(xpOrder.getStartAddress());
            itinerary.setEndPoint(xpOrder.getEndAddress());
            itinerary.setMileage(xpOrder.getMileageKilometers()!=null ? xpOrder.getMileageKilometers().toString() :"0");
            itinerary.setAmount(xpOrder.getOrderMoney());
            xpInvoiceVo.setItinerary(itinerary);
            xpInvoiceVoList.add(xpInvoiceVo);
@@ -5016,26 +5041,54 @@
            XpInvoiceVo xpInvoiceVo = new XpInvoiceVo();
            xpInvoiceVo.setUid(xpOrder.getAppUserId().toString());
            xpInvoiceVo.setOrderNo(xpOrder.getOrderNumber());
            xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney());
            BigDecimal orderMoney = xpOrder.getOrderMoney() == null ? BigDecimal.ZERO : xpOrder.getOrderMoney();
            XpInvoiceVo.GoodsDetail goodsDetail = new XpInvoiceVo.GoodsDetail();
            goodsDetail.setProductName("Robotaxi出行服务");
            goodsDetail.setProductCode(null);
            goodsDetail.setProductSpecCode("XE2000398");
            goodsDetail.setProductSpec(null);
            goodsDetail.setProductUnit("次");
            goodsDetail.setQuantity(1);
            goodsDetail.setUnitPrice(orderMoney);
            goodsDetail.setInTaxAmount(orderMoney);
            goodsDetail.setTaxRate(null);
            goodsDetail.setTaxAmount(null);
            goodsDetail.setExTaxAmount(null);
            goodsDetail.setItemId(xpOrder.getOrderNumber());
            goodsDetail.setCouponAmount(xpOrder.getCouponMoney());
            goodsDetail.setCompanyCode("8000");
            xpInvoiceVo.setGoodsDetail(JSON.toJSONString(goodsDetail));
            xpInvoiceVo.setOrderTotalAmount(xpOrder.getPayMoney());
            xpInvoiceVo.setOrderBusAmount(xpOrder.getOrderMoney());
            xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney());
            xpInvoiceVo.setOrderFinishTime(String.valueOf(xpOrder.getTripEnd()));
            xpInvoiceVo.setOrderFinishTime(xpOrder.getTripEnd()!=null?String.valueOf(xpOrder.getTripEnd()):"");
            JSONObject extData = new JSONObject();
            extData.put("companyCode", "8000");
            extData.put("realCompanyCode", null);
            extData.put("siteName",null);
            extData.put("pile", null);
            extData.put("payFag", null);
            extData.put("supplierCode", null);
            xpInvoiceVo.setExtData(JSON.toJSONString(extData));
            xpInvoiceVo.setXpInvoiceFlag(true);
            xpInvoiceVo.setInvoiceStatus(xpOrder.getInvoiceStatus());
            XpInvoiceVo.Itinerary itinerary = new XpInvoiceVo.Itinerary();
            // yyyy-MM-dd格式
            itinerary.setTripStartDate(xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            itinerary.setTripEndDate(xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            itinerary.setTripStartDate(xpOrder.getAcceptanceTime()!=null?xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
            itinerary.setTripEndDate(xpOrder.getTripEnd()!=null?xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
            XpVehicle xpVehicle = vehicleList.stream().filter(vehicle -> vehicle.getId().equals(xpOrder.getVehicleId())).findFirst().get();
            itinerary.setCarType(xpVehicle.getVehicleModel());
            itinerary.setTripStartDate(xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            itinerary.setTripStartDate(xpOrder.getBoardingTime()!=null?xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
            itinerary.setCity(xpOrder.getCityName());
            itinerary.setStartPoint(xpOrder.getStartAddress());
            itinerary.setEndPoint(xpOrder.getEndAddress());
            itinerary.setMileage(xpOrder.getMileageKilometers().toString());
            itinerary.setAmount(xpOrder.getOrderMoney());
            itinerary.setMileage(xpOrder.getMileageKilometers()!=null ? xpOrder.getMileageKilometers().toString() :"0");
            xpInvoiceVo.setItinerary(itinerary);
            xpInvoiceVoList.add(xpInvoiceVo);