diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application.yml index d01e28e5..1efe23b6 100644 --- a/xinnengyuan/ruoyi-admin/src/main/resources/application.yml +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application.yml @@ -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 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java index 49958449..840266c7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java @@ -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 ids) { + List receiveList = this.listByIds(ids); List itemList = materialReceiveItemService.lambdaQuery() .in(MatMaterialReceiveItem::getReceiveId, ids) .list(); if (CollUtil.isNotEmpty(itemList)) { materialReceiveItemService.removeBatchByIds(itemList); } + // 关联删除材料数据 + Set formCode = receiveList.stream().map(MatMaterialReceive::getFormCode).collect(Collectors.toSet()); + List materials = materialsService.lambdaQuery() + .in(MatMaterials::getFormCode, formCode) + .list(); + if (CollUtil.isNotEmpty(materials)) { + for (MatMaterials material : materials) { + List 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 materialIds = materials.stream().map(MatMaterials::getId).collect(Collectors.toSet()); + List allInventoryList = materialsInventoryService.lambdaQuery() + .in(MatMaterialsInventory::getMaterialsId, materialIds) + .list(); + if (CollUtil.isNotEmpty(allInventoryList)) { + materialsInventoryService.removeBatchByIds(allInventoryList); + } + } + materialsService.removeBatchByIds(materials); + } return this.removeBatchByIds(ids); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/controller/VehVehicleApplyController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/controller/VehVehicleApplyController.java new file mode 100644 index 00000000..7e933a71 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/controller/VehVehicleApplyController.java @@ -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 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 list = vehVehicleApplyService.queryList(req); + ExcelUtil.exportExcel(list, "乘车申请", VehVehicleApplyVo.class, response); + } + + /** + * 获取乘车申请详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("vehicle:vehicleApply:query") + @GetMapping("/{id}") + public R 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 add(@Validated @RequestBody VehVehicleApplyCreateReq req) { + return toAjax(vehVehicleApplyService.insertByBo(req)); + } + + /** + * 修改乘车申请 + */ + @SaCheckPermission("vehicle:vehicleApply:edit") + @Log(title = "乘车申请", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated @RequestBody VehVehicleApplyUpdateReq req) { + return toAjax(vehVehicleApplyService.updateByBo(req)); + } + + /** + * 车主审核 + */ + @SaCheckPermission("vehicle:vehicleApply:edit") + @Log(title = "乘车申请", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/vehicleOwnerReview") + public R 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 remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(vehVehicleApplyService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/controller/VehVehicleTripController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/controller/VehVehicleTripController.java new file mode 100644 index 00000000..fcf5b955 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/controller/VehVehicleTripController.java @@ -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 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 list = vehVehicleTripService.queryList(req); + ExcelUtil.exportExcel(list, "车辆出行记录", VehVehicleTripVo.class, response); + } + + /** + * 获取车辆出行记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("vehicle:vehicleTrip:query") + @GetMapping("/{id}") + public R 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 add(@Validated @RequestBody VehVehicleTripCreateReq req) { + return toAjax(vehVehicleTripService.insertByBo(req)); + } + + /** + * 修改车辆出行记录 + */ + @SaCheckPermission("vehicle:vehicleTrip:edit") + @Log(title = "车辆出行记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated @RequestBody VehVehicleTripUpdateReq req) { + return toAjax(vehVehicleTripService.updateByBo(req)); + } + + /** + * 取消车辆出行记录 + */ + @SaCheckPermission("vehicle:vehicleTrip:edit") + @Log(title = "车辆出行记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/cancel") + public R 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 remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(vehVehicleTripService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleApply.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleApply.java new file mode 100644 index 00000000..83abc90c --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleApply.java @@ -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; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleInfo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleInfo.java index 63c7443b..f8d034aa 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleInfo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleInfo.java @@ -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; - } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleTrip.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleTrip.java new file mode 100644 index 00000000..2240f7bf --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/VehVehicleTrip.java @@ -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; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyCreateReq.java new file mode 100644 index 00000000..2a879adc --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyCreateReq.java @@ -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; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyQueryReq.java new file mode 100644 index 00000000..09b08dee --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyQueryReq.java @@ -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; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyReviewReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyReviewReq.java new file mode 100644 index 00000000..bb01b8cc --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyReviewReq.java @@ -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; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyUpdateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyUpdateReq.java new file mode 100644 index 00000000..017f2bc0 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicleapply/VehVehicleApplyUpdateReq.java @@ -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; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripCancelReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripCancelReq.java new file mode 100644 index 00000000..24fe8312 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripCancelReq.java @@ -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; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripCreateReq.java new file mode 100644 index 00000000..9a4209ad --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripCreateReq.java @@ -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; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripQueryReq.java new file mode 100644 index 00000000..60fbb227 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripQueryReq.java @@ -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; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripUpdateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripUpdateReq.java new file mode 100644 index 00000000..dbb21b7c --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/dto/vehicletrip/VehVehicleTripUpdateReq.java @@ -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; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/enums/VehApplyStatusEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/enums/VehApplyStatusEnum.java new file mode 100644 index 00000000..5ddde9f6 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/enums/VehApplyStatusEnum.java @@ -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; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/enums/VehTripStatusEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/enums/VehTripStatusEnum.java new file mode 100644 index 00000000..2380d0ea --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/enums/VehTripStatusEnum.java @@ -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; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/enums/VehVehicleInfoStatusEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/enums/VehVehicleInfoStatusEnum.java new file mode 100644 index 00000000..7c55ab9c --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/enums/VehVehicleInfoStatusEnum.java @@ -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; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleApplyVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleApplyVo.java new file mode 100644 index 00000000..1c38fc8a --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleApplyVo.java @@ -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; + + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleInfoVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleInfoVo.java index b051b332..908be104 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleInfoVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleInfoVo.java @@ -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; - /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleTripVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleTripVo.java new file mode 100644 index 00000000..a545238d --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/domain/vo/VehVehicleTripVo.java @@ -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; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/mapper/VehVehicleApplyMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/mapper/VehVehicleApplyMapper.java new file mode 100644 index 00000000..f5c87598 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/mapper/VehVehicleApplyMapper.java @@ -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 { + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/mapper/VehVehicleTripMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/mapper/VehVehicleTripMapper.java new file mode 100644 index 00000000..f27dc8a1 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/mapper/VehVehicleTripMapper.java @@ -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 { + + Page selectVehicleTripPage(@Param("page") Page page, + @Param("req") VehVehicleTripQueryReq req); + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/IVehVehicleApplyService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/IVehVehicleApplyService.java new file mode 100644 index 00000000..93308c47 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/IVehVehicleApplyService.java @@ -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 { + + /** + * 查询乘车申请 + * + * @param id 主键 + * @return 乘车申请 + */ + VehVehicleApplyVo queryById(Long id); + + /** + * 分页查询乘车申请列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 乘车申请分页列表 + */ + TableDataInfo queryPageList(VehVehicleApplyQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的乘车申请列表 + * + * @param req 查询条件 + * @return 乘车申请列表 + */ + List 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 ids, Boolean isValid); +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/IVehVehicleTripService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/IVehVehicleTripService.java new file mode 100644 index 00000000..f8720416 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/IVehVehicleTripService.java @@ -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 { + + /** + * 查询车辆出行记录 + * + * @param id 主键 + * @return 车辆出行记录 + */ + VehVehicleTripVo queryById(Long id); + + /** + * 分页查询车辆出行记录列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 车辆出行记录分页列表 + */ + TableDataInfo queryPageList(VehVehicleTripQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的车辆出行记录列表 + * + * @param req 查询条件 + * @return 车辆出行记录列表 + */ + List 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 ids, Boolean isValid); +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleApplyServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleApplyServiceImpl.java new file mode 100644 index 00000000..88c826e5 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleApplyServiceImpl.java @@ -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 + 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 queryPageList(VehVehicleApplyQueryReq req, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(req); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的乘车申请列表 + * + * @param req 查询条件 + * @return 乘车申请列表 + */ + @Override + public List queryList(VehVehicleApplyQueryReq req) { + LambdaQueryWrapper lqw = buildQueryWrapper(req); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(VehVehicleApplyQueryReq req) { + LambdaQueryWrapper 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 ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleInfoServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleInfoServiceImpl.java index a0afd577..e2ad0243 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleInfoServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleInfoServiceImpl.java @@ -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 @@ -38,7 +40,7 @@ public class VehVehicleInfoServiceImpl extends ServiceImpl ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleTripServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleTripServiceImpl.java new file mode 100644 index 00000000..5890768d --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/vehicle/service/impl/VehVehicleTripServiceImpl.java @@ -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 + 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 queryPageList(VehVehicleTripQueryReq req, PageQuery pageQuery) { + Page 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 queryList(VehVehicleTripQueryReq req) { + LambdaQueryWrapper lqw = buildQueryWrapper(req); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(VehVehicleTripQueryReq req) { + LambdaQueryWrapper 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 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 ids, Boolean isValid) { + // 获取数据列表 + List list = this.listByIds(ids); + if (isValid) { + // 获取登录用户 + Long userId = LoginHelper.getUserId(); + Set 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 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()); + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/ChatServerHandler.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/ChatServerHandler.java index d4058963..131e39d7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/ChatServerHandler.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/ChatServerHandler.java @@ -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 userRoomCountMap = new ConcurrentHashMap<>(); //维护一个在线用户列表 private static final List onlineUserList = new ArrayList<>(); - public static List getOnlineUserList(){ + + public static List getOnlineUserList() { return onlineUserList; } @@ -99,13 +103,13 @@ public class ChatServerHandler extends SimpleChannelInboundHandler new ArrayList<>()); List 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 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 chatGroups = chatGroupService.list(queryWrapper); boolean isHaveSystemRoom = false; @@ -150,12 +154,12 @@ public class ChatServerHandler extends SimpleChannelInboundHandler 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 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 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 temp = new HashMap<>(); - userRoomCountMap.forEachKey(0,key ->{ - if (key.contains(sysUserVo.getUserId().toString())){ - temp.put(key,userRoomCountMap.get(key)); + HashMap 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{ + 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 temp = new HashMap<>(); + HashMap 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 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); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/domain/enums/ChatRoomEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/domain/enums/ChatRoomEnum.java index 502bb166..2fcf465f 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/domain/enums/ChatRoomEnum.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/domain/enums/ChatRoomEnum.java @@ -14,7 +14,9 @@ public enum ChatRoomEnum { SAFE("101", "安全消息"), - QUALITY("102", "质量消息"); + QUALITY("102", "质量消息"), + + VEHICLE("103", "车辆消息"); /** * ID diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/vehicle/VehVehicleApplyMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/vehicle/VehVehicleApplyMapper.xml new file mode 100644 index 00000000..af793b60 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/vehicle/VehVehicleApplyMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/vehicle/VehVehicleTripMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/vehicle/VehVehicleTripMapper.xml new file mode 100644 index 00000000..dcb36d3c --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/vehicle/VehVehicleTripMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + diff --git a/xinnengyuan/script/sql/vehicle.sql b/xinnengyuan/script/sql/vehicle.sql index a5a5bd12..967182b0 100644 --- a/xinnengyuan/script/sql/vehicle.sql +++ b/xinnengyuan/script/sql/vehicle.sql @@ -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 '更新者',