From ff64d2d48c40d6b668556be1dc610c826f9a2350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=97=AD=E6=98=8E=5C73939?= <739390650@QQ.COM> Date: Tue, 10 Mar 2026 13:37:58 +0800 Subject: [PATCH] =?UTF-8?q?opt:=E8=A5=BF=E9=97=A8=E5=AD=90=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/AcsAgvDailyStatistics.java | 38 +++ .../agv_usage/domain/AcsAgvUsageRecord.java | 43 ++++ .../mapper/AcsAgvDailyStatisticsMapper.java | 19 ++ .../mapper/AcsAgvDailyStatisticsMapper.xml | 37 +++ .../mapper/AcsAgvUsageRecordMapper.java | 17 ++ .../mapper/AcsAgvUsageRecordMapper.xml | 38 +++ .../agv_usage/rest/AgvUsageController.java | 86 +++++++ .../agv_usage/service/AcsAgvUsageService.java | 25 ++ .../service/impl/AcsAgvUsageServiceImpl.java | 221 ++++++++++++++++++ .../agv/ndcone/AgvNdcOneDeviceDriver.java | 26 +++ .../service/impl/HandheldServiceImpl.java | 39 ++-- .../controller/AgvUsageController.java | 63 +++++ .../agv_usage/service/IAgvUsageService.java | 18 ++ .../agv_usage/service/dto/AgvUsageQuery.java | 15 ++ .../service/impl/AgvUsageServiceImpl.java | 180 ++++++++++++++ .../SchBaseVehiclematerialgroupDeleteLog.java | 1 - .../service/impl/SchBasePointServiceImpl.java | 44 ++++ .../src/views/wms/sch/agv_usage/agvUsage.js | 33 +++ .../src/views/wms/sch/agv_usage/index.vue | 216 +++++++++++++++++ 19 files changed, 1136 insertions(+), 23 deletions(-) create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/domain/AcsAgvDailyStatistics.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/domain/AcsAgvUsageRecord.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvDailyStatisticsMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvDailyStatisticsMapper.xml create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvUsageRecordMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvUsageRecordMapper.xml create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/rest/AgvUsageController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/service/AcsAgvUsageService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/service/impl/AcsAgvUsageServiceImpl.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/controller/AgvUsageController.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/IAgvUsageService.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/dto/AgvUsageQuery.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/impl/AgvUsageServiceImpl.java create mode 100644 lms/nladmin-ui/src/views/wms/sch/agv_usage/agvUsage.js create mode 100644 lms/nladmin-ui/src/views/wms/sch/agv_usage/index.vue diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/domain/AcsAgvDailyStatistics.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/domain/AcsAgvDailyStatistics.java new file mode 100644 index 0000000..fb2e32d --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/domain/AcsAgvDailyStatistics.java @@ -0,0 +1,38 @@ +package org.nl.acs.agv_usage.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@TableName("acs_agv_daily_statistics") +public class AcsAgvDailyStatistics implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ASSIGN_UUID) + private String id; + + private String device_code; + + private String device_name; + + private Date work_date; + + private Long total_work_duration; + + private Long total_idle_duration; + + private BigDecimal usage_rate; + + private Integer task_count; + + private Date create_time; + + private Date update_time; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/domain/AcsAgvUsageRecord.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/domain/AcsAgvUsageRecord.java new file mode 100644 index 0000000..064e8bb --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/domain/AcsAgvUsageRecord.java @@ -0,0 +1,43 @@ +package org.nl.acs.agv_usage.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("acs_agv_usage_record") +public class AcsAgvUsageRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ASSIGN_UUID) + private String id; + + private String device_code; + + private String device_name; + + private String task_code; + + private String instruction_code; + + private Date start_time; + + private Date end_time; + + private Long work_duration; + + private Date work_date; + + private String status; + + private Date create_time; + + private Date update_time; + + private String is_active; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvDailyStatisticsMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvDailyStatisticsMapper.java new file mode 100644 index 0000000..a2085f6 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvDailyStatisticsMapper.java @@ -0,0 +1,19 @@ +package org.nl.acs.agv_usage.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.nl.acs.agv_usage.domain.AcsAgvDailyStatistics; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface AcsAgvDailyStatisticsMapper extends BaseMapper { + + AcsAgvDailyStatistics selectByDeviceCodeAndDate(@Param("deviceCode") String deviceCode, @Param("workDate") Date workDate); + + List selectByDateRange(@Param("startDate") Date startDate, @Param("endDate") Date endDate); + + List selectByDeviceCodeAndDateRange(@Param("deviceCode") String deviceCode, @Param("startDate") Date startDate, @Param("endDate") Date endDate); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvDailyStatisticsMapper.xml b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvDailyStatisticsMapper.xml new file mode 100644 index 0000000..b9463dc --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvDailyStatisticsMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvUsageRecordMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvUsageRecordMapper.java new file mode 100644 index 0000000..1c078de --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvUsageRecordMapper.java @@ -0,0 +1,17 @@ +package org.nl.acs.agv_usage.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.nl.acs.agv_usage.domain.AcsAgvUsageRecord; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface AcsAgvUsageRecordMapper extends BaseMapper { + + AcsAgvUsageRecord selectActiveByDeviceCode(@Param("deviceCode") String deviceCode); + + List selectByDeviceCodeAndDate(@Param("deviceCode") String deviceCode, @Param("workDate") Date workDate); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvUsageRecordMapper.xml b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvUsageRecordMapper.xml new file mode 100644 index 0000000..f8c7ad7 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/mapper/AcsAgvUsageRecordMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/rest/AgvUsageController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/rest/AgvUsageController.java new file mode 100644 index 0000000..98c43ce --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/rest/AgvUsageController.java @@ -0,0 +1,86 @@ +package org.nl.acs.agv_usage.rest; + +import cn.dev33.satoken.annotation.SaIgnore; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.agv_usage.domain.AcsAgvDailyStatistics; +import org.nl.acs.agv_usage.service.AcsAgvUsageService; +import org.nl.common.logging.annotation.Log; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "AGV使用率统计接口") +@RequestMapping("/api/agv_usage") +@SaIgnore +public class AgvUsageController { + + private final AcsAgvUsageService agvUsageService; + + @GetMapping("/statistics") + @Log("获取AGV使用率统计") + @ApiOperation("获取AGV使用率统计") + public ResponseEntity getStatistics( + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { + List> result = agvUsageService.getAgvUsageRate(startDate, endDate); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + @GetMapping("/statistics/detail") + @Log("获取AGV详细统计") + @ApiOperation("获取AGV详细统计") + public ResponseEntity getStatisticsDetail( + @RequestParam(required = false) String deviceCode, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { + List result; + if (deviceCode != null && !deviceCode.isEmpty()) { + result = agvUsageService.getStatisticsByDeviceAndDateRange(deviceCode, startDate, endDate); + } else { + result = agvUsageService.getStatisticsByDateRange(startDate, endDate); + } + return new ResponseEntity<>(result, HttpStatus.OK); + } + + @GetMapping("/realtime") + @Log("获取AGV实时状态") + @ApiOperation("获取AGV实时状态") + public ResponseEntity getRealtimeStatus() { + Map result = agvUsageService.getAgvRealtimeStatus(); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + @PostMapping("/start") + @Log("AGV开始工作") + @ApiOperation("AGV开始工作") + public ResponseEntity startWork( + @RequestParam String deviceCode, + @RequestParam(required = false) String deviceName, + @RequestParam(required = false) String taskCode, + @RequestParam(required = false) String instructionCode) { + agvUsageService.startWork(deviceCode, deviceName, taskCode, instructionCode); + return new ResponseEntity<>("success", HttpStatus.OK); + } + + @PostMapping("/end") + @Log("AGV结束工作") + @ApiOperation("AGV结束工作") + public ResponseEntity endWork( + @RequestParam String deviceCode, + @RequestParam(required = false) String taskCode, + @RequestParam(required = false) String instructionCode) { + agvUsageService.endWork(deviceCode, taskCode, instructionCode); + return new ResponseEntity<>("success", HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/service/AcsAgvUsageService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/service/AcsAgvUsageService.java new file mode 100644 index 0000000..dffd218 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/service/AcsAgvUsageService.java @@ -0,0 +1,25 @@ +package org.nl.acs.agv_usage.service; + +import org.nl.acs.agv_usage.domain.AcsAgvDailyStatistics; +import org.nl.acs.agv_usage.domain.AcsAgvUsageRecord; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +public interface AcsAgvUsageService { + + void startWork(String deviceCode, String deviceName, String taskCode, String instructionCode); + + void endWork(String deviceCode, String taskCode, String instructionCode); + + void updateDailyStatistics(String deviceCode, Date workDate); + + List getStatisticsByDateRange(Date startDate, Date endDate); + + List getStatisticsByDeviceAndDateRange(String deviceCode, Date startDate, Date endDate); + + List> getAgvUsageRate(Date startDate, Date endDate); + + Map getAgvRealtimeStatus(); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/service/impl/AcsAgvUsageServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/service/impl/AcsAgvUsageServiceImpl.java new file mode 100644 index 0000000..7d91f9b --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv_usage/service/impl/AcsAgvUsageServiceImpl.java @@ -0,0 +1,221 @@ +package org.nl.acs.agv_usage.service.impl; + +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.agv_usage.domain.AcsAgvDailyStatistics; +import org.nl.acs.agv_usage.domain.AcsAgvUsageRecord; +import org.nl.acs.agv_usage.mapper.AcsAgvDailyStatisticsMapper; +import org.nl.acs.agv_usage.mapper.AcsAgvUsageRecordMapper; +import org.nl.acs.agv_usage.service.AcsAgvUsageService; +import org.nl.acs.device.domain.Device; +import org.nl.acs.device.service.DeviceService; +import org.nl.acs.opc.DeviceAppService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AcsAgvUsageServiceImpl implements AcsAgvUsageService { + + private final AcsAgvUsageRecordMapper usageRecordMapper; + private final AcsAgvDailyStatisticsMapper dailyStatisticsMapper; + private final DeviceAppService deviceAppService; + private final DeviceService deviceService; + + private static final long DAY_SECONDS = 24 * 60 * 60L; + private static final long WORK_DAY_SECONDS = 8 * 60 * 60L; + + @Override + @Transactional(rollbackFor = Exception.class) + public void startWork(String deviceCode, String deviceName, String taskCode, String instructionCode) { + AcsAgvUsageRecord existingRecord = usageRecordMapper.selectActiveByDeviceCode(deviceCode); + if (existingRecord != null) { + log.warn("AGV {} 已有工作中的记录,先结束上一条记录", deviceCode); + endWork(deviceCode, existingRecord.getTask_code(), existingRecord.getInstruction_code()); + } + + AcsAgvUsageRecord record = new AcsAgvUsageRecord(); + record.setId(IdUtil.simpleUUID()); + record.setDevice_code(deviceCode); + record.setDevice_name(deviceName); + record.setTask_code(taskCode); + record.setInstruction_code(instructionCode); + record.setStart_time(new Date()); + record.setWork_date(new Date()); + record.setStatus("0"); + record.setWork_duration(0L); + record.setIs_active("1"); + record.setCreate_time(new Date()); + record.setUpdate_time(new Date()); + + usageRecordMapper.insert(record); + log.info("AGV {} 开始工作,任务号: {}, 指令号: {}", deviceCode, taskCode, instructionCode); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void endWork(String deviceCode, String taskCode, String instructionCode) { + AcsAgvUsageRecord record = usageRecordMapper.selectActiveByDeviceCode(deviceCode); + if (record == null) { + log.warn("AGV {} 没有找到工作中的记录", deviceCode); + return; + } + + Date endTime = new Date(); + long workDuration = (endTime.getTime() - record.getStart_time().getTime()) / 1000; + + record.setEnd_time(endTime); + record.setWork_duration(workDuration); + record.setStatus("1"); + record.setUpdate_time(new Date()); + + usageRecordMapper.updateById(record); + + updateDailyStatistics(deviceCode, record.getWork_date()); + + log.info("AGV {} 结束工作,任务号: {}, 工作时长: {}秒", deviceCode, taskCode, workDuration); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateDailyStatistics(String deviceCode, Date workDate) { + List records = usageRecordMapper.selectByDeviceCodeAndDate(deviceCode, workDate); + + long totalWorkDuration = records.stream() + .filter(r -> "1".equals(r.getStatus())) + .mapToLong(AcsAgvUsageRecord::getWork_duration) + .sum(); + + int taskCount = (int) records.stream() + .filter(r -> "1".equals(r.getStatus())) + .count(); + + String deviceName = null; + Device device = deviceAppService.findDeviceByCode(deviceCode); + if (device != null) { + deviceName = device.getDevice_name(); + } + + AcsAgvDailyStatistics existingStats = dailyStatisticsMapper.selectByDeviceCodeAndDate(deviceCode, workDate); + + long totalIdleDuration = DAY_SECONDS - totalWorkDuration; + if (totalIdleDuration < 0) { + totalIdleDuration = 0; + } + + BigDecimal usageRate = BigDecimal.valueOf(totalWorkDuration) + .divide(BigDecimal.valueOf(DAY_SECONDS), 4, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)) + .setScale(2, RoundingMode.HALF_UP); + + if (existingStats != null) { + existingStats.setTotal_work_duration(totalWorkDuration); + existingStats.setTotal_idle_duration(totalIdleDuration); + existingStats.setUsage_rate(usageRate); + existingStats.setTask_count(taskCount); + existingStats.setUpdate_time(new Date()); + dailyStatisticsMapper.updateById(existingStats); + } else { + AcsAgvDailyStatistics newStats = new AcsAgvDailyStatistics(); + newStats.setId(IdUtil.simpleUUID()); + newStats.setDevice_code(deviceCode); + newStats.setDevice_name(deviceName); + newStats.setWork_date(workDate); + newStats.setTotal_work_duration(totalWorkDuration); + newStats.setTotal_idle_duration(totalIdleDuration); + newStats.setUsage_rate(usageRate); + newStats.setTask_count(taskCount); + newStats.setCreate_time(new Date()); + newStats.setUpdate_time(new Date()); + dailyStatisticsMapper.insert(newStats); + } + } + + @Override + public List getStatisticsByDateRange(Date startDate, Date endDate) { + return dailyStatisticsMapper.selectByDateRange(startDate, endDate); + } + + @Override + public List getStatisticsByDeviceAndDateRange(String deviceCode, Date startDate, Date endDate) { + return dailyStatisticsMapper.selectByDeviceCodeAndDateRange(deviceCode, startDate, endDate); + } + + @Override + public List> getAgvUsageRate(Date startDate, Date endDate) { + List statistics = getStatisticsByDateRange(startDate, endDate); + + Map> deviceStatsMap = new LinkedHashMap<>(); + + for (AcsAgvDailyStatistics stat : statistics) { + String deviceCode = stat.getDevice_code(); + if (!deviceStatsMap.containsKey(deviceCode)) { + Map deviceData = new HashMap<>(); + deviceData.put("deviceCode", deviceCode); + deviceData.put("deviceName", stat.getDevice_name()); + deviceData.put("totalWorkDuration", 0L); + deviceData.put("totalTaskCount", 0); + deviceData.put("avgUsageRate", BigDecimal.ZERO); + deviceData.put("dayCount", 0); + deviceData.put("usageRateSum", BigDecimal.ZERO); + deviceStatsMap.put(deviceCode, deviceData); + } + + Map deviceData = deviceStatsMap.get(deviceCode); + deviceData.put("totalWorkDuration", (Long) deviceData.get("totalWorkDuration") + stat.getTotal_work_duration()); + deviceData.put("totalTaskCount", (Integer) deviceData.get("totalTaskCount") + stat.getTask_count()); + deviceData.put("dayCount", (Integer) deviceData.get("dayCount") + 1); + deviceData.put("usageRateSum", ((BigDecimal) deviceData.get("usageRateSum")).add(stat.getUsage_rate())); + } + + List> result = new ArrayList<>(); + for (Map deviceData : deviceStatsMap.values()) { + int dayCount = (Integer) deviceData.get("dayCount"); + if (dayCount > 0) { + BigDecimal avgUsageRate = ((BigDecimal) deviceData.get("usageRateSum")) + .divide(BigDecimal.valueOf(dayCount), 2, RoundingMode.HALF_UP); + deviceData.put("avgUsageRate", avgUsageRate); + } + deviceData.remove("usageRateSum"); + deviceData.remove("dayCount"); + result.add(deviceData); + } + + return result; + } + + @Override + public Map getAgvRealtimeStatus() { + Map result = new HashMap<>(); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AcsAgvUsageRecord::getStatus, "0") + .eq(AcsAgvUsageRecord::getIs_active, "1"); + List workingRecords = usageRecordMapper.selectList(wrapper); + + List> workingAgvList = new ArrayList<>(); + for (AcsAgvUsageRecord record : workingRecords) { + Map agvStatus = new HashMap<>(); + agvStatus.put("deviceCode", record.getDevice_code()); + agvStatus.put("deviceName", record.getDevice_name()); + agvStatus.put("taskCode", record.getTask_code()); + agvStatus.put("startTime", record.getStart_time()); + agvStatus.put("currentDuration", (System.currentTimeMillis() - record.getStart_time().getTime()) / 1000); + workingAgvList.add(agvStatus); + } + + result.put("workingAgvList", workingAgvList); + result.put("workingCount", workingAgvList.size()); + + return result; + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java index eb52f7b..707b7ef 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java @@ -45,6 +45,7 @@ import org.nl.system.service.dict.dao.Dict; import org.nl.system.service.param.ISysParamService; import org.nl.config.SpringContextHolder; import org.nl.system.service.param.impl.SysParamServiceImpl; +import org.nl.acs.agv_usage.service.AcsAgvUsageService; import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; @@ -70,6 +71,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); DeviceService deviceService = SpringContextHolder.getBean(DeviceService.class); ISysDictService dictService = SpringContextHolder.getBean(ISysDictService.class); + AcsAgvUsageService agvUsageService = SpringContextHolder.getBean(AcsAgvUsageService.class); int agvaddr = 0; int agvaddr_copy = 0; @@ -155,6 +157,19 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic transportOrder = inst.getTask_code(); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data); + // AGV使用率统计 - 开始工作 + try { + String agvDeviceCode = "agv" + carno; + String agvDeviceName = this.device_code; + Device agvDevice = deviceAppService.findDeviceByCode(agvDeviceCode); + if (agvDevice != null) { + agvDeviceName = agvDevice.getDevice_name(); + } + agvUsageService.startWork(agvDeviceCode, agvDeviceName, inst.getTask_code(), inst.getInstruction_code()); + } catch (Exception e) { + log.error("AGV使用率统计-开始工作失败: {}", e.getMessage()); + } + //到达取货点 //(需要WCS反馈) } else if (phase == 0x03) { @@ -463,6 +478,17 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic return; } transportOrder = ""; + + // AGV使用率统计 - 结束工作 + try { + String agvDeviceCode = "agv" + inst.getCarno(); + if (StrUtil.isNotEmpty(agvDeviceCode)) { + agvUsageService.endWork(agvDeviceCode, inst.getTask_code(), inst.getInstruction_code()); + } + } catch (Exception e) { + log.error("AGV使用率统计-结束工作失败: {}", e.getMessage()); + } + if (device.getDeviceDriver() instanceof PlcToAgvDeviceDriver) { PlcToAgvDeviceDriver plcToAgvDeviceDriver = (PlcToAgvDeviceDriver) device.getDeviceDriver(); if (device_code.contains("_01")) { diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/impl/HandheldServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/impl/HandheldServiceImpl.java index cd822f4..26e17f9 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/impl/HandheldServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/handheld/service/impl/HandheldServiceImpl.java @@ -425,11 +425,10 @@ public class HandheldServiceImpl implements HandheldService { //是否需要从日志表重新入库的标志 Boolean reentry_flag = param.getBoolean("reentry_flag"); - reentry_flag = true; //如果当前点位是SD01点位,且当前载具在组盘表中不存在 List groups = iSchBaseVehiclematerialgroupService.selectGroupByVehicleCode(param.getString("vehicle_code")); - if (reentry_flag!= null && reentry_flag && "SD01".equals(device_code) && CollectionUtil.isEmpty(groups) ) { + if (reentry_flag!= null && reentry_flag && "SD01".equals(device_code)) { List dictList = dictService.getDictByName("sd01_interval_hour"); if(CollectionUtil.isNotEmpty(dictList)){ @@ -445,15 +444,13 @@ public class HandheldServiceImpl implements HandheldService { .apply("point_code = {0}", device_code) // 3. 核心新增:筛选 hour 小时内删除的数据 .apply("delete_time >= DATE_SUB(NOW(), INTERVAL {0} HOUR)", hour) - .orderByDesc(SchBaseVehiclematerialgroupDeleteLog::getDelete_time) - .last("LIMIT 1")); + .orderByDesc(SchBaseVehiclematerialgroupDeleteLog::getDelete_time)); //则自动将log表中的数据库插入到组盘表中 if(CollectionUtil.isNotEmpty(logList)){ - SchBaseVehiclematerialgroupDeleteLog log = logList.get(0); - SchBaseVehiclematerialgroup group = new SchBaseVehiclematerialgroup(); - BeanUtils.copyProperties(log,group); - iSchBaseVehiclematerialgroupService.save(group); + for(SchBaseVehiclematerialgroupDeleteLog log : logList) { + iSchBaseVehiclematerialgroupDeleteLogService.removeById(log.getGroup_id()); + } } } } @@ -482,7 +479,7 @@ public class HandheldServiceImpl implements HandheldService { @Override public SD01GroupLogRespondDto getSD01GroupLog(JSONObject param) { - String device_code = param.getString("device_code"); + String device_code = param.getString("pointCode"); String vehicle_code = param.getString("vehicle_code"); if(!"SD01".equals(device_code) || StringUtils.isBlank(vehicle_code)){ @@ -501,7 +498,7 @@ public class HandheldServiceImpl implements HandheldService { String hour = dict.getValue(); -// 修复后的查询代码(兼容下划线字段的Lambda写法) + // 修复后的查询代码(兼容下划线字段的Lambda写法) List logList = iSchBaseVehiclematerialgroupDeleteLogService .list(Wrappers.lambdaQuery(SchBaseVehiclematerialgroupDeleteLog.class) // 1. 对数据库字段:用Lambda + 字段名(MyBatis-Plus会自动转下划线) @@ -510,23 +507,21 @@ public class HandheldServiceImpl implements HandheldService { .apply("point_code = {0}", device_code) // 3. 核心新增:筛选 hour 小时内删除的数据 .apply("delete_time >= DATE_SUB(NOW(), INTERVAL {0} HOUR)", hour) - .orderByDesc(SchBaseVehiclematerialgroupDeleteLog::getDelete_time) - .last("LIMIT 1")); + .orderByDesc(SchBaseVehiclematerialgroupDeleteLog::getDelete_time)); if(CollectionUtil.isEmpty(logList)){ return null; } - - SD01GroupLogRespondDto sd01GroupLogRespondDto = new SD01GroupLogRespondDto(); - LogMaterialDto logMaterialDto = new LogMaterialDto(); - - logMaterialDto.setMaterial_qty(logList.get(0).getMaterial_qty()); - logMaterialDto.setMaterial_code(logList.get(0).getMaterial_id()); - logMaterialDto.setDue_date(logList.get(0).getDue_date()); - logMaterialDto.setOrder_code(logList.get(0).getOrder_code()); - List logMaterialDtos = new ArrayList<>(); - logMaterialDtos.add(logMaterialDto); + SD01GroupLogRespondDto sd01GroupLogRespondDto = new SD01GroupLogRespondDto(); + for (SchBaseVehiclematerialgroupDeleteLog log : logList) { + LogMaterialDto logMaterialDto = new LogMaterialDto(); + logMaterialDto.setMaterial_qty(log.getMaterial_qty()); + logMaterialDto.setMaterial_code(log.getMaterial_id()); + logMaterialDto.setDue_date(log.getDue_date()); + logMaterialDto.setOrder_code(log.getOrder_code()); + logMaterialDtos.add(logMaterialDto); + } sd01GroupLogRespondDto.setMaterial(logMaterialDtos); sd01GroupLogRespondDto.setDevice_code(device_code); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/controller/AgvUsageController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/controller/AgvUsageController.java new file mode 100644 index 0000000..bbcb36c --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/controller/AgvUsageController.java @@ -0,0 +1,63 @@ +package org.nl.wms.sch.agv_usage.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.sch.agv_usage.service.IAgvUsageService; +import org.nl.wms.sch.agv_usage.service.dto.AgvUsageQuery; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "AGV使用率统计") +@RequestMapping("/api/agv_usage") +public class AgvUsageController { + + private final IAgvUsageService agvUsageService; + + @GetMapping("/statistics") + @Log("获取AGV使用率统计") + @ApiOperation("获取AGV使用率统计") + public ResponseEntity getStatistics( + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { + AgvUsageQuery query = new AgvUsageQuery(); + query.setStartDate(startDate); + query.setEndDate(endDate); + List> result = agvUsageService.getAgvUsageStatistics(query); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + @GetMapping("/statistics/detail") + @Log("获取AGV详细统计") + @ApiOperation("获取AGV详细统计") + public ResponseEntity getStatisticsDetail( + @RequestParam(required = false) String deviceCode, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { + AgvUsageQuery query = new AgvUsageQuery(); + query.setDeviceCode(deviceCode); + query.setStartDate(startDate); + query.setEndDate(endDate); + List> result = agvUsageService.getAgvUsageDetail(query); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + @GetMapping("/today") + @Log("获取今日AGV使用率") + @ApiOperation("获取今日AGV使用率") + public ResponseEntity getTodayUsageRate() { + Map result = agvUsageService.getAgvUsageRateToday(); + return new ResponseEntity<>(result, HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/IAgvUsageService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/IAgvUsageService.java new file mode 100644 index 0000000..d154f97 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/IAgvUsageService.java @@ -0,0 +1,18 @@ +package org.nl.wms.sch.agv_usage.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.sch.agv_usage.service.dto.AgvUsageQuery; + +import java.util.List; +import java.util.Map; + +public interface IAgvUsageService { + + List> getAgvUsageStatistics(AgvUsageQuery query); + + List> getAgvUsageDetail(AgvUsageQuery query); + + Map getAgvRealtimeStatus(); + + Map getAgvUsageRateToday(); +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/dto/AgvUsageQuery.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/dto/AgvUsageQuery.java new file mode 100644 index 0000000..9fac256 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/dto/AgvUsageQuery.java @@ -0,0 +1,15 @@ +package org.nl.wms.sch.agv_usage.service.dto; + +import lombok.Data; + +import java.util.Date; + +@Data +public class AgvUsageQuery { + + private String deviceCode; + + private Date startDate; + + private Date endDate; +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/impl/AgvUsageServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/impl/AgvUsageServiceImpl.java new file mode 100644 index 0000000..af2a9e6 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/agv_usage/service/impl/AgvUsageServiceImpl.java @@ -0,0 +1,180 @@ +package org.nl.wms.sch.agv_usage.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import lombok.extern.slf4j.Slf4j; +import org.nl.config.SpringContextHolder; +import org.nl.system.service.param.dao.Param; +import org.nl.system.service.param.impl.SysParamServiceImpl; +import org.nl.wms.sch.agv_usage.service.IAgvUsageService; +import org.nl.wms.sch.agv_usage.service.dto.AgvUsageQuery; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.*; + +@Slf4j +@Service +public class AgvUsageServiceImpl implements IAgvUsageService { + + private String getAcsUrl() { + SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class); + Param acsUrlObj = sysParamService.findByCode(GeneralDefinition.ACS_URL); + if (ObjectUtil.isEmpty(acsUrlObj)) { + return null; + } + return acsUrlObj.getValue(); + } + + private boolean isConnectAcs() { + SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class); + Param isConnectAcs = sysParamService.findByCode(GeneralDefinition.IS_CONNECT_ACS); + if (ObjectUtil.isEmpty(isConnectAcs)) { + return false; + } + return StrUtil.equals(GeneralDefinition.YES, isConnectAcs.getValue()); + } + + @Override + public List> getAgvUsageStatistics(AgvUsageQuery query) { + if (!isConnectAcs()) { + log.warn("未连接ACS系统"); + return new ArrayList<>(); + } + + String acsUrl = getAcsUrl(); + if (StrUtil.isEmpty(acsUrl)) { + log.warn("ACS地址未配置"); + return new ArrayList<>(); + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String startDate = sdf.format(query.getStartDate()); + String endDate = sdf.format(query.getEndDate()); + + String url = acsUrl + "api/agv_usage/statistics?startDate=" + startDate + "&endDate=" + endDate; + + try { + String result = HttpRequest.get(url) + .setConnectionTimeout(5000) + .execute() + .body(); + // 修复点1:使用TypeReference指定泛型类型,解决List和List>不兼容问题 + return JSON.parseObject(result, new TypeReference>>() {}); + } catch (Exception e) { + log.error("调用ACS获取AGV使用率统计失败: {}", e.getMessage()); + return new ArrayList<>(); + } + } + + @Override + public List> getAgvUsageDetail(AgvUsageQuery query) { + if (!isConnectAcs()) { + log.warn("未连接ACS系统"); + return new ArrayList<>(); + } + + String acsUrl = getAcsUrl(); + if (StrUtil.isEmpty(acsUrl)) { + log.warn("ACS地址未配置"); + return new ArrayList<>(); + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String startDate = sdf.format(query.getStartDate()); + String endDate = sdf.format(query.getEndDate()); + + StringBuilder urlBuilder = new StringBuilder(acsUrl) + .append("/api/agv_usage/statistics/detail?startDate=") + .append(startDate) + .append("&endDate=") + .append(endDate); + + if (StrUtil.isNotEmpty(query.getDeviceCode())) { + urlBuilder.append("&deviceCode=").append(query.getDeviceCode()); + } + + try { + String result = HttpRequest.get(urlBuilder.toString()) + .setConnectionTimeout(5000) + .execute() + .body(); + // 修复点2:同上,统一使用TypeReference保证泛型类型匹配 + return JSON.parseObject(result, new TypeReference>>() {}); + } catch (Exception e) { + log.error("调用ACS获取AGV详细统计失败: {}", e.getMessage()); + return new ArrayList<>(); + } + } + + @Override + public Map getAgvRealtimeStatus() { + Map result = new HashMap<>(); + if (!isConnectAcs()) { + log.warn("未连接ACS系统"); + result.put("workingAgvList", new ArrayList<>()); + result.put("workingCount", 0); + return result; + } + + String acsUrl = getAcsUrl(); + if (StrUtil.isEmpty(acsUrl)) { + log.warn("ACS地址未配置"); + result.put("workingAgvList", new ArrayList<>()); + result.put("workingCount", 0); + return result; + } + + String url = acsUrl + "api/agv_usage/realtime"; + + try { + String response = HttpRequest.get(url) + .setConnectionTimeout(5000) + .execute() + .body(); + // 修复点3:使用TypeReference指定Map,移除不必要的SuppressWarnings + Map map = JSON.parseObject(response, new TypeReference>() {}); + return map != null ? map : result; + } catch (Exception e) { + log.error("调用ACS获取AGV实时状态失败: {}", e.getMessage()); + result.put("workingAgvList", new ArrayList<>()); + result.put("workingCount", 0); + return result; + } + } + + @Override + public Map getAgvUsageRateToday() { + Map result = new HashMap<>(); + if (!isConnectAcs()) { + log.warn("未连接ACS系统"); + return result; + } + + String acsUrl = getAcsUrl(); + if (StrUtil.isEmpty(acsUrl)) { + log.warn("ACS地址未配置"); + return result; + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String today = sdf.format(new Date()); + String url = acsUrl + "api/agv_usage/statistics?startDate=" + today + "&endDate=" + today; + + try { + String response = HttpRequest.get(url) + .setConnectionTimeout(5000) + .execute() + .body(); + // 修复点4:同上,使用TypeReference保证类型匹配 + return JSON.parseObject(response, new TypeReference>() {}); + } catch (Exception e) { + log.error("调用ACS获取今日AGV使用率失败: {}", e.getMessage()); + } + return result; + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group_delete_log/service/dao/SchBaseVehiclematerialgroupDeleteLog.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group_delete_log/service/dao/SchBaseVehiclematerialgroupDeleteLog.java index d97c856..95d170a 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group_delete_log/service/dao/SchBaseVehiclematerialgroupDeleteLog.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group_delete_log/service/dao/SchBaseVehiclematerialgroupDeleteLog.java @@ -45,7 +45,6 @@ public class SchBaseVehiclematerialgroupDeleteLog implements Serializable { @ApiModelProperty(value = "来源载具编码") private String source_vehicle_code; - @TableField(exist = false) @ApiModelProperty(value = "点位编码") private String point_code; diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java index 4ef68ce..4b67df0 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java @@ -2,6 +2,7 @@ package org.nl.wms.sch.point.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; @@ -35,6 +36,10 @@ import org.nl.system.service.param.dao.Param; import org.nl.wms.database.vehicle.service.IMdBaseVehicleService; import org.nl.wms.database.vehicle.service.dao.MdBaseVehicle; import org.nl.wms.ext.fab.service.dto.OrderMater; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +import org.nl.wms.sch.group_delete_log.service.ISchBaseVehiclematerialgroupDeleteLogService; +import org.nl.wms.sch.group_delete_log.service.dao.SchBaseVehiclematerialgroupDeleteLog; import org.nl.wms.sch.point.service.ISchBasePointService; import org.nl.wms.sch.point.service.dao.SchBasePoint; import org.nl.wms.sch.point.service.dao.mapper.SchBasePointMapper; @@ -47,6 +52,7 @@ import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; import org.nl.wms.sch.task_manage.enums.PointStatusEnum; import org.nl.wms.sch.task_manage.task.core.TaskStatus; import org.nl.wms.util.PointUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -76,6 +82,11 @@ public class SchBasePointServiceImpl extends ServiceImpl dictList = dictService.getDictByName("sd01_interval_hour"); + if(CollectionUtil.isNotEmpty(dictList)) { + Dict dict = dictList.get(0); + + if ("hour".equals(dict.getLabel())) { + String hour = dict.getValue(); + //判断log中是否存在sd01 载具号=这个的单据 + List loglist = schBaseVehiclematerialgroupDeleteLogService.list(Wrappers.lambdaQuery(SchBaseVehiclematerialgroupDeleteLog.class) + // 1. 对数据库字段:用Lambda + 字段名(MyBatis-Plus会自动转下划线) + .eq(SchBaseVehiclematerialgroupDeleteLog::getVehicle_code, vehicle_code) + // 2. 对非数据库字段(@TableField(exist=false)):改用apply手动拼接 + .apply("point_code = {0}", "SD01") + // 3. 核心新增:筛选 hour 小时内删除的数据 + .apply("delete_time >= DATE_SUB(NOW(), INTERVAL {0} HOUR)", hour)); + + if (CollectionUtils.isEmpty(loglist)) { + //如果是设置为无货将组盘插入到日志表中,默认point_code=SD01 + List schBaseVehiclematerialgroupList = schBaseVehiclematerialgroupService.list(Wrappers.lambdaQuery(SchBaseVehiclematerialgroup.class) + .eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicle_code)); + + for (SchBaseVehiclematerialgroup schBaseVehiclematerialgroup : schBaseVehiclematerialgroupList) { + SchBaseVehiclematerialgroupDeleteLog deleteLog = new SchBaseVehiclematerialgroupDeleteLog(); + BeanUtils.copyProperties(schBaseVehiclematerialgroup, deleteLog); + deleteLog.setDelete_time(DateUtil.now()); + deleteLog.setPoint_code("SD01"); + schBaseVehiclematerialgroupDeleteLogService.save(deleteLog); + } + } + } + } + vehicle_code = null; } else if (ObjectUtil.isNotEmpty(pointStatus) && (pointStatus.equals(GoodsEnum.EMPTY_PALLETS.getValue()) || pointStatus.equals(GoodsEnum.IN_STOCK.getValue()))) { if (StrUtil.isEmpty(entity.getVehicle_code())) throw new BadRequestException("载具编码不能为空"); @@ -195,6 +238,7 @@ public class SchBasePointServiceImpl extends ServiceImpl +
+
+ + + + + + + + + 搜索 + 重置 + + +
+ + + + +
+ AGV使用率统计 +
+ + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + +
+ + + + +