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

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

View File

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

View File

@ -3,6 +3,7 @@ package org.dromara.manager.recognizermanager.enums;
import lombok.Getter; import lombok.Getter;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -48,6 +49,15 @@ public enum RecognizerTypeEnum {
return null; return null;
} }
public static RecognizerTypeEnum fromCode(String code) {
for (RecognizerTypeEnum type : RecognizerTypeEnum.values()) {
if (type.getCode().equals(code)) {
return type;
}
}
return null;
}
/** /**
* 将多个 RecognizerTypeEnum 拼接为接口识别参数字符串(","分隔) * 将多个 RecognizerTypeEnum 拼接为接口识别参数字符串(","分隔)
*/ */
@ -60,4 +70,18 @@ public enum RecognizerTypeEnum {
.collect(Collectors.joining(",")); .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; private String issueUnit;
/**
* 领料单位id
*/
private Long issueUnitId;
/** /**
* 领用人 * 领用人
*/ */

View File

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

View File

@ -8,7 +8,7 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import java.util.stream.Stream; import java.util.stream.Stream;
@Configuration //@Configuration
public class WebSocketConfig { public class WebSocketConfig {
@Bean @Bean
public ServerEndpointExporter serverEndpointExporter() { 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.mapper.OthYs7DeviceImgMapper;
import org.dromara.other.service.IOthYs7DeviceImgService; import org.dromara.other.service.IOthYs7DeviceImgService;
import org.dromara.other.service.IOthYs7DeviceService; 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.dto.recognizerecord.HseRecognizeRecordCreateDto;
import org.dromara.safety.domain.enums.HseRecordCategoryEnum; import org.dromara.safety.domain.enums.HseRecordCategoryEnum;
import org.dromara.safety.service.IHseRecognizeRecordService; import org.dromara.safety.service.IHseRecognizeRecordService;
import org.dromara.safety.service.IHseViolationLevelService;
import org.dromara.system.domain.vo.SysOssUploadVo; import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.service.ISysOssService; import org.dromara.system.service.ISysOssService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -45,6 +47,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* 萤石摄像头图片Service业务层处理 * 萤石摄像头图片Service业务层处理
@ -66,6 +69,9 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe
@Resource @Resource
private IHseRecognizeRecordService recognizeRecordService; private IHseRecognizeRecordService recognizeRecordService;
@Resource
private IHseViolationLevelService violationLevelService;
@Resource @Resource
private IOthYs7DeviceService ys7DeviceService; private IOthYs7DeviceService ys7DeviceService;
@ -206,6 +212,33 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe
public void saveCapturePic(List<OthYs7DeviceImgCreateByCapture> imgList) { public void saveCapturePic(List<OthYs7DeviceImgCreateByCapture> imgList) {
List<OthYs7DeviceImg> saveList = new ArrayList<>(); List<OthYs7DeviceImg> saveList = new ArrayList<>();
List<HseRecognizeRecordCreateDto> recordList = 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) { for (OthYs7DeviceImgCreateByCapture img : imgList) {
OthYs7DeviceImg othYs7DeviceImg = new OthYs7DeviceImg(); OthYs7DeviceImg othYs7DeviceImg = new OthYs7DeviceImg();
String url = img.getUrl(); String url = img.getUrl();
@ -220,17 +253,11 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe
othYs7DeviceImg.setDeviceName(img.getDeviceName()); othYs7DeviceImg.setDeviceName(img.getDeviceName());
othYs7DeviceImg.setUrl(ossUrl); othYs7DeviceImg.setUrl(ossUrl);
// 将抓取的图片进行识别 // 将抓取的图片进行识别
// List<RecognizerTypeEnum> recTypes = List.of(RecognizerTypeEnum.NO_EQUIPMENT, List<RecognizerTypeEnum> recTypes = level.get(img.getProjectId());
// RecognizerTypeEnum.NO_HELMET, if (CollUtil.isEmpty(recTypes)) {
// RecognizerTypeEnum.NO_EQUIPMENT, log.error("未设置安全等级");
// RecognizerTypeEnum.NO_VEST, continue;
// RecognizerTypeEnum.SMOKE, }
// RecognizerTypeEnum.FIRE);
List<RecognizerTypeEnum> recTypes = List.of(
RecognizerTypeEnum.COLUMN,
RecognizerTypeEnum.PANEL,
RecognizerTypeEnum.BRACKET,
RecognizerTypeEnum.HOLE);
RecognizeVo recognizeVo = null; RecognizeVo recognizeVo = null;
try { try {
recognizeVo = recognizerManager.recognize(ossUrl, recTypes); 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") @GetMapping("/myList")
public R<List<VehVehicleTripMyVo>> queryMyList(VehVehicleTripMyQueryReq req) { 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 endPlace;
/** /**
* 出发地 * 出发地
*/ */
private String startLat; private String startLat;
/** /**
* 出发地 * 出发地
*/ */
private String startLng; private String startLng;
/** /**
* 目的地 * 目的地
*/ */
private String endLat; private String endLat;
/** /**
* 目的地 * 目的地
*/ */
private String endLng; 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 = "目的地经度不能为空") @NotBlank(message = "目的地经度不能为空")
private String endLat; private String endLng;
/** /**
* 目的地纬度 * 目的地纬度
*/ */
@NotBlank(message = "目的地纬度不能为空") @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 = "出发地经度不能为空") @NotBlank(message = "出发地经度不能为空")
private String startLat; private String startLng;
/** /**
* 出发地纬度 * 出发地纬度
*/ */
@NotBlank(message = "出发地纬度不能为空") @NotBlank(message = "出发地纬度不能为空")
private String startLng; private String startLat;
/** /**
* 目的地经度 * 目的地经度
*/ */
@NotBlank(message = "目的地经度不能为空") @NotBlank(message = "目的地经度不能为空")
private String endLat; private String endLng;
/** /**
* 目的地纬度 * 目的地纬度
*/ */
@NotBlank(message = "目的地纬度不能为空") @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; private static final long serialVersionUID = 4251601419123102085L;
/** /**
* 查询类型(1待出行 2预约中 3已完成) * 查询类型
* web(1待出行 2预约中 3已完成)
* app(0待出行 1进行中 2预约中 3已完成)
*/ */
@NotBlank(message = "查询类型不能为空") @NotBlank(message = "查询类型不能为空")
private String type; 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 = "出发地经度") @ExcelProperty(value = "出发地经度")
private String startLat; private String startLng;
/** /**
* 出发地纬度 * 出发地纬度
*/ */
@ExcelProperty(value = "出发地纬度") @ExcelProperty(value = "出发地纬度")
private String startLng; private String startLat;
/** /**
* 目的地经度 * 目的地经度
*/ */
@ExcelProperty(value = "目的地经度") @ExcelProperty(value = "目的地经度")
private String endLat; private String endLng;
/** /**
* 目的地纬度 * 目的地纬度
*/ */
@ExcelProperty(value = "目的地纬度") @ExcelProperty(value = "目的地纬度")
private String endLng; private String endLat;
/** /**
* 乘车状态 * 乘车状态

View File

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

View File

@ -44,6 +44,14 @@ public interface IVehVehicleTripService extends IService<VehVehicleTrip> {
*/ */
List<VehVehicleTripMyVo> queryMyList(VehVehicleTripMyQueryReq req); 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.domain.event.ProcessTaskEvent;
import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException; 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.ObjectUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery; 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()) && ObjectUtils.isNotNull(req.getStartTime()) && ObjectUtils.isNotNull(req.getPeopleNum())
&& req.getPeopleNum() >= 1) { && req.getPeopleNum() >= 1) {
result = baseMapper.selectVehicleTripPage(pageQuery.build(), req); 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 { } else {
result = baseMapper.selectVoPage(pageQuery.build(), buildQueryWrapper(req)); result = baseMapper.selectVoPage(pageQuery.build(), buildQueryWrapper(req));
} }
@ -115,8 +126,6 @@ public class VehVehicleTripServiceImpl extends ServiceImpl<VehVehicleTripMapper,
if (userId == null) { if (userId == null) {
throw new ServiceException("请先登录", HttpStatus.UNAUTHORIZED); throw new ServiceException("请先登录", HttpStatus.UNAUTHORIZED);
} }
// 查询数据
List<VehVehicleTrip> tripList = new ArrayList<>();
// --- 一、查询当前用户创建的行程 --- // --- 一、查询当前用户创建的行程 ---
List<VehVehicleTrip> createdTrips = this.lambdaQuery() List<VehVehicleTrip> createdTrips = this.lambdaQuery()
.eq(VehVehicleTrip::getCreateBy, userId) .eq(VehVehicleTrip::getCreateBy, userId)
@ -125,10 +134,6 @@ public class VehVehicleTripServiceImpl extends ServiceImpl<VehVehicleTripMapper,
.ne("2".equals(type), VehVehicleTrip::getReviewStatus, BusinessStatusEnum.FINISH.getStatus()) .ne("2".equals(type), VehVehicleTrip::getReviewStatus, BusinessStatusEnum.FINISH.getStatus())
.eq("3".equals(type), VehVehicleTrip::getTripStatus, VehTripStatusEnum.COMPLETED.getValue()) .eq("3".equals(type), VehVehicleTrip::getTripStatus, VehTripStatusEnum.COMPLETED.getValue())
.list(); .list();
// 收集行程id
Set<Long> tripIds = createdTrips.stream()
.map(VehVehicleTrip::getId)
.collect(Collectors.toSet());
// --- 二、查询当前用户作为乘客的申请 --- // --- 二、查询当前用户作为乘客的申请 ---
List<VehVehicleApply> userApplies = vehicleApplyService.lambdaQuery() List<VehVehicleApply> userApplies = vehicleApplyService.lambdaQuery()
.eq(VehVehicleApply::getCreateBy, userId) .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()) .notIn("2".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ARRIVED.getValue(), VehApplyStatusEnum.ALREADY.getValue())
.eq("3".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ARRIVED.getValue()) .eq("3".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ARRIVED.getValue())
.list(); .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<>(); return buildTripMyVoList(createdTrips, userApplies, userId);
if (CollUtil.isEmpty(tripList)) { }
return result;
/**
* 查询当前用户车辆出行记录列表
*
* @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(); List<VehVehicleTrip> createdTrips = this.lambdaQuery()
BeanUtils.copyProperties(trip, tripMyVo); .eq(VehVehicleTrip::getCreateBy, userId)
List<VehVehicleApply> list = applyList.stream() .eq("0".equals(type) || "2".equals(type), VehVehicleTrip::getTripStatus, VehTripStatusEnum.READY_DEPART.getValue())
.filter(apply -> apply.getTripId().equals(trip.getId())) .eq("0".equals(type), VehVehicleTrip::getReviewStatus, BusinessStatusEnum.FINISH.getStatus())
.toList(); .eq("1".equals(type), VehVehicleTrip::getTripStatus, VehTripStatusEnum.UNDERWAY.getValue())
if (CollUtil.isNotEmpty(list)) { .ne("2".equals(type), VehVehicleTrip::getReviewStatus, BusinessStatusEnum.FINISH.getStatus())
// 封装数据 .eq("3".equals(type), VehVehicleTrip::getTripStatus, VehTripStatusEnum.COMPLETED.getValue())
List<VehVehicleApplyVo> applyVoList = list.stream().map(apply -> { .list();
VehVehicleApplyVo applyVo = new VehVehicleApplyVo(); // --- 二、查询当前用户作为乘客的申请 ---
BeanUtils.copyProperties(apply, applyVo); List<VehVehicleApply> userApplies = vehicleApplyService.lambdaQuery()
return applyVo; .eq(VehVehicleApply::getCreateBy, userId)
}).toList(); .eq("0".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.CONFIRMED.getValue())
tripMyVo.setApplyList(applyVoList); .eq("1".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ALREADY.getValue())
} .notIn("2".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ARRIVED.getValue(), VehApplyStatusEnum.ALREADY.getValue())
tripMyVo.setIsVehicleOwner(trip.getCreateBy().equals(userId) ? 1 : 0); .eq("3".equals(type), VehVehicleApply::getStatus, VehApplyStatusEnum.ARRIVED.getValue())
return tripMyVo; .list();
}).toList()); // 整合数据
// 根据出行时间排序 return buildTripMyVoList(createdTrips, userApplies, userId);
tripMyVos.sort(Comparator.comparing(VehVehicleTripMyVo::getStartTime));
return tripMyVos;
} }
/** /**
@ -475,6 +465,77 @@ public class VehVehicleTripServiceImpl extends ServiceImpl<VehVehicleTripMapper,
return this.removeBatchByIds(ids); 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' * 正常使用只需#processEvent.flowCode=='leave1'

View File

@ -14,10 +14,10 @@
trip_reason, trip_reason,
start_place, start_place,
end_place, end_place,
start_lat,
start_lng, start_lng,
end_lat, start_lat,
end_lng, end_lng,
end_lat,
start_time, start_time,
end_time, end_time,
people_num, people_num,
@ -51,7 +51,7 @@
-- 3. 时间评分0-100 -- 3. 时间评分0-100
ROUND( ROUND(
GREATEST(0, LEAST(100, 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 )), 2
) AS time_score, ) AS time_score,
@ -73,7 +73,7 @@
)) * 0.5) )) * 0.5)
+ +
(GREATEST(0, LEAST(100, (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) )) * 0.2)
+ +
(CASE (CASE