摄像头拍摄逻辑,车辆管理

This commit is contained in:
lcj
2025-10-30 20:03:43 +08:00
parent c456ae215f
commit 87e1cb7473
22 changed files with 352 additions and 114 deletions

View File

@ -1,6 +1,5 @@
package org.dromara.test;
import cn.hutool.core.collection.CollUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.materials.domain.MatMaterialIssue;
@ -17,6 +16,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
@ -49,12 +49,15 @@ public class MaterialsTest {
List<MatMaterials> materials = materialsService.lambdaQuery()
.eq(MatMaterials::getProjectId, PROJECT_ID)
.list();
Set<Long> materialIds = materials.stream().map(MatMaterials::getId).collect(Collectors.toSet());
List<MatMaterialsInventory> inventoryList = materialsInventoryService.lambdaQuery()
.in(MatMaterialsInventory::getMaterialsId, materialIds)
.eq(MatMaterialsInventory::getOutPut, MatMaterialsInventoryOutPutEnum.OUT.getValue())
.list();
Map<String, List<MatMaterials>> map = materials.stream()
.collect(Collectors.groupingBy(MatMaterials::getFormCode));
for (Map.Entry<String, List<MatMaterials>> entry : map.entrySet()) {
String key = entry.getKey();
List<MatMaterials> value = entry.getValue();
}
for (MatMaterials material : materials) {
String formCode = material.getFormCode();
// 查看入库数据
@ -62,13 +65,13 @@ public class MaterialsTest {
.eq(MatMaterialReceive::getFormCode, formCode)
.one();
// 查看出库数据
List<MatMaterialsInventory> inventoryList = materialsInventoryService.lambdaQuery()
/* List<MatMaterialsInventory> inventoryList = materialsInventoryService.lambdaQuery()
.eq(MatMaterialsInventory::getMaterialsId, material.getId())
.eq(MatMaterialsInventory::getOutPut, MatMaterialsInventoryOutPutEnum.OUT.getValue())
.list();
if (CollUtil.isEmpty(inventoryList)) {
continue;
}
}*/
// 创建领料出库数据
List<MatMaterialIssue> issueList = inventoryList.stream().map(inventory -> {
MatMaterialIssue issue = new MatMaterialIssue();

View File

@ -1,5 +1,6 @@
package org.dromara.job.cycle;
import cn.hutool.core.collection.CollUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.manager.ys7manager.Ys7Manager;
@ -10,6 +11,8 @@ import org.dromara.other.domain.enums.OthDeviceStatusEnum;
import org.dromara.other.service.IOthDevicePresetService;
import org.dromara.other.service.IOthYs7DeviceImgService;
import org.dromara.other.service.IOthYs7DeviceService;
import org.dromara.safety.domain.HseViolationLevel;
import org.dromara.safety.service.IHseViolationLevelService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@ -40,6 +43,9 @@ public class IncSyncYs7DeviceCapturePicData {
@Resource
private IOthYs7DeviceImgService ys7DeviceImgService;
@Resource
private IHseViolationLevelService violationLevelService;
@Resource
private Ys7Manager ys7Manager;
@ -49,11 +55,21 @@ public class IncSyncYs7DeviceCapturePicData {
@Scheduled(cron = "0 */10 7-19 * * ?")
public void run() {
log.info("执行萤石设备抓拍图片");
// 获取所有项目的等级信息
List<HseViolationLevel> allLevel = violationLevelService.lambdaQuery()
.select(HseViolationLevel::getId, HseViolationLevel::getProjectId)
.list();
Set<Long> projectIds = allLevel.stream().map(HseViolationLevel::getProjectId).collect(Collectors.toSet());
// 查询所有在线的摄像头设备,仅获取必要字段
List<OthYs7Device> deviceList = ys7DeviceService.lambdaQuery()
.select(OthYs7Device::getId, OthYs7Device::getDeviceSerial, OthYs7Device::getDeviceName)
.in(OthYs7Device::getProjectId, projectIds) // 仅获取设置了安全等级项目的摄像头
.eq(OthYs7Device::getStatus, OthDeviceStatusEnum.ONLINE.getValue())
.list();
if (CollUtil.isEmpty(deviceList)) {
log.info("没有可拍摄的摄像头设备");
return;
}
// 提取设备序列号用于后续查询预置位
List<String> deviceSerialList = deviceList.stream()
.map(OthYs7Device::getDeviceSerial).toList();

View File

@ -3,6 +3,7 @@ package org.dromara.manager.recognizermanager.enums;
import lombok.Getter;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
@ -48,6 +49,15 @@ public enum RecognizerTypeEnum {
return null;
}
public static RecognizerTypeEnum fromCode(String code) {
for (RecognizerTypeEnum type : RecognizerTypeEnum.values()) {
if (type.getCode().equals(code)) {
return type;
}
}
return null;
}
/**
* 将多个 RecognizerTypeEnum 拼接为接口识别参数字符串(","分隔)
*/
@ -60,4 +70,18 @@ public enum RecognizerTypeEnum {
.collect(Collectors.joining(","));
}
/**
* 将多个 code 转换为 RecognizerTypeEnum
*
* @param codes code列表
* @return RecognizerTypeEnum列表
*/
public static List<RecognizerTypeEnum> listFromCodes(List<String> codes) {
return codes.stream()
.map(RecognizerTypeEnum::fromCode)
.filter(Objects::nonNull)
.distinct()
.toList();
}
}

View File

@ -68,6 +68,11 @@ public class MatMaterialIssue extends BaseEntity {
*/
private String issueUnit;
/**
* 领料单位id
*/
private Long issueUnitId;
/**
* 领用人
*/

View File

@ -270,7 +270,9 @@ public class MatMaterialIssueServiceImpl extends ServiceImpl<MatMaterialIssueMap
inventory.setOutPutTime(new Date());
inventory.setResidue(item.getRemainingQuantity().longValue());
inventory.setOperator(nickname);
inventory.setOperatorId(LoginHelper.getUserId());
inventory.setRecipient(materialIssue.getIssueUnit());
inventory.setRecipientId(materialIssue.getIssueUnitId());
inventory.setShipper(materialIssue.getShipper());
inventory.setMaterialsId(item.getMaterialsId());
inventory.setProjectId(materialIssue.getProjectId());

View File

@ -8,7 +8,7 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import java.util.stream.Stream;
@Configuration
//@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {

View File

@ -31,9 +31,11 @@ import org.dromara.other.domain.vo.ys7deviceimg.OthYs7DeviceImgVo;
import org.dromara.other.mapper.OthYs7DeviceImgMapper;
import org.dromara.other.service.IOthYs7DeviceImgService;
import org.dromara.other.service.IOthYs7DeviceService;
import org.dromara.safety.domain.HseViolationLevel;
import org.dromara.safety.domain.dto.recognizerecord.HseRecognizeRecordCreateDto;
import org.dromara.safety.domain.enums.HseRecordCategoryEnum;
import org.dromara.safety.service.IHseRecognizeRecordService;
import org.dromara.safety.service.IHseViolationLevelService;
import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.service.ISysOssService;
import org.springframework.beans.BeanUtils;
@ -45,6 +47,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
/**
* 萤石摄像头图片Service业务层处理
@ -66,6 +69,9 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe
@Resource
private IHseRecognizeRecordService recognizeRecordService;
@Resource
private IHseViolationLevelService violationLevelService;
@Resource
private IOthYs7DeviceService ys7DeviceService;
@ -206,6 +212,33 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe
public void saveCapturePic(List<OthYs7DeviceImgCreateByCapture> imgList) {
List<OthYs7DeviceImg> saveList = new ArrayList<>();
List<HseRecognizeRecordCreateDto> recordList = new ArrayList<>();
// 获取项目id
Set<Long> projectIds = imgList.stream().map(OthYs7DeviceImgCreateByCapture::getProjectId).collect(Collectors.toSet());
// 获取安全等级设置
List<HseViolationLevel> levelList = violationLevelService.lambdaQuery()
.in(HseViolationLevel::getProjectId, projectIds)
.list();
if (CollUtil.isEmpty(levelList)) {
log.error("未设置安全等级");
return;
}
Map<Long, List<RecognizerTypeEnum>> level = new HashMap<>();
Map<Long, List<HseViolationLevel>> levelMap = levelList.stream()
.collect(Collectors.groupingBy(HseViolationLevel::getProjectId));
for (Map.Entry<Long, List<HseViolationLevel>> entry : levelMap.entrySet()) {
List<RecognizerTypeEnum> recognizerTypeEnums = entry.getValue().stream().map(l -> {
List<String> levels = StringUtils.splitList(l.getViolationType());
return RecognizerTypeEnum.listFromCodes(levels);
}).filter(CollUtil::isNotEmpty)
.flatMap(Collection::stream)
.distinct()
.toList();
level.put(entry.getKey(), recognizerTypeEnums);
}
if (CollUtil.isEmpty(level)) {
log.error("未设置安全等级");
return;
}
for (OthYs7DeviceImgCreateByCapture img : imgList) {
OthYs7DeviceImg othYs7DeviceImg = new OthYs7DeviceImg();
String url = img.getUrl();
@ -220,17 +253,11 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe
othYs7DeviceImg.setDeviceName(img.getDeviceName());
othYs7DeviceImg.setUrl(ossUrl);
// 将抓取的图片进行识别
// List<RecognizerTypeEnum> recTypes = List.of(RecognizerTypeEnum.NO_EQUIPMENT,
// RecognizerTypeEnum.NO_HELMET,
// RecognizerTypeEnum.NO_EQUIPMENT,
// RecognizerTypeEnum.NO_VEST,
// RecognizerTypeEnum.SMOKE,
// RecognizerTypeEnum.FIRE);
List<RecognizerTypeEnum> recTypes = List.of(
RecognizerTypeEnum.COLUMN,
RecognizerTypeEnum.PANEL,
RecognizerTypeEnum.BRACKET,
RecognizerTypeEnum.HOLE);
List<RecognizerTypeEnum> recTypes = level.get(img.getProjectId());
if (CollUtil.isEmpty(recTypes)) {
log.error("未设置安全等级");
continue;
}
RecognizeVo recognizeVo = null;
try {
recognizeVo = recognizerManager.recognize(ossUrl, recTypes);

View File

@ -0,0 +1,85 @@
package org.dromara.vehicle.controller.app;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
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.bo.VehVehicleInfoBo;
import org.dromara.vehicle.domain.vo.VehVehicleInfoVo;
import org.dromara.vehicle.service.IVehVehicleInfoService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author lilemy
* @date 2025-10-30 11:51
*/
@Validated
@RestController
@RequestMapping("/app/vehicle/vehicleInfo")
public class VehVehicleInfoAppController extends BaseController {
@Resource
private IVehVehicleInfoService vehicleInfoService;
/**
* 查询车辆信息列表
*/
@GetMapping("/list")
public TableDataInfo<VehVehicleInfoVo> list(VehVehicleInfoBo bo, PageQuery pageQuery) {
return vehicleInfoService.queryPageList(bo, pageQuery);
}
/**
* 获取车辆信息详细信息
*
* @param id 主键
*/
@GetMapping("/{id}")
public R<VehVehicleInfoVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(vehicleInfoService.queryById(id));
}
/**
* 新增车辆信息
*/
@Log(title = "车辆信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody VehVehicleInfoBo bo) {
return toAjax(vehicleInfoService.insertByBo(bo));
}
/**
* 修改车辆信息
*/
@Log(title = "车辆信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody VehVehicleInfoBo bo) {
return toAjax(vehicleInfoService.updateByBo(bo));
}
/**
* 删除车辆信息
*
* @param ids 主键串
*/
@Log(title = "车辆信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(vehicleInfoService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -46,7 +46,7 @@ public class VehVehicleTripAppController extends BaseController {
*/
@GetMapping("/myList")
public R<List<VehVehicleTripMyVo>> queryMyList(VehVehicleTripMyQueryReq req) {
return R.ok(vehicleTripService.queryMyList(req));
return R.ok(vehicleTripService.queryMyAppList(req));
}
/**

View File

@ -61,22 +61,22 @@ public class VehVehicleApply extends BaseEntity {
/**
* 出发地经度
*/
private String startLat;
private String startLng;
/**
* 出发地纬度
*/
private String startLng;
private String startLat;
/**
* 目的地经度
*/
private String endLat;
private String endLng;
/**
* 目的地纬度
*/
private String endLng;
private String endLat;
/**
* 乘车状态

View File

@ -65,22 +65,22 @@ public class VehVehicleTrip extends BaseEntity {
private String endPlace;
/**
* 出发地
* 出发地
*/
private String startLat;
/**
* 出发地
* 出发地
*/
private String startLng;
/**
* 目的地
* 目的地
*/
private String endLat;
/**
* 目的地
* 目的地
*/
private String endLng;

View File

@ -54,24 +54,24 @@ public class VehVehicleApplyCreateReq implements Serializable {
/**
* 出发地经度
*/
private String startLat;
private String startLng;
/**
* 出发地纬度
*/
private String startLng;
private String startLat;
/**
* 目的地经度
*/
@NotBlank(message = "目的地经度不能为空")
private String endLat;
private String endLng;
/**
* 目的地纬度
*/
@NotBlank(message = "目的地纬度不能为空")
private String endLng;
private String endLat;
/**
* 备注

View File

@ -45,22 +45,22 @@ public class VehVehicleApplyUpdateReq implements Serializable {
/**
* 出发地经度
*/
private String startLat;
private String startLng;
/**
* 出发地纬度
*/
private String startLng;
private String startLat;
/**
* 目的地经度
*/
private String endLat;
private String endLng;
/**
* 目的地纬度
*/
private String endLng;
private String endLat;
/**
* 备注

View File

@ -59,25 +59,25 @@ public class VehVehicleTripCreateReq implements Serializable {
* 出发地经度
*/
@NotBlank(message = "出发地经度不能为空")
private String startLat;
private String startLng;
/**
* 出发地纬度
*/
@NotBlank(message = "出发地纬度不能为空")
private String startLng;
private String startLat;
/**
* 目的地经度
*/
@NotBlank(message = "目的地经度不能为空")
private String endLat;
private String endLng;
/**
* 目的地纬度
*/
@NotBlank(message = "目的地纬度不能为空")
private String endLng;
private String endLat;
/**
* 计划出发时间

View File

@ -17,7 +17,9 @@ public class VehVehicleTripMyQueryReq implements Serializable {
private static final long serialVersionUID = 4251601419123102085L;
/**
* 查询类型(1待出行 2预约中 3已完成)
* 查询类型
* web(1待出行 2预约中 3已完成)
* app(0待出行 1进行中 2预约中 3已完成)
*/
@NotBlank(message = "查询类型不能为空")
private String type;

View File

@ -29,12 +29,12 @@ public class VehVehicleTripQueryReq implements Serializable {
/**
* 目的地经度
*/
private String endLat;
private String endLng;
/**
* 目的地纬度
*/
private String endLng;
private String endLat;
/**
* 计划出发时间

View File

@ -61,22 +61,22 @@ public class VehVehicleTripUpdateReq implements Serializable {
/**
* 出发地经度
*/
private String startLat;
private String startLng;
/**
* 出发地纬度
*/
private String startLng;
private String startLat;
/**
* 目的地经度
*/
private String endLat;
private String endLng;
/**
* 目的地纬度
*/
private String endLng;
private String endLat;
/**
* 计划出发时间

View File

@ -75,25 +75,25 @@ public class VehVehicleApplyVo implements Serializable {
* 出发地经度
*/
@ExcelProperty(value = "出发地经度")
private String startLat;
private String startLng;
/**
* 出发地纬度
*/
@ExcelProperty(value = "出发地纬度")
private String startLng;
private String startLat;
/**
* 目的地经度
*/
@ExcelProperty(value = "目的地经度")
private String endLat;
private String endLng;
/**
* 目的地纬度
*/
@ExcelProperty(value = "目的地纬度")
private String endLng;
private String endLat;
/**
* 乘车状态

View File

@ -81,25 +81,25 @@ public class VehVehicleTripVo implements Serializable {
* 出发地经度
*/
@ExcelProperty(value = "出发地经度")
private String startLat;
private String startLng;
/**
* 出发地纬度
*/
@ExcelProperty(value = "出发地纬度")
private String startLng;
private String startLat;
/**
* 目的地经度
*/
@ExcelProperty(value = "目的地经度")
private String endLat;
private String endLng;
/**
* 目的地纬度
*/
@ExcelProperty(value = "目的地纬度")
private String endLng;
private String endLat;
/**
* 计划出发时间
@ -155,6 +155,11 @@ public class VehVehicleTripVo implements Serializable {
*/
private String distanceScore;
/**
* 时间
*/
private String time;
/**
* 时间评分
*/

View File

@ -44,6 +44,14 @@ public interface IVehVehicleTripService extends IService<VehVehicleTrip> {
*/
List<VehVehicleTripMyVo> queryMyList(VehVehicleTripMyQueryReq req);
/**
* 查询当前用户车辆出行记录列表
*
* @param req 列表查询条件
* @return 当前用户车辆出行记录列表
*/
List<VehVehicleTripMyVo> queryMyAppList(VehVehicleTripMyQueryReq req);
/**
* 查询符合条件的车辆出行记录列表
*

View File

@ -14,6 +14,7 @@ import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
@ -96,6 +97,16 @@ public class VehVehicleTripServiceImpl extends ServiceImpl<VehVehicleTripMapper,
&& ObjectUtils.isNotNull(req.getStartTime()) && ObjectUtils.isNotNull(req.getPeopleNum())
&& req.getPeopleNum() >= 1) {
result = baseMapper.selectVehicleTripPage(pageQuery.build(), req);
result.getRecords().forEach(trip -> {
Date startTime = trip.getStartTime();
Date date = DateUtils.toDate(req.getStartTime());
// 判断日期
if (date.after(startTime)) {
DateUtils.getTimeDifference(startTime, date);
} else {
DateUtils.getTimeDifference(date, startTime);
}
});
} else {
result = baseMapper.selectVoPage(pageQuery.build(), buildQueryWrapper(req));
}
@ -115,8 +126,6 @@ public class VehVehicleTripServiceImpl extends ServiceImpl<VehVehicleTripMapper,
if (userId == null) {
throw new ServiceException("请先登录", HttpStatus.UNAUTHORIZED);
}
// 查询数据
List<VehVehicleTrip> tripList = new ArrayList<>();
// --- 一、查询当前用户创建的行程 ---
List<VehVehicleTrip> createdTrips = this.lambdaQuery()
.eq(VehVehicleTrip::getCreateBy, userId)
@ -125,10 +134,6 @@ public class VehVehicleTripServiceImpl extends ServiceImpl<VehVehicleTripMapper,
.ne("2".equals(type), VehVehicleTrip::getReviewStatus, BusinessStatusEnum.FINISH.getStatus())
.eq("3".equals(type), VehVehicleTrip::getTripStatus, VehTripStatusEnum.COMPLETED.getValue())
.list();
// 收集行程id
Set<Long> tripIds = createdTrips.stream()
.map(VehVehicleTrip::getId)
.collect(Collectors.toSet());
// --- 二、查询当前用户作为乘客的申请 ---
List<VehVehicleApply> userApplies = vehicleApplyService.lambdaQuery()
.eq(VehVehicleApply::getCreateBy, userId)
@ -136,57 +141,42 @@ public class VehVehicleTripServiceImpl extends ServiceImpl<VehVehicleTripMapper,
.notIn("2".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ARRIVED.getValue(), VehApplyStatusEnum.ALREADY.getValue())
.eq("3".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ARRIVED.getValue())
.list();
List<VehVehicleApply> applyList = new ArrayList<>(userApplies);
// 收集申请对应的行程id
tripIds.addAll(userApplies.stream()
.map(VehVehicleApply::getTripId)
.collect(Collectors.toSet()));
// 收集申请id
Set<Long> applyIds = userApplies.stream()
.map(VehVehicleApply::getId)
.collect(Collectors.toSet());
// --- 三、查询这些行程Id对应的行程合并创建的与乘坐的 ---
if (CollUtil.isNotEmpty(tripIds)) {
List<VehVehicleTrip> trips = this.lambdaQuery()
.in(VehVehicleTrip::getId, tripIds)
.list();
tripList.addAll(trips);
}
// --- 四、查询这些行程对应的有效申请 ---
if (CollUtil.isNotEmpty(tripIds)) {
List<VehVehicleApply> applies = vehicleApplyService.lambdaQuery()
.in(VehVehicleApply::getTripId, tripIds)
.notIn(CollUtil.isNotEmpty(applyIds), VehVehicleApply::getId, applyIds)
.ne(VehVehicleApply::getStatus, VehApplyStatusEnum.CANCELED.getValue())
.list();
applyList.addAll(applies);
}
// 整合数据
List<VehVehicleTripMyVo> result = new ArrayList<>();
if (CollUtil.isEmpty(tripList)) {
return result;
return buildTripMyVoList(createdTrips, userApplies, userId);
}
/**
* 查询当前用户车辆出行记录列表
*
* @param req 列表查询条件
* @return 当前用户车辆出行记录列表
*/
@Override
public List<VehVehicleTripMyVo> queryMyAppList(VehVehicleTripMyQueryReq req) {
String type = req.getType();
Long userId = LoginHelper.getUserId();
if (userId == null) {
throw new ServiceException("请先登录", HttpStatus.UNAUTHORIZED);
}
List<VehVehicleTripMyVo> tripMyVos = new ArrayList<>(tripList.stream().map(trip -> {
VehVehicleTripMyVo tripMyVo = new VehVehicleTripMyVo();
BeanUtils.copyProperties(trip, tripMyVo);
List<VehVehicleApply> list = applyList.stream()
.filter(apply -> apply.getTripId().equals(trip.getId()))
.toList();
if (CollUtil.isNotEmpty(list)) {
// 封装数据
List<VehVehicleApplyVo> applyVoList = list.stream().map(apply -> {
VehVehicleApplyVo applyVo = new VehVehicleApplyVo();
BeanUtils.copyProperties(apply, applyVo);
return applyVo;
}).toList();
tripMyVo.setApplyList(applyVoList);
}
tripMyVo.setIsVehicleOwner(trip.getCreateBy().equals(userId) ? 1 : 0);
return tripMyVo;
}).toList());
// 根据出行时间排序
tripMyVos.sort(Comparator.comparing(VehVehicleTripMyVo::getStartTime));
return tripMyVos;
// --- 一、查询当前用户创建的行程 ---
List<VehVehicleTrip> createdTrips = this.lambdaQuery()
.eq(VehVehicleTrip::getCreateBy, userId)
.eq("0".equals(type) || "2".equals(type), VehVehicleTrip::getTripStatus, VehTripStatusEnum.READY_DEPART.getValue())
.eq("0".equals(type), VehVehicleTrip::getReviewStatus, BusinessStatusEnum.FINISH.getStatus())
.eq("1".equals(type), VehVehicleTrip::getTripStatus, VehTripStatusEnum.UNDERWAY.getValue())
.ne("2".equals(type), VehVehicleTrip::getReviewStatus, BusinessStatusEnum.FINISH.getStatus())
.eq("3".equals(type), VehVehicleTrip::getTripStatus, VehTripStatusEnum.COMPLETED.getValue())
.list();
// --- 二、查询当前用户作为乘客的申请 ---
List<VehVehicleApply> userApplies = vehicleApplyService.lambdaQuery()
.eq(VehVehicleApply::getCreateBy, userId)
.eq("0".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.CONFIRMED.getValue())
.eq("1".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ALREADY.getValue())
.notIn("2".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ARRIVED.getValue(), VehApplyStatusEnum.ALREADY.getValue())
.eq("3".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ARRIVED.getValue())
.list();
// 整合数据
return buildTripMyVoList(createdTrips, userApplies, userId);
}
/**
@ -475,6 +465,77 @@ public class VehVehicleTripServiceImpl extends ServiceImpl<VehVehicleTripMapper,
return this.removeBatchByIds(ids);
}
/**
* 构建用户行程及其对应申请的展示列表
*
* @param createdTrips 用户创建的行程列表
* @param userApplies 用户申请列表
* @param userId 当前用户ID
* @return 组装后的 VehVehicleTripMyVo 列表
*/
private List<VehVehicleTripMyVo> buildTripMyVoList(List<VehVehicleTrip> createdTrips,
List<VehVehicleApply> userApplies,
Long userId) {
// 收集行程id
Set<Long> tripIds = createdTrips.stream()
.map(VehVehicleTrip::getId)
.collect(Collectors.toSet());
List<VehVehicleApply> applyList = new ArrayList<>(userApplies);
// 收集申请对应的行程id
tripIds.addAll(userApplies.stream()
.map(VehVehicleApply::getTripId)
.collect(Collectors.toSet()));
// 收集申请id
Set<Long> applyIds = userApplies.stream()
.map(VehVehicleApply::getId)
.collect(Collectors.toSet());
// --- 三、查询这些行程Id对应的行程合并创建的与乘坐的 ---
List<VehVehicleTrip> tripList = new ArrayList<>();
if (CollUtil.isNotEmpty(tripIds)) {
List<VehVehicleTrip> trips = this.lambdaQuery()
.in(VehVehicleTrip::getId, tripIds)
.list();
tripList.addAll(trips);
}
// --- 四、查询这些行程对应的有效申请 ---
if (CollUtil.isNotEmpty(tripIds)) {
List<VehVehicleApply> applies = vehicleApplyService.lambdaQuery()
.in(VehVehicleApply::getTripId, tripIds)
.notIn(CollUtil.isNotEmpty(applyIds), VehVehicleApply::getId, applyIds)
.ne(VehVehicleApply::getStatus, VehApplyStatusEnum.CANCELED.getValue())
.list();
applyList.addAll(applies);
}
if (CollUtil.isEmpty(tripList)) {
return Collections.emptyList();
}
return tripList.stream().map(trip -> {
VehVehicleTripMyVo tripMyVo = new VehVehicleTripMyVo();
BeanUtils.copyProperties(trip, tripMyVo);
// 找出对应申请
List<VehVehicleApply> relatedApplies = applyList.stream()
.filter(apply -> apply.getTripId().equals(trip.getId()))
.toList();
if (CollUtil.isNotEmpty(relatedApplies)) {
List<VehVehicleApplyVo> applyVoList = relatedApplies.stream().map(apply -> {
VehVehicleApplyVo applyVo = new VehVehicleApplyVo();
BeanUtils.copyProperties(apply, applyVo);
return applyVo;
}).toList();
tripMyVo.setApplyList(applyVoList);
}
// 是否为行程发起人
tripMyVo.setIsVehicleOwner(trip.getCreateBy().equals(userId) ? 1 : 0);
return tripMyVo;
}).sorted(Comparator.comparing(VehVehicleTripMyVo::getStartTime))
.toList();
}
/**
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
* 正常使用只需#processEvent.flowCode=='leave1'

View File

@ -14,10 +14,10 @@
trip_reason,
start_place,
end_place,
start_lat,
start_lng,
end_lat,
start_lat,
end_lng,
end_lat,
start_time,
end_time,
people_num,
@ -51,7 +51,7 @@
-- 3. 时间评分0-100
ROUND(
GREATEST(0, LEAST(100,
100 - ABS(TIMESTAMPDIFF(MINUTE, start_time, #{req.startTime})) / (60 / 100)
100 - ABS(TIMESTAMPDIFF(MINUTE, start_time, #{req.startTime})) / (120 / 100)
)), 2
) AS time_score,
@ -73,7 +73,7 @@
)) * 0.5)
+
(GREATEST(0, LEAST(100,
100 - ABS(TIMESTAMPDIFF(MINUTE, start_time, #{req.startTime})) / (60 / 100)
100 - ABS(TIMESTAMPDIFF(MINUTE, start_time, #{req.startTime})) / (120 / 100)
)) * 0.2)
+
(CASE