车辆管理,修改材料
This commit is contained in:
@ -289,6 +289,8 @@ springdoc:
|
||||
packages-to-scan: org.dromara.websocket
|
||||
- group: 27.新中大模块
|
||||
packages-to-scan: org.dromara.xzd
|
||||
- group: 28.车辆模块
|
||||
packages-to-scan: org.dromara.vehicle
|
||||
# knife4j的增强配置,不需要增强可以不配
|
||||
knife4j:
|
||||
enable: true
|
||||
|
||||
@ -23,7 +23,10 @@ import org.dromara.facility.constant.FacRedisKeyConstant;
|
||||
import org.dromara.facility.domain.FacMatrix;
|
||||
import org.dromara.facility.domain.FacPhotovoltaicPanel;
|
||||
import org.dromara.facility.domain.dto.geojson.*;
|
||||
import org.dromara.facility.domain.dto.photovoltaicpanel.*;
|
||||
import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelCreateByGeoJsonReq;
|
||||
import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelCreateReq;
|
||||
import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelQueryReq;
|
||||
import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelUpdateReq;
|
||||
import org.dromara.facility.domain.enums.FacFinishStatusEnum;
|
||||
import org.dromara.facility.domain.enums.FacFinishTypeEnum;
|
||||
import org.dromara.facility.domain.vo.photovoltaicpanel.FacPhotovoltaicPanelVo;
|
||||
@ -329,10 +332,10 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl<FacPhotovoltaic
|
||||
}
|
||||
Long matrixId = matrix.getId();*/
|
||||
// 去掉首字母 (T/G)
|
||||
String withoutPrefix = name.substring(2);
|
||||
String withoutPrefix = name.substring(1);
|
||||
|
||||
// 如果包含".",只取第一个"."前的数字
|
||||
int dotIndex = withoutPrefix.indexOf("#");
|
||||
int dotIndex = withoutPrefix.indexOf(".");
|
||||
if (dotIndex != -1) {
|
||||
withoutPrefix = withoutPrefix.substring(0, dotIndex);
|
||||
}
|
||||
|
||||
@ -26,16 +26,20 @@ import org.dromara.common.utils.DocumentUtil;
|
||||
import org.dromara.materials.constants.MatMaterialsConstant;
|
||||
import org.dromara.materials.domain.MatMaterialReceive;
|
||||
import org.dromara.materials.domain.MatMaterialReceiveItem;
|
||||
import org.dromara.materials.domain.MatMaterials;
|
||||
import org.dromara.materials.domain.MatMaterialsInventory;
|
||||
import org.dromara.materials.domain.dto.materialreceive.MatMaterialReceiveCreateReq;
|
||||
import org.dromara.materials.domain.dto.materialreceive.MatMaterialReceiveQueryReq;
|
||||
import org.dromara.materials.domain.dto.materialreceive.MatMaterialReceiveUpdateReq;
|
||||
import org.dromara.materials.domain.dto.materialreceive.MatMaterialReceiveWordDto;
|
||||
import org.dromara.materials.domain.dto.materialreceiveitem.MatMaterialReceiveItemDto;
|
||||
import org.dromara.materials.domain.dto.materialreceiveitem.MatMaterialReceiveItemWordDto;
|
||||
import org.dromara.materials.domain.enums.MatMaterialsInventoryOutPutEnum;
|
||||
import org.dromara.materials.domain.vo.materialreceive.MatMaterialReceiveVo;
|
||||
import org.dromara.materials.mapper.MatMaterialReceiveMapper;
|
||||
import org.dromara.materials.service.IMatMaterialReceiveItemService;
|
||||
import org.dromara.materials.service.IMatMaterialReceiveService;
|
||||
import org.dromara.materials.service.IMatMaterialsInventoryService;
|
||||
import org.dromara.materials.service.IMatMaterialsService;
|
||||
import org.dromara.project.service.IBusProjectService;
|
||||
import org.dromara.system.domain.vo.SysOssVo;
|
||||
@ -53,6 +57,7 @@ import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
/**
|
||||
@ -81,6 +86,9 @@ public class MatMaterialReceiveServiceImpl extends ServiceImpl<MatMaterialReceiv
|
||||
@Resource
|
||||
private IMatMaterialsService materialsService;
|
||||
|
||||
@Resource
|
||||
private IMatMaterialsInventoryService materialsInventoryService;
|
||||
|
||||
/**
|
||||
* 查询物料接收单
|
||||
*
|
||||
@ -366,12 +374,37 @@ public class MatMaterialReceiveServiceImpl extends ServiceImpl<MatMaterialReceiv
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean deleteByIds(Collection<Long> ids) {
|
||||
List<MatMaterialReceive> receiveList = this.listByIds(ids);
|
||||
List<MatMaterialReceiveItem> itemList = materialReceiveItemService.lambdaQuery()
|
||||
.in(MatMaterialReceiveItem::getReceiveId, ids)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(itemList)) {
|
||||
materialReceiveItemService.removeBatchByIds(itemList);
|
||||
}
|
||||
// 关联删除材料数据
|
||||
Set<String> formCode = receiveList.stream().map(MatMaterialReceive::getFormCode).collect(Collectors.toSet());
|
||||
List<MatMaterials> materials = materialsService.lambdaQuery()
|
||||
.in(MatMaterials::getFormCode, formCode)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(materials)) {
|
||||
for (MatMaterials material : materials) {
|
||||
List<MatMaterialsInventory> inventoryList = materialsInventoryService.lambdaQuery()
|
||||
.eq(MatMaterialsInventory::getMaterialsId, material.getId())
|
||||
.eq(MatMaterialsInventory::getOutPut, MatMaterialsInventoryOutPutEnum.OUT.getValue())
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(inventoryList)) {
|
||||
throw new ServiceException("存在关联的库存数据,无法删除", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
Set<Long> materialIds = materials.stream().map(MatMaterials::getId).collect(Collectors.toSet());
|
||||
List<MatMaterialsInventory> allInventoryList = materialsInventoryService.lambdaQuery()
|
||||
.in(MatMaterialsInventory::getMaterialsId, materialIds)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(allInventoryList)) {
|
||||
materialsInventoryService.removeBatchByIds(allInventoryList);
|
||||
}
|
||||
}
|
||||
materialsService.removeBatchByIds(materials);
|
||||
}
|
||||
return this.removeBatchByIds(ids);
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,118 @@
|
||||
package org.dromara.vehicle.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyCreateReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyQueryReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyReviewReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyUpdateReq;
|
||||
import org.dromara.vehicle.domain.vo.VehVehicleApplyVo;
|
||||
import org.dromara.vehicle.service.IVehVehicleApplyService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 乘车申请
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/vehicle/vehicleApply")
|
||||
public class VehVehicleApplyController extends BaseController {
|
||||
|
||||
private final IVehVehicleApplyService vehVehicleApplyService;
|
||||
|
||||
/**
|
||||
* 查询乘车申请列表
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleApply:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<VehVehicleApplyVo> list(VehVehicleApplyQueryReq req, PageQuery pageQuery) {
|
||||
return vehVehicleApplyService.queryPageList(req, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出乘车申请列表
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleApply:export")
|
||||
@Log(title = "乘车申请", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(VehVehicleApplyQueryReq req, HttpServletResponse response) {
|
||||
List<VehVehicleApplyVo> list = vehVehicleApplyService.queryList(req);
|
||||
ExcelUtil.exportExcel(list, "乘车申请", VehVehicleApplyVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取乘车申请详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleApply:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<VehVehicleApplyVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(vehVehicleApplyService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增乘车申请
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleApply:add")
|
||||
@Log(title = "乘车申请", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated @RequestBody VehVehicleApplyCreateReq req) {
|
||||
return toAjax(vehVehicleApplyService.insertByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改乘车申请
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleApply:edit")
|
||||
@Log(title = "乘车申请", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated @RequestBody VehVehicleApplyUpdateReq req) {
|
||||
return toAjax(vehVehicleApplyService.updateByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 车主审核
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleApply:edit")
|
||||
@Log(title = "乘车申请", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping("/vehicleOwnerReview")
|
||||
public R<Void> vehicleOwnerReview(@Validated @RequestBody VehVehicleApplyReviewReq req) {
|
||||
return toAjax(vehVehicleApplyService.vehicleOwnerReview(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除乘车申请
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleApply:remove")
|
||||
@Log(title = "乘车申请", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] ids) {
|
||||
return toAjax(vehVehicleApplyService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,118 @@
|
||||
package org.dromara.vehicle.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripCancelReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripCreateReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripQueryReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripUpdateReq;
|
||||
import org.dromara.vehicle.domain.vo.VehVehicleTripVo;
|
||||
import org.dromara.vehicle.service.IVehVehicleTripService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 车辆出行记录
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/vehicle/vehicleTrip")
|
||||
public class VehVehicleTripController extends BaseController {
|
||||
|
||||
private final IVehVehicleTripService vehVehicleTripService;
|
||||
|
||||
/**
|
||||
* 查询车辆出行记录列表
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleTrip:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<VehVehicleTripVo> list(VehVehicleTripQueryReq req, PageQuery pageQuery) {
|
||||
return vehVehicleTripService.queryPageList(req, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出车辆出行记录列表
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleTrip:export")
|
||||
@Log(title = "车辆出行记录", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(VehVehicleTripQueryReq req, HttpServletResponse response) {
|
||||
List<VehVehicleTripVo> list = vehVehicleTripService.queryList(req);
|
||||
ExcelUtil.exportExcel(list, "车辆出行记录", VehVehicleTripVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取车辆出行记录详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleTrip:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<VehVehicleTripVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(vehVehicleTripService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增车辆出行记录
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleTrip:add")
|
||||
@Log(title = "车辆出行记录", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated @RequestBody VehVehicleTripCreateReq req) {
|
||||
return toAjax(vehVehicleTripService.insertByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改车辆出行记录
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleTrip:edit")
|
||||
@Log(title = "车辆出行记录", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated @RequestBody VehVehicleTripUpdateReq req) {
|
||||
return toAjax(vehVehicleTripService.updateByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消车辆出行记录
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleTrip:edit")
|
||||
@Log(title = "车辆出行记录", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping("/cancel")
|
||||
public R<Void> cancel(@Validated @RequestBody VehVehicleTripCancelReq req) {
|
||||
return toAjax(vehVehicleTripService.cancel(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除车辆出行记录
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("vehicle:vehicleTrip:remove")
|
||||
@Log(title = "车辆出行记录", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] ids) {
|
||||
return toAjax(vehVehicleTripService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,91 @@
|
||||
package org.dromara.vehicle.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
|
||||
import java.io.Serial;
|
||||
|
||||
/**
|
||||
* 乘车申请对象 veh_vehicle_apply
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("veh_vehicle_apply")
|
||||
public class VehVehicleApply extends BaseEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 关联行程ID
|
||||
*/
|
||||
private Long tripId;
|
||||
|
||||
/**
|
||||
* 申请人数
|
||||
*/
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
private String passengerPhone;
|
||||
|
||||
/**
|
||||
* 出发地
|
||||
*/
|
||||
private String startPlace;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 出发地经度
|
||||
*/
|
||||
private String startLat;
|
||||
|
||||
/**
|
||||
* 出发地纬度
|
||||
*/
|
||||
private String startLng;
|
||||
|
||||
/**
|
||||
* 目的地经度
|
||||
*/
|
||||
private String endLat;
|
||||
|
||||
/**
|
||||
* 目的地纬度
|
||||
*/
|
||||
private String endLng;
|
||||
|
||||
/**
|
||||
* 乘车状态
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@ -1,12 +1,13 @@
|
||||
package org.dromara.vehicle.domain;
|
||||
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import java.math.BigDecimal;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
@ -144,5 +145,4 @@ public class VehVehicleInfo extends BaseEntity {
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,122 @@
|
||||
package org.dromara.vehicle.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 车辆出行记录对象 veh_vehicle_trip
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("veh_vehicle_trip")
|
||||
public class VehVehicleTrip extends BaseEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 车辆ID
|
||||
*/
|
||||
private Long vehicleId;
|
||||
|
||||
/**
|
||||
* 车牌号
|
||||
*/
|
||||
private String plateNumber;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
private String passengerPhone;
|
||||
|
||||
/**
|
||||
* 出行事由
|
||||
*/
|
||||
private String tripReason;
|
||||
|
||||
/**
|
||||
* 出发地
|
||||
*/
|
||||
private String startPlace;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 出发地经度
|
||||
*/
|
||||
private String startLat;
|
||||
|
||||
/**
|
||||
* 出发地纬度
|
||||
*/
|
||||
private String startLng;
|
||||
|
||||
/**
|
||||
* 目的地经度
|
||||
*/
|
||||
private String endLat;
|
||||
|
||||
/**
|
||||
* 目的地纬度
|
||||
*/
|
||||
private String endLng;
|
||||
|
||||
/**
|
||||
* 计划出发时间
|
||||
*/
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* 计划到达时间
|
||||
*/
|
||||
private Date endTime;
|
||||
|
||||
/**
|
||||
* 申请人数
|
||||
*/
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 剩余座位数
|
||||
*/
|
||||
private Integer leftSeat;
|
||||
|
||||
/**
|
||||
* 审核状态
|
||||
*/
|
||||
private String reviewStatus;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private String tripStatus;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@ -0,0 +1,80 @@
|
||||
package org.dromara.vehicle.domain.dto.vehicleapply;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 14:15
|
||||
*/
|
||||
@Data
|
||||
public class VehVehicleApplyCreateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1199219811382958686L;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@NotNull(message = "项目ID不能为空")
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 关联行程ID
|
||||
*/
|
||||
@NotNull(message = "关联行程ID不能为空")
|
||||
private Long tripId;
|
||||
|
||||
/**
|
||||
* 申请人数
|
||||
*/
|
||||
@NotNull(message = "申请人数不能为空")
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
private String passengerPhone;
|
||||
|
||||
/**
|
||||
* 出发地
|
||||
*/
|
||||
private String startPlace;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
@NotBlank(message = "目的地不能为空")
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 出发地经度
|
||||
*/
|
||||
private String startLat;
|
||||
|
||||
/**
|
||||
* 出发地纬度
|
||||
*/
|
||||
private String startLng;
|
||||
|
||||
/**
|
||||
* 目的地经度
|
||||
*/
|
||||
@NotBlank(message = "目的地经度不能为空")
|
||||
private String endLat;
|
||||
|
||||
/**
|
||||
* 目的地纬度
|
||||
*/
|
||||
@NotBlank(message = "目的地纬度不能为空")
|
||||
private String endLng;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
package org.dromara.vehicle.domain.dto.vehicleapply;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 14:48
|
||||
*/
|
||||
@Data
|
||||
public class VehVehicleApplyQueryReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = -7148064523789231728L;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 关联行程ID
|
||||
*/
|
||||
private Long tripId;
|
||||
|
||||
/**
|
||||
* 申请人数
|
||||
*/
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
private String passengerPhone;
|
||||
|
||||
/**
|
||||
* 出发地
|
||||
*/
|
||||
private String startPlace;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 乘车状态
|
||||
*/
|
||||
private String status;
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
package org.dromara.vehicle.domain.dto.vehicleapply;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 15:00
|
||||
*/
|
||||
@Data
|
||||
public class VehVehicleApplyReviewReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = -5881272503469997069L;
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
@NotNull(message = "主键不能为空")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 乘车状态
|
||||
*/
|
||||
@NotBlank(message = "乘车状态不能为空")
|
||||
private String status;
|
||||
}
|
||||
@ -0,0 +1,79 @@
|
||||
package org.dromara.vehicle.domain.dto.vehicleapply;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 15:30
|
||||
*/
|
||||
@Data
|
||||
public class VehVehicleApplyUpdateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 7272254511495824388L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键不能为空")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 关联行程ID
|
||||
*/
|
||||
private Long tripId;
|
||||
|
||||
/**
|
||||
* 申请人数
|
||||
*/
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
private String passengerPhone;
|
||||
|
||||
/**
|
||||
* 出发地
|
||||
*/
|
||||
private String startPlace;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 出发地经度
|
||||
*/
|
||||
private String startLat;
|
||||
|
||||
/**
|
||||
* 出发地纬度
|
||||
*/
|
||||
private String startLng;
|
||||
|
||||
/**
|
||||
* 目的地经度
|
||||
*/
|
||||
private String endLat;
|
||||
|
||||
/**
|
||||
* 目的地纬度
|
||||
*/
|
||||
private String endLng;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
package org.dromara.vehicle.domain.dto.vehicletrip;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 09:22
|
||||
*/
|
||||
@Data
|
||||
public class VehVehicleTripCancelReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 7690656986769836247L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键不能为空")
|
||||
private Long id;
|
||||
}
|
||||
@ -0,0 +1,109 @@
|
||||
package org.dromara.vehicle.domain.dto.vehicletrip;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 10:05
|
||||
*/
|
||||
@Data
|
||||
public class VehVehicleTripCreateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 7691668678158594767L;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 车辆ID
|
||||
*/
|
||||
private Long vehicleId;
|
||||
|
||||
/**
|
||||
* 车牌号
|
||||
*/
|
||||
private String plateNumber;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
private String passengerPhone;
|
||||
|
||||
/**
|
||||
* 出行事由
|
||||
*/
|
||||
private String tripReason;
|
||||
|
||||
/**
|
||||
* 出发地
|
||||
*/
|
||||
@NotBlank(message = "出发地不能为空")
|
||||
private String startPlace;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
@NotBlank(message = "目的地不能为空")
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 出发地经度
|
||||
*/
|
||||
@NotBlank(message = "出发地经度不能为空")
|
||||
private String startLat;
|
||||
|
||||
/**
|
||||
* 出发地纬度
|
||||
*/
|
||||
@NotBlank(message = "出发地纬度不能为空")
|
||||
private String startLng;
|
||||
|
||||
/**
|
||||
* 目的地经度
|
||||
*/
|
||||
@NotBlank(message = "目的地经度不能为空")
|
||||
private String endLat;
|
||||
|
||||
/**
|
||||
* 目的地纬度
|
||||
*/
|
||||
@NotBlank(message = "目的地纬度不能为空")
|
||||
private String endLng;
|
||||
|
||||
/**
|
||||
* 计划出发时间
|
||||
*/
|
||||
@NotNull(message = "计划出发时间不能为空")
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* 计划到达时间
|
||||
*/
|
||||
private Date endTime;
|
||||
|
||||
/**
|
||||
* 申请人数
|
||||
*/
|
||||
@NotNull(message = "申请人数不能为空")
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 剩余座位数
|
||||
*/
|
||||
@NotNull(message = "剩余座位数不能为空")
|
||||
private Integer leftSeat;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
}
|
||||
@ -0,0 +1,54 @@
|
||||
package org.dromara.vehicle.domain.dto.vehicletrip;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-25 19:40
|
||||
*/
|
||||
@Data
|
||||
public class VehVehicleTripQueryReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = -7795154504461471208L;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 目的地经度
|
||||
*/
|
||||
private String endLat;
|
||||
|
||||
/**
|
||||
* 目的地纬度
|
||||
*/
|
||||
private String endLng;
|
||||
|
||||
/**
|
||||
* 计划出发时间
|
||||
*/
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* 出行人数
|
||||
*/
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 审核状态
|
||||
*/
|
||||
private String reviewStatus;
|
||||
|
||||
}
|
||||
@ -0,0 +1,105 @@
|
||||
package org.dromara.vehicle.domain.dto.vehicletrip;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 11:33
|
||||
*/
|
||||
@Data
|
||||
public class VehVehicleTripUpdateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 3855392201273235078L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键不能为空")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 车辆ID
|
||||
*/
|
||||
private Long vehicleId;
|
||||
|
||||
/**
|
||||
* 车牌号
|
||||
*/
|
||||
private String plateNumber;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
private String passengerPhone;
|
||||
|
||||
/**
|
||||
* 出行事由
|
||||
*/
|
||||
private String tripReason;
|
||||
|
||||
/**
|
||||
* 出发地
|
||||
*/
|
||||
private String startPlace;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 出发地经度
|
||||
*/
|
||||
private String startLat;
|
||||
|
||||
/**
|
||||
* 出发地纬度
|
||||
*/
|
||||
private String startLng;
|
||||
|
||||
/**
|
||||
* 目的地经度
|
||||
*/
|
||||
private String endLat;
|
||||
|
||||
/**
|
||||
* 目的地纬度
|
||||
*/
|
||||
private String endLng;
|
||||
|
||||
/**
|
||||
* 计划出发时间
|
||||
*/
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* 计划到达时间
|
||||
*/
|
||||
private Date endTime;
|
||||
|
||||
/**
|
||||
* 申请人数
|
||||
*/
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 剩余座位数
|
||||
*/
|
||||
private Integer leftSeat;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
package org.dromara.vehicle.domain.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 09:39
|
||||
*/
|
||||
@Getter
|
||||
public enum VehApplyStatusEnum {
|
||||
|
||||
APPLYING("申请中", "1"),
|
||||
CONFIRMED("已确认", "2"),
|
||||
REJECTED("已拒绝", "3"),
|
||||
ALREADY("已上车", "4"),
|
||||
ARRIVED("已到达", "5"),
|
||||
CANCELED("已取消", "6");
|
||||
|
||||
private final String text;
|
||||
|
||||
private final String value;
|
||||
|
||||
VehApplyStatusEnum(String text, String value) {
|
||||
this.text = text;
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
package org.dromara.vehicle.domain.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 09:32
|
||||
*/
|
||||
@Getter
|
||||
public enum VehTripStatusEnum {
|
||||
|
||||
READY_DEPART("待出发","1"),
|
||||
UNDERWAY("进行中","2"),
|
||||
COMPLETED("已完成","3"),
|
||||
CANCELED("已取消","4" );
|
||||
|
||||
private final String text;
|
||||
|
||||
private final String value;
|
||||
|
||||
VehTripStatusEnum(String text, String value) {
|
||||
this.text = text;
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
package org.dromara.vehicle.domain.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-27 11:42
|
||||
*/
|
||||
@Getter
|
||||
public enum VehVehicleInfoStatusEnum {
|
||||
|
||||
AVAILABLE("可用", "1"),
|
||||
IN_USE("使用中", "2"),
|
||||
UNDER_MAINTENANCE("维护中", "3"),
|
||||
DISABLE("停用", "4");
|
||||
|
||||
private final String text;
|
||||
|
||||
private final String value;
|
||||
|
||||
VehVehicleInfoStatusEnum(String text, String value) {
|
||||
this.text = text;
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,111 @@
|
||||
package org.dromara.vehicle.domain.vo;
|
||||
|
||||
import org.dromara.vehicle.domain.VehVehicleApply;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 乘车申请视图对象 veh_vehicle_apply
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = VehVehicleApply.class)
|
||||
public class VehVehicleApplyVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "主键ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@ExcelProperty(value = "项目ID")
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 关联行程ID
|
||||
*/
|
||||
@ExcelProperty(value = "关联行程ID")
|
||||
private Long tripId;
|
||||
|
||||
/**
|
||||
* 申请人数
|
||||
*/
|
||||
@ExcelProperty(value = "申请人数")
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
@ExcelProperty(value = "联系电话")
|
||||
private String passengerPhone;
|
||||
|
||||
/**
|
||||
* 出发地
|
||||
*/
|
||||
@ExcelProperty(value = "出发地")
|
||||
private String startPlace;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
@ExcelProperty(value = "目的地")
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 出发地经度
|
||||
*/
|
||||
@ExcelProperty(value = "出发地经度")
|
||||
private String startLat;
|
||||
|
||||
/**
|
||||
* 出发地纬度
|
||||
*/
|
||||
@ExcelProperty(value = "出发地纬度")
|
||||
private String startLng;
|
||||
|
||||
/**
|
||||
* 目的地经度
|
||||
*/
|
||||
@ExcelProperty(value = "目的地经度")
|
||||
private String endLat;
|
||||
|
||||
/**
|
||||
* 目的地纬度
|
||||
*/
|
||||
@ExcelProperty(value = "目的地纬度")
|
||||
private String endLng;
|
||||
|
||||
/**
|
||||
* 乘车状态
|
||||
*/
|
||||
@ExcelProperty(value = "乘车状态", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(dictType = "veh_vehicle_apply_status")
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@ -1,19 +1,17 @@
|
||||
package org.dromara.vehicle.domain.vo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import org.dromara.vehicle.domain.VehVehicleInfo;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import org.dromara.vehicle.domain.VehVehicleInfo;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@ -0,0 +1,183 @@
|
||||
package org.dromara.vehicle.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import org.dromara.common.translation.annotation.Translation;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.vehicle.domain.VehVehicleTrip;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
/**
|
||||
* 车辆出行记录视图对象 veh_vehicle_trip
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = VehVehicleTrip.class)
|
||||
public class VehVehicleTripVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "主键ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@ExcelProperty(value = "项目ID")
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 车辆ID
|
||||
*/
|
||||
@ExcelProperty(value = "车辆ID")
|
||||
private Long vehicleId;
|
||||
|
||||
/**
|
||||
* 车牌号
|
||||
*/
|
||||
@ExcelProperty(value = "车牌号")
|
||||
private String plateNumber;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
@ExcelProperty(value = "联系电话")
|
||||
private String passengerPhone;
|
||||
|
||||
/**
|
||||
* 出行事由
|
||||
*/
|
||||
@ExcelProperty(value = "出行事由")
|
||||
private String tripReason;
|
||||
|
||||
/**
|
||||
* 出发地
|
||||
*/
|
||||
@ExcelProperty(value = "出发地")
|
||||
private String startPlace;
|
||||
|
||||
/**
|
||||
* 目的地
|
||||
*/
|
||||
@ExcelProperty(value = "目的地")
|
||||
private String endPlace;
|
||||
|
||||
/**
|
||||
* 出发地经度
|
||||
*/
|
||||
@ExcelProperty(value = "出发地经度")
|
||||
private String startLat;
|
||||
|
||||
/**
|
||||
* 出发地纬度
|
||||
*/
|
||||
@ExcelProperty(value = "出发地纬度")
|
||||
private String startLng;
|
||||
|
||||
/**
|
||||
* 目的地经度
|
||||
*/
|
||||
@ExcelProperty(value = "目的地经度")
|
||||
private String endLat;
|
||||
|
||||
/**
|
||||
* 目的地纬度
|
||||
*/
|
||||
@ExcelProperty(value = "目的地纬度")
|
||||
private String endLng;
|
||||
|
||||
/**
|
||||
* 计划出发时间
|
||||
*/
|
||||
@ExcelProperty(value = "计划出发时间")
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* 计划到达时间
|
||||
*/
|
||||
@ExcelProperty(value = "计划到达时间")
|
||||
private Date endTime;
|
||||
|
||||
/**
|
||||
* 申请人数
|
||||
*/
|
||||
@ExcelProperty(value = "申请人数")
|
||||
private Integer peopleNum;
|
||||
|
||||
/**
|
||||
* 剩余座位数
|
||||
*/
|
||||
@ExcelProperty(value = "剩余座位数")
|
||||
private Integer leftSeat;
|
||||
|
||||
/**
|
||||
* 审核状态
|
||||
*/
|
||||
@ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(dictType = "wf_business_status")
|
||||
private String reviewStatus;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(dictType = "veh_vehicle_trip_status")
|
||||
private String tripStatus;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 距离(米)
|
||||
*/
|
||||
private String distanceM;
|
||||
|
||||
/**
|
||||
* 距离评分
|
||||
*/
|
||||
private String distanceScore;
|
||||
|
||||
/**
|
||||
* 时间评分
|
||||
*/
|
||||
private String timeScore;
|
||||
|
||||
/**
|
||||
* 人数评分
|
||||
*/
|
||||
private String peopleScore;
|
||||
|
||||
/**
|
||||
* 总评分
|
||||
*/
|
||||
private String totalScore;
|
||||
|
||||
/**
|
||||
* 创建者
|
||||
*/
|
||||
private Long createBy;
|
||||
|
||||
/**
|
||||
* 创建者名称
|
||||
*/
|
||||
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
|
||||
private String createByName;
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
package org.dromara.vehicle.mapper;
|
||||
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
import org.dromara.vehicle.domain.VehVehicleApply;
|
||||
import org.dromara.vehicle.domain.vo.VehVehicleApplyVo;
|
||||
|
||||
/**
|
||||
* 乘车申请Mapper接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
public interface VehVehicleApplyMapper extends BaseMapperPlus<VehVehicleApply, VehVehicleApplyVo> {
|
||||
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
package org.dromara.vehicle.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
import org.dromara.vehicle.domain.VehVehicleTrip;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripQueryReq;
|
||||
import org.dromara.vehicle.domain.vo.VehVehicleTripVo;
|
||||
|
||||
/**
|
||||
* 车辆出行记录Mapper接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
public interface VehVehicleTripMapper extends BaseMapperPlus<VehVehicleTrip, VehVehicleTripVo> {
|
||||
|
||||
Page<VehVehicleTripVo> selectVehicleTripPage(@Param("page") Page<VehVehicleTrip> page,
|
||||
@Param("req") VehVehicleTripQueryReq req);
|
||||
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
package org.dromara.vehicle.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.vehicle.domain.VehVehicleApply;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyCreateReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyQueryReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyReviewReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyUpdateReq;
|
||||
import org.dromara.vehicle.domain.vo.VehVehicleApplyVo;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 乘车申请Service接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
public interface IVehVehicleApplyService extends IService<VehVehicleApply> {
|
||||
|
||||
/**
|
||||
* 查询乘车申请
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 乘车申请
|
||||
*/
|
||||
VehVehicleApplyVo queryById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询乘车申请列表
|
||||
*
|
||||
* @param req 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 乘车申请分页列表
|
||||
*/
|
||||
TableDataInfo<VehVehicleApplyVo> queryPageList(VehVehicleApplyQueryReq req, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的乘车申请列表
|
||||
*
|
||||
* @param req 查询条件
|
||||
* @return 乘车申请列表
|
||||
*/
|
||||
List<VehVehicleApplyVo> queryList(VehVehicleApplyQueryReq req);
|
||||
|
||||
/**
|
||||
* 新增乘车申请
|
||||
*
|
||||
* @param req 乘车申请
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
Boolean insertByBo(VehVehicleApplyCreateReq req);
|
||||
|
||||
/**
|
||||
* 修改乘车申请
|
||||
*
|
||||
* @param req 乘车申请
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
Boolean updateByBo(VehVehicleApplyUpdateReq req);
|
||||
|
||||
/**
|
||||
* 车主审核
|
||||
*
|
||||
* @param req 审核信息
|
||||
* @return 是否审核成功
|
||||
*/
|
||||
Boolean vehicleOwnerReview(VehVehicleApplyReviewReq req);
|
||||
|
||||
/**
|
||||
* 校验并批量删除乘车申请信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
package org.dromara.vehicle.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.vehicle.domain.VehVehicleTrip;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripCancelReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripCreateReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripQueryReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripUpdateReq;
|
||||
import org.dromara.vehicle.domain.vo.VehVehicleTripVo;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 车辆出行记录Service接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
public interface IVehVehicleTripService extends IService<VehVehicleTrip> {
|
||||
|
||||
/**
|
||||
* 查询车辆出行记录
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 车辆出行记录
|
||||
*/
|
||||
VehVehicleTripVo queryById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询车辆出行记录列表
|
||||
*
|
||||
* @param req 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 车辆出行记录分页列表
|
||||
*/
|
||||
TableDataInfo<VehVehicleTripVo> queryPageList(VehVehicleTripQueryReq req, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的车辆出行记录列表
|
||||
*
|
||||
* @param req 查询条件
|
||||
* @return 车辆出行记录列表
|
||||
*/
|
||||
List<VehVehicleTripVo> queryList(VehVehicleTripQueryReq req);
|
||||
|
||||
/**
|
||||
* 新增车辆出行记录
|
||||
*
|
||||
* @param req 车辆出行记录
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
Boolean insertByBo(VehVehicleTripCreateReq req);
|
||||
|
||||
/**
|
||||
* 修改车辆出行记录
|
||||
*
|
||||
* @param req 车辆出行记录
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
Boolean updateByBo(VehVehicleTripUpdateReq req);
|
||||
|
||||
/**
|
||||
* 取消车辆出行记录
|
||||
*
|
||||
* @param req 车辆出行记录
|
||||
* @return 是否取消成功
|
||||
*/
|
||||
Boolean cancel(VehVehicleTripCancelReq req);
|
||||
|
||||
/**
|
||||
* 校验并批量删除车辆出行记录信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@ -0,0 +1,233 @@
|
||||
package org.dromara.vehicle.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.constant.HttpStatus;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.vehicle.domain.VehVehicleApply;
|
||||
import org.dromara.vehicle.domain.VehVehicleTrip;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyCreateReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyQueryReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyReviewReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicleapply.VehVehicleApplyUpdateReq;
|
||||
import org.dromara.vehicle.domain.enums.VehApplyStatusEnum;
|
||||
import org.dromara.vehicle.domain.vo.VehVehicleApplyVo;
|
||||
import org.dromara.vehicle.mapper.VehVehicleApplyMapper;
|
||||
import org.dromara.vehicle.service.IVehVehicleApplyService;
|
||||
import org.dromara.vehicle.service.IVehVehicleTripService;
|
||||
import org.dromara.websocket.ChatServerHandler;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
/**
|
||||
* 乘车申请Service业务层处理
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class VehVehicleApplyServiceImpl extends ServiceImpl<VehVehicleApplyMapper, VehVehicleApply>
|
||||
implements IVehVehicleApplyService {
|
||||
|
||||
private final IVehVehicleTripService vehicleTripService;
|
||||
|
||||
private final ChatServerHandler chatServerHandler;
|
||||
|
||||
/**
|
||||
* 查询乘车申请
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 乘车申请
|
||||
*/
|
||||
@Override
|
||||
public VehVehicleApplyVo queryById(Long id) {
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询乘车申请列表
|
||||
*
|
||||
* @param req 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 乘车申请分页列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<VehVehicleApplyVo> queryPageList(VehVehicleApplyQueryReq req, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<VehVehicleApply> lqw = buildQueryWrapper(req);
|
||||
Page<VehVehicleApplyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的乘车申请列表
|
||||
*
|
||||
* @param req 查询条件
|
||||
* @return 乘车申请列表
|
||||
*/
|
||||
@Override
|
||||
public List<VehVehicleApplyVo> queryList(VehVehicleApplyQueryReq req) {
|
||||
LambdaQueryWrapper<VehVehicleApply> lqw = buildQueryWrapper(req);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<VehVehicleApply> buildQueryWrapper(VehVehicleApplyQueryReq req) {
|
||||
LambdaQueryWrapper<VehVehicleApply> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByDesc(VehVehicleApply::getId);
|
||||
lqw.eq(req.getProjectId() != null, VehVehicleApply::getProjectId, req.getProjectId());
|
||||
lqw.eq(req.getTripId() != null, VehVehicleApply::getTripId, req.getTripId());
|
||||
lqw.eq(req.getPeopleNum() != null, VehVehicleApply::getPeopleNum, req.getPeopleNum());
|
||||
lqw.eq(StringUtils.isNotBlank(req.getPassengerPhone()), VehVehicleApply::getPassengerPhone, req.getPassengerPhone());
|
||||
lqw.eq(StringUtils.isNotBlank(req.getStartPlace()), VehVehicleApply::getStartPlace, req.getStartPlace());
|
||||
lqw.eq(StringUtils.isNotBlank(req.getEndPlace()), VehVehicleApply::getEndPlace, req.getEndPlace());
|
||||
lqw.eq(StringUtils.isNotBlank(req.getStatus()), VehVehicleApply::getStatus, req.getStatus());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增乘车申请
|
||||
*
|
||||
* @param req 乘车申请
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(VehVehicleApplyCreateReq req) {
|
||||
VehVehicleApply apply = new VehVehicleApply();
|
||||
BeanUtils.copyProperties(req, apply);
|
||||
validEntityBeforeSave(apply);
|
||||
VehVehicleTrip vehicleTrip = vehicleTripService.getById(req.getTripId());
|
||||
if (vehicleTrip == null) {
|
||||
throw new ServiceException("行程不存在", HttpStatus.NOT_FOUND);
|
||||
}
|
||||
boolean save = this.save(apply);
|
||||
if (!save) {
|
||||
throw new ServiceException("新增失败");
|
||||
}
|
||||
// 发送消息
|
||||
CompletableFuture.runAsync(() -> {
|
||||
Long createBy = vehicleTrip.getCreateBy();
|
||||
String title = "有乘客申请乘车,请及时查看!";
|
||||
try {
|
||||
chatServerHandler.sendSystemMessageToUser(createBy, title, "4");
|
||||
} catch (Exception e) {
|
||||
log.error("异步发送系统消息失败,用户ID: {}, 消息: {}", createBy, title, e);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改乘车申请
|
||||
*
|
||||
* @param req 乘车申请
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(VehVehicleApplyUpdateReq req) {
|
||||
// 获取旧数据
|
||||
VehVehicleApply oldApply = this.getById(req.getId());
|
||||
if (oldApply == null) {
|
||||
throw new ServiceException("数据不存在", HttpStatus.NOT_FOUND);
|
||||
}
|
||||
VehVehicleApply apply = new VehVehicleApply();
|
||||
BeanUtils.copyProperties(req, apply);
|
||||
validEntityBeforeSave(apply);
|
||||
return this.updateById(apply);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车主审核
|
||||
*
|
||||
* @param req 审核信息
|
||||
* @return 是否审核成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean vehicleOwnerReview(VehVehicleApplyReviewReq req) {
|
||||
Long id = req.getId();
|
||||
String status = req.getStatus();
|
||||
// 获取数据
|
||||
VehVehicleApply apply = this.getById(id);
|
||||
if (apply == null) {
|
||||
throw new ServiceException("数据不存在", HttpStatus.NOT_FOUND);
|
||||
}
|
||||
String applyStatus = apply.getStatus();
|
||||
if (Objects.equals(applyStatus, VehApplyStatusEnum.CANCELED.getValue())) {
|
||||
throw new ServiceException("该申请已取消,无需审核", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
if (Objects.equals(applyStatus, VehApplyStatusEnum.ALREADY.getValue())
|
||||
|| Objects.equals(applyStatus, VehApplyStatusEnum.ARRIVED.getValue())) {
|
||||
throw new ServiceException("该申请已上车,无需审核", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
// 获取行程信息
|
||||
VehVehicleTrip vehicleTrip = vehicleTripService.getById(apply.getTripId());
|
||||
if (vehicleTrip == null) {
|
||||
throw new ServiceException("行程不存在", HttpStatus.NOT_FOUND);
|
||||
}
|
||||
if (Objects.equals(status, VehApplyStatusEnum.CONFIRMED.getValue())) {
|
||||
// 修改行程信息
|
||||
int left = vehicleTrip.getLeftSeat() - apply.getPeopleNum();
|
||||
if (left < 0) {
|
||||
throw new ServiceException("座位不足", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
vehicleTrip.setLeftSeat(left);
|
||||
boolean updateTrip = vehicleTripService.updateById(vehicleTrip);
|
||||
if (!updateTrip) {
|
||||
throw new ServiceException("行程信息更新失败", HttpStatus.ERROR);
|
||||
}
|
||||
}
|
||||
apply.setStatus(status);
|
||||
boolean updateApply = this.updateById(apply);
|
||||
if (!updateApply) {
|
||||
throw new ServiceException("行程信息更新失败", HttpStatus.ERROR);
|
||||
}
|
||||
// 通知申请人
|
||||
CompletableFuture.runAsync(() -> {
|
||||
Long createBy = apply.getCreateBy();
|
||||
String title = Objects.equals(status, VehApplyStatusEnum.CONFIRMED.getValue()) ?
|
||||
"您申请的行程已通过审核,请及时查看!" : "您申请的行程未通过审核,请及时查看!";
|
||||
try {
|
||||
chatServerHandler.sendSystemMessageToUser(createBy, title, "4");
|
||||
} catch (Exception e) {
|
||||
log.error("异步发送系统消息失败,用户ID: {}, 消息: {}", createBy, title, e);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(VehVehicleApply entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并批量删除乘车申请信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
@ -26,6 +27,7 @@ import java.util.Map;
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class VehVehicleInfoServiceImpl extends ServiceImpl<VehVehicleInfoMapper, VehVehicleInfo>
|
||||
@ -38,7 +40,7 @@ public class VehVehicleInfoServiceImpl extends ServiceImpl<VehVehicleInfoMapper,
|
||||
* @return 车辆信息
|
||||
*/
|
||||
@Override
|
||||
public VehVehicleInfoVo queryById(Long id){
|
||||
public VehVehicleInfoVo queryById(Long id) {
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
@ -130,7 +132,7 @@ public class VehVehicleInfoServiceImpl extends ServiceImpl<VehVehicleInfoMapper,
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(VehVehicleInfo entity){
|
||||
private void validEntityBeforeSave(VehVehicleInfo entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
@ -143,7 +145,7 @@ public class VehVehicleInfoServiceImpl extends ServiceImpl<VehVehicleInfoMapper,
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
|
||||
@ -0,0 +1,345 @@
|
||||
package org.dromara.vehicle.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.PhoneUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.constant.HttpStatus;
|
||||
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessTaskEvent;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.utils.ObjectUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.system.domain.vo.SysUserVo;
|
||||
import org.dromara.system.service.ISysUserService;
|
||||
import org.dromara.vehicle.domain.VehVehicleApply;
|
||||
import org.dromara.vehicle.domain.VehVehicleInfo;
|
||||
import org.dromara.vehicle.domain.VehVehicleTrip;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripCancelReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripCreateReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripQueryReq;
|
||||
import org.dromara.vehicle.domain.dto.vehicletrip.VehVehicleTripUpdateReq;
|
||||
import org.dromara.vehicle.domain.enums.VehApplyStatusEnum;
|
||||
import org.dromara.vehicle.domain.enums.VehTripStatusEnum;
|
||||
import org.dromara.vehicle.domain.enums.VehVehicleInfoStatusEnum;
|
||||
import org.dromara.vehicle.domain.vo.VehVehicleTripVo;
|
||||
import org.dromara.vehicle.mapper.VehVehicleTripMapper;
|
||||
import org.dromara.vehicle.service.IVehVehicleApplyService;
|
||||
import org.dromara.vehicle.service.IVehVehicleInfoService;
|
||||
import org.dromara.vehicle.service.IVehVehicleTripService;
|
||||
import org.dromara.websocket.ChatServerHandler;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 车辆出行记录Service业务层处理
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-25
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class VehVehicleTripServiceImpl extends ServiceImpl<VehVehicleTripMapper, VehVehicleTrip>
|
||||
implements IVehVehicleTripService {
|
||||
|
||||
@Lazy
|
||||
@Resource
|
||||
private IVehVehicleInfoService vehicleInfoService;
|
||||
|
||||
@Lazy
|
||||
@Resource
|
||||
private IVehVehicleApplyService vehicleApplyService;
|
||||
|
||||
@Resource
|
||||
private ISysUserService userService;
|
||||
|
||||
@Resource
|
||||
private ChatServerHandler chatServerHandler;
|
||||
|
||||
/**
|
||||
* 查询车辆出行记录
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 车辆出行记录
|
||||
*/
|
||||
@Override
|
||||
public VehVehicleTripVo queryById(Long id) {
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询车辆出行记录列表
|
||||
*
|
||||
* @param req 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 车辆出行记录分页列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<VehVehicleTripVo> queryPageList(VehVehicleTripQueryReq req, PageQuery pageQuery) {
|
||||
Page<VehVehicleTripVo> result;
|
||||
if (StringUtils.isNotBlank(req.getEndLat()) && StringUtils.isNotBlank(req.getEndLng())
|
||||
&& ObjectUtils.isNotNull(req.getEndLat()) && ObjectUtils.isNotNull(req.getEndLng())) {
|
||||
result = baseMapper.selectVehicleTripPage(pageQuery.build(), req);
|
||||
} else {
|
||||
result = baseMapper.selectVoPage(pageQuery.build(), buildQueryWrapper(req));
|
||||
}
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的车辆出行记录列表
|
||||
*
|
||||
* @param req 查询条件
|
||||
* @return 车辆出行记录列表
|
||||
*/
|
||||
@Override
|
||||
public List<VehVehicleTripVo> queryList(VehVehicleTripQueryReq req) {
|
||||
LambdaQueryWrapper<VehVehicleTrip> lqw = buildQueryWrapper(req);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<VehVehicleTrip> buildQueryWrapper(VehVehicleTripQueryReq req) {
|
||||
LambdaQueryWrapper<VehVehicleTrip> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(req.getProjectId() != null, VehVehicleTrip::getProjectId, req.getProjectId());
|
||||
lqw.eq(StringUtils.isNotBlank(req.getEndPlace()), VehVehicleTrip::getEndPlace, req.getEndPlace());
|
||||
lqw.eq(StringUtils.isNotBlank(req.getEndLat()), VehVehicleTrip::getEndLat, req.getEndLat());
|
||||
lqw.eq(StringUtils.isNotBlank(req.getEndLng()), VehVehicleTrip::getEndLng, req.getEndLng());
|
||||
lqw.eq(req.getStartTime() != null, VehVehicleTrip::getStartTime, req.getStartTime());
|
||||
lqw.eq(req.getPeopleNum() != null, VehVehicleTrip::getPeopleNum, req.getPeopleNum());
|
||||
lqw.eq(req.getReviewStatus() != null, VehVehicleTrip::getReviewStatus, req.getReviewStatus());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增车辆出行记录
|
||||
*
|
||||
* @param req 车辆出行记录
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(VehVehicleTripCreateReq req) {
|
||||
VehVehicleTrip trip = new VehVehicleTrip();
|
||||
BeanUtils.copyProperties(req, trip);
|
||||
validEntityBeforeSave(trip);
|
||||
// 判断车辆是否被占用
|
||||
Long vehicleId = trip.getVehicleId();
|
||||
if (vehicleId != null) {
|
||||
// 获取车辆信息
|
||||
VehVehicleInfo vehicle = vehicleInfoService.getById(vehicleId);
|
||||
if (vehicle == null) {
|
||||
throw new ServiceException("车辆不存在", HttpStatus.NOT_FOUND);
|
||||
}
|
||||
if (!vehicle.getVehicleStatus().equals(VehVehicleInfoStatusEnum.AVAILABLE.getValue())) {
|
||||
throw new ServiceException("车辆已被占用", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
return this.save(trip);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改车辆出行记录
|
||||
*
|
||||
* @param req 车辆出行记录
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(VehVehicleTripUpdateReq req) {
|
||||
// 获取旧数据
|
||||
VehVehicleTrip oldEntity = this.getById(req.getId());
|
||||
if (oldEntity == null) {
|
||||
throw new ServiceException("数据不存在", HttpStatus.NOT_FOUND);
|
||||
}
|
||||
if (ObjectUtils.isNotEmpty(req.getVehicleId()) && !Objects.equals(req.getVehicleId(), oldEntity.getVehicleId())) {
|
||||
// 车辆id不一致,需要判断车辆是否被占用
|
||||
VehVehicleInfo vehicle = vehicleInfoService.getById(req.getVehicleId());
|
||||
if (vehicle == null) {
|
||||
throw new ServiceException("车辆不存在", HttpStatus.NOT_FOUND);
|
||||
}
|
||||
if (!vehicle.getVehicleStatus().equals(VehVehicleInfoStatusEnum.AVAILABLE.getValue())) {
|
||||
throw new ServiceException("当前车辆无法使用", HttpStatus.CONFLICT);
|
||||
}
|
||||
}
|
||||
VehVehicleTrip trip = new VehVehicleTrip();
|
||||
BeanUtils.copyProperties(req, trip);
|
||||
validEntityBeforeSave(trip);
|
||||
return this.updateById(trip);
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消车辆出行记录
|
||||
*
|
||||
* @param req 车辆出行记录
|
||||
* @return 是否取消成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean cancel(VehVehicleTripCancelReq req) {
|
||||
// 数据校验
|
||||
VehVehicleTrip trip = this.getById(req.getId());
|
||||
if (trip == null) {
|
||||
throw new ServiceException("车辆出行记录不存在", HttpStatus.NOT_FOUND);
|
||||
}
|
||||
if (trip.getTripStatus().equals(VehTripStatusEnum.CANCELED.getValue())) {
|
||||
throw new ServiceException("该记录已取消", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
// 权限校验
|
||||
Long userId = LoginHelper.getUserId();
|
||||
if (!LoginHelper.isSuperAdmin() && !userId.equals(trip.getCreateBy())) {
|
||||
throw new ServiceException("没有权限取消该记录", HttpStatus.FORBIDDEN);
|
||||
}
|
||||
// 设置取消状态
|
||||
trip.setTripStatus(VehTripStatusEnum.CANCELED.getValue());
|
||||
// 通知已预约用户
|
||||
List<VehVehicleApply> applyList = vehicleApplyService.lambdaQuery()
|
||||
.eq(VehVehicleApply::getTripId, trip.getId())
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(applyList)) {
|
||||
// 通知
|
||||
for (VehVehicleApply apply : applyList) {
|
||||
CompletableFuture.runAsync(() -> {
|
||||
Long createBy = apply.getCreateBy();
|
||||
String title = "司机已取消您预约的行程,请及时查看!";
|
||||
try {
|
||||
chatServerHandler.sendSystemMessageToUser(createBy, title, "4");
|
||||
} catch (Exception e) {
|
||||
log.error("异步发送系统消息失败,用户ID: {}, 消息: {}", createBy, title, e);
|
||||
}
|
||||
});
|
||||
}
|
||||
// 修改申请状态
|
||||
applyList.forEach(apply -> apply.setStatus(VehApplyStatusEnum.CANCELED.getValue()));
|
||||
boolean updateApply = vehicleApplyService.updateBatchById(applyList);
|
||||
if (!updateApply) {
|
||||
throw new ServiceException("修改申请状态失败");
|
||||
}
|
||||
}
|
||||
// 更新数据
|
||||
return this.updateById(trip);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(VehVehicleTrip entity) {
|
||||
Long vehicleId = entity.getVehicleId();
|
||||
String plateNumber = entity.getPlateNumber();
|
||||
String passengerPhone = entity.getPassengerPhone();
|
||||
if (vehicleId == null && StringUtils.isBlank(plateNumber)) {
|
||||
throw new ServiceException("车辆不能为空");
|
||||
}
|
||||
// 如果手机号为空,则使用用户手机号
|
||||
if (StringUtils.isBlank(passengerPhone)) {
|
||||
Long userId = LoginHelper.getUserId();
|
||||
SysUserVo userVo = userService.selectUserById(userId);
|
||||
passengerPhone = userVo.getPhonenumber();
|
||||
}
|
||||
if (!PhoneUtil.isPhone(passengerPhone)) {
|
||||
throw new ServiceException("手机号格式错误", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并批量删除车辆出行记录信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
// 获取数据列表
|
||||
List<VehVehicleTrip> list = this.listByIds(ids);
|
||||
if (isValid) {
|
||||
// 获取登录用户
|
||||
Long userId = LoginHelper.getUserId();
|
||||
Set<Long> userIds = list.stream().map(VehVehicleTrip::getCreateBy).collect(Collectors.toSet());
|
||||
if (!userIds.contains(userId)) {
|
||||
throw new ServiceException("没有权限删除该记录", HttpStatus.FORBIDDEN);
|
||||
}
|
||||
// 获取出现状态
|
||||
for (VehVehicleTrip trip : list) {
|
||||
if (!trip.getTripStatus().equals(VehTripStatusEnum.CANCELED.getValue())
|
||||
|| !trip.getTripStatus().equals(VehTripStatusEnum.READY_DEPART.getValue())) {
|
||||
throw new ServiceException("该记录已开始,不能删除", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 同步删除用户申请记录
|
||||
List<VehVehicleApply> applyList = vehicleApplyService.lambdaQuery()
|
||||
.in(VehVehicleApply::getTripId, ids)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(applyList)) {
|
||||
boolean deleteApply = vehicleApplyService.removeByIds(applyList);
|
||||
if (!deleteApply) {
|
||||
throw new ServiceException("删除用户申请记录失败");
|
||||
}
|
||||
}
|
||||
return this.removeBatchByIds(ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
|
||||
* 正常使用只需#processEvent.flowCode=='leave1'
|
||||
* 示例为了方便则使用startsWith匹配了全部示例key
|
||||
*
|
||||
* @param processEvent 参数
|
||||
*/
|
||||
@EventListener(condition = "#processEvent.flowCode.endsWith('vehVehicleTrip')")
|
||||
@Transactional
|
||||
public void processPlansHandler(ProcessEvent processEvent) {
|
||||
log.info("车辆出行审核任务执行了{}", processEvent.toString());
|
||||
String id = processEvent.getBusinessId();
|
||||
VehVehicleTrip vehicleTrip = this.getById(Long.valueOf(id));
|
||||
if (vehicleTrip == null) {
|
||||
return;
|
||||
}
|
||||
vehicleTrip.setReviewStatus(processEvent.getStatus());
|
||||
this.updateById(vehicleTrip);
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行任务创建监听
|
||||
* 示例:也可通过 @EventListener(condition = "#processTaskEvent.flowCode=='leave1'")进行判断
|
||||
* 在方法中判断流程节点key
|
||||
* if ("xxx".equals(processTaskEvent.getNodeCode())) {
|
||||
* //执行业务逻辑
|
||||
* }
|
||||
*
|
||||
* @param processTaskEvent 参数
|
||||
*/
|
||||
@EventListener(condition = "#processTaskEvent.flowCode.endsWith('vehVehicleTrip')")
|
||||
public void processTaskPlansHandler(ProcessTaskEvent processTaskEvent) {
|
||||
log.info("车辆出行审核任务创建了{}", processTaskEvent.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 监听删除流程事件
|
||||
* 正常使用只需#processDeleteEvent.flowCode=='leave1'
|
||||
* 示例为了方便则使用startsWith匹配了全部示例key
|
||||
*
|
||||
* @param processDeleteEvent 参数
|
||||
*/
|
||||
@EventListener(condition = "#processDeleteEvent.flowCode.endsWith('vehVehicleTrip')")
|
||||
public void processDeletePlansHandler(ProcessDeleteEvent processDeleteEvent) {
|
||||
log.info("车辆出行审核删除流程任务执行了{}", processDeleteEvent.toString());
|
||||
}
|
||||
}
|
||||
@ -12,7 +12,6 @@ import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
|
||||
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
|
||||
import io.netty.util.concurrent.GlobalEventExecutor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.domain.dto.UserDTO;
|
||||
import org.dromara.common.core.domain.model.LoginUser;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.system.domain.vo.SysOssVo;
|
||||
@ -44,20 +43,24 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
private static ChatGroupServiceImpl chatGroupService;
|
||||
private static SysUserServiceImpl sysUserService;
|
||||
private static SysOssServiceImpl sysOssService;
|
||||
|
||||
@Autowired
|
||||
public void setChatHistoryService(ChatHistoryServiceImpl service) {
|
||||
chatHistoryService = service;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void setChatGroupService(ChatGroupServiceImpl service){
|
||||
public void setChatGroupService(ChatGroupServiceImpl service) {
|
||||
chatGroupService = service;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void setSysUserService(SysUserServiceImpl service){
|
||||
public void setSysUserService(SysUserServiceImpl service) {
|
||||
sysUserService = service;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void setSysOssService(SysOssServiceImpl service){
|
||||
public void setSysOssService(SysOssServiceImpl service) {
|
||||
sysOssService = service;
|
||||
}
|
||||
|
||||
@ -72,7 +75,8 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
private static final ConcurrentHashMap<String, Integer> userRoomCountMap = new ConcurrentHashMap<>();
|
||||
//维护一个在线用户列表
|
||||
private static final List<String> onlineUserList = new ArrayList<>();
|
||||
public static List<String> getOnlineUserList(){
|
||||
|
||||
public static List<String> getOnlineUserList() {
|
||||
return onlineUserList;
|
||||
}
|
||||
|
||||
@ -99,13 +103,13 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
|
||||
//建立双向映射关系
|
||||
LoginUser loginUser = LoginHelper.getLoginUser(token.replace("Bearer%20", ""));
|
||||
if (loginUser == null){
|
||||
if (loginUser == null) {
|
||||
throw new RuntimeException("token获取信息失败");
|
||||
}
|
||||
//判断是否存在该账号的通道实例列表
|
||||
userChannelMap.computeIfAbsent(loginUser.getUserId().toString(), k -> new ArrayList<>());
|
||||
List<ChannelHandlerContext> channelHandlerContexts = userChannelMap.get(loginUser.getUserId().toString());
|
||||
if (!channelHandlerContexts.contains( ctx)){
|
||||
if (!channelHandlerContexts.contains(ctx)) {
|
||||
channelHandlerContexts.add(ctx);
|
||||
}
|
||||
//把该账号的通道实例列表跟账号id关联 一个账号有多个通道实例
|
||||
@ -131,7 +135,7 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
|
||||
//构建各个聊天房间未读 数量
|
||||
LambdaQueryWrapper<ChatGroup> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.like(ChatGroup::getMembers, loginUser.getUserId()+",").or().like(ChatGroup::getMembers,loginUser.getUserId()+"]");
|
||||
queryWrapper.like(ChatGroup::getMembers, loginUser.getUserId() + ",").or().like(ChatGroup::getMembers, loginUser.getUserId() + "]");
|
||||
//拿到该用户所参与的房间列表
|
||||
List<ChatGroup> chatGroups = chatGroupService.list(queryWrapper);
|
||||
boolean isHaveSystemRoom = false;
|
||||
@ -150,12 +154,12 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
historyLambdaQueryWrapper.eq(ChatHistory::getIsRead, "1");
|
||||
List<ChatHistory> list = chatHistoryService.list(historyLambdaQueryWrapper);
|
||||
if (list != null && !list.isEmpty()) {
|
||||
roomCounts.put(loginUser.getUserId()+"+"+chatGroup.getId().toString(), list.size());
|
||||
roomCounts.put(loginUser.getUserId() + "+" + chatGroup.getId().toString(), list.size());
|
||||
//连接后同步未读消息到内存中
|
||||
userRoomCountMap.put(loginUser.getUserId()+"+"+chatGroup.getId().toString(), list.size());
|
||||
userRoomCountMap.put(loginUser.getUserId() + "+" + chatGroup.getId().toString(), list.size());
|
||||
}
|
||||
//在遍历的同时寻找是否有系统消息房间
|
||||
if (!isHaveSystemRoom && chatGroup.getMembers().contains("["+ ChatRoomEnum.SYSTEM.getRoomId())){
|
||||
if (!isHaveSystemRoom && chatGroup.getMembers().contains("[" + ChatRoomEnum.SYSTEM.getRoomId())) {
|
||||
isHaveSystemRoom = true;
|
||||
}
|
||||
// if (!isHaveAttendanceRoom && chatGroup.getMembers().contains("["+ChatRoomEnum.ATTENDANCE.getRoomId())){
|
||||
@ -170,18 +174,18 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
}
|
||||
JSONObject message = new JSONObject();
|
||||
message.put("type", "3");
|
||||
message.put("messageType","txt");
|
||||
message.put("messageType", "txt");
|
||||
message.put("unReadCount", roomCounts);
|
||||
log.info("发送所有未读消息:{}",message);
|
||||
if(message.get("unReadCount") != null && !roomCounts.isEmpty()) {
|
||||
log.info("发送所有未读消息:{}", message);
|
||||
if (message.get("unReadCount") != null && !roomCounts.isEmpty()) {
|
||||
sendMessage(ctx, message.toJSONString());
|
||||
}
|
||||
}
|
||||
//认证完成后开始构建系统消息房间 判断是否有系统消息房间 没有则增加
|
||||
if (!isHaveSystemRoom){
|
||||
if (!isHaveSystemRoom) {
|
||||
ChatGroup chatGroup = new ChatGroup();
|
||||
chatGroup.setType(String.valueOf(2));
|
||||
chatGroup.setMembers("["+ChatRoomEnum.SYSTEM.getRoomId()+", " + loginUser.getUserId()+"]");
|
||||
chatGroup.setMembers("[" + ChatRoomEnum.SYSTEM.getRoomId() + ", " + loginUser.getUserId() + "]");
|
||||
chatGroupService.save(chatGroup);
|
||||
}
|
||||
|
||||
@ -310,9 +314,9 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
//来自哪个用户
|
||||
jsonObject.put("from", sysUserVo.getUserId().toString());
|
||||
jsonObject.put("nickName", sysUserVo.getNickName());
|
||||
if(sysUserVo.getAvatar() != null){
|
||||
if (sysUserVo.getAvatar() != null) {
|
||||
SysOssVo byId = sysOssService.getById(sysUserVo.getAvatar());
|
||||
if(byId != null){
|
||||
if (byId != null) {
|
||||
jsonObject.put("avatar", byId.getUrl());
|
||||
}
|
||||
}
|
||||
@ -329,7 +333,7 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
//只要发送一条数据,就要给接收方推送所有未读消息
|
||||
if (!userRoomCountMap.containsKey(id + "+" + RoomId)) {
|
||||
userRoomCountMap.put(id + "+" + RoomId, 1);
|
||||
}else {
|
||||
} else {
|
||||
userRoomCountMap.put(id + "+" + RoomId, userRoomCountMap.get(id + "+" + RoomId) + 1);
|
||||
}
|
||||
//发送消息完成后添加聊天记录
|
||||
@ -340,7 +344,7 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
chatHistory.setIsRead("1");
|
||||
chatHistory.setMessageType(jsonObject.get("messageType").toString());
|
||||
|
||||
if (!jsonObject.get("messageType").equals("txt")){
|
||||
if (!jsonObject.get("messageType").equals("txt")) {
|
||||
|
||||
//将携带base64转为文件然后进行存储 赋值url
|
||||
String base64Data = jsonObject.get("message").toString();
|
||||
@ -352,7 +356,7 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
byte[] fileBytes = Base64.getDecoder().decode(base64Data);
|
||||
|
||||
// 创建临时文件
|
||||
File tempFile = File.createTempFile("", jsonObject.get("fileName").toString());
|
||||
File tempFile = File.createTempFile("", jsonObject.get("fileName").toString());
|
||||
tempFile.deleteOnExit();
|
||||
|
||||
// 写入文件
|
||||
@ -390,37 +394,37 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
}
|
||||
|
||||
}
|
||||
}else if ("1".equals(type)){
|
||||
} else if ("1".equals(type)) {
|
||||
log.info("收到客户端确认消息:{}", jsonObject);
|
||||
//前端接收方收到消息返回1 说明此时处于聊天框内 可以清空该房间的所有未读消息 将此房间聊天记录全部已读
|
||||
//现在是用户发送消息 ctx为接收方用户
|
||||
LambdaQueryWrapper<ChatHistory> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
lambdaQueryWrapper
|
||||
.ne(ChatHistory::getSenderId,sysUserVo.getUserId().toString())
|
||||
.eq(ChatHistory::getGeterId,jsonObject.get("roomId"))
|
||||
.eq(ChatHistory::getIsRead,"1");
|
||||
.ne(ChatHistory::getSenderId, sysUserVo.getUserId().toString())
|
||||
.eq(ChatHistory::getGeterId, jsonObject.get("roomId"))
|
||||
.eq(ChatHistory::getIsRead, "1");
|
||||
List<ChatHistory> list = chatHistoryService.list(lambdaQueryWrapper);
|
||||
if (list != null && !list.isEmpty()){
|
||||
if (list != null && !list.isEmpty()) {
|
||||
for (ChatHistory chatHistory : list) {
|
||||
chatHistory.setIsRead("0");
|
||||
}
|
||||
}
|
||||
chatHistoryService.updateBatchById( list);
|
||||
chatHistoryService.updateBatchById(list);
|
||||
|
||||
//将该房间未读消息 清空
|
||||
userRoomCountMap.put(sysUserVo.getUserId() + "+" + jsonObject.get("roomId"), 0);
|
||||
//清空过后返回其余房间未读消息
|
||||
HashMap<String,Object> temp = new HashMap<>();
|
||||
userRoomCountMap.forEachKey(0,key ->{
|
||||
if (key.contains(sysUserVo.getUserId().toString())){
|
||||
temp.put(key,userRoomCountMap.get(key));
|
||||
HashMap<String, Object> temp = new HashMap<>();
|
||||
userRoomCountMap.forEachKey(0, key -> {
|
||||
if (key.contains(sysUserVo.getUserId().toString())) {
|
||||
temp.put(key, userRoomCountMap.get(key));
|
||||
}
|
||||
});
|
||||
//构建消息
|
||||
JSONObject message = new JSONObject();
|
||||
message.put("type", "1");
|
||||
message.put("unReadCount", temp);
|
||||
message.put("messageType","txt");
|
||||
message.put("messageType", "txt");
|
||||
//发送
|
||||
sendMessage(ctx, message.toString());
|
||||
}
|
||||
@ -435,21 +439,21 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
}
|
||||
|
||||
//给固定的人发消息
|
||||
private void sendMessage(ChannelHandlerContext ctx,String message) {
|
||||
private void sendMessage(ChannelHandlerContext ctx, String message) {
|
||||
|
||||
ctx.channel().writeAndFlush(new TextWebSocketFrame(message));
|
||||
}
|
||||
|
||||
//发送群消息,此时其他客户端也能收到群消息
|
||||
private void sendAllMessage(){
|
||||
private void sendAllMessage() {
|
||||
String message = "我是服务器,这里发送的是群消息";
|
||||
channelGroup.writeAndFlush( new TextWebSocketFrame(message));
|
||||
channelGroup.writeAndFlush(new TextWebSocketFrame(message));
|
||||
}
|
||||
|
||||
|
||||
//通过userId进行发送消息
|
||||
@Transactional
|
||||
public void sendSystemMessageToUser(Long userId, String message,String value){
|
||||
public void sendSystemMessageToUser(Long userId, String message, String value) {
|
||||
// /现在已用type:0 1 3 (暂定为0)
|
||||
// {
|
||||
// "type":"4",
|
||||
@ -465,94 +469,116 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
ChatGroup groupServiceOne = null;
|
||||
ChatHistory chatHistory = null;
|
||||
|
||||
switch (value){
|
||||
switch (value) {
|
||||
//1:系统消息
|
||||
case "0" ->{
|
||||
case "0" -> {
|
||||
//生成系统消息的聊天记录
|
||||
lambdaQueryWrapper.eq(ChatGroup::getMembers,"["+ChatRoomEnum.SYSTEM.getRoomId()+", "+userId+"]");
|
||||
lambdaQueryWrapper.eq(ChatGroup::getMembers, "[" + ChatRoomEnum.SYSTEM.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne = chatGroupService.getOne(lambdaQueryWrapper);
|
||||
//如果给成员发送系统消息 而该成员还没有建立过连接从而没有群聊房间 则创建该成员系统消息房间
|
||||
if (groupServiceOne == null){
|
||||
if (groupServiceOne == null) {
|
||||
groupServiceOne = new ChatGroup();
|
||||
groupServiceOne.setType(String.valueOf(2));
|
||||
groupServiceOne.setMembers("["+ChatRoomEnum.SYSTEM.getRoomId()+", "+userId+"]");
|
||||
groupServiceOne.setMembers("[" + ChatRoomEnum.SYSTEM.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
}else {
|
||||
} else {
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
}
|
||||
chatHistory = new ChatHistory();
|
||||
//发送方设置为99 表示系统消息
|
||||
chatHistory.setSenderId(99L);
|
||||
jsonObject.put("nickName","系统消息");
|
||||
jsonObject.put("roomType",2);
|
||||
jsonObject.put("nickName", "系统消息");
|
||||
jsonObject.put("roomType", 2);
|
||||
}
|
||||
|
||||
//2:考勤消息
|
||||
case "1" ->{
|
||||
lambdaQueryWrapper.eq(ChatGroup::getMembers,"["+ChatRoomEnum.ATTENDANCE.getRoomId()+", "+userId+"]");
|
||||
case "1" -> {
|
||||
lambdaQueryWrapper.eq(ChatGroup::getMembers, "[" + ChatRoomEnum.ATTENDANCE.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne = chatGroupService.getOne(lambdaQueryWrapper);
|
||||
//如果给成员发送考勤消息 而该成员还没有建立过连接从而没有考勤房间 则创建该成员考勤消息房间
|
||||
if (groupServiceOne == null){
|
||||
if (groupServiceOne == null) {
|
||||
groupServiceOne = new ChatGroup();
|
||||
groupServiceOne.setType(String.valueOf(3));
|
||||
groupServiceOne.setMembers("["+ChatRoomEnum.ATTENDANCE.getRoomId()+", "+userId+"]");
|
||||
groupServiceOne.setMembers("[" + ChatRoomEnum.ATTENDANCE.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
}else {
|
||||
} else {
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
}
|
||||
chatHistory = new ChatHistory();
|
||||
//发送方设置为100 表示系统消息中的考勤消息
|
||||
chatHistory.setSenderId(100L);
|
||||
jsonObject.put("nickName","考勤消息");
|
||||
jsonObject.put("roomType",3);
|
||||
jsonObject.put("nickName", "考勤消息");
|
||||
jsonObject.put("roomType", 3);
|
||||
}
|
||||
|
||||
//安全消息
|
||||
case "2" ->{
|
||||
lambdaQueryWrapper.eq(ChatGroup::getMembers,"["+ChatRoomEnum.SAFE.getRoomId()+", "+userId+"]");
|
||||
case "2" -> {
|
||||
lambdaQueryWrapper.eq(ChatGroup::getMembers, "[" + ChatRoomEnum.SAFE.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne = chatGroupService.getOne(lambdaQueryWrapper);
|
||||
//如果给成员发送安全消息 而该成员还没有建立过连接从而没有安全消息 则创建该成员安全消息房间
|
||||
if (groupServiceOne == null){
|
||||
if (groupServiceOne == null) {
|
||||
groupServiceOne = new ChatGroup();
|
||||
groupServiceOne.setType(String.valueOf(4));
|
||||
groupServiceOne.setMembers("["+ChatRoomEnum.SAFE.getRoomId()+", "+userId+"]");
|
||||
groupServiceOne.setMembers("[" + ChatRoomEnum.SAFE.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
}else {
|
||||
} else {
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
}
|
||||
chatHistory = new ChatHistory();
|
||||
//发送方设置为101 表示系统消息中的安全消息
|
||||
chatHistory.setSenderId(101L);
|
||||
jsonObject.put("nickName","安全消息");
|
||||
jsonObject.put("roomType",4);
|
||||
jsonObject.put("nickName", "安全消息");
|
||||
jsonObject.put("roomType", 4);
|
||||
}
|
||||
|
||||
//质量消息
|
||||
case "3" ->{
|
||||
lambdaQueryWrapper.eq(ChatGroup::getMembers,"["+ChatRoomEnum.QUALITY.getRoomId()+", "+userId+"]");
|
||||
case "3" -> {
|
||||
lambdaQueryWrapper.eq(ChatGroup::getMembers, "[" + ChatRoomEnum.QUALITY.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne = chatGroupService.getOne(lambdaQueryWrapper);
|
||||
//如果给成员发送质量消息 而该成员还没有建立过连接从而没有质量消息 则创建该成员质量消息房间
|
||||
if (groupServiceOne == null){
|
||||
if (groupServiceOne == null) {
|
||||
groupServiceOne = new ChatGroup();
|
||||
groupServiceOne.setType(String.valueOf(5));
|
||||
groupServiceOne.setMembers("["+ChatRoomEnum.QUALITY.getRoomId()+", "+userId+"]");
|
||||
groupServiceOne.setMembers("[" + ChatRoomEnum.QUALITY.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
}else {
|
||||
} else {
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
}
|
||||
chatHistory = new ChatHistory();
|
||||
//发送方设置为102 表示系统消息中的质量消息
|
||||
chatHistory.setSenderId(102L);
|
||||
jsonObject.put("nickName","质量消息");
|
||||
jsonObject.put("roomType",5);
|
||||
jsonObject.put("nickName", "质量消息");
|
||||
jsonObject.put("roomType", 5);
|
||||
}
|
||||
|
||||
// 车辆消息
|
||||
case "4" -> {
|
||||
lambdaQueryWrapper.eq(ChatGroup::getMembers, "[" + ChatRoomEnum.VEHICLE.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne = chatGroupService.getOne(lambdaQueryWrapper);
|
||||
//如果给成员发送车辆消息 而该成员还没有建立过连接从而没有车辆消息 则创建该成员车辆消息房间
|
||||
if (groupServiceOne == null) {
|
||||
groupServiceOne = new ChatGroup();
|
||||
groupServiceOne.setType(String.valueOf(6));
|
||||
groupServiceOne.setMembers("[" + ChatRoomEnum.VEHICLE.getRoomId() + ", " + userId + "]");
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
} else {
|
||||
groupServiceOne.setLastMessage(message);
|
||||
groupServiceOne.setLastMessageTime(new Date());
|
||||
}
|
||||
chatHistory = new ChatHistory();
|
||||
//发送方设置为103 表示系统消息中的车辆消息
|
||||
chatHistory.setSenderId(103L);
|
||||
jsonObject.put("nickName", "车辆消息");
|
||||
jsonObject.put("roomType", 6);
|
||||
}
|
||||
|
||||
default -> {
|
||||
@ -572,12 +598,12 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
chatHistoryService.save(chatHistory);
|
||||
|
||||
//发送消息后 将该房间未读消息数加1
|
||||
if (userRoomCountMap.containsKey(userId+"+"+groupServiceOne.getId())){
|
||||
if (userRoomCountMap.containsKey(userId + "+" + groupServiceOne.getId())) {
|
||||
//该房间未读消息数加1
|
||||
userRoomCountMap.put(userId+"+"+groupServiceOne.getId(), userRoomCountMap.get(userId+"+"+groupServiceOne.getId())+1);
|
||||
}else{
|
||||
userRoomCountMap.put(userId + "+" + groupServiceOne.getId(), userRoomCountMap.get(userId + "+" + groupServiceOne.getId()) + 1);
|
||||
} else {
|
||||
//将该房间未读消息数设置为1
|
||||
userRoomCountMap.put(userId+"+"+groupServiceOne.getId(), 1);
|
||||
userRoomCountMap.put(userId + "+" + groupServiceOne.getId(), 1);
|
||||
}
|
||||
|
||||
//通过userId拿到该用户所有通道实例
|
||||
@ -595,10 +621,10 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
|
||||
//设置未读消息数
|
||||
private void setUnReadCount(Long userId, JSONObject jsonObject) {
|
||||
HashMap<String,Object> temp = new HashMap<>();
|
||||
HashMap<String, Object> temp = new HashMap<>();
|
||||
userRoomCountMap.forEachKey(0, (value) -> {
|
||||
if (value.contains(userId.toString())){
|
||||
temp.put(value,userRoomCountMap.get(value));
|
||||
if (value.contains(userId.toString())) {
|
||||
temp.put(value, userRoomCountMap.get(value));
|
||||
}
|
||||
});
|
||||
jsonObject.put("unReadCount", temp);
|
||||
@ -606,23 +632,23 @@ public class ChatServerHandler extends SimpleChannelInboundHandler<TextWebSocket
|
||||
|
||||
|
||||
//用于房间创建后发送确认消息
|
||||
public void sendRoomInfo(Long userId,ChatGroup chatGroup){
|
||||
public void sendRoomInfo(Long userId, ChatGroup chatGroup) {
|
||||
//通过ID找到所有通道 发送消息
|
||||
List<ChannelHandlerContext> channelHandlerContexts = userChannelMap.get(userId.toString());
|
||||
if (channelHandlerContexts == null||channelHandlerContexts.isEmpty()){
|
||||
if (channelHandlerContexts == null || channelHandlerContexts.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
jsonObject.put("type", "5");
|
||||
jsonObject.put("messageType","txt");
|
||||
jsonObject.put("messageType", "txt");
|
||||
jsonObject.put("roomInfo", chatGroup);
|
||||
|
||||
for (ChannelHandlerContext channelHandlerContext : channelHandlerContexts) {
|
||||
sendMessage(channelHandlerContext, String.valueOf(jsonObject));
|
||||
}
|
||||
|
||||
log.info("发送房间创建确认消息:{}",jsonObject);
|
||||
log.info("发送房间创建确认消息:{}", jsonObject);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -14,7 +14,9 @@ public enum ChatRoomEnum {
|
||||
|
||||
SAFE("101", "安全消息"),
|
||||
|
||||
QUALITY("102", "质量消息");
|
||||
QUALITY("102", "质量消息"),
|
||||
|
||||
VEHICLE("103", "车辆消息");
|
||||
|
||||
/**
|
||||
* ID
|
||||
|
||||
@ -0,0 +1,7 @@
|
||||
<?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="org.dromara.vehicle.mapper.VehVehicleApplyMapper">
|
||||
|
||||
</mapper>
|
||||
@ -0,0 +1,93 @@
|
||||
<?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="org.dromara.vehicle.mapper.VehVehicleTripMapper">
|
||||
|
||||
<select id="selectVehicleTripPage" resultType="org.dromara.vehicle.domain.vo.VehVehicleTripVo">
|
||||
SELECT
|
||||
id,
|
||||
project_id,
|
||||
vehicle_id,
|
||||
plate_number,
|
||||
passenger_phone,
|
||||
trip_reason,
|
||||
start_place,
|
||||
end_place,
|
||||
start_lat,
|
||||
start_lng,
|
||||
end_lat,
|
||||
end_lng,
|
||||
start_time,
|
||||
end_time,
|
||||
people_num,
|
||||
left_seat,
|
||||
review_status,
|
||||
trip_status,
|
||||
remark,
|
||||
|
||||
-- 1. 终点距离(米)
|
||||
ROUND(
|
||||
ST_Distance_Sphere(
|
||||
POINT(end_lng, end_lat),
|
||||
POINT(#{req.endLng}, #{req.endLat})
|
||||
), 2
|
||||
) AS distanceM,
|
||||
|
||||
-- 2. 距离评分(0-100)
|
||||
ROUND(
|
||||
GREATEST(0, LEAST(100,
|
||||
100 - ST_Distance_Sphere(
|
||||
POINT(end_lng, end_lat),
|
||||
POINT(#{req.endLng}, #{req.endLat})
|
||||
) / (1 * 10000 / 100)
|
||||
)), 2
|
||||
) AS distance_score,
|
||||
|
||||
-- 3. 时间评分(0-100)
|
||||
ROUND(
|
||||
GREATEST(0, LEAST(100,
|
||||
100 - ABS(TIMESTAMPDIFF(MINUTE, start_time, #{req.startTime})) / (30 / 100)
|
||||
)), 2
|
||||
) AS time_score,
|
||||
|
||||
-- 4. 人数评分(0-100)
|
||||
ROUND(
|
||||
CASE
|
||||
WHEN left_seat >= #{req.peopleNum} THEN 100
|
||||
ELSE (left_seat / #{req.peopleNum}) * 100
|
||||
END, 2
|
||||
) AS people_score,
|
||||
|
||||
-- 5. 综合评分
|
||||
ROUND((
|
||||
(GREATEST(0, LEAST(100,
|
||||
100 - ST_Distance_Sphere(
|
||||
POINT(end_lng, end_lat),
|
||||
POINT(#{req.endLng}, #{req.endLat})
|
||||
) / (1 * 10000 / 100)
|
||||
)) * 0.5)
|
||||
+
|
||||
(GREATEST(0, LEAST(100,
|
||||
100 - ABS(TIMESTAMPDIFF(MINUTE, start_time, #{req.startTime})) / (30 / 100)
|
||||
)) * 0.2)
|
||||
+
|
||||
(CASE
|
||||
WHEN left_seat >= #{req.peopleNum} THEN 100
|
||||
ELSE (left_seat / #{req.peopleNum}) * 100
|
||||
END * 0.3)
|
||||
), 2) AS total_score
|
||||
|
||||
FROM veh_vehicle_trip
|
||||
|
||||
<where>
|
||||
<if test="req.projectId != null">
|
||||
AND project_id = #{req.projectId}
|
||||
</if>
|
||||
</where>
|
||||
|
||||
ORDER BY total_score DESC
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
@ -67,28 +67,30 @@ values (1981989139020378119, '车辆信息导出', 1981989139020378114, '5', '#'
|
||||
|
||||
CREATE TABLE veh_vehicle_trip
|
||||
(
|
||||
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
|
||||
`project_id` BIGINT NOT NULL COMMENT '项目ID',
|
||||
`initiator_id` BIGINT NOT NULL COMMENT '发起人',
|
||||
`vehicle_id` BIGINT NULL COMMENT '车辆ID',
|
||||
`trip_reason` VARCHAR(512) NOT NULL COMMENT '出行事由',
|
||||
`start_place` VARCHAR(255) NULL COMMENT '出发地',
|
||||
`end_place` VARCHAR(255) NOT NULL COMMENT '目的地',
|
||||
`start_lat` VARCHAR(32) NULL COMMENT '出发地经度',
|
||||
`start_lng` VARCHAR(32) NULL COMMENT '出发地纬度',
|
||||
`end_lat` VARCHAR(32) NULL COMMENT '目的地经度',
|
||||
`end_lng` VARCHAR(32) NULL COMMENT '目的地纬度',
|
||||
`start_time` DATETIME NOT NULL COMMENT '计划出发时间',
|
||||
`end_time` DATETIME NULL COMMENT '计划到达时间',
|
||||
`left_seat` INT DEFAULT 0 NOT NULL COMMENT '剩余座位数',
|
||||
`is_driver` VARCHAR(2) NOT NULL COMMENT '是否为车主(0不是 1是)',
|
||||
`trip_status` VARCHAR(2) DEFAULT '0' NOT NULL COMMENT '状态',
|
||||
`remark` TEXT NULL COMMENT '备注',
|
||||
`create_by` BIGINT NULL COMMENT '创建者',
|
||||
`update_by` BIGINT NULL COMMENT '更新者',
|
||||
`create_dept` BIGINT NULL COMMENT '创建部门',
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
|
||||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT '更新时间',
|
||||
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
|
||||
`project_id` BIGINT NOT NULL COMMENT '项目ID',
|
||||
`vehicle_id` BIGINT NULL COMMENT '车辆ID',
|
||||
`plate_number` VARCHAR(32) NOT NULL COMMENT '车牌号',
|
||||
`passenger_phone` VARCHAR(32) NULL COMMENT '联系电话',
|
||||
`trip_reason` VARCHAR(512) NOT NULL COMMENT '出行事由',
|
||||
`start_place` VARCHAR(255) NULL COMMENT '出发地',
|
||||
`end_place` VARCHAR(255) NOT NULL COMMENT '目的地',
|
||||
`start_lat` VARCHAR(32) NULL COMMENT '出发地经度',
|
||||
`start_lng` VARCHAR(32) NULL COMMENT '出发地纬度',
|
||||
`end_lat` VARCHAR(32) NULL COMMENT '目的地经度',
|
||||
`end_lng` VARCHAR(32) NULL COMMENT '目的地纬度',
|
||||
`start_time` DATETIME NOT NULL COMMENT '计划出发时间',
|
||||
`end_time` DATETIME NULL COMMENT '计划到达时间',
|
||||
`people_num` INT DEFAULT 1 NOT NULL COMMENT '申请人数',
|
||||
`left_seat` INT DEFAULT 0 NOT NULL COMMENT '剩余座位数',
|
||||
`review_status` VARCHAR(16) DEFAULT 'draft' NOT NULL COMMENT '审核状态',
|
||||
`trip_status` VARCHAR(2) DEFAULT '0' NOT NULL COMMENT '状态',
|
||||
`remark` TEXT NULL COMMENT '备注',
|
||||
`create_by` BIGINT NULL COMMENT '创建者',
|
||||
`update_by` BIGINT NULL COMMENT '更新者',
|
||||
`create_dept` BIGINT NULL COMMENT '创建部门',
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
|
||||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT '更新时间',
|
||||
index `idx_project_id` (`project_id`)
|
||||
) COMMENT ='车辆出行记录';
|
||||
|
||||
@ -98,11 +100,15 @@ CREATE TABLE veh_vehicle_apply
|
||||
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
|
||||
`project_id` BIGINT NOT NULL COMMENT '项目ID',
|
||||
`trip_id` BIGINT NOT NULL COMMENT '关联行程ID',
|
||||
`passenger_id` BIGINT NOT NULL COMMENT '乘客用户ID',
|
||||
`people_num` INT DEFAULT 1 NOT NULL COMMENT '申请人数',
|
||||
`passenger_phone` VARCHAR(32) NULL COMMENT '联系电话',
|
||||
`status` VARCHAR(2) DEFAULT '0' NOT NULL COMMENT '状态( 0申请中 1已确认 2上车 3到达 4取消)',
|
||||
`boarded` VARCHAR(2) DEFAULT '0' NOT NULL COMMENT '是否确认上车(0否 1是)',
|
||||
`arrived` VARCHAR(2) DEFAULT '0' NOT NULL COMMENT '是否确认到达(0否 1是)',
|
||||
`start_place` VARCHAR(255) NULL COMMENT '出发地',
|
||||
`end_place` VARCHAR(255) NOT NULL COMMENT '目的地',
|
||||
`start_lat` VARCHAR(32) NULL COMMENT '出发地经度',
|
||||
`start_lng` VARCHAR(32) NULL COMMENT '出发地纬度',
|
||||
`end_lat` VARCHAR(32) NULL COMMENT '目的地经度',
|
||||
`end_lng` VARCHAR(32) NULL COMMENT '目的地纬度',
|
||||
`status` VARCHAR(2) DEFAULT '0' NOT NULL COMMENT '乘车状态',
|
||||
`remark` TEXT NULL COMMENT '备注',
|
||||
`create_by` BIGINT NULL COMMENT '创建者',
|
||||
`update_by` BIGINT NULL COMMENT '更新者',
|
||||
|
||||
Reference in New Issue
Block a user