From fb5c21dbfe52a876d3f49846695243f46f0b26ab Mon Sep 17 00:00:00 2001 From: wenshijun Date: Thu, 10 Jul 2025 08:40:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E9=80=BB=E8=BE=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=89=8D=E9=A1=B9=E7=9B=AE=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 + src/main/java/com/zg/SmartApplication.java | 2 + .../com/zg/common/utils/EntityFillUtils.java | 32 + .../java/com/zg/common/utils/MinioUtil.java | 60 ++ .../zg/framework/config/SecurityConfig.java | 1 + .../websocket/config/DeviceSession.java | 25 + .../config/DeviceSessionCleaner.java | 48 ++ .../websocket/config/WebSocketServer.java | 4 + .../controller/AutoInventoryController.java | 22 +- .../InventoryMatchScanController.java | 49 +- .../mapper/InventoryMatchScanMapper.java | 6 + .../AutoInventory/mapper/SodMapper.java | 5 +- .../AutoInventory/service/ISodService.java | 7 +- .../service/InventoryMatchScanService.java | 7 +- .../impl/InventoryMatchScanServiceImpl.java | 38 +- .../service/impl/SodServiceImpl.java | 45 +- .../HdInventory/HdInventoryController.java | 14 +- .../controller/InventoryTaskController.java | 13 + .../Task/controller/StatisticsController.java | 38 + .../Task/mapper/InventoryTaskMapper.java | 22 + .../Task/service/IInventoryTaskService.java | 14 + .../impl/InventoryTaskServiceImpl.java | 25 +- .../domain/dto/MatchScanPageDTO.java | 2 +- .../dto/{SodQueryDTO.java => QueryDTO.java} | 6 +- .../domain/entity/InventoryMatchScan.java | 154 +++- .../domain/entity/InventoryTask.java | 189 ++--- .../Inventory/domain/vo/RkInfoMatchVO.java | 14 + .../information/domain/DeviceInfo.java | 101 ++- .../information/domain/PcdeDetail.java | 15 +- .../service/impl/DeviceInfoServiceImpl.java | 3 +- .../service/impl/PcdeDetailServiceImpl.java | 14 +- .../controller/AgvTaskResultController.java | 85 +++ .../wisdom/controller/DdTaskController.java | 104 +++ .../controller/MoveRecordController.java | 103 +++ .../wisdom/controller/RkInfoController.java | 14 +- .../project/wisdom/domain/AgvTaskResult.java | 224 ++++++ .../com/zg/project/wisdom/domain/DdTask.java | 166 +++++ .../zg/project/wisdom/domain/MoveRecord.java | 191 +++++ .../com/zg/project/wisdom/domain/RkInfo.java | 662 ++++++------------ .../zg/project/wisdom/domain/dto/AgvDTO.java | 18 + .../wisdom/domain/dto/MoveRequestDTO.java | 27 + .../wisdom/domain/dto/MoveTargetItem.java | 24 + .../wisdom/domain/dto/PcRkInfoItemDTO.java | 6 +- .../wisdom/domain/dto/RefundRequestDTO.java | 19 + .../wisdom/domain/dto/RkInfoScanDTO.java | 8 +- .../wisdom/domain/dto/StockOutDTO.java | 12 + .../wisdom/domain/dto/StockOutItemDTO.java | 1 + .../wisdom/domain/vo/TaskExecuteResultVO.java | 17 + .../wisdom/mapper/AgvTaskResultMapper.java | 22 + .../project/wisdom/mapper/DdTaskMapper.java | 42 ++ .../wisdom/mapper/MoveRecordMapper.java | 62 ++ .../project/wisdom/mapper/RkInfoMapper.java | 52 ++ .../wisdom/service/IAgvTaskResultService.java | 32 + .../wisdom/service/IDdTaskService.java | 50 ++ .../wisdom/service/IMoveRecordService.java | 63 ++ .../wisdom/service/IRkInfoService.java | 31 + .../impl/AgvTaskResultServiceImpl.java | 83 +++ .../service/impl/DdTaskServiceImpl.java | 175 +++++ .../service/impl/MoveRecordServiceImpl.java | 233 ++++++ .../service/impl/RkInfoServiceImpl.java | 205 +++++- src/main/resources/application.yml | 10 + .../InventoryMatchScanMapper.xml | 169 +++-- .../Inventory/AutoInventory/SodMapper.xml | 11 - .../Inventory/Task/InventoryTaskMapper.xml | 116 ++- .../mybatis/information/DeviceInfoMapper.xml | 70 +- .../mybatis/information/PcdeDetailMapper.xml | 74 +- .../mybatis/wisdom/AgvTaskResultMapper.xml | 91 +++ .../resources/mybatis/wisdom/DdTaskMapper.xml | 100 +++ .../mybatis/wisdom/MoveRecordMapper.xml | 151 ++++ .../resources/mybatis/wisdom/RkInfoMapper.xml | 179 ++++- 70 files changed, 3710 insertions(+), 974 deletions(-) create mode 100644 src/main/java/com/zg/common/utils/EntityFillUtils.java create mode 100644 src/main/java/com/zg/common/utils/MinioUtil.java create mode 100644 src/main/java/com/zg/framework/websocket/config/DeviceSession.java create mode 100644 src/main/java/com/zg/framework/websocket/config/DeviceSessionCleaner.java create mode 100644 src/main/java/com/zg/project/Inventory/Task/controller/StatisticsController.java rename src/main/java/com/zg/project/Inventory/domain/dto/{SodQueryDTO.java => QueryDTO.java} (91%) create mode 100644 src/main/java/com/zg/project/Inventory/domain/vo/RkInfoMatchVO.java create mode 100644 src/main/java/com/zg/project/wisdom/controller/AgvTaskResultController.java create mode 100644 src/main/java/com/zg/project/wisdom/controller/DdTaskController.java create mode 100644 src/main/java/com/zg/project/wisdom/controller/MoveRecordController.java create mode 100644 src/main/java/com/zg/project/wisdom/domain/AgvTaskResult.java create mode 100644 src/main/java/com/zg/project/wisdom/domain/DdTask.java create mode 100644 src/main/java/com/zg/project/wisdom/domain/MoveRecord.java create mode 100644 src/main/java/com/zg/project/wisdom/domain/dto/AgvDTO.java create mode 100644 src/main/java/com/zg/project/wisdom/domain/dto/MoveRequestDTO.java create mode 100644 src/main/java/com/zg/project/wisdom/domain/dto/MoveTargetItem.java create mode 100644 src/main/java/com/zg/project/wisdom/domain/dto/RefundRequestDTO.java create mode 100644 src/main/java/com/zg/project/wisdom/domain/vo/TaskExecuteResultVO.java create mode 100644 src/main/java/com/zg/project/wisdom/mapper/AgvTaskResultMapper.java create mode 100644 src/main/java/com/zg/project/wisdom/mapper/DdTaskMapper.java create mode 100644 src/main/java/com/zg/project/wisdom/mapper/MoveRecordMapper.java create mode 100644 src/main/java/com/zg/project/wisdom/service/IAgvTaskResultService.java create mode 100644 src/main/java/com/zg/project/wisdom/service/IDdTaskService.java create mode 100644 src/main/java/com/zg/project/wisdom/service/IMoveRecordService.java create mode 100644 src/main/java/com/zg/project/wisdom/service/impl/AgvTaskResultServiceImpl.java create mode 100644 src/main/java/com/zg/project/wisdom/service/impl/DdTaskServiceImpl.java create mode 100644 src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java create mode 100644 src/main/resources/mybatis/wisdom/AgvTaskResultMapper.xml create mode 100644 src/main/resources/mybatis/wisdom/DdTaskMapper.xml create mode 100644 src/main/resources/mybatis/wisdom/MoveRecordMapper.xml diff --git a/pom.xml b/pom.xml index e57eebe..235580c 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,7 @@ 1.0.0 4.4.7 3.5.5 + 8.5.4 @@ -210,6 +211,12 @@ poi-ooxml ${poi.version} + + + io.minio + minio + ${minio.version} + com.baomidou diff --git a/src/main/java/com/zg/SmartApplication.java b/src/main/java/com/zg/SmartApplication.java index 7db3334..981b537 100644 --- a/src/main/java/com/zg/SmartApplication.java +++ b/src/main/java/com/zg/SmartApplication.java @@ -3,6 +3,7 @@ package com.zg; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.scheduling.annotation.EnableScheduling; /** * 启动程序 @@ -10,6 +11,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; * @author zg */ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +@EnableScheduling public class SmartApplication { public static void main(String[] args) diff --git a/src/main/java/com/zg/common/utils/EntityFillUtils.java b/src/main/java/com/zg/common/utils/EntityFillUtils.java new file mode 100644 index 0000000..0d826db --- /dev/null +++ b/src/main/java/com/zg/common/utils/EntityFillUtils.java @@ -0,0 +1,32 @@ +package com.zg.common.utils; + +import com.zg.framework.web.domain.BaseEntity; + +import java.util.Date; + +public class EntityFillUtils { + + /** + * 设置新增操作的公共字段(创建人、创建时间、修改人、修改时间、逻辑删除) + */ + public static void fillCreateFields(BaseEntity entity) { + String username = SecurityUtils.getUsername(); + Date now = new Date(); + + entity.setCreateBy(username); + entity.setCreateTime(now); + entity.setUpdateBy(username); + entity.setUpdateTime(now); + } + + /** + * 设置修改操作的公共字段(修改人、修改时间) + */ + public static void fillUpdateFields(BaseEntity entity) { + String username = SecurityUtils.getUsername(); + Date now = new Date(); + + entity.setUpdateBy(username); + entity.setUpdateTime(now); + } +} diff --git a/src/main/java/com/zg/common/utils/MinioUtil.java b/src/main/java/com/zg/common/utils/MinioUtil.java new file mode 100644 index 0000000..352e9d7 --- /dev/null +++ b/src/main/java/com/zg/common/utils/MinioUtil.java @@ -0,0 +1,60 @@ +package com.zg.common.utils; + +import io.minio.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +@Component +public class MinioUtil { + + @Value("${minio.endpoint}") + private String endpoint; + + @Value("${minio.accessKey}") + private String accessKey; + + @Value("${minio.secretKey}") + private String secretKey; + + @Value("${minio.bucketName}") + private String bucketName; + + /** + * 上传文件到 MinIO,自动根据日期生成路径 + * 如:2025/07/10/uuid-xxx.jpg + */ + public String uploadFile(MultipartFile file) throws Exception { + MinioClient client = MinioClient.builder() + .endpoint(endpoint) + .credentials(accessKey, secretKey) + .build(); + + // 检查桶是否存在,不存在则创建 + boolean found = client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + if (!found) { + client.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + } + + String originalFilename = file.getOriginalFilename(); + String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")); + String objectName = datePath + "/" + UUID.randomUUID().toString() + "-" + originalFilename; + + try (InputStream inputStream = file.getInputStream()) { + client.putObject(PutObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .stream(inputStream, file.getSize(), -1) + .contentType(file.getContentType()) + .build()); + } + + // 返回完整可访问 URL(前端可直接使用) + return endpoint + "/" + bucketName + "/" + objectName; + } +} diff --git a/src/main/java/com/zg/framework/config/SecurityConfig.java b/src/main/java/com/zg/framework/config/SecurityConfig.java index 76e45cb..f055125 100644 --- a/src/main/java/com/zg/framework/config/SecurityConfig.java +++ b/src/main/java/com/zg/framework/config/SecurityConfig.java @@ -120,6 +120,7 @@ public class SecurityConfig "/ws/**", "/information/device/**", "/MatchScan/**", + "/wisdom/task/**", // "/wisdom/stock/**", // "/information/materialtype/**", // "/information/warehousingtype/**", diff --git a/src/main/java/com/zg/framework/websocket/config/DeviceSession.java b/src/main/java/com/zg/framework/websocket/config/DeviceSession.java new file mode 100644 index 0000000..95c6d7e --- /dev/null +++ b/src/main/java/com/zg/framework/websocket/config/DeviceSession.java @@ -0,0 +1,25 @@ +package com.zg.framework.websocket.config; + +import javax.websocket.Session; + +public class DeviceSession { + private Session session; + private long lastActiveTime; + + public DeviceSession(Session session) { + this.session = session; + this.lastActiveTime = System.currentTimeMillis(); + } + + public Session getSession() { + return session; + } + + public long getLastActiveTime() { + return lastActiveTime; + } + + public void refreshTime() { + this.lastActiveTime = System.currentTimeMillis(); + } +} diff --git a/src/main/java/com/zg/framework/websocket/config/DeviceSessionCleaner.java b/src/main/java/com/zg/framework/websocket/config/DeviceSessionCleaner.java new file mode 100644 index 0000000..300488b --- /dev/null +++ b/src/main/java/com/zg/framework/websocket/config/DeviceSessionCleaner.java @@ -0,0 +1,48 @@ +package com.zg.framework.websocket.config; + +import com.zg.project.Inventory.AutoInventory.service.IRfidService; +import com.zg.project.Inventory.AutoInventory.utils.SpringContextUtils; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.websocket.Session; +import java.io.IOException; +import java.util.Iterator; +import java.util.Map; + +@Component +public class DeviceSessionCleaner { + + private static final long TIMEOUT = 30 * 1000; // 30秒无响应视为失联 + + @Scheduled(fixedDelay = 10000) // 每10秒检查一次 + public void checkTimeoutSessions() { + Iterator> iterator = WebSocketServer.deviceSessionMap.entrySet().iterator(); + + IRfidService rfidService = SpringContextUtils.getBean(IRfidService.class); + + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + String deviceId = entry.getKey(); + DeviceSession deviceSession = entry.getValue(); + long lastActive = deviceSession.getLastActiveTime(); + + if (System.currentTimeMillis() - lastActive > TIMEOUT) { + try { + Session session = deviceSession.getSession(); + if (session != null && session.isOpen()) { + session.close(); // 主动断开连接 + } + } catch (IOException e) { + e.printStackTrace(); + } + + rfidService.disconnect(deviceId); // 释放设备连接 + iterator.remove(); // 移除超时设备 + WebSocketServer.sessionMap.remove(deviceId); // 保持一致性 + + System.out.println("🛑 超时释放设备连接 deviceId=" + deviceId); + } + } + } +} diff --git a/src/main/java/com/zg/framework/websocket/config/WebSocketServer.java b/src/main/java/com/zg/framework/websocket/config/WebSocketServer.java index db2c181..45ed8ff 100644 --- a/src/main/java/com/zg/framework/websocket/config/WebSocketServer.java +++ b/src/main/java/com/zg/framework/websocket/config/WebSocketServer.java @@ -17,6 +17,9 @@ public class WebSocketServer { public static final ConcurrentHashMap sessionMap = new ConcurrentHashMap<>(); private static final ConcurrentHashMap sessionToDeviceMap = new ConcurrentHashMap<>(); + // 新增:用于记录设备连接状态和最后活跃时间 + public static final ConcurrentHashMap deviceSessionMap = new ConcurrentHashMap<>(); + // rfidService 不在构造方法中注入! private IRfidService rfidService; @@ -43,6 +46,7 @@ public class WebSocketServer { String ip = json.getString("ip"); int port = json.getIntValue("port"); + deviceSessionMap.put(deviceId, new DeviceSession(session)); sessionMap.put(deviceId, session); sessionToDeviceMap.put(session, deviceId); diff --git a/src/main/java/com/zg/project/Inventory/AutoInventory/controller/AutoInventoryController.java b/src/main/java/com/zg/project/Inventory/AutoInventory/controller/AutoInventoryController.java index d6fee0f..301f957 100644 --- a/src/main/java/com/zg/project/Inventory/AutoInventory/controller/AutoInventoryController.java +++ b/src/main/java/com/zg/project/Inventory/AutoInventory/controller/AutoInventoryController.java @@ -3,10 +3,11 @@ package com.zg.project.Inventory.AutoInventory.controller; import com.zg.framework.web.controller.BaseController; import com.zg.framework.web.domain.AjaxResult; import com.zg.project.Inventory.AutoInventory.service.InventoryMatchScanService; -import com.zg.project.Inventory.domain.dto.SodQueryDTO; +import com.zg.project.Inventory.domain.dto.QueryDTO; import com.zg.project.Inventory.domain.vo.ChartDataVO; import com.zg.project.Inventory.AutoInventory.service.IRfidService; import com.zg.project.Inventory.AutoInventory.service.ISodService; +import com.zg.project.wisdom.service.IRkInfoService; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,6 +22,9 @@ public class AutoInventoryController extends BaseController { @Autowired private ISodService sodService; + @Autowired + private IRkInfoService rkInfoService; + @Autowired private IRfidService rfidService; @@ -33,7 +37,7 @@ public class AutoInventoryController extends BaseController { } @PostMapping("/sodQuery") @ApiOperation("条件查询库存数据") - public AjaxResult query(@RequestBody SodQueryDTO dto) { + public AjaxResult query(@RequestBody QueryDTO dto) { return AjaxResult.success(sodService.selectByPcdeList(dto)); } @@ -66,17 +70,15 @@ public class AutoInventoryController extends BaseController { */ @PostMapping("/match") @ApiOperation("开始匹配") - public AjaxResult match(@RequestBody SodQueryDTO dto) { - //停止标签盘点 + public AjaxResult match(@RequestBody QueryDTO dto) { + // 停止盘点 rfidService.stopScan(dto.getDeviceId()); dto.setScanType(1); - // 调用服务层的方法 - Map resultMap = sodService.matchWithStatus(dto); + rkInfoService.matchWithStatus(dto); - // 返回包含分页数据的 Map - return AjaxResult.success(resultMap); + return AjaxResult.success(); } /** @@ -84,8 +86,8 @@ public class AutoInventoryController extends BaseController { */ @PostMapping("/chart") @ApiOperation("匹配后图表统计") - public AjaxResult chart(@RequestBody SodQueryDTO dto) { - ChartDataVO vo = sodService.matchWithAll(dto); + public AjaxResult chart(@RequestBody QueryDTO dto) { + ChartDataVO vo = rkInfoService.matchWithAll(dto); return AjaxResult.success(vo); } diff --git a/src/main/java/com/zg/project/Inventory/AutoInventory/controller/InventoryMatchScanController.java b/src/main/java/com/zg/project/Inventory/AutoInventory/controller/InventoryMatchScanController.java index c8b4b9b..0819ca0 100644 --- a/src/main/java/com/zg/project/Inventory/AutoInventory/controller/InventoryMatchScanController.java +++ b/src/main/java/com/zg/project/Inventory/AutoInventory/controller/InventoryMatchScanController.java @@ -1,14 +1,22 @@ package com.zg.project.Inventory.AutoInventory.controller; +import com.zg.common.utils.poi.ExcelUtil; import com.zg.framework.web.controller.BaseController; import com.zg.framework.web.domain.AjaxResult; +import com.zg.framework.web.page.TableDataInfo; import com.zg.project.Inventory.AutoInventory.service.InventoryMatchScanService; import com.zg.project.Inventory.domain.dto.MatchScanPageDTO; +import com.zg.project.Inventory.domain.entity.InventoryMatchScan; +import com.zg.project.Inventory.domain.entity.InventoryTask; +import com.zg.project.Inventory.domain.vo.InventoryMatchScanSimpleVO; import com.zg.project.Inventory.domain.vo.InventoryMatchScanVO; +import com.zg.project.Inventory.domain.vo.RkInfoMatchVO; +import com.zg.project.wisdom.domain.RkInfo; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.util.List; import static com.zg.common.utils.PageUtils.startPage; @@ -20,19 +28,40 @@ public class InventoryMatchScanController extends BaseController { @Autowired private InventoryMatchScanService inventoryMatchScanService; - /** - * 分页查询盘点结果 - * @param dto - * @return - */ - @PostMapping("/historyList") - @ApiOperation("分页查询盘点结果") - public AjaxResult getHistoryList(@RequestBody MatchScanPageDTO dto) { - return AjaxResult.success(inventoryMatchScanService.getHistoryList(dto)); - } /** * 分页查询盘点结果 + * @param matchScan + * @return + */ + @GetMapping("/list") + public TableDataInfo list(InventoryMatchScan matchScan) { + startPage(); + List list = inventoryMatchScanService.selectInventoryMatchScanList(matchScan); + return getDataTable(list); + } + + @PostMapping("/export") + public void export(HttpServletResponse response, InventoryMatchScan criteria) { + List list = inventoryMatchScanService.selectInventoryMatchScanList(criteria); + ExcelUtil util = new ExcelUtil<>(InventoryMatchScan.class); + util.exportExcel(response, list, "盘点匹配结果"); + } + + /** + * 根据盘点任务id查看盘点结果 + * @param matchScan + * @return + */ + @GetMapping("/countList") + public TableDataInfo countList(InventoryMatchScan matchScan) { + startPage(); + List list = inventoryMatchScanService.selectMatchScanCountList(matchScan); + return getDataTable(list); + } + + /** + * 根据任务名称分页查询盘点结果 * @param dto * @return */ diff --git a/src/main/java/com/zg/project/Inventory/AutoInventory/mapper/InventoryMatchScanMapper.java b/src/main/java/com/zg/project/Inventory/AutoInventory/mapper/InventoryMatchScanMapper.java index c9ff108..11f6f1d 100644 --- a/src/main/java/com/zg/project/Inventory/AutoInventory/mapper/InventoryMatchScanMapper.java +++ b/src/main/java/com/zg/project/Inventory/AutoInventory/mapper/InventoryMatchScanMapper.java @@ -5,6 +5,7 @@ import com.zg.project.Inventory.domain.entity.InventoryMatchScan; import com.zg.project.Inventory.domain.entity.Sod; import com.zg.project.Inventory.domain.vo.InventoryMatchScanSimpleVO; import com.zg.project.Inventory.domain.vo.InventoryMatchScanVO; +import com.zg.project.Inventory.domain.vo.RkInfoMatchVO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -27,4 +28,9 @@ public interface InventoryMatchScanMapper { List getByTaskName(MatchScanPageDTO dto); + List selectInventoryMatchScanList(InventoryMatchScan matchScan); + + List selectOnlyFromMatchScan(InventoryMatchScan param); + + List selectJoinRkInfo(InventoryMatchScan param); } diff --git a/src/main/java/com/zg/project/Inventory/AutoInventory/mapper/SodMapper.java b/src/main/java/com/zg/project/Inventory/AutoInventory/mapper/SodMapper.java index db7d9f9..bc7bd3d 100644 --- a/src/main/java/com/zg/project/Inventory/AutoInventory/mapper/SodMapper.java +++ b/src/main/java/com/zg/project/Inventory/AutoInventory/mapper/SodMapper.java @@ -1,6 +1,6 @@ package com.zg.project.Inventory.AutoInventory.mapper; -import com.zg.project.Inventory.domain.dto.SodQueryDTO; +import com.zg.project.Inventory.domain.dto.QueryDTO; import com.zg.project.Inventory.domain.entity.Sod; import com.zg.project.Inventory.domain.vo.PcdeCntVO; import com.zg.project.Inventory.domain.vo.SodVO; @@ -11,7 +11,7 @@ import java.util.List; @Mapper public interface SodMapper { - List selectByPcdeList(@Param("query") SodQueryDTO query); + List selectByPcdeList(@Param("query") QueryDTO query); List getAll(); @@ -21,5 +21,4 @@ public interface SodMapper { boolean existsByFycde1(String id); - List selectPcdeCntByFycde1(List ids); } \ No newline at end of file diff --git a/src/main/java/com/zg/project/Inventory/AutoInventory/service/ISodService.java b/src/main/java/com/zg/project/Inventory/AutoInventory/service/ISodService.java index 7b39874..9087e9c 100644 --- a/src/main/java/com/zg/project/Inventory/AutoInventory/service/ISodService.java +++ b/src/main/java/com/zg/project/Inventory/AutoInventory/service/ISodService.java @@ -1,6 +1,6 @@ package com.zg.project.Inventory.AutoInventory.service; -import com.zg.project.Inventory.domain.dto.SodQueryDTO; +import com.zg.project.Inventory.domain.dto.QueryDTO; import com.zg.project.Inventory.domain.vo.ChartDataVO; import com.zg.project.Inventory.domain.vo.SodVO; @@ -8,12 +8,11 @@ import java.util.List; import java.util.Map; public interface ISodService { - List selectByPcdeList(SodQueryDTO dto); + List selectByPcdeList(QueryDTO dto); - Map matchWithStatus(SodQueryDTO dto); + Map matchWithStatus(QueryDTO dto); - ChartDataVO matchWithAll(SodQueryDTO dto); Map getAll(); } diff --git a/src/main/java/com/zg/project/Inventory/AutoInventory/service/InventoryMatchScanService.java b/src/main/java/com/zg/project/Inventory/AutoInventory/service/InventoryMatchScanService.java index c35c101..cf774c3 100644 --- a/src/main/java/com/zg/project/Inventory/AutoInventory/service/InventoryMatchScanService.java +++ b/src/main/java/com/zg/project/Inventory/AutoInventory/service/InventoryMatchScanService.java @@ -3,7 +3,9 @@ package com.zg.project.Inventory.AutoInventory.service; import com.zg.framework.web.page.TableDataInfo; import com.zg.project.Inventory.domain.dto.MatchScanPageDTO; import com.zg.project.Inventory.domain.entity.InventoryMatchScan; +import com.zg.project.Inventory.domain.vo.InventoryMatchScanSimpleVO; import com.zg.project.Inventory.domain.vo.InventoryMatchScanVO; +import com.zg.project.Inventory.domain.vo.RkInfoMatchVO; import java.util.List; import java.util.Map; @@ -15,8 +17,9 @@ public interface InventoryMatchScanService { Map getAll(); - TableDataInfo getHistoryList(MatchScanPageDTO dto); - List getByTaskName(MatchScanPageDTO dto); + List selectInventoryMatchScanList(InventoryMatchScan matchScan); + + List selectMatchScanCountList(InventoryMatchScan matchScan); } diff --git a/src/main/java/com/zg/project/Inventory/AutoInventory/service/impl/InventoryMatchScanServiceImpl.java b/src/main/java/com/zg/project/Inventory/AutoInventory/service/impl/InventoryMatchScanServiceImpl.java index 533b04e..efd4dd5 100644 --- a/src/main/java/com/zg/project/Inventory/AutoInventory/service/impl/InventoryMatchScanServiceImpl.java +++ b/src/main/java/com/zg/project/Inventory/AutoInventory/service/impl/InventoryMatchScanServiceImpl.java @@ -1,12 +1,15 @@ package com.zg.project.Inventory.AutoInventory.service.impl; import com.zg.framework.web.page.TableDataInfo; +import com.zg.project.Inventory.Task.mapper.InventoryTaskMapper; import com.zg.project.Inventory.domain.dto.MatchScanPageDTO; import com.zg.project.Inventory.domain.entity.InventoryMatchScan; import com.zg.project.Inventory.AutoInventory.mapper.InventoryMatchScanMapper; import com.zg.project.Inventory.AutoInventory.service.InventoryMatchScanService; import com.zg.project.Inventory.domain.vo.InventoryMatchScanSimpleVO; import com.zg.project.Inventory.domain.vo.InventoryMatchScanVO; +import com.zg.project.Inventory.domain.vo.RkInfoMatchVO; +import com.zg.project.wisdom.mapper.RkInfoMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,6 +23,12 @@ public class InventoryMatchScanServiceImpl implements InventoryMatchScanService @Autowired private InventoryMatchScanMapper mapper; + @Autowired + private InventoryTaskMapper taskMapper; + + @Autowired + private RkInfoMapper rkInfoMapper; + @Override public void saveBatch(List list) { mapper.insertBatch(list); @@ -39,21 +48,26 @@ public class InventoryMatchScanServiceImpl implements InventoryMatchScanService return resultMap; } - @Override - public TableDataInfo getHistoryList(MatchScanPageDTO dto) { - int pageNum = dto.getPageNum() == null ? 1 : dto.getPageNum(); - int pageSize = dto.getPageSize() == null ? 10 : dto.getPageSize(); - int offset = (pageNum - 1) * pageSize; - - int total = mapper.countGroupedHistory(dto); - List pageList = mapper.getGroupedHistoryList(dto, offset, pageSize); - - return new TableDataInfo(pageList, total); - } - @Override public List getByTaskName(MatchScanPageDTO dto) { return mapper.getByTaskName(dto); } + @Override + public List selectInventoryMatchScanList(InventoryMatchScan matchScan) { + return mapper.selectInventoryMatchScanList(matchScan); + } + + @Override + public List selectMatchScanCountList(InventoryMatchScan param) { + if ("2".equals(param.getStatus())) { + return mapper.selectOnlyFromMatchScan(param); + } else if ("1".equals(param.getStatus())) { + String wh = taskMapper.getWhByTaskId(param.getTaskId()); + return rkInfoMapper.getUnscannedPcodeByWh(wh, param.getTaskId()); + } else { + return mapper.selectJoinRkInfo(param); + } + } + } diff --git a/src/main/java/com/zg/project/Inventory/AutoInventory/service/impl/SodServiceImpl.java b/src/main/java/com/zg/project/Inventory/AutoInventory/service/impl/SodServiceImpl.java index f225a1a..e3e367b 100644 --- a/src/main/java/com/zg/project/Inventory/AutoInventory/service/impl/SodServiceImpl.java +++ b/src/main/java/com/zg/project/Inventory/AutoInventory/service/impl/SodServiceImpl.java @@ -2,7 +2,7 @@ package com.zg.project.Inventory.AutoInventory.service.impl; import com.zg.common.utils.PageUtils; import com.zg.framework.web.page.TableDataInfo; -import com.zg.project.Inventory.domain.dto.SodQueryDTO; +import com.zg.project.Inventory.domain.dto.QueryDTO; import com.zg.project.Inventory.domain.entity.InventoryMatchScan; import com.zg.project.Inventory.domain.entity.Sod; import com.zg.project.Inventory.domain.vo.ChartDataVO; @@ -31,12 +31,12 @@ public class SodServiceImpl implements ISodService { private InventoryMatchScanMapper matchScanMapper; @Override - public List selectByPcdeList(SodQueryDTO dto) { + public List selectByPcdeList(QueryDTO dto) { return sodMapper.selectByPcdeList(dto); } @Override - public Map matchWithStatus(SodQueryDTO dto) { + public Map matchWithStatus(QueryDTO dto) { int pageNum = dto.getPageNum(); int pageSize = dto.getPageSize(); List pcdeIds = dto.getIds(); @@ -67,13 +67,13 @@ public class SodServiceImpl implements ISodService { List toSave = new ArrayList<>(); matchedAll.forEach(sod -> - toSave.add(buildScanRecord(dto.getTaskName(),sod.getFycde1(), "0", deviceId, tmeStr, nowStr, scanType))); + toSave.add(buildScanRecord(dto.getTaskId(),sod.getFycde1(), "0", deviceId, tmeStr, nowStr, scanType))); missedAll.forEach(sod -> - toSave.add(buildScanRecord(dto.getTaskName(),sod.getFycde1(), "1", deviceId, tmeStr, nowStr, scanType))); + toSave.add(buildScanRecord(dto.getTaskId(),sod.getFycde1(), "1", deviceId, tmeStr, nowStr, scanType))); errorAll.forEach(sod -> - toSave.add(buildScanRecord(dto.getTaskName(),sod.getFycde1(), "2", deviceId, tmeStr, nowStr, scanType))); + toSave.add(buildScanRecord(dto.getTaskId(),sod.getFycde1(), "2", deviceId, tmeStr, nowStr, scanType))); if (!toSave.isEmpty()) { matchScanMapper.insertBatch(toSave); @@ -111,45 +111,18 @@ public class SodServiceImpl implements ISodService { } - private InventoryMatchScan buildScanRecord(String taskName,String pcde, String status, + private InventoryMatchScan buildScanRecord(String taskId,String pcode, String status, String deviceId, String tme, String createdAt, int scanType) { InventoryMatchScan record = new InventoryMatchScan(); - record.setPcde(pcde); - record.setTaskName(taskName); + record.setPcode(pcode); + record.setTaskId(taskId); record.setStatus(status); record.setDeviceId(deviceId); record.setTme(tme); record.setScanType(scanType); - record.setCreatedAt(createdAt); return record; } - @Override - public ChartDataVO matchWithAll(SodQueryDTO dto) { - - List ids = dto.getIds(); - if (ids == null || ids.isEmpty()) { - // 没传扫描 ID,直接返回空 - return new ChartDataVO(Collections.emptyList(), - Collections.emptyList(), - 0L); - } - - // ① 查询统计结果 - List rows = sodMapper.selectPcdeCntByFycde1(ids); - - // ② 组装前端需要的数组 - List pcdeList = new ArrayList<>(rows.size()); - List fycdeCntList = new ArrayList<>(rows.size()); - - for (PcdeCntVO r : rows) { - pcdeList.add(r.getPcde()); - fycdeCntList.add(r.getCnt()); - } - - return new ChartDataVO(pcdeList, fycdeCntList, (long) rows.size()); - } - @Override public Map getAll() { List sodList = sodMapper.getAll(); diff --git a/src/main/java/com/zg/project/Inventory/HdInventory/HdInventoryController.java b/src/main/java/com/zg/project/Inventory/HdInventory/HdInventoryController.java index 75b3d07..6808b85 100644 --- a/src/main/java/com/zg/project/Inventory/HdInventory/HdInventoryController.java +++ b/src/main/java/com/zg/project/Inventory/HdInventory/HdInventoryController.java @@ -2,7 +2,8 @@ package com.zg.project.Inventory.HdInventory; import com.zg.framework.web.domain.AjaxResult; import com.zg.project.Inventory.AutoInventory.service.ISodService; -import com.zg.project.Inventory.domain.dto.SodQueryDTO; +import com.zg.project.Inventory.domain.dto.QueryDTO; +import com.zg.project.wisdom.service.IRkInfoService; import io.swagger.annotations.ApiModelProperty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -15,19 +16,20 @@ import java.util.Map; @RestController @RequestMapping("/HdInventory") public class HdInventoryController { - @Autowired - private ISodService sodService; + private IRkInfoService rkInfoService; @ApiModelProperty("盘点对比") @PostMapping("/match") - public AjaxResult match(@RequestBody SodQueryDTO dto) { + public AjaxResult match(@RequestBody QueryDTO dto) { dto.setScanType(0); - Map resultMap = sodService.matchWithStatus(dto); +// dto.setDeviceId("0"); - return AjaxResult.success(resultMap); + rkInfoService.matchWithStatus(dto); + + return AjaxResult.success(); } diff --git a/src/main/java/com/zg/project/Inventory/Task/controller/InventoryTaskController.java b/src/main/java/com/zg/project/Inventory/Task/controller/InventoryTaskController.java index 0545b59..c926cf6 100644 --- a/src/main/java/com/zg/project/Inventory/Task/controller/InventoryTaskController.java +++ b/src/main/java/com/zg/project/Inventory/Task/controller/InventoryTaskController.java @@ -34,6 +34,19 @@ public class InventoryTaskController extends BaseController @Autowired private IInventoryTaskService inventoryTaskService; + /** + * 根据当前登录用户数统计待执行盘点任务数 + * @return + */ + @PreAuthorize("@ss.hasPermi('Inventory:task:list')") + @GetMapping("/count") + public AjaxResult countPending() + { + Long userId = getUserId(); + int count = inventoryTaskService.countPendingTaskByUserId(userId); + return success(count); + } + /** * 查询盘点任务列表 */ diff --git a/src/main/java/com/zg/project/Inventory/Task/controller/StatisticsController.java b/src/main/java/com/zg/project/Inventory/Task/controller/StatisticsController.java new file mode 100644 index 0000000..622c4ac --- /dev/null +++ b/src/main/java/com/zg/project/Inventory/Task/controller/StatisticsController.java @@ -0,0 +1,38 @@ +package com.zg.project.Inventory.Task.controller; + +import com.zg.framework.aspectj.lang.annotation.Log; +import com.zg.framework.aspectj.lang.enums.BusinessType; +import com.zg.framework.web.controller.BaseController; +import com.zg.framework.web.domain.AjaxResult; +import com.zg.project.Inventory.Task.service.IInventoryTaskService; +import com.zg.project.wisdom.service.IRkInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/statistics") +public class StatisticsController extends BaseController { + + @Autowired + private IInventoryTaskService taskService; + + @Autowired + private IRkInfoService rkInfoService; + + /** + * 统计盘点任务对应仓库的待盘点数量 + * @param taskId + * @return + */ + @GetMapping("/count") + public AjaxResult conuntGetByTaskId(@RequestParam("taskId") String taskId) + { + + String warehouse = taskService.getWhByTaskId(taskId); + + int count = rkInfoService.countGetByWh(warehouse); + + return AjaxResult.success(count); + } +} diff --git a/src/main/java/com/zg/project/Inventory/Task/mapper/InventoryTaskMapper.java b/src/main/java/com/zg/project/Inventory/Task/mapper/InventoryTaskMapper.java index 19b9b66..23e0c40 100644 --- a/src/main/java/com/zg/project/Inventory/Task/mapper/InventoryTaskMapper.java +++ b/src/main/java/com/zg/project/Inventory/Task/mapper/InventoryTaskMapper.java @@ -2,6 +2,7 @@ package com.zg.project.Inventory.Task.mapper; import java.util.List; import com.zg.project.Inventory.domain.entity.InventoryTask; +import org.apache.ibatis.annotations.Param; /** * 盘点任务Mapper接口 @@ -58,4 +59,25 @@ public interface InventoryTaskMapper * @return 结果 */ public int deleteInventoryTaskByIds(Long[] ids); + + /** + * 查询用户待处理的任务数量 + * @param userId + * @return + */ + int countPendingTaskByUserId(Long userId); + + /** + * 根据任务ID查询仓库ID + * @param taskId + * @return + */ + String getWhByTaskId(String taskId); + + /** + * 更新任务状态 + * @param taskId + * @param status + */ + void updateStatus(@Param("taskId") String taskId, @Param("status") String status); } diff --git a/src/main/java/com/zg/project/Inventory/Task/service/IInventoryTaskService.java b/src/main/java/com/zg/project/Inventory/Task/service/IInventoryTaskService.java index 1cebafa..a85056f 100644 --- a/src/main/java/com/zg/project/Inventory/Task/service/IInventoryTaskService.java +++ b/src/main/java/com/zg/project/Inventory/Task/service/IInventoryTaskService.java @@ -58,4 +58,18 @@ public interface IInventoryTaskService * @return 结果 */ public int deleteInventoryTaskById(Long id); + + /** + * 统计用户待处理的盘点任务数量 + * @param userId + * @return + */ + int countPendingTaskByUserId(Long userId); + + /** + * 根据盘点任务id获取仓库id + * @param taskId + * @return + */ + String getWhByTaskId(String taskId); } diff --git a/src/main/java/com/zg/project/Inventory/Task/service/impl/InventoryTaskServiceImpl.java b/src/main/java/com/zg/project/Inventory/Task/service/impl/InventoryTaskServiceImpl.java index baf0e4d..230d2fd 100644 --- a/src/main/java/com/zg/project/Inventory/Task/service/impl/InventoryTaskServiceImpl.java +++ b/src/main/java/com/zg/project/Inventory/Task/service/impl/InventoryTaskServiceImpl.java @@ -1,6 +1,9 @@ package com.zg.project.Inventory.Task.service.impl; import java.util.List; + +import com.zg.common.utils.DateUtils; +import com.zg.common.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.zg.project.Inventory.Task.mapper.InventoryTaskMapper; @@ -50,8 +53,11 @@ public class InventoryTaskServiceImpl implements IInventoryTaskService * @return 结果 */ @Override - public int insertInventoryTask(InventoryTask inventoryTask) - { + public int insertInventoryTask(InventoryTask inventoryTask) { + inventoryTask.setCreatedBy(SecurityUtils.getUsername()); + inventoryTask.setCreatedAt(DateUtils.getTime()); + inventoryTask.setIsDelete("0"); + inventoryTask.setStatus("0"); return inventoryTaskMapper.insertInventoryTask(inventoryTask); } @@ -90,4 +96,19 @@ public class InventoryTaskServiceImpl implements IInventoryTaskService { return inventoryTaskMapper.deleteInventoryTaskById(id); } + + @Override + public int countPendingTaskByUserId(Long userId) { + return inventoryTaskMapper.countPendingTaskByUserId(userId); + } + + /** + * 根据任务ID获取仓库 + * @param taskId + * @return + */ + @Override + public String getWhByTaskId(String taskId) { + return inventoryTaskMapper.getWhByTaskId(taskId); + } } diff --git a/src/main/java/com/zg/project/Inventory/domain/dto/MatchScanPageDTO.java b/src/main/java/com/zg/project/Inventory/domain/dto/MatchScanPageDTO.java index 8735357..96eb537 100644 --- a/src/main/java/com/zg/project/Inventory/domain/dto/MatchScanPageDTO.java +++ b/src/main/java/com/zg/project/Inventory/domain/dto/MatchScanPageDTO.java @@ -25,7 +25,7 @@ public class MatchScanPageDTO { /** * 盘点任务名称 */ - private String taskName; + private String taskId; /** * 库位码 diff --git a/src/main/java/com/zg/project/Inventory/domain/dto/SodQueryDTO.java b/src/main/java/com/zg/project/Inventory/domain/dto/QueryDTO.java similarity index 91% rename from src/main/java/com/zg/project/Inventory/domain/dto/SodQueryDTO.java rename to src/main/java/com/zg/project/Inventory/domain/dto/QueryDTO.java index 0fdd2e6..fb2d100 100644 --- a/src/main/java/com/zg/project/Inventory/domain/dto/SodQueryDTO.java +++ b/src/main/java/com/zg/project/Inventory/domain/dto/QueryDTO.java @@ -10,7 +10,7 @@ import java.util.List; @Data @ApiModel("库存查询参数") -public class SodQueryDTO { +public class QueryDTO { @ApiModelProperty("系统入库时间,格式 yyyy-MM-dd") private String tme; @@ -36,8 +36,8 @@ public class SodQueryDTO { @ApiModelProperty("盘点类型(0=手动盘点,1=自动盘点)") private Integer scanType; - @ApiModelProperty("盘点任务名称") - private String taskName; + @ApiModelProperty("盘点任务ID") + private String taskId; } \ No newline at end of file diff --git a/src/main/java/com/zg/project/Inventory/domain/entity/InventoryMatchScan.java b/src/main/java/com/zg/project/Inventory/domain/entity/InventoryMatchScan.java index 1ebf913..29373a8 100644 --- a/src/main/java/com/zg/project/Inventory/domain/entity/InventoryMatchScan.java +++ b/src/main/java/com/zg/project/Inventory/domain/entity/InventoryMatchScan.java @@ -1,52 +1,140 @@ package com.zg.project.Inventory.domain.entity; -import com.baomidou.mybatisplus.annotation.*; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.zg.framework.aspectj.lang.annotation.Excel; +import com.zg.framework.web.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; -import java.io.Serializable; +import java.util.Date; -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("inventory_match_scan") -@ApiModel(value = "InventoryMatchScan对象", description = "盘点匹配数据记录表") -public class InventoryMatchScan implements Serializable { +/** + * 盘点匹配数据记录表 InventoryMatchScan + * + * @author zg + * @date 2025-06-24 + */ +public class InventoryMatchScan extends BaseEntity { private static final long serialVersionUID = 1L; - @ApiModelProperty("主键ID") - @TableId(value = "Id", type = IdType.AUTO) - private Long Id; + /** 主键ID */ + @Excel(name = "主键ID") + private Long id; - @ApiModelProperty("设备ID") - @TableField("device_id") + /** 设备ID */ + @Excel(name = "设备ID") private String deviceId; - @ApiModelProperty("设备ID") - @TableField("task_name") - private String taskName; + /** 盘点任务ID */ + @Excel(name = "盘点任务ID") + private String taskId; - @ApiModelProperty("扫描到的标签ID(货品码ID)") - @TableField("pcde") - private String pcde; + /** 扫描标签ID(货品码ID) */ + @Excel(name = "扫描标签ID") + private String pcode; - @ApiModelProperty("系统入库时间") - @TableField("tme") + /** 系统入库时间 */ + @Excel(name = "系统入库时间") private String tme; - @ApiModelProperty("盘点类型(0=手动盘点,1=自动盘点)") - @TableField("scan_type") + /** 盘点类型(0=手动盘点,1=自动盘点) */ + @Excel(name = "盘点类型", readConverterExp = "0=手动盘点,1=自动盘点") private Integer scanType; - @ApiModelProperty("匹配状态(0=正常, 1=未扫到, 2=误扫)") - @TableField("status") + /** 匹配状态(0=正常, 1=未扫到, 2=误扫) */ + @Excel(name = "匹配状态", readConverterExp = "0=正常,1=未扫到,2=误扫") private String status; - @ApiModelProperty("创建时间") - @TableField(value = "created_at", fill = FieldFill.INSERT) - private String createdAt; + /** 匹配到的真实货品码 */ + @Excel(name = "库位号") + private String rkPcode; + + @Excel(name = "盘点任务名称") + private String taskName; + + // ---------- Getter/Setter ---------- + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getPcode() { + return pcode; + } + + public void setPcode(String pcode) { + this.pcode = pcode; + } + + public String getTme() { + return tme; + } + + public void setTme(String tme) { + this.tme = tme; + } + + public Integer getScanType() { + return scanType; + } + + public void setScanType(Integer scanType) { + this.scanType = scanType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getRkPcode() { + return rkPcode; + } + + public void setRkPcode(String rkPcode) { + this.rkPcode = rkPcode; + } + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("deviceId", getDeviceId()) + .append("taskId", getTaskId()) + .append("pcode", getPcode()) + .append("tme", getTme()) + .append("scanType", getScanType()) + .append("status", getStatus()) + .append("rkPcode", getRkPcode()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } } diff --git a/src/main/java/com/zg/project/Inventory/domain/entity/InventoryTask.java b/src/main/java/com/zg/project/Inventory/domain/entity/InventoryTask.java index 32ea9fa..5152f6f 100644 --- a/src/main/java/com/zg/project/Inventory/domain/entity/InventoryTask.java +++ b/src/main/java/com/zg/project/Inventory/domain/entity/InventoryTask.java @@ -7,12 +7,11 @@ import com.zg.framework.web.domain.BaseEntity; /** * 盘点任务对象 inventory_task - * + * * @author zg * @date 2025-06-16 */ -public class InventoryTask extends BaseEntity -{ +public class InventoryTask extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键ID */ @@ -66,153 +65,85 @@ public class InventoryTask extends BaseEntity @Excel(name = "逻辑删除标志", readConverterExp = "0=正常,1=删除") private String isDelete; - public void setId(Long id) - { - this.id = id; - } + /** 执行人姓名(扩展字段) */ + private String userName; - public Long getId() - { - return id; - } + /** 仓库名称(扩展字段) */ + private String warehouseName; - public void setTaskName(String taskName) - { - this.taskName = taskName; - } + /** 场景名称(扩展字段) */ + private String sceneName; - public String getTaskName() - { - return taskName; - } + // ---------- getter/setter ---------- - public void setWarehouseId(String warehouseId) - { - this.warehouseId = warehouseId; - } + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } - public String getWarehouseId() - { - return warehouseId; - } + public String getTaskName() { return taskName; } + public void setTaskName(String taskName) { this.taskName = taskName; } - public void setSceneId(String sceneId) - { - this.sceneId = sceneId; - } + public String getWarehouseId() { return warehouseId; } + public void setWarehouseId(String warehouseId) { this.warehouseId = warehouseId; } - public String getSceneId() - { - return sceneId; - } + public String getSceneId() { return sceneId; } + public void setSceneId(String sceneId) { this.sceneId = sceneId; } - public void setUserId(Long userId) - { - this.userId = userId; - } + public Long getUserId() { return userId; } + public void setUserId(Long userId) { this.userId = userId; } - public Long getUserId() - { - return userId; - } + public String getRequireTime() { return requireTime; } + public void setRequireTime(String requireTime) { this.requireTime = requireTime; } - public void setRequireTime(String requireTime) - { - this.requireTime = requireTime; - } + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } - public String getRequireTime() - { - return requireTime; - } + public String getTaskType() { return taskType; } + public void setTaskType(String taskType) { this.taskType = taskType; } - public void setStatus(String status) - { - this.status = status; - } + public String getCreatedBy() { return createdBy; } + public void setCreatedBy(String createdBy) { this.createdBy = createdBy; } - public String getStatus() - { - return status; - } + public String getCreatedAt() { return createdAt; } + public void setCreatedAt(String createdAt) { this.createdAt = createdAt; } - public void setTaskType(String taskType) - { - this.taskType = taskType; - } + public String getUpdatedBy() { return updatedBy; } + public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy; } - public String getTaskType() - { - return taskType; - } + public String getUpdatedAt() { return updatedAt; } + public void setUpdatedAt(String updatedAt) { this.updatedAt = updatedAt; } - public void setCreatedBy(String createdBy) - { - this.createdBy = createdBy; - } + public String getIsDelete() { return isDelete; } + public void setIsDelete(String isDelete) { this.isDelete = isDelete; } - public String getCreatedBy() - { - return createdBy; - } + public String getUserName() { return userName; } + public void setUserName(String userName) { this.userName = userName; } - public void setCreatedAt(String createdAt) - { - this.createdAt = createdAt; - } + public String getWarehouseName() { return warehouseName; } + public void setWarehouseName(String warehouseName) { this.warehouseName = warehouseName; } - public String getCreatedAt() - { - return createdAt; - } - - public void setUpdatedBy(String updatedBy) - { - this.updatedBy = updatedBy; - } - - public String getUpdatedBy() - { - return updatedBy; - } - - public void setUpdatedAt(String updatedAt) - { - this.updatedAt = updatedAt; - } - - public String getUpdatedAt() - { - return updatedAt; - } - - public void setIsDelete(String isDelete) - { - this.isDelete = isDelete; - } - - public String getIsDelete() - { - return isDelete; - } + public String getSceneName() { return sceneName; } + public void setSceneName(String sceneName) { this.sceneName = sceneName; } @Override public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("taskName", getTaskName()) - .append("warehouseId", getWarehouseId()) - .append("sceneId", getSceneId()) - .append("userId", getUserId()) - .append("requireTime", getRequireTime()) - .append("status", getStatus()) - .append("taskType", getTaskType()) - .append("remark", getRemark()) - .append("createdBy", getCreatedBy()) - .append("createdAt", getCreatedAt()) - .append("updatedBy", getUpdatedBy()) - .append("updatedAt", getUpdatedAt()) - .append("isDelete", getIsDelete()) - .toString(); + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("taskName", getTaskName()) + .append("warehouseId", getWarehouseId()) + .append("warehouseName", getWarehouseName()) + .append("sceneId", getSceneId()) + .append("sceneName", getSceneName()) + .append("userId", getUserId()) + .append("userName", getUserName()) + .append("requireTime", getRequireTime()) + .append("status", getStatus()) + .append("taskType", getTaskType()) + .append("remark", getRemark()) + .append("createdBy", getCreatedBy()) + .append("createdAt", getCreatedAt()) + .append("updatedBy", getUpdatedBy()) + .append("updatedAt", getUpdatedAt()) + .append("isDelete", getIsDelete()) + .toString(); } } diff --git a/src/main/java/com/zg/project/Inventory/domain/vo/RkInfoMatchVO.java b/src/main/java/com/zg/project/Inventory/domain/vo/RkInfoMatchVO.java new file mode 100644 index 0000000..9d04d9e --- /dev/null +++ b/src/main/java/com/zg/project/Inventory/domain/vo/RkInfoMatchVO.java @@ -0,0 +1,14 @@ +package com.zg.project.Inventory.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class RkInfoMatchVO { + + @ApiModelProperty("入库表中的pcode") + private String rkPcode; + + @ApiModelProperty("实际入库数量") + private Integer realQty; +} diff --git a/src/main/java/com/zg/project/information/domain/DeviceInfo.java b/src/main/java/com/zg/project/information/domain/DeviceInfo.java index a9819d7..3ee8495 100644 --- a/src/main/java/com/zg/project/information/domain/DeviceInfo.java +++ b/src/main/java/com/zg/project/information/domain/DeviceInfo.java @@ -7,12 +7,11 @@ import com.zg.framework.web.domain.BaseEntity; /** * 设备信息对象 device_info - * + * * @author zg * @date 2025-04-14 */ -public class DeviceInfo extends BaseEntity -{ +public class DeviceInfo extends BaseEntity { private static final long serialVersionUID = 1L; /** 设备ID */ @@ -27,75 +26,105 @@ public class DeviceInfo extends BaseEntity private Long port; /** 所属仓库ID */ - @Excel(name = "所属仓库ID") - private Long warehouseId; +// @Excel(name = "所属仓库ID") + private String warehouseId; + + /** 所属场景ID */ +// @Excel(name = "所属场景ID") + private String sceneId; + + /** 仓库名称(非数据库字段) */ + @Excel(name = "仓库名称") + private String warehouseName; + + /** 场景名称(非数据库字段) */ + @Excel(name = "场景名称") + private String sceneName; /** 是否删除(0否 1是) */ @Excel(name = "是否删除", readConverterExp = "0=否,1=是") private String isDelete; - public void setDeviceId(Long deviceId) - { + // Getter & Setter + public void setDeviceId(Long deviceId) { this.deviceId = deviceId; } - public Long getDeviceId() - { + public Long getDeviceId() { return deviceId; } - public void setIpAddress(String ipAddress) - { + public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; } - public String getIpAddress() - { + public String getIpAddress() { return ipAddress; } - public void setPort(Long port) - { + public void setPort(Long port) { this.port = port; } - public Long getPort() - { + public Long getPort() { return port; } - public void setWarehouseId(Long warehouseId) - { + public void setWarehouseId(String warehouseId) { this.warehouseId = warehouseId; } - public Long getWarehouseId() - { + public String getWarehouseId() { return warehouseId; } - public void setIsDelete(String isDelete) - { + public void setSceneId(String sceneId) { + this.sceneId = sceneId; + } + + public String getSceneId() { + return sceneId; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + + public String getSceneName() { + return sceneName; + } + + public void setIsDelete(String isDelete) { this.isDelete = isDelete; } - public String getIsDelete() - { + public String getIsDelete() { return isDelete; } @Override public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("deviceId", getDeviceId()) - .append("ipAddress", getIpAddress()) - .append("port", getPort()) - .append("warehouseId", getWarehouseId()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("isDelete", getIsDelete()) - .toString(); + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("deviceId", getDeviceId()) + .append("ipAddress", getIpAddress()) + .append("port", getPort()) + .append("warehouseId", getWarehouseId()) + .append("sceneId", getSceneId()) + .append("warehouseName", getWarehouseName()) + .append("sceneName", getSceneName()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("isDelete", getIsDelete()) + .toString(); } } diff --git a/src/main/java/com/zg/project/information/domain/PcdeDetail.java b/src/main/java/com/zg/project/information/domain/PcdeDetail.java index be09ff1..e207d93 100644 --- a/src/main/java/com/zg/project/information/domain/PcdeDetail.java +++ b/src/main/java/com/zg/project/information/domain/PcdeDetail.java @@ -22,7 +22,7 @@ public class PcdeDetail extends BaseEntity /** 库位编号 */ @Excel(name = "库位编号") - private String locationCode; + private String pcode; /** 所属场景 */ private String scene; @@ -74,14 +74,11 @@ public class PcdeDetail extends BaseEntity return id; } - public void setLocationCode(String locationCode) - { - this.locationCode = locationCode; + public String getPcode() { + return pcode; } - - public String getLocationCode() - { - return locationCode; + public void setPcode(String pcode) { + this.pcode = pcode; } public void setScene(String scene) @@ -198,7 +195,7 @@ public class PcdeDetail extends BaseEntity public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("id", getId()) - .append("locationCode", getLocationCode()) + .append("pcode", getPcode()) .append("scene", getScene()) .append("sceneName", getSceneName()) .append("warehouse", getWarehouse()) diff --git a/src/main/java/com/zg/project/information/service/impl/DeviceInfoServiceImpl.java b/src/main/java/com/zg/project/information/service/impl/DeviceInfoServiceImpl.java index b1c10eb..1dfec2a 100644 --- a/src/main/java/com/zg/project/information/service/impl/DeviceInfoServiceImpl.java +++ b/src/main/java/com/zg/project/information/service/impl/DeviceInfoServiceImpl.java @@ -2,6 +2,7 @@ package com.zg.project.information.service.impl; import java.util.List; import com.zg.common.utils.DateUtils; +import com.zg.common.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.zg.project.information.mapper.DeviceInfoMapper; @@ -53,10 +54,10 @@ public class DeviceInfoServiceImpl implements IDeviceInfoService @Override public int insertDeviceInfo(DeviceInfo deviceInfo) { + deviceInfo.setCreateBy(SecurityUtils.getUsername()); deviceInfo.setCreateTime(DateUtils.getNowDate()); return deviceInfoMapper.insertDeviceInfo(deviceInfo); } - /** * 修改设备信息 * diff --git a/src/main/java/com/zg/project/information/service/impl/PcdeDetailServiceImpl.java b/src/main/java/com/zg/project/information/service/impl/PcdeDetailServiceImpl.java index 82a9f58..2209d25 100644 --- a/src/main/java/com/zg/project/information/service/impl/PcdeDetailServiceImpl.java +++ b/src/main/java/com/zg/project/information/service/impl/PcdeDetailServiceImpl.java @@ -64,7 +64,7 @@ public class PcdeDetailServiceImpl implements IPcdeDetailService @Override public int insertPcdeDetail(PcdeDetail pcdeDetail) { // 原始 locationCode - String locationCode = pcdeDetail.getLocationCode(); + String locationCode = pcdeDetail.getPcode(); // 将 locationCode 转换为十六进制字符串 StringBuilder hex = new StringBuilder(); @@ -108,7 +108,7 @@ public class PcdeDetailServiceImpl implements IPcdeDetailService } // 获取库位编号 - String locationCode = pcdeDetail.getLocationCode(); + String locationCode = pcdeDetail.getPcode(); // 检查该库位是否仍有关联货物 int count = rkInfoMapper.countRkInfoByLocationCode(locationCode); @@ -137,7 +137,7 @@ public class PcdeDetailServiceImpl implements IPcdeDetailService } // 获取库位编号 - String locationCode = pcdeDetail.getLocationCode(); + String locationCode = pcdeDetail.getPcode(); // 查询该库位上是否存在库存 int count = rkInfoMapper.countRkInfoByLocationCode(locationCode); @@ -161,7 +161,7 @@ public class PcdeDetailServiceImpl implements IPcdeDetailService for (PcdeDetail detail : pcdeList) { try { - PcdeDetail exist = pcdeDetailMapper.selectByLocationCode(detail.getLocationCode()); + PcdeDetail exist = pcdeDetailMapper.selectByLocationCode(detail.getPcode()); if (exist == null) { detail.setCreateBy(operName); detail.setCreateTime(DateUtils.getNowDate()); @@ -169,11 +169,11 @@ public class PcdeDetailServiceImpl implements IPcdeDetailService successNum++; } else { failureNum++; - failureMsg.append("
库位编号 ").append(detail.getLocationCode()).append(" 已存在"); + failureMsg.append("
库位编号 ").append(detail.getPcode()).append(" 已存在"); } } catch (Exception e) { failureNum++; - failureMsg.append("
库位编号 ").append(detail.getLocationCode()).append(" 导入失败:").append(e.getMessage()); + failureMsg.append("
库位编号 ").append(detail.getPcode()).append(" 导入失败:").append(e.getMessage()); } } @@ -198,7 +198,7 @@ public class PcdeDetailServiceImpl implements IPcdeDetailService // 过滤掉已使用的 List availableList = pcdeList.stream() - .filter(p -> !usedPcodeList.contains(p.getLocationCode())) + .filter(p -> !usedPcodeList.contains(p.getPcode())) .collect(Collectors.toList()); return availableList; diff --git a/src/main/java/com/zg/project/wisdom/controller/AgvTaskResultController.java b/src/main/java/com/zg/project/wisdom/controller/AgvTaskResultController.java new file mode 100644 index 0000000..2b805dc --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/controller/AgvTaskResultController.java @@ -0,0 +1,85 @@ +package com.zg.project.wisdom.controller; + +import com.zg.framework.web.controller.BaseController; +import com.zg.framework.web.domain.AjaxResult; +import com.zg.framework.web.page.TableDataInfo; +import com.zg.project.wisdom.domain.AgvTaskResult; +import com.zg.project.wisdom.domain.dto.AgvDTO; +import com.zg.project.wisdom.service.IAgvTaskResultService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/wisdom/agv") +public class AgvTaskResultController extends BaseController { + + @Autowired + private IAgvTaskResultService agvTaskResultService; + + /** + * 查询AGV任务结果列表(分页) + */ + @GetMapping("/list") + public TableDataInfo list(AgvTaskResult agvTaskResult) { + startPage(); + List list = agvTaskResultService.selectAgvTaskResultList(agvTaskResult); + return getDataTable(list); + } + + /** + * 根据ID查询单个AGV任务结果 + */ + @GetMapping("/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(agvTaskResultService.selectAgvTaskResultById(id)); + } + + /** + * 新增AGV任务执行结果 + */ + @PostMapping + public AjaxResult add(@RequestBody AgvTaskResult agvTaskResult) { + return toAjax(agvTaskResultService.insertAgvTaskResult(agvTaskResult)); + } + + /** + * 修改AGV任务执行结果 + */ + @PutMapping + public AjaxResult edit(@RequestBody AgvTaskResult agvTaskResult) { + return toAjax(agvTaskResultService.updateAgvTaskResult(agvTaskResult)); + } + + /** + * 批量删除AGV任务执行结果 + */ + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(agvTaskResultService.deleteAgvTaskResultByIds(ids)); + } + + /** + * AGV任务执行结果回调 + */ + @PostMapping("/callback") + public AjaxResult receiveCallback(@RequestBody AgvDTO dto) { + agvTaskResultService.handleAgvCallback(dto); + return AjaxResult.success("AGV回调接收成功"); + } + + /** + * 检查AGV任务执行结果状态 + */ + @PostMapping("/checkStatus") + public AjaxResult checkAgvTaskStatus(@RequestBody AgvDTO dto) { + boolean exists = agvTaskResultService.existsByRequestIdAndStatus(dto.getRequestId(), dto.getStatus()); + if (exists) { + return AjaxResult.success("已达到指定状态:" + dto.getStatus()); + } else { + return AjaxResult.error("未达到指定状态:" + dto.getStatus()); + } + } +} diff --git a/src/main/java/com/zg/project/wisdom/controller/DdTaskController.java b/src/main/java/com/zg/project/wisdom/controller/DdTaskController.java new file mode 100644 index 0000000..263787d --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/controller/DdTaskController.java @@ -0,0 +1,104 @@ +package com.zg.project.wisdom.controller; + +import java.util.List; + +import com.zg.common.utils.poi.ExcelUtil; +import com.zg.framework.aspectj.lang.annotation.Log; +import com.zg.framework.aspectj.lang.enums.BusinessType; +import com.zg.framework.web.controller.BaseController; +import com.zg.framework.web.domain.AjaxResult; +import com.zg.framework.web.page.TableDataInfo; +import com.zg.project.wisdom.domain.DdTask; +import com.zg.project.wisdom.domain.vo.TaskExecuteResultVO; +import com.zg.project.wisdom.service.IDdTaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.security.access.prepost.PreAuthorize; + +/** + * 调度任务 Controller + * + * @author zg + */ +@RestController +@RequestMapping("/wisdom/task") +public class DdTaskController extends BaseController { + + @Autowired + private IDdTaskService ddTaskService; + + /** + * 查询调度任务列表 + */ +// @PreAuthorize("@ss.hasPermi('wisdom:task:list')") + @GetMapping("/list") + public TableDataInfo list(DdTask ddTask) { + startPage(); + List list = ddTaskService.selectDdTaskList(ddTask); + return getDataTable(list); + } + + /** + * 导出调度任务列表 + */ +// @PreAuthorize("@ss.hasPermi('wisdom:task:export')") + @Log(title = "调度任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public AjaxResult export(DdTask ddTask) { + List list = ddTaskService.selectDdTaskList(ddTask); + ExcelUtil util = new ExcelUtil<>(DdTask.class); + return util.exportExcel(list, "调度任务数据"); + } + + /** + * 获取调度任务详情 + */ +// @PreAuthorize("@ss.hasPermi('wisdom:task:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(ddTaskService.selectDdTaskById(id)); + } + + /** + * 新增调度任务 + */ +// @PreAuthorize("@ss.hasPermi('wisdom:task:add')") + @Log(title = "调度任务", businessType = BusinessType.INSERT) + @PostMapping("/add") + public AjaxResult add(@RequestBody DdTask ddTask) { + return toAjax(ddTaskService.insertDdTask(ddTask)); + } + + /** + * 修改调度任务 + */ +// @PreAuthorize("@ss.hasPermi('wisdom:task:edit')") + @Log(title = "调度任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DdTask ddTask) { + return toAjax(ddTaskService.updateDdTask(ddTask)); + } + + /** + * 删除调度任务 + */ +// @PreAuthorize("@ss.hasPermi('wisdom:task:remove')") + @Log(title = "调度任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(ddTaskService.deleteDdTaskByIds(ids)); + } + + /** + * 执行任务 + * @param + * @return + */ + @PreAuthorize("@ss.hasPermi('wisdom:task:execute')") + @PostMapping("/execute") + public AjaxResult execute(@RequestParam Long id) { + TaskExecuteResultVO vo = ddTaskService.executeTask(id); + return AjaxResult.success(vo); + } + +} diff --git a/src/main/java/com/zg/project/wisdom/controller/MoveRecordController.java b/src/main/java/com/zg/project/wisdom/controller/MoveRecordController.java new file mode 100644 index 0000000..cda6288 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/controller/MoveRecordController.java @@ -0,0 +1,103 @@ +package com.zg.project.wisdom.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zg.framework.aspectj.lang.annotation.Log; +import com.zg.framework.aspectj.lang.enums.BusinessType; +import com.zg.common.utils.poi.ExcelUtil; +import com.zg.framework.web.controller.BaseController; +import com.zg.framework.web.domain.AjaxResult; +import com.zg.framework.web.page.TableDataInfo; + +import com.zg.project.wisdom.domain.MoveRecord; +import com.zg.project.wisdom.domain.dto.MoveRequestDTO; +import com.zg.project.wisdom.service.IMoveRecordService; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +/** + * 移库记录Controller + * + * @author zg + * @date 2025-06-20 + */ +@RestController +@RequestMapping("/inventory/move") +public class MoveRecordController extends BaseController +{ + @Autowired + private IMoveRecordService moveRecordService; + + + /** + * 新增移库记录 + */ + @PreAuthorize("@ss.hasPermi('inventory:move:add')") + @Log(title = "移库记录", businessType = BusinessType.INSERT) + @PostMapping("/add") + public AjaxResult processMove(@RequestBody MoveRequestDTO dto) { + moveRecordService.processMove(dto); + return AjaxResult.success("移库成功"); + } + + + /** + * 查询移库记录列表 + */ + @PreAuthorize("@ss.hasPermi('inventory:move:list')") + @GetMapping("/list") + public TableDataInfo list(MoveRecord moveRecord) + { + startPage(); + List list = moveRecordService.selectMoveRecordList(moveRecord); + return getDataTable(list); + } + + /** + * 导出移库记录列表 + */ + @PreAuthorize("@ss.hasPermi('inventory:move:export')") + @Log(title = "移库记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, MoveRecord moveRecord) + { + List list = moveRecordService.selectMoveRecordList(moveRecord); + ExcelUtil util = new ExcelUtil<>(MoveRecord.class); + util.exportExcel(response, list, "移库记录数据"); + } + + /** + * 获取移库记录详细信息 + */ + @PreAuthorize("@ss.hasPermi('inventory:move:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(moveRecordService.selectMoveRecordById(id)); + } + + /** + * 修改移库记录 + */ + @PreAuthorize("@ss.hasPermi('inventory:move:edit')") + @Log(title = "移库记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody MoveRecord moveRecord) + { + return toAjax(moveRecordService.updateMoveRecord(moveRecord)); + } + + /** + * 删除移库记录 + */ + @PreAuthorize("@ss.hasPermi('inventory:move:remove')") + @Log(title = "移库记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(moveRecordService.deleteMoveRecordByIds(ids)); + } +} diff --git a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java index 6184ebd..5b172e9 100644 --- a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java +++ b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java @@ -6,6 +6,7 @@ import java.util.Map; import javax.servlet.http.HttpServletResponse; import com.zg.project.wisdom.domain.dto.PcRkInfoBatchDTO; +import com.zg.project.wisdom.domain.dto.RefundRequestDTO; import com.zg.project.wisdom.domain.dto.RkInfoBatchDTO; import com.zg.project.wisdom.domain.dto.StockOutDTO; import com.zg.project.wisdom.service.IGysJhService; @@ -45,7 +46,6 @@ public class RkInfoController extends BaseController * 查询库存单据主列表 */ @PreAuthorize("@ss.hasPermi('wisdom:stock:list')") -// @GetMapping("/details/list") @GetMapping("/list") public TableDataInfo list(RkInfo rkInfo) { @@ -154,4 +154,16 @@ public class RkInfoController extends BaseController public AjaxResult doOutStock(@RequestBody StockOutDTO dto) { return toAjax(rkInfoService.batchOutStock(dto)); } + + /** + * 还料入库 + * @param + * @return + */ + @Log(title = "还料入库", businessType = BusinessType.INSERT) + @PreAuthorize("@ss.hasPermi('wisdom:outbound:add')") + @PostMapping("/refund") + public AjaxResult refundMaterial(@RequestBody RefundRequestDTO dto) { + return toAjax(rkInfoService.refundMaterial(dto)); + } } diff --git a/src/main/java/com/zg/project/wisdom/domain/AgvTaskResult.java b/src/main/java/com/zg/project/wisdom/domain/AgvTaskResult.java new file mode 100644 index 0000000..37ea049 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/AgvTaskResult.java @@ -0,0 +1,224 @@ +package com.zg.project.wisdom.domain; + +import com.zg.framework.aspectj.lang.annotation.Excel; +import com.zg.framework.web.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * AGV任务执行结果实体类 + * + * 表名:agv_task_result + * 用于记录AGV回调的执行结果 + * + * @author zg + */ +public class AgvTaskResult extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 请求ID(唯一标识任务请求) */ + @Excel(name = "请求ID") + private String requestId; + + /** 任务编号(可关联调度任务) */ + @Excel(name = "任务编号") + private String taskNo; + + /** 任务ID(AGV侧) */ + @Excel(name = "任务ID") + private String jobId; + + /** 所属系统 */ + @Excel(name = "所属系统") + private String owner; + + /** 任务类型 */ + @Excel(name = "任务类型") + private String type; + + /** 优先级 */ + @Excel(name = "优先级") + private String priority; + + /** 起点位置 */ + @Excel(name = "起点位置") + private String sourceName; + + /** 终点位置 */ + @Excel(name = "终点位置") + private String targetName; + + /** AGV任务创建时间 */ + @Excel(name = "AGV创建时间") + private String createdAt; + + /** AGV任务更新时间 */ + @Excel(name = "AGV更新时间") + private String updatedAt; + + /** 执行状态(如END_ARRIVE等) */ + /** + * 执行状态(AGV任务阶段): + * CREATED - 创建任务; + * ALLOCATED - 分配资源; + * WAITING_PICK_UP - 等待取货; + * PICK_UP_COMPLETED - 取货完成; + * WAITING_TAKE_DOWN - 等待卸货; + * END_ARRIVE - 到达终点; + * TAKE_DOWN_COMPLETED - 卸货完成; + * FINISHED - 任务完成; + * FAILURE - 执行失败; + * PROCESSING - 任务执行中。 + */ + @Excel(name = "执行状态") + private String status; + + /** 执行信息说明 */ + @Excel(name = "执行信息") + private String msg; + + /** 是否删除(0正常 1删除) */ + private String isDelete; + + // getter/setter + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getTaskNo() { + return taskNo; + } + + public void setTaskNo(String taskNo) { + this.taskNo = taskNo; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public String getSourceName() { + return sourceName; + } + + public void setSourceName(String sourceName) { + this.sourceName = sourceName; + } + + public String getTargetName() { + return targetName; + } + + public void setTargetName(String targetName) { + this.targetName = targetName; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getIsDelete() { + return isDelete; + } + + public void setIsDelete(String isDelete) { + this.isDelete = isDelete; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("requestId", getRequestId()) + .append("taskNo", getTaskNo()) + .append("jobId", getJobId()) + .append("owner", getOwner()) + .append("type", getType()) + .append("priority", getPriority()) + .append("sourceName", getSourceName()) + .append("targetName", getTargetName()) + .append("createdAt", getCreatedAt()) + .append("updatedAt", getUpdatedAt()) + .append("status", getStatus()) + .append("msg", getMsg()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("isDelete", getIsDelete()) + .toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/zg/project/wisdom/domain/DdTask.java b/src/main/java/com/zg/project/wisdom/domain/DdTask.java new file mode 100644 index 0000000..2e68ee9 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/DdTask.java @@ -0,0 +1,166 @@ +package com.zg.project.wisdom.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.zg.framework.web.domain.BaseEntity; +import com.zg.framework.aspectj.lang.annotation.Excel; +import java.util.Date; + +/** + * 调度任务实体类 + * + * @author zg + */ +public class DdTask extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 任务编号 */ + @Excel(name = "任务编号") + private String taskNo; + + /** 任务详情 */ + @Excel(name = "任务详情") + private String taskDtl; + + /** 任务类型(0入库,1出库,2移库) */ + @Excel(name = "任务类型") + private String taskType; + + /** 任务状态(0待建,1完成,-1取消) */ + @Excel(name = "任务状态") + private Integer taskStatus; + + /** 物料状态(0空托,1有货) */ + @Excel(name = "物料状态") + private Integer midStatus; + + /** 物料编码 */ + @Excel(name = "物料编码") + private String mid; + + /** 物料数量 */ + @Excel(name = "物料数量") + private Integer num; + + /** 物资状态(合格品/不合格品/样品等) */ + @Excel(name = "物资状态") + private String midType; + + /** 起始位置 */ + @Excel(name = "起始位置") + private String sourceName; + + /** 目标位置 */ + @Excel(name = "目标位置") + private String targetName; + + /** 操作员 */ + @Excel(name = "操作员") + private String operator; + + /** 审核员 */ + @Excel(name = "审核员") + private String approver; + + /** 单据创建时间(原始单据时间) */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "单据创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date rcptim; + + /** 绑定单据ID */ + @Excel(name = "rcp id") + private String rid; + + /** 执行次数 */ + @Excel(name = "执行次数") + private Integer doCount; + + /** 封签码或订单号 */ + @Excel(name = "封签码/订单号") + private String prf; + + /** 是否删除(0正常 1删除) */ + private String isDelete; + + // getter/setter + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public String getTaskNo() { return taskNo; } + public void setTaskNo(String taskNo) { this.taskNo = taskNo; } + + public String getTaskDtl() { return taskDtl; } + public void setTaskDtl(String taskDtl) { this.taskDtl = taskDtl; } + + public String getTaskType() { return taskType; } + public void setTaskType(String taskType) { this.taskType = taskType; } + + public Integer getTaskStatus() { return taskStatus; } + public void setTaskStatus(Integer taskStatus) { this.taskStatus = taskStatus; } + + public Integer getMidStatus() { return midStatus; } + public void setMidStatus(Integer midStatus) { this.midStatus = midStatus; } + + public String getMid() { return mid; } + public void setMid(String mid) { this.mid = mid; } + + public Integer getNum() { return num; } + public void setNum(Integer num) { this.num = num; } + + public String getMidType() { return midType; } + public void setMidType(String midType) { this.midType = midType; } + + public String getSourceName() { return sourceName; } + public void setSourceName(String sourceName) { this.sourceName = sourceName; } + + public String getTargetName() { return targetName; } + public void setTargetName(String targetName) { this.targetName = targetName; } + + public String getOperator() { return operator; } + public void setOperator(String operator) { this.operator = operator; } + + public String getApprover() { return approver; } + public void setApprover(String approver) { this.approver = approver; } + + public Date getRcptim() { return rcptim; } + public void setRcptim(Date rcptim) { this.rcptim = rcptim; } + + public String getRid() { return rid; } + public void setRid(String rid) { this.rid = rid; } + + public Integer getDoCount() { return doCount; } + public void setDoCount(Integer doCount) { this.doCount = doCount; } + + public String getPrf() { return prf; } + public void setPrf(String prf) { this.prf = prf; } + + public String getIsDelete() { return isDelete; } + public void setIsDelete(String isDelete) { this.isDelete = isDelete; } + + @Override + public String toString() { + return "DdTask{" + + "id=" + id + + ", taskNo='" + taskNo + '\'' + + ", taskDtl='" + taskDtl + '\'' + + ", taskType='" + taskType + '\'' + + ", taskStatus=" + taskStatus + + ", midStatus=" + midStatus + + ", mid='" + mid + '\'' + + ", num=" + num + + ", midType='" + midType + '\'' + + ", sourceName='" + sourceName + '\'' + + ", targetName='" + targetName + '\'' + + ", operator='" + operator + '\'' + + ", approver='" + approver + '\'' + + ", rcptim=" + rcptim + + ", rid='" + rid + '\'' + + ", doCount=" + doCount + + ", prf='" + prf + '\'' + + ", isDelete='" + isDelete + '\'' + + '}'; + } +} diff --git a/src/main/java/com/zg/project/wisdom/domain/MoveRecord.java b/src/main/java/com/zg/project/wisdom/domain/MoveRecord.java new file mode 100644 index 0000000..6fec24a --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/MoveRecord.java @@ -0,0 +1,191 @@ +package com.zg.project.wisdom.domain; + +import com.zg.framework.web.domain.BaseEntity; +import com.zg.framework.aspectj.lang.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; + +/** + * 移库记录对象 move_record + * + * @author zg + * @date 2025-06-20 + */ +public class MoveRecord extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 关联的库存单据ID */ + @Excel(name = "库存单据ID") + private Long rkId; + + /** 实物ID */ + @Excel(name = "实物ID") + private String entityId; + + /** 原仓库 */ + @Excel(name = "原仓库") + private String fromCangku; + + /** 原库位码 */ + @Excel(name = "原库位码") + private String fromPcode; + + /** 原托盘码 */ + @Excel(name = "原托盘码") + private String fromTrayCode; + + /** 目标仓库 */ + @Excel(name = "目标仓库") + private String toCangku; + + /** 目标库位码 */ + @Excel(name = "目标库位码") + private String toPcode; + + /** 目标托盘码 */ + @Excel(name = "目标托盘码") + private String toTrayCode; + + /** 移库原因 */ + @Excel(name = "移库原因") + private String moveReason; + + /** 操作人 */ + private String movedBy; + + @Excel(name = "操作人名称") + private String movedByName; + + /** 操作时间(移库时间) */ + @Excel(name = "操作时间", dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date movedAt; + + /** 是否删除(0正常 1删除) */ + @Excel(name = "是否删除", readConverterExp = "0=正常,1=删除") + private String isDelete; + + /** 原仓库名称 */ + @Excel(name = "原仓库名称") + private String fromCangkuName; + + /** 目标仓库名称 */ + @Excel(name = "目标仓库名称") + private String toCangkuName; + + /** 项目号 */ + @Excel(name = "项目号") + private String xmNo; + + /** 项目描述 */ + @Excel(name = "项目描述") + private String xmMs; + + /** 物料描述 */ + @Excel(name = "物料描述") + private String wlMs; + + /** 供应商名称 */ + @Excel(name = "供应商名称") + private String gysMc; + + // Getters and Setters + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public Long getRkId() { return rkId; } + public void setRkId(Long rkId) { this.rkId = rkId; } + + public String getEntityId() { return entityId; } + public void setEntityId(String entityId) { this.entityId = entityId; } + + public String getFromCangku() { return fromCangku; } + public void setFromCangku(String fromCangku) { this.fromCangku = fromCangku; } + + public String getFromPcode() { return fromPcode; } + public void setFromPcode(String fromPcode) { this.fromPcode = fromPcode; } + + public String getFromTrayCode() { return fromTrayCode; } + public void setFromTrayCode(String fromTrayCode) { this.fromTrayCode = fromTrayCode; } + + public String getToCangku() { return toCangku; } + public void setToCangku(String toCangku) { this.toCangku = toCangku; } + + public String getToPcode() { return toPcode; } + public void setToPcode(String toPcode) { this.toPcode = toPcode; } + + public String getToTrayCode() { return toTrayCode; } + public void setToTrayCode(String toTrayCode) { this.toTrayCode = toTrayCode; } + + public String getMoveReason() { return moveReason; } + public void setMoveReason(String moveReason) { this.moveReason = moveReason; } + + public String getMovedBy() { return movedBy; } + public void setMovedBy(String movedBy) { this.movedBy = movedBy; } + public String getMovedByName() { + return movedByName; + } + public void setMovedByName(String movedByName) { + this.movedByName = movedByName; + } + + public Date getMovedAt() { return movedAt; } + public void setMovedAt(Date movedAt) { this.movedAt = movedAt; } + + public String getIsDelete() { return isDelete; } + public void setIsDelete(String isDelete) { this.isDelete = isDelete; } + + public String getFromCangkuName() { return fromCangkuName; } + public void setFromCangkuName(String fromCangkuName) { this.fromCangkuName = fromCangkuName; } + + public String getToCangkuName() { return toCangkuName; } + public void setToCangkuName(String toCangkuName) { this.toCangkuName = toCangkuName; } + + public String getXmNo() { return xmNo; } + public void setXmNo(String xmNo) { this.xmNo = xmNo; } + + public String getXmMs() { return xmMs; } + public void setXmMs(String xmMs) { this.xmMs = xmMs; } + + public String getWlMs() { return wlMs; } + public void setWlMs(String wlMs) { this.wlMs = wlMs; } + + public String getGysMc() { return gysMc; } + public void setGysMc(String gysMc) { this.gysMc = gysMc; } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("rkId", getRkId()) + .append("entityId", getEntityId()) + .append("fromCangku", getFromCangku()) + .append("fromPcode", getFromPcode()) + .append("fromTrayCode", getFromTrayCode()) + .append("toCangku", getToCangku()) + .append("toPcode", getToPcode()) + .append("toTrayCode", getToTrayCode()) + .append("moveReason", getMoveReason()) + .append("movedBy", getMovedBy()) + .append("movedByName", getMovedByName()) + .append("movedAt", getMovedAt()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("isDelete", getIsDelete()) + .append("fromCangkuName", getFromCangkuName()) + .append("toCangkuName", getToCangkuName()) + .append("xmNo", getXmNo()) + .append("xmMs", getXmMs()) + .append("wlMs", getWlMs()) + .append("gysMc", getGysMc()) + .toString(); + } +} diff --git a/src/main/java/com/zg/project/wisdom/domain/RkInfo.java b/src/main/java/com/zg/project/wisdom/domain/RkInfo.java index 95e0c4f..f4304da 100644 --- a/src/main/java/com/zg/project/wisdom/domain/RkInfo.java +++ b/src/main/java/com/zg/project/wisdom/domain/RkInfo.java @@ -2,6 +2,8 @@ package com.zg.project.wisdom.domain; import java.math.BigDecimal; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -10,7 +12,7 @@ import com.zg.framework.web.domain.BaseEntity; /** * 库存单据主对象 rk_info - * + * * @author zg * @date 2025-05-28 */ @@ -28,15 +30,12 @@ public class RkInfo extends BaseEntity private Long stockAge; /** 入库类型 */ -// @Excel(name = "入库类型") private String rkType; /** 物资类型 */ -// @Excel(name = "物资类型") private String wlType; /** 所属仓库 */ -// @Excel(name = "所属仓库") private String cangku; /** 入库类型名称(联查显示用,导出专用) */ @@ -55,6 +54,16 @@ public class RkInfo extends BaseEntity @Excel(name = "入库时间", dateFormat = "yyyy-MM-dd HH:mm:ss") private Date rkTime; + /** 借用时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "借用时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date borrowTime; + + /** 归还时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "归还时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date returnTime; + /** 理货员 */ @Excel(name = "理货员") private String lihuoY; @@ -76,13 +85,19 @@ public class RkInfo extends BaseEntity private String xj; /** 项目号 */ - @Excel(name = "项目号") + @Excel(name = "库存项目号") private String xmNo; /** 项目描述 */ - @Excel(name = "项目描述") + @Excel(name = "库存项目描述") private String xmMs; + @Excel(name = "领取方项目号") + private String xmNoCk; + + @Excel(name = "领取方项目描述") + private String xmMsCk; + /** 物料号 */ @Excel(name = "物料号") private String wlNo; @@ -129,7 +144,7 @@ public class RkInfo extends BaseEntity /** 实际入库数量 */ @Excel(name = "实际入库数量") - private Long realQty; + private BigDecimal realQty; /** 库位码 */ @Excel(name = "库位码") @@ -150,449 +165,238 @@ public class RkInfo extends BaseEntity @Excel(name = "出库理货员") private String ckLihuoY; -// @Excel(name = "出库类型编号") private String ckType; @Excel(name = "出库类型名称") private String ckTypeName; -// @Excel(name = "施工队编号") private String teamCode; @Excel(name = "施工队名称") private String teamName; -// 出库时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Excel(name = "领用时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date lyTime; @Excel(name = "出库备注") private String ckRemark; + + @TableField(exist = false) + private String status; + + /** 是否移库过(0否 1是) */ + @Excel(name = "是否移库过") + private String hasMoved; + + /** 是否借料(0否 1是) */ + @Excel(name = "是否借料", readConverterExp = "0=否,1=是") + private String isBorrowed; + + /** 入库开始时间 */ + private Date startTime; + + /** 入库结束时间*/ + private Date endTime; + /** 是否删除(0 表示正常,1 表示已删除) */ -// @Excel(name = "是否删除", readConverterExp = "0=,表=示正常,1,表=示已删除") private String isDelete; - public String getKeyword() { - return keyword; - } - - public void setKeyword(String keyword) { - this.keyword = keyword; - } - - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - - public void setRkType(String rkType) - { - this.rkType = rkType; - } - - public String getRkType() - { - return rkType; - } - - public Long getStockAge() { - return stockAge; - } - - public void setStockAge(Long stockAge) { - this.stockAge = stockAge; - } - - public void setWlType(String wlType) - { - this.wlType = wlType; - } - - public String getWlType() - { - return wlType; - } - - public void setCangku(String cangku) - { - this.cangku = cangku; - } - - public String getCangku() - { - return cangku; - } - - public String getRkTypeName() { - return rkTypeName; - } - public void setRkTypeName(String rkTypeName) { - this.rkTypeName = rkTypeName; - } - - public String getWlTypeName() { - return wlTypeName; - } - public void setWlTypeName(String wlTypeName) { - this.wlTypeName = wlTypeName; - } - - public String getCangkuName() { - return cangkuName; - } - public void setCangkuName(String cangkuName) { - this.cangkuName = cangkuName; - } - - public void setRkTime(Date rkTime) - { - this.rkTime = rkTime; - } - - public Date getRkTime() - { - return rkTime; - } - - public void setLihuoY(String lihuoY) - { - this.lihuoY = lihuoY; - } - - public String getLihuoY() - { - return lihuoY; - } - - public void setIsChuku(String isChuku) - { - this.isChuku = isChuku; - } - - public String getIsChuku() - { - return isChuku; - } - - public String getBillNo() { - return billNo; - } - - public String getBillNoCk() { - return billNoCk; - } - - public void setBillNoCk(String billNoCk) { - this.billNoCk = billNoCk; - } - - public void setBillNo(String billNo) { - this.billNo = billNo; - } - - public void setXj(String xj) - { - this.xj = xj; - } - - public String getXj() - { - return xj; - } - - public void setXmNo(String xmNo) - { - this.xmNo = xmNo; - } - - public String getXmNo() - { - return xmNo; - } - - public void setXmMs(String xmMs) - { - this.xmMs = xmMs; - } - - public String getXmMs() - { - return xmMs; - } - - public void setWlNo(String wlNo) - { - this.wlNo = wlNo; - } - - public String getWlNo() - { - return wlNo; - } - - public void setWlMs(String wlMs) - { - this.wlMs = wlMs; - } - - public String getWlMs() - { - return wlMs; - } - - public void setGysNo(String gysNo) - { - this.gysNo = gysNo; - } - - public String getGysNo() - { - return gysNo; - } - - public void setGysMc(String gysMc) - { - this.gysMc = gysMc; - } - - public String getGysMc() - { - return gysMc; - } - - public void setJhAmt(BigDecimal jhAmt) - { - this.jhAmt = jhAmt; - } - - public BigDecimal getJhAmt() - { - return jhAmt; - } - - public void setHtDj(BigDecimal htDj) - { - this.htDj = htDj; - } - - public BigDecimal getHtDj() - { - return htDj; - } - - public void setSapNo(String sapNo) - { - this.sapNo = sapNo; - } - - public String getSapNo() - { - return sapNo; - } - - public void setXh(String xh) - { - this.xh = xh; - } - - public String getXh() - { - return xh; - } - - public void setJhQty(Long jhQty) - { - this.jhQty = jhQty; - } - - public Long getJhQty() - { - return jhQty; - } - - public void setHtQty(Long htQty) - { - this.htQty = htQty; - } - - public Long getHtQty() - { - return htQty; - } - - public void setDw(String dw) - { - this.dw = dw; - } - - public String getDw() - { - return dw; - } - - public void setRealQty(Long realQty) - { - this.realQty = realQty; - } - - public Long getRealQty() - { - return realQty; - } - - public void setPcode(String pcode) - { - this.pcode = pcode; - } - - public String getPcode() - { - return pcode; - } - - public void setPcodeId(String pcodeId) { - this.pcodeId = pcodeId; - } - - public String getPcodeId() { - return pcodeId; - } - - public void setTrayCode(String trayCode) - { - this.trayCode = trayCode; - } - - public String getTrayCode() - { - return trayCode; - } - - public void setEntityId(String entityId) - { - this.entityId = entityId; - } - - public String getEntityId() - { - return entityId; - } - - public String getCkLihuoY() { - return ckLihuoY; - } - - public void setCkLihuoY(String ckLihuoY) { - this.ckLihuoY = ckLihuoY; - } - - public String getCkType() { - return ckType; - } - - public void setCkType(String ckType) { - this.ckType = ckType; - } - - public String getCkTypeName() { - return ckTypeName; - } - - public void setCkTypeName(String ckTypeName) { - this.ckTypeName = ckTypeName; - } - - public String getTeamCode() { - return teamCode; - } - - public void setTeamCode(String teamCode) { - this.teamCode = teamCode; - } - - public String getTeamName() { - return teamName; - } - - public void setTeamName(String teamName) { - this.teamName = teamName; - } - - public String getCkRemark() { - return ckRemark; - } - - public void setCkRemark(String ckRemark) { - this.ckRemark = ckRemark; - } - - public Date getLyTime() { - return lyTime; - } - - public void setLyTime(Date lyTime) { - this.lyTime = lyTime; - } - - public void setIsDelete(String isDelete) - { - this.isDelete = isDelete; - } - - public String getIsDelete() - { - return isDelete; - } + // Getter 和 Setter 方法 + public String getKeyword() { return keyword; } + public void setKeyword(String keyword) { this.keyword = keyword; } + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public Long getStockAge() { return stockAge; } + public void setStockAge(Long stockAge) { this.stockAge = stockAge; } + public String getRkType() { return rkType; } + public void setRkType(String rkType) { this.rkType = rkType; } + public String getWlType() { return wlType; } + public void setWlType(String wlType) { this.wlType = wlType; } + public String getCangku() { return cangku; } + public void setCangku(String cangku) { this.cangku = cangku; } + public String getRkTypeName() { return rkTypeName; } + public void setRkTypeName(String rkTypeName) { this.rkTypeName = rkTypeName; } + public String getWlTypeName() { return wlTypeName; } + public void setWlTypeName(String wlTypeName) { this.wlTypeName = wlTypeName; } + public String getCangkuName() { return cangkuName; } + public void setCangkuName(String cangkuName) { this.cangkuName = cangkuName; } + public Date getRkTime() { return rkTime; } + public void setRkTime(Date rkTime) { this.rkTime = rkTime; } + public Date getBorrowTime() { + return borrowTime; + } + public void setBorrowTime(Date borrowTime) { + this.borrowTime = borrowTime; + } + + public Date getReturnTime() { + return returnTime; + } + public void setReturnTime(Date returnTime) { + this.returnTime = returnTime; + } + + public String getLihuoY() { return lihuoY; } + public void setLihuoY(String lihuoY) { this.lihuoY = lihuoY; } + public String getIsChuku() { return isChuku; } + public void setIsChuku(String isChuku) { this.isChuku = isChuku; } + public String getBillNo() { return billNo; } + public void setBillNo(String billNo) { this.billNo = billNo; } + public String getBillNoCk() { return billNoCk; } + public void setBillNoCk(String billNoCk) { this.billNoCk = billNoCk; } + public String getXj() { return xj; } + public void setXj(String xj) { this.xj = xj; } + public String getXmNo() { return xmNo; } + public void setXmNo(String xmNo) { this.xmNo = xmNo; } + public String getXmMs() { return xmMs; } + public void setXmMs(String xmMs) { this.xmMs = xmMs; } + public String getWlNo() { return wlNo; } + public void setWlNo(String wlNo) { this.wlNo = wlNo; } + public String getWlMs() { return wlMs; } + public void setWlMs(String wlMs) { this.wlMs = wlMs; } + public String getGysNo() { return gysNo; } + public void setGysNo(String gysNo) { this.gysNo = gysNo; } + public String getGysMc() { return gysMc; } + public void setGysMc(String gysMc) { this.gysMc = gysMc; } + public BigDecimal getJhAmt() { return jhAmt; } + public void setJhAmt(BigDecimal jhAmt) { this.jhAmt = jhAmt; } + public BigDecimal getHtDj() { return htDj; } + public void setHtDj(BigDecimal htDj) { this.htDj = htDj; } + public String getSapNo() { return sapNo; } + public void setSapNo(String sapNo) { this.sapNo = sapNo; } + public String getXh() { return xh; } + public void setXh(String xh) { this.xh = xh; } + public Long getJhQty() { return jhQty; } + public void setJhQty(Long jhQty) { this.jhQty = jhQty; } + public Long getHtQty() { return htQty; } + public void setHtQty(Long htQty) { this.htQty = htQty; } + public String getDw() { return dw; } + public void setDw(String dw) { this.dw = dw; } + public BigDecimal getRealQty() { return realQty; } + public void setRealQty(BigDecimal realQty) { this.realQty = realQty; } + public String getPcode() { return pcode; } + public void setPcode(String pcode) { this.pcode = pcode; } + public String getPcodeId() { return pcodeId; } + public void setPcodeId(String pcodeId) { this.pcodeId = pcodeId; } + public String getTrayCode() { return trayCode; } + public void setTrayCode(String trayCode) { this.trayCode = trayCode; } + public String getEntityId() { return entityId; } + public void setEntityId(String entityId) { this.entityId = entityId; } + public String getCkLihuoY() { return ckLihuoY; } + public void setCkLihuoY(String ckLihuoY) { this.ckLihuoY = ckLihuoY; } + public String getCkType() { return ckType; } + public void setCkType(String ckType) { this.ckType = ckType; } + public String getCkTypeName() { return ckTypeName; } + public void setCkTypeName(String ckTypeName) { this.ckTypeName = ckTypeName; } + public String getTeamCode() { return teamCode; } + public void setTeamCode(String teamCode) { this.teamCode = teamCode; } + public String getTeamName() { return teamName; } + public void setTeamName(String teamName) { this.teamName = teamName; } + public Date getLyTime() { return lyTime; } + public void setLyTime(Date lyTime) { this.lyTime = lyTime; } + public String getCkRemark() { return ckRemark; } + public void setCkRemark(String ckRemark) { this.ckRemark = ckRemark; } + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } + public String getHasMoved() { return hasMoved; } + public void setHasMoved(String hasMoved) { this.hasMoved = hasMoved; } + public String getXmNoCk() { + return xmNoCk; + } + + public void setXmNoCk(String xmNoCk) { + this.xmNoCk = xmNoCk; + } + + public String getXmMsCk() { + return xmMsCk; + } + + public void setXmMsCk(String xmMsCk) { + this.xmMsCk = xmMsCk; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getIsBorrowed() { + return isBorrowed; + } + + public void setIsBorrowed(String isBorrowed) { + this.isBorrowed = isBorrowed; + } + + public String getIsDelete() { return isDelete; } + public void setIsDelete(String isDelete) { this.isDelete = isDelete; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("rkType", getRkType()) - .append("wlType", getWlType()) - .append("cangku", getCangku()) - .append("rkTime", getRkTime()) - .append("lihuoY", getLihuoY()) - .append("isChuku", getIsChuku()) - .append("billNo", getBillNo()) - .append("billNoCk", getBillNoCk()) - .append("remark", getRemark()) - .append("xj", getXj()) - .append("xmNo", getXmNo()) - .append("xmMs", getXmMs()) - .append("wlNo", getWlNo()) - .append("wlMs", getWlMs()) - .append("gysNo", getGysNo()) - .append("gysMc", getGysMc()) - .append("jhAmt", getJhAmt()) - .append("htDj", getHtDj()) - .append("sapNo", getSapNo()) - .append("xh", getXh()) - .append("jhQty", getJhQty()) - .append("htQty", getHtQty()) - .append("dw", getDw()) - .append("realQty", getRealQty()) - .append("pcode", getPcode()) - .append("pcodeId", getPcodeId()) - .append("trayCode", getTrayCode()) - .append("entityId", getEntityId()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("ckLihuoY", getCkLihuoY()) - .append("ckType", getCkType()) - .append("ckTypeName", getCkTypeName()) - .append("teamCode", getTeamCode()) - .append("teamName", getTeamName()) - .append("lyTime", getLyTime()) - .append("ckRemark", getCkRemark()) - .append("isDelete", getIsDelete()) - .toString(); + .append("id", getId()) + .append("rkType", getRkType()) + .append("wlType", getWlType()) + .append("cangku", getCangku()) + .append("rkTime", getRkTime()) + .append("borrowTime", getBorrowTime()) + .append("returnTime", getReturnTime()) + .append("lihuoY", getLihuoY()) + .append("isChuku", getIsChuku()) + .append("billNo", getBillNo()) + .append("billNoCk", getBillNoCk()) + .append("remark", getRemark()) + .append("xj", getXj()) + .append("xmNo", getXmNo()) + .append("xmMs", getXmMs()) + .append("wlNo", getWlNo()) + .append("wlMs", getWlMs()) + .append("gysNo", getGysNo()) + .append("gysMc", getGysMc()) + .append("jhAmt", getJhAmt()) + .append("htDj", getHtDj()) + .append("sapNo", getSapNo()) + .append("xh", getXh()) + .append("jhQty", getJhQty()) + .append("htQty", getHtQty()) + .append("dw", getDw()) + .append("realQty", getRealQty()) + .append("pcode", getPcode()) + .append("pcodeId", getPcodeId()) + .append("trayCode", getTrayCode()) + .append("entityId", getEntityId()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("ckLihuoY", getCkLihuoY()) + .append("ckType", getCkType()) + .append("ckTypeName", getCkTypeName()) + .append("teamCode", getTeamCode()) + .append("teamName", getTeamName()) + .append("lyTime", getLyTime()) + .append("ckRemark", getCkRemark()) + .append("status", getStatus()) + .append("hasMoved", getHasMoved()) + .append("xmNoCk", getXmNoCk()) + .append("xmMsCk", getXmMsCk()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("isBorrowed", getIsBorrowed()) + .append("isDelete", getIsDelete()) + .toString(); } } diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/AgvDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/AgvDTO.java new file mode 100644 index 0000000..79f5c33 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/dto/AgvDTO.java @@ -0,0 +1,18 @@ +package com.zg.project.wisdom.domain.dto; + +import lombok.Data; + +@Data +public class AgvDTO { + private String requestId; + private String jobId; + private String owner; + private String type; + private String priority; + private String sourceName; + private String targetName; + private String createdAt; + private String updatedAt; + private String status; + private String msg; +} diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/MoveRequestDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/MoveRequestDTO.java new file mode 100644 index 0000000..b76ae12 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/dto/MoveRequestDTO.java @@ -0,0 +1,27 @@ +package com.zg.project.wisdom.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel("移库请求对象") +public class MoveRequestDTO { + + @ApiModelProperty("原库存ID") + private Long fromRkId; + + @ApiModelProperty("移库原因") + private String moveReason; + + @ApiModelProperty("操作人") + private String movedBy; + + @ApiModelProperty("操作时间") + private String movedAt; + + @ApiModelProperty("目标列表") + private List targets; +} \ No newline at end of file diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/MoveTargetItem.java b/src/main/java/com/zg/project/wisdom/domain/dto/MoveTargetItem.java new file mode 100644 index 0000000..25c08bc --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/dto/MoveTargetItem.java @@ -0,0 +1,24 @@ +package com.zg.project.wisdom.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel("目标位置项") +public class MoveTargetItem { + + @ApiModelProperty("目标仓库") + private String toCangku; + + @ApiModelProperty("目标库位码") + private String toPcode; + + @ApiModelProperty("目标托盘码") + private String toTrayCode; + + @ApiModelProperty("实际移动数量") + private BigDecimal realQty; +} diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/PcRkInfoItemDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/PcRkInfoItemDTO.java index 62ef227..0448aa0 100644 --- a/src/main/java/com/zg/project/wisdom/domain/dto/PcRkInfoItemDTO.java +++ b/src/main/java/com/zg/project/wisdom/domain/dto/PcRkInfoItemDTO.java @@ -56,7 +56,7 @@ public class PcRkInfoItemDTO { private BigDecimal htDj; /** 实际入库数量 */ - private Long realQty; + private BigDecimal realQty; /** 库位码 */ private String pcode; @@ -203,11 +203,11 @@ public class PcRkInfoItemDTO { this.htDj = htDj; } - public Long getRealQty() { + public BigDecimal getRealQty() { return realQty; } - public void setRealQty(Long realQty) { + public void setRealQty(BigDecimal realQty) { this.realQty = realQty; } diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/RefundRequestDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/RefundRequestDTO.java new file mode 100644 index 0000000..4332f22 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/dto/RefundRequestDTO.java @@ -0,0 +1,19 @@ +package com.zg.project.wisdom.domain.dto; + +import lombok.Data; + +/** + * 还料入库请求 DTO + */ +@Data +public class RefundRequestDTO { + + /** 原出库记录ID */ + private Long originalId; + + /** 新库位码 */ + private String pcode; + + /** 入库类型 */ + private String rkType; +} diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/RkInfoScanDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/RkInfoScanDTO.java index dfcb77d..88d3e9c 100644 --- a/src/main/java/com/zg/project/wisdom/domain/dto/RkInfoScanDTO.java +++ b/src/main/java/com/zg/project/wisdom/domain/dto/RkInfoScanDTO.java @@ -1,5 +1,7 @@ package com.zg.project.wisdom.domain.dto; +import java.math.BigDecimal; + public class RkInfoScanDTO { /** 库位码 */ @@ -12,7 +14,7 @@ public class RkInfoScanDTO { private String trayCode; /** 实际数量 */ - private Long realQty; + private BigDecimal realQty; /** 实物 ID */ private String entityId; @@ -44,11 +46,11 @@ public class RkInfoScanDTO { this.trayCode = trayCode; } - public Long getRealQty() { + public BigDecimal getRealQty() { return realQty; } - public void setRealQty(Long realQty) { + public void setRealQty(BigDecimal realQty) { this.realQty = realQty; } diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/StockOutDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/StockOutDTO.java index 7ffbde0..ec39641 100644 --- a/src/main/java/com/zg/project/wisdom/domain/dto/StockOutDTO.java +++ b/src/main/java/com/zg/project/wisdom/domain/dto/StockOutDTO.java @@ -15,6 +15,12 @@ public class StockOutDTO { /** 领用时间(出库时间) */ private Date lyTime; + /** 借用时间 */ + private Date borrowTime; + + /** 归还时间 */ + private Date returnTime; + /** 施工队编码 */ private String teamCode; @@ -24,6 +30,12 @@ public class StockOutDTO { /** 出库理货员 */ private String ckLihuoY; + /** 领取项目编号 */ + private String xmNoCk; + + /** 领取项目描述*/ + private String xmMsCk; + /** 出库列表 */ private List ckList; diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/StockOutItemDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/StockOutItemDTO.java index 17fce42..b3187aa 100644 --- a/src/main/java/com/zg/project/wisdom/domain/dto/StockOutItemDTO.java +++ b/src/main/java/com/zg/project/wisdom/domain/dto/StockOutItemDTO.java @@ -13,4 +13,5 @@ public class StockOutItemDTO { /** 出库备注 */ private String ckRemark; + } diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/TaskExecuteResultVO.java b/src/main/java/com/zg/project/wisdom/domain/vo/TaskExecuteResultVO.java new file mode 100644 index 0000000..02d8908 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/vo/TaskExecuteResultVO.java @@ -0,0 +1,17 @@ +package com.zg.project.wisdom.domain.vo; + +import lombok.Data; + +@Data +public class TaskExecuteResultVO { + + /** 请求ID(taskNo + AGV) */ + private String requestId; + + /** AGV接口返回码 */ + private Integer code; + + /** AGV接口返回信息 */ + private String msg; + +} diff --git a/src/main/java/com/zg/project/wisdom/mapper/AgvTaskResultMapper.java b/src/main/java/com/zg/project/wisdom/mapper/AgvTaskResultMapper.java new file mode 100644 index 0000000..e59c749 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/mapper/AgvTaskResultMapper.java @@ -0,0 +1,22 @@ +package com.zg.project.wisdom.mapper; + +import com.zg.project.wisdom.domain.AgvTaskResult; + +import java.util.List; + +public interface AgvTaskResultMapper { + + AgvTaskResult selectAgvTaskResultById(Long id); + + List selectAgvTaskResultList(AgvTaskResult agvTaskResult); + + int insertAgvTaskResult(AgvTaskResult agvTaskResult); + + int updateAgvTaskResult(AgvTaskResult agvTaskResult); + + int deleteAgvTaskResultById(Long id); + + int deleteAgvTaskResultByIds(Long[] ids); + + int selectCountByRequestIdAndStatus(String requestId, String status); +} diff --git a/src/main/java/com/zg/project/wisdom/mapper/DdTaskMapper.java b/src/main/java/com/zg/project/wisdom/mapper/DdTaskMapper.java new file mode 100644 index 0000000..e51ce41 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/mapper/DdTaskMapper.java @@ -0,0 +1,42 @@ +package com.zg.project.wisdom.mapper; + +import com.zg.project.wisdom.domain.DdTask; +import java.util.List; + +/** + * 调度任务 Mapper 接口 + * + * @author zg + */ +public interface DdTaskMapper { + + /** + * 查询调度任务列表 + */ + List selectDdTaskList(DdTask ddTask); + + /** + * 查询单个调度任务 + */ + DdTask selectDdTaskById(Long id); + + /** + * 新增调度任务 + */ + int insertDdTask(DdTask ddTask); + + /** + * 修改调度任务 + */ + int updateDdTask(DdTask ddTask); + + /** + * 批量删除调度任务 + */ + int deleteDdTaskByIds(Long[] ids); + + /** + * 删除单个调度任务 + */ + int deleteDdTaskById(Long id); +} diff --git a/src/main/java/com/zg/project/wisdom/mapper/MoveRecordMapper.java b/src/main/java/com/zg/project/wisdom/mapper/MoveRecordMapper.java new file mode 100644 index 0000000..ca7d123 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/mapper/MoveRecordMapper.java @@ -0,0 +1,62 @@ +package com.zg.project.wisdom.mapper; + +import com.zg.project.wisdom.domain.MoveRecord; + +import java.util.List; + +/** + * 移库记录Mapper接口 + * + * @author zg + * @date 2025-06-20 + */ +public interface MoveRecordMapper +{ + /** + * 查询移库记录 + * + * @param id 移库记录主键 + * @return 移库记录 + */ + public MoveRecord selectMoveRecordById(Long id); + + /** + * 查询移库记录列表 + * + * @param moveRecord 查询条件 + * @return 移库记录集合 + */ + public List selectMoveRecordList(MoveRecord moveRecord); + + /** + * 修改移库记录 + * + * @param moveRecord 移库记录 + * @return 结果 + */ + public int updateMoveRecord(MoveRecord moveRecord); + + /** + * 删除移库记录 + * + * @param id 移库记录主键 + * @return 结果 + */ + public int deleteMoveRecordById(Long id); + + /** + * 批量删除移库记录 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteMoveRecordByIds(Long[] ids); + + /** + * 新增移库记录 + * + * @param moveRecord 移库记录 + * @return 结果 + */ + void insertMoveRecord(MoveRecord moveRecord); +} diff --git a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java index e634030..7c007d3 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java @@ -1,6 +1,9 @@ package com.zg.project.wisdom.mapper; import java.util.List; + +import com.zg.project.Inventory.domain.vo.PcdeCntVO; +import com.zg.project.Inventory.domain.vo.RkInfoMatchVO; import com.zg.project.wisdom.domain.RkInfo; import org.apache.ibatis.annotations.Param; @@ -118,4 +121,53 @@ public interface RkInfoMapper * @param billNoCk */ int cancelStockOut(String billNoCk); + + /** + * 查看盘点扫描正常数据 + * @param pcdeIds + * @return + */ + List getByPcodeIdList(List pcdeIds); + + /** + * 盘点扫描未正常数据 + * @param pcdeIds + * @return + */ + List getMissedPcodeIds(List pcdeIds); + + /** + * 判断盘点扫描的id是否存在 + * @param id + * @return + */ + int existsByPcodeId(String id); + + /** + * 获取指定仓库的盘点数据 + * @param warehouse + * @return + */ + int countGetByWh(@Param("warehouse") String warehouse); + + /** + * 根据所属仓库查询所有的库位号和库位对应的货物数量 + * @param wh + * @return + */ + List getUnscannedPcodeByWh(@Param("wh") String wh, @Param("taskId") String taskId); + + /** + * 图表统计:每个库位有多少个货物 + * @param ids + * @return + */ + List selectPcdeCntFromRkInfo(List ids); + + /** + * 还料入库 + * @param newEntry + * @return + */ + int insertRkInfo(RkInfo newEntry); } diff --git a/src/main/java/com/zg/project/wisdom/service/IAgvTaskResultService.java b/src/main/java/com/zg/project/wisdom/service/IAgvTaskResultService.java new file mode 100644 index 0000000..1194dd6 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/service/IAgvTaskResultService.java @@ -0,0 +1,32 @@ +package com.zg.project.wisdom.service; + +import com.zg.project.wisdom.domain.AgvTaskResult; +import com.zg.project.wisdom.domain.dto.AgvDTO; + +import java.util.List; + +public interface IAgvTaskResultService { + /** 根据主键查询AGV任务结果 */ + AgvTaskResult selectAgvTaskResultById(Long id); + + /** 查询AGV任务结果列表 */ + List selectAgvTaskResultList(AgvTaskResult agvTaskResult); + + /** 插入新的AGV任务结果记录 */ + int insertAgvTaskResult(AgvTaskResult agvTaskResult); + + /** 更新AGV任务结果记录 */ + int updateAgvTaskResult(AgvTaskResult agvTaskResult); + + /** 根据主键删除AGV任务结果 */ + int deleteAgvTaskResultById(Long id); + + /** 根据主键数组批量删除AGV任务结果 */ + int deleteAgvTaskResultByIds(Long[] ids); + + /** 处理AGV回调 */ + void handleAgvCallback(AgvDTO dto); + + /** 根据请求ID和状态判断AGV任务结果是否存在 */ + boolean existsByRequestIdAndStatus(String requestId, String status); +} diff --git a/src/main/java/com/zg/project/wisdom/service/IDdTaskService.java b/src/main/java/com/zg/project/wisdom/service/IDdTaskService.java new file mode 100644 index 0000000..963014c --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/service/IDdTaskService.java @@ -0,0 +1,50 @@ +package com.zg.project.wisdom.service; + +import com.zg.framework.web.domain.AjaxResult; +import com.zg.project.wisdom.domain.DdTask; +import com.zg.project.wisdom.domain.vo.TaskExecuteResultVO; + +import java.util.List; + +/** + * 调度任务 Service 接口 + * + * @author zg + */ +public interface IDdTaskService { + + /** + * 查询调度任务列表 + */ + List selectDdTaskList(DdTask ddTask); + + /** + * 查询单个调度任务 + */ + DdTask selectDdTaskById(Long id); + + /** + * 新增调度任务 + */ + int insertDdTask(DdTask ddTask); + + /** + * 修改调度任务 + */ + int updateDdTask(DdTask ddTask); + + /** + * 批量删除调度任务 + */ + int deleteDdTaskByIds(Long[] ids); + + /** + * 删除单个调度任务 + */ + int deleteDdTaskById(Long id); + + /** + * 执行任务 + */ + TaskExecuteResultVO executeTask(Long id); +} diff --git a/src/main/java/com/zg/project/wisdom/service/IMoveRecordService.java b/src/main/java/com/zg/project/wisdom/service/IMoveRecordService.java new file mode 100644 index 0000000..cd5212d --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/service/IMoveRecordService.java @@ -0,0 +1,63 @@ +package com.zg.project.wisdom.service; + +import com.zg.project.wisdom.domain.MoveRecord; +import com.zg.project.wisdom.domain.dto.MoveRequestDTO; + +import java.util.List; + +/** + * 移库记录Service接口 + * + * @author zg + * @date 2025-06-20 + */ +public interface IMoveRecordService +{ + /** + * 查询移库记录 + * + * @param id 移库记录主键 + * @return 移库记录 + */ + public MoveRecord selectMoveRecordById(Long id); + + /** + * 查询移库记录列表 + * + * @param moveRecord 查询条件 + * @return 移库记录集合 + */ + public List selectMoveRecordList(MoveRecord moveRecord); + + + /** + * 修改移库记录 + * + * @param moveRecord 移库记录 + * @return 结果 + */ + public int updateMoveRecord(MoveRecord moveRecord); + + /** + * 批量删除移库记录 + * + * @param ids 移库记录主键集合 + * @return 结果 + */ + public int deleteMoveRecordByIds(Long[] ids); + + /** + * 删除移库记录 + * + * @param id 移库记录主键 + * @return 结果 + */ + public int deleteMoveRecordById(Long id); + + /** + * 批量处理移库 + * + * @param dto + */ + void processMove(MoveRequestDTO dto); +} diff --git a/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java b/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java index 6d23614..3191c10 100644 --- a/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java +++ b/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java @@ -3,8 +3,11 @@ package com.zg.project.wisdom.service; import java.util.List; import java.util.Map; +import com.zg.project.Inventory.domain.dto.QueryDTO; +import com.zg.project.Inventory.domain.vo.ChartDataVO; import com.zg.project.wisdom.domain.RkInfo; import com.zg.project.wisdom.domain.dto.PcRkInfoBatchDTO; +import com.zg.project.wisdom.domain.dto.RefundRequestDTO; import com.zg.project.wisdom.domain.dto.RkInfoBatchDTO; import com.zg.project.wisdom.domain.dto.StockOutDTO; @@ -102,4 +105,32 @@ public interface IRkInfoService * @param */ int deleteByCkBillNo(String billNoCk); + + /** + * 盘点开始匹配 + * @param dto + * @return + */ + void matchWithStatus(QueryDTO dto); + + /** + * 统计指定仓库的库存数量 + * @param warehouse + * @return + */ + int countGetByWh(String warehouse); + + /** + * 图表统计:每个库位有多少个货物 + * @param dto + * @return + */ + ChartDataVO matchWithAll(QueryDTO dto); + + /** + * 还料入库 + * @param dto + * @return + */ + int refundMaterial(RefundRequestDTO dto); } diff --git a/src/main/java/com/zg/project/wisdom/service/impl/AgvTaskResultServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/AgvTaskResultServiceImpl.java new file mode 100644 index 0000000..f022689 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/service/impl/AgvTaskResultServiceImpl.java @@ -0,0 +1,83 @@ +package com.zg.project.wisdom.service.impl; + +import com.zg.common.utils.DateUtils; +import com.zg.common.utils.SecurityUtils; +import com.zg.project.wisdom.domain.AgvTaskResult; +import com.zg.project.wisdom.domain.dto.AgvDTO; +import com.zg.project.wisdom.mapper.AgvTaskResultMapper; +import com.zg.project.wisdom.service.IAgvTaskResultService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AgvTaskResultServiceImpl implements IAgvTaskResultService { + + @Autowired + private AgvTaskResultMapper agvTaskResultMapper; + + @Override + public AgvTaskResult selectAgvTaskResultById(Long id) { + return agvTaskResultMapper.selectAgvTaskResultById(id); + } + + @Override + public List selectAgvTaskResultList(AgvTaskResult agvTaskResult) { + return agvTaskResultMapper.selectAgvTaskResultList(agvTaskResult); + } + + @Override + public int insertAgvTaskResult(AgvTaskResult agvTaskResult) { + agvTaskResult.setCreateBy(SecurityUtils.getUserId().toString()); + return agvTaskResultMapper.insertAgvTaskResult(agvTaskResult); + } + + @Override + public int updateAgvTaskResult(AgvTaskResult agvTaskResult) { + agvTaskResult.setUpdateBy(SecurityUtils.getUserId().toString()); + return agvTaskResultMapper.updateAgvTaskResult(agvTaskResult); + } + + @Override + public int deleteAgvTaskResultById(Long id) { + return agvTaskResultMapper.deleteAgvTaskResultById(id); + } + + @Override + public int deleteAgvTaskResultByIds(Long[] ids) { + return agvTaskResultMapper.deleteAgvTaskResultByIds(ids); + } + + @Override + public void handleAgvCallback(AgvDTO dto) { + String requestId = dto.getRequestId(); + String taskNo = requestId != null && requestId.length() > 2 + ? requestId.substring(0, requestId.length() - 2) + : requestId; + + AgvTaskResult result = new AgvTaskResult(); + result.setRequestId(requestId); + result.setTaskNo(taskNo); + result.setJobId(dto.getJobId()); + result.setOwner(dto.getOwner()); + result.setType(dto.getType()); + result.setPriority(dto.getPriority()); + result.setSourceName(dto.getSourceName()); + result.setTargetName(dto.getTargetName()); + result.setCreatedAt(dto.getCreatedAt()); + result.setUpdatedAt(dto.getUpdatedAt()); + result.setStatus(dto.getStatus()); + result.setMsg(dto.getMsg()); + result.setCreateBy("agv"); + result.setCreateTime(DateUtils.getNowDate()); + result.setIsDelete("0"); + + agvTaskResultMapper.insertAgvTaskResult(result); + } + + @Override + public boolean existsByRequestIdAndStatus(String requestId, String status) { + return agvTaskResultMapper.selectCountByRequestIdAndStatus(requestId, status) > 0; + } +} diff --git a/src/main/java/com/zg/project/wisdom/service/impl/DdTaskServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/DdTaskServiceImpl.java new file mode 100644 index 0000000..d99515c --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/service/impl/DdTaskServiceImpl.java @@ -0,0 +1,175 @@ +package com.zg.project.wisdom.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.zg.common.exception.ServiceException; +import com.zg.common.utils.DateUtils; +import com.zg.common.utils.SecurityUtils; +import com.zg.common.utils.StringUtils; +import com.zg.common.utils.http.HttpUtils; +import com.zg.framework.web.domain.AjaxResult; +import com.zg.project.wisdom.domain.DdTask; +import com.zg.project.wisdom.domain.vo.TaskExecuteResultVO; +import com.zg.project.wisdom.mapper.DdTaskMapper; +import com.zg.project.wisdom.service.IDdTaskService; +import org.apache.commons.lang3.RandomUtils; +import org.apache.commons.lang3.math.NumberUtils; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * 调度任务 Service 实现类 + * + * @author zg + */ +@Service +public class DdTaskServiceImpl implements IDdTaskService { + + @Autowired + private DdTaskMapper ddTaskMapper; + + @Value("${agv.job.create-url}") + private String agvJobCreateUrl; + + @Override + public List selectDdTaskList(DdTask ddTask) { + return ddTaskMapper.selectDdTaskList(ddTask); + } + + @Override + public DdTask selectDdTaskById(Long id) { + return ddTaskMapper.selectDdTaskById(id); + } + + @Override + public int insertDdTask(DdTask ddTask) { + // 1. 生成任务编号(如 DD20250701143059001) + String taskNo = "DD" + DateUtils.dateTimeNow("yyyyMMddHHmmssSSS"); + ddTask.setTaskNo(taskNo); + + // 2. 判断 mid 是否为空,设置 midStatus(0空托盘,1有货) + if (ddTask.getMid() == null || ddTask.getMid().trim().isEmpty()) { + ddTask.setMidStatus(0); + } else { + ddTask.setMidStatus(1); + } + + // 3. 设置任务初始状态为待建(0) + ddTask.setTaskStatus(0); + + // 4. 设置操作员和审核员(从当前登录用户上下文中获取) + Long userId = SecurityUtils.getUserId(); + ddTask.setOperator(userId.toString()); + ddTask.setApprover(userId.toString()); + + // 5. 设置接收时间 rcptim 和初始化字段 + ddTask.setRcptim(DateUtils.getNowDate()); + ddTask.setRid(""); + ddTask.setDoCount(0); + + // 6. 设置通用字段 + ddTask.setCreateBy(userId.toString()); + ddTask.setCreateTime(DateUtils.getNowDate()); + ddTask.setUpdateBy(userId.toString()); + ddTask.setUpdateTime(DateUtils.getNowDate()); + ddTask.setIsDelete("0"); + + return ddTaskMapper.insertDdTask(ddTask); + } + + @Override + public int updateDdTask(DdTask ddTask) { + return ddTaskMapper.updateDdTask(ddTask); + } + + @Override + public int deleteDdTaskByIds(Long[] ids) { + return ddTaskMapper.deleteDdTaskByIds(ids); + } + + @Override + public int deleteDdTaskById(Long id) { + return ddTaskMapper.deleteDdTaskById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TaskExecuteResultVO executeTask(Long id) { + // 1. 查询任务 + DdTask task = ddTaskMapper.selectDdTaskById(id); + if (task == null) { + throw new ServiceException("任务不存在,ID = " + id); + } + if (task.getTaskStatus() == null || task.getTaskStatus() != 0) { + throw new ServiceException("任务状态不是待执行,当前状态为:" + task.getTaskStatus()); + } + + // 2. 构造 requestId + String requestId; + if (StringUtils.isBlank(task.getTaskNo())) { + String timeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("MMddHHmmss")); + int rand = new Random().nextInt(900) + 100; + requestId = timeStr + rand; + int num = Optional.ofNullable(task.getNum()).orElse(0); + requestId += String.format("%02d", num); + } else { + requestId = task.getTaskNo(); + } + requestId += "1"; // AGV 固定值 + int type = NumberUtils.toInt(task.getTaskType(), 0); + requestId += (type + 1); // 1上架、2下架、3移库 + + // 3. 构造 AGV 参数 + JSONObject param = new JSONObject(); + param.put("requestId", requestId); + param.put("taskNo", task.getTaskNo()); + param.put("owner", "wms"); + param.put("type", type); + param.put("priority", 1); + param.put("sourceName", task.getSourceName()); + param.put("targetName", task.getTargetName()); + + // 4. 调用 AGV 接口 + String result = HttpUtils.sendPost(agvJobCreateUrl, param.toJSONString()); + if (StringUtils.isBlank(result)) { + throw new ServiceException("AGV接口无响应"); + } + + Integer code; + String msg; + try { + JSONObject json = JSON.parseObject(result); + code = json.getInteger("code"); + msg = json.getString("msg"); + } catch (Exception e) { + throw new ServiceException("AGV响应解析失败:" + result); + } + + if (!Objects.equals(code, 0)) { + throw new ServiceException("AGV调用失败:" + msg); + } + + // 5. 更新任务状态 + task.setTaskStatus(1); + task.setDoCount(task.getDoCount() != null ? task.getDoCount() + 1 : 1); + task.setUpdateBy(SecurityUtils.getUserId().toString()); + task.setUpdateTime(DateUtils.getNowDate()); + ddTaskMapper.updateDdTask(task); + + // 6. 返回结果 + TaskExecuteResultVO resultVO = new TaskExecuteResultVO(); + resultVO.setRequestId(requestId); + resultVO.setCode(code); + resultVO.setMsg(msg); + return resultVO; + } + +} diff --git a/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java new file mode 100644 index 0000000..1f62026 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java @@ -0,0 +1,233 @@ +package com.zg.project.wisdom.service.impl; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import com.zg.common.exception.ServiceException; +import com.zg.common.utils.DateUtils; +import com.zg.common.utils.EntityFillUtils; +import com.zg.common.utils.SecurityUtils; +import com.zg.project.wisdom.domain.RkInfo; +import com.zg.project.wisdom.domain.dto.MoveRequestDTO; +import com.zg.project.wisdom.domain.dto.MoveTargetItem; +import com.zg.project.wisdom.mapper.MoveRecordMapper; +import com.zg.project.wisdom.domain.MoveRecord; +import com.zg.project.wisdom.mapper.RkInfoMapper; +import com.zg.project.wisdom.service.IMoveRecordService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 移库记录Service业务层处理 + * + * @author zg + * @date 2025-06-20 + */ +@Service +public class MoveRecordServiceImpl implements IMoveRecordService +{ + @Autowired + private MoveRecordMapper moveRecordMapper; + + @Autowired + private RkInfoMapper rkInfoMapper; + + /** + * 查询移库记录 + * + * @param id 移库记录主键 + * @return 移库记录 + */ + @Override + public MoveRecord selectMoveRecordById(Long id) + { + return moveRecordMapper.selectMoveRecordById(id); + } + + /** + * 查询移库记录列表 + * + * @param moveRecord 查询条件 + * @return 移库记录 + */ + @Override + public List selectMoveRecordList(MoveRecord moveRecord) + { + return moveRecordMapper.selectMoveRecordList(moveRecord); + } + + /** + * 新增移库记录 + * + * @param moveRecord 移库记录 + * @return 结果 + */ + + /** + * 修改移库记录 + * + * @param moveRecord 移库记录 + * @return 结果 + */ + @Override + public int updateMoveRecord(MoveRecord moveRecord) + { + return moveRecordMapper.updateMoveRecord(moveRecord); + } + + /** + * 批量删除移库记录 + * + * @param ids 需要删除的移库记录主键 + * @return 结果 + */ + @Override + public int deleteMoveRecordByIds(Long[] ids) + { + return moveRecordMapper.deleteMoveRecordByIds(ids); + } + + /** + * 删除移库记录信息 + * + * @param id 移库记录主键 + * @return 结果 + */ + @Override + public int deleteMoveRecordById(Long id) + { + return moveRecordMapper.deleteMoveRecordById(id); + } + + /** + * 处理库存移库操作 + * + * @param dto 移库请求参数(包含原库存ID、移库目标列表等) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void processMove(MoveRequestDTO dto) { + // 查询原始库存记录 + RkInfo original = rkInfoMapper.selectRkInfoById(dto.getFromRkId()); + if (original == null || "1".equals(original.getIsDelete())) { + throw new ServiceException("原库存不存在或已删除"); + } + + // 计算目标总数量 + BigDecimal totalQty = dto.getTargets().stream() + .map(MoveTargetItem::getRealQty) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + // 原始库存数量 + BigDecimal realQty = original.getRealQty(); + if (realQty == null) { + throw new ServiceException("原库存数量为空,无法进行比较"); + } + + if (totalQty.compareTo(realQty) > 0) { + throw new ServiceException("拆分总数量不能大于原库存数量"); + } + + // 操作信息 + String username = dto.getMovedBy(); + Date now = DateUtils.parseDate(dto.getMovedAt()); + + // 情况一:整库移库(目标总数量 = 原库存,且仅一个目标) + if (dto.getTargets().size() == 1 && totalQty.compareTo(realQty) == 0) { + MoveTargetItem target = dto.getTargets().get(0); + + RkInfo info = new RkInfo(); + BeanUtils.copyProperties(original, info); + + original.setCangku(target.getToCangku()); + original.setPcode(target.getToPcode()); + original.setTrayCode(target.getToTrayCode()); + original.setHasMoved("1"); + original.setUpdateBy(username); + original.setUpdateTime(now); + rkInfoMapper.updateRkInfo(original); + + // 记录移库日志 + moveRecordMapper.insertMoveRecord(createMoveRecord(info, target, dto)); + return; + } + + // 情况二 & 三:需要新建多条库存记录 + List insertList = new ArrayList<>(); + + // 情况三:部分移库(目标总量 < 原库存) + if (totalQty.compareTo(realQty) < 0) { + // 原库存数量减少 + original.setRealQty(realQty.subtract(totalQty)); + original.setUpdateBy(username); + original.setUpdateTime(now); + rkInfoMapper.updateRkInfo(original); + } else { + // 情况二:原库存刚好用完(但目标多个) → 删除原库存 + rkInfoMapper.deleteRkInfoById(original.getId()); + } + + // 新增多条目标库存 + for (MoveTargetItem target : dto.getTargets()) { + RkInfo newInfo = new RkInfo(); + BeanUtils.copyProperties(original, newInfo, "id"); + + newInfo.setCangku(target.getToCangku()); + newInfo.setPcode(target.getToPcode()); + newInfo.setTrayCode(target.getToTrayCode()); + newInfo.setRealQty(target.getRealQty()); + newInfo.setHasMoved("1"); + + newInfo.setCreateBy(username); + newInfo.setCreateTime(now); + newInfo.setUpdateBy(username); + newInfo.setUpdateTime(now); + + insertList.add(newInfo); + + // 移库记录 + moveRecordMapper.insertMoveRecord(createMoveRecord(original, target, dto)); + } + + if (!insertList.isEmpty()) { + rkInfoMapper.batchInsertRkInfo(insertList); + } + } + + /** + * 构建移库记录对象 + * + * @param info 原库存记录 + * @param target 目标位置数据 + * @param dto 请求参数 + * @return 构建后的移库记录 + */ + private MoveRecord createMoveRecord(RkInfo info, MoveTargetItem target, MoveRequestDTO dto) { + Long userId = SecurityUtils.getUserId(); + MoveRecord record = new MoveRecord(); + record.setRkId(info.getId()); + record.setEntityId(info.getEntityId()); + record.setFromCangku(info.getCangku()); + record.setFromPcode(info.getPcode()); + record.setFromTrayCode(info.getTrayCode()); + record.setToCangku(target.getToCangku()); + record.setToPcode(target.getToPcode()); + record.setToTrayCode(target.getToTrayCode()); + record.setMoveReason(dto.getMoveReason()); + record.setMovedBy(userId.toString()); + record.setMovedAt(DateUtils.getNowDate()); + + record.setIsDelete("0"); + record.setCreateBy(userId.toString()); + record.setUpdateBy(userId.toString()); + record.setCreateTime(DateUtils.getNowDate()); + record.setUpdateTime(DateUtils.getNowDate()); + + return record; + } + +} diff --git a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java index 0df2d22..101332f 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java @@ -1,20 +1,32 @@ package com.zg.project.wisdom.service.impl; +import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; +import java.util.stream.Collectors; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.zg.common.exception.ServiceException; import com.zg.common.utils.DateUtils; +import com.zg.common.utils.PageUtils; import com.zg.common.utils.SecurityUtils; +import com.zg.framework.web.page.TableDataInfo; +import com.zg.project.Inventory.AutoInventory.mapper.InventoryMatchScanMapper; +import com.zg.project.Inventory.Task.mapper.InventoryTaskMapper; +import com.zg.project.Inventory.domain.dto.QueryDTO; +import com.zg.project.Inventory.domain.entity.InventoryMatchScan; +import com.zg.project.Inventory.domain.vo.ChartDataVO; +import com.zg.project.Inventory.domain.vo.PcdeCntVO; import com.zg.project.wisdom.domain.RkBill; import com.zg.project.wisdom.domain.dto.*; import com.zg.project.wisdom.mapper.GysJhMapper; import com.zg.project.wisdom.mapper.RkBillMapper; import com.zg.project.wisdom.utils.BillNoUtil; import com.zg.project.wisdom.utils.CodeConvertUtil; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.zg.project.wisdom.mapper.RkInfoMapper; @@ -29,7 +41,7 @@ import org.springframework.transaction.annotation.Transactional; * @date 2025-05-28 */ @Service -public class RkInfoServiceImpl implements IRkInfoService +public class RkInfoServiceImpl implements IRkInfoService { @Autowired @@ -41,9 +53,15 @@ public class RkInfoServiceImpl implements IRkInfoService @Autowired private RkBillMapper rkBillMapper; + @Autowired + private InventoryMatchScanMapper matchScanMapper; + + @Autowired + private InventoryTaskMapper taskMapper; + /** * 查询库存单据主 - * + * * @param id 库存单据主主键 * @return 库存单据主 */ @@ -55,7 +73,7 @@ public class RkInfoServiceImpl implements IRkInfoService /** * 查询库存单据主列表 - * + * * @param rkInfo 库存单据主 * @return 库存单据主 */ @@ -80,7 +98,7 @@ public class RkInfoServiceImpl implements IRkInfoService /** * 修改库存单据主 - * + * * @param rkInfo 库存单据主 * @return 结果 */ @@ -93,7 +111,7 @@ public class RkInfoServiceImpl implements IRkInfoService /** * 批量删除库存单据主 - * + * * @param ids 需要删除的库存单据主主键 * @return 结果 */ @@ -105,7 +123,7 @@ public class RkInfoServiceImpl implements IRkInfoService /** * 删除库存单据主信息 - * + * * @param id 库存单据主主键 * @return 结果 */ @@ -183,6 +201,7 @@ public class RkInfoServiceImpl implements IRkInfoService // 系统字段 entity.setIsChuku("0"); + entity.setIsBorrowed("0"); entity.setIsDelete("0"); entity.setRkTime(now); entity.setCreateBy(username); @@ -360,40 +379,176 @@ public class RkInfoServiceImpl implements IRkInfoService // Step 1: 提前生成出库单据号(如 CK202406100001) String billNo = BillNoUtil.generateTodayBillNo("CK"); - // Step 2: 构造出库主单 rk_bill -// RkBill bill = new RkBill(); -// bill.setBillNo(billNo); -// bill.setCkType(dto.getCkType()); -// bill.setCkTime(dto.getLyTime()); -// bill.setCkLihuoY(dto.getCkLihuoY()); -// bill.setTeamCode(dto.getTeamCode()); -// bill.setIsChuku("1"); -// bill.setIsDelete("0"); -// bill.setCreateBy(username); -// bill.setCreateTime(now); -// bill.setUpdateBy(username); -// bill.setUpdateTime(now); -// -// rkBillMapper.insertRkBill(bill); - - // Step 3: 批量更新 rk_info(出库状态 + 单号 + 单据ID) + // Step 2: 批量更新 rk_info(出库状态 + 单号 + 单据ID) for (StockOutItemDTO item : dto.getCkList()) { RkInfo update = new RkInfo(); update.setId(item.getId()); update.setBillNoCk(billNo); update.setIsChuku("1"); + if ("JLCK".equals(dto.getCkType())) { + update.setIsBorrowed("1"); + update.setBorrowTime(dto.getBorrowTime()); + update.setReturnTime(dto.getReturnTime()); + } update.setCkType(dto.getCkType()); update.setLyTime(dto.getLyTime()); update.setCkLihuoY(dto.getCkLihuoY()); update.setTeamCode(dto.getTeamCode()); update.setCkRemark(item.getCkRemark()); + update.setXmNoCk(dto.getXmNoCk()); + update.setXmMsCk(dto.getXmMsCk()); update.setUpdateBy(username); update.setUpdateTime(now); - rkInfoMapper.updateById(update); } return dto.getCkList().size(); } + @Override + public void matchWithStatus(QueryDTO dto) { + List pcdeIds = dto.getIds(); + if (pcdeIds == null || pcdeIds.isEmpty()) return; + + // 一、三类匹配数据 + List matchedAll = rkInfoMapper.getByPcodeIdList(pcdeIds); + matchedAll.forEach(r -> r.setStatus("0")); + + List missedAll = rkInfoMapper.getMissedPcodeIds(pcdeIds); + missedAll.forEach(r -> r.setStatus("1")); + + List errorIds = pcdeIds.stream() + .filter(id -> rkInfoMapper.existsByPcodeId(id) == 0) + .collect(Collectors.toList()); + + List errorAll = errorIds.stream() + .map(id -> { + RkInfo r = new RkInfo(); + r.setPcodeId(id); + r.setStatus("2"); + return r; + }) + .collect(Collectors.toList()); + + // 二、封装入库记录 + String tmeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + String deviceId = dto.getDeviceId(); + int scanType = dto.getScanType() != null ? dto.getScanType() : 0; + String taskId = dto.getTaskId(); + + if (scanType == 1 && (deviceId == null || deviceId.trim().isEmpty())) { + throw new ServiceException("自动盘点必须传递设备ID"); + } + + List toSave = new ArrayList<>(); + for (RkInfo r : matchedAll) { + toSave.add(buildScanRecord(taskId, r.getPcodeId(), "0", deviceId, tmeStr, scanType)); + } + for (RkInfo r : missedAll) { + toSave.add(buildScanRecord(taskId, r.getPcodeId(), "1", deviceId, tmeStr, scanType)); + } + for (RkInfo r : errorAll) { + toSave.add(buildScanRecord(taskId, r.getPcodeId(), "2", deviceId, tmeStr, scanType)); + } + + if (!toSave.isEmpty()) { + matchScanMapper.insertBatch(toSave); + } + + taskMapper.updateStatus(taskId, "1"); + } + + private InventoryMatchScan buildScanRecord(String taskId, String pcode, String status, + String deviceId, String tme, int scanType) { + InventoryMatchScan record = new InventoryMatchScan(); + record.setPcode(pcode); + record.setTaskId(taskId); + record.setStatus(status); + + if (scanType == 1 && deviceId != null) { + record.setDeviceId(deviceId); + } + + record.setTme(tme); + record.setScanType(scanType); + return record; + } + + + @Override + public int countGetByWh(String warehouse) { + return rkInfoMapper.countGetByWh(warehouse); + } + + /** + * 图表统计:每个库位有多少个货物 + * @param dto + * @return + */ + @Override + public ChartDataVO matchWithAll(QueryDTO dto) { + List ids = dto.getIds(); + if (ids == null || ids.isEmpty()) { + return new ChartDataVO(Collections.emptyList(), + Collections.emptyList(), + 0L); + } + + List rows = rkInfoMapper.selectPcdeCntFromRkInfo(ids); + + List pcdeList = new ArrayList<>(rows.size()); + List fycdeCntList = new ArrayList<>(rows.size()); + + for (PcdeCntVO r : rows) { + pcdeList.add(r.getPcde()); + fycdeCntList.add(r.getCnt()); + } + + return new ChartDataVO(pcdeList, fycdeCntList, (long) rows.size()); + } + + /** + * 还料入库 + * @param dto + * @return + */ + @Override + public int refundMaterial(RefundRequestDTO dto) { + Long originalId = dto.getOriginalId(); + String newPcode = dto.getPcode(); + + // 1. 查原出库记录 + RkInfo original = rkInfoMapper.selectRkInfoById(originalId); + if (original == null || "1".equals(original.getIsDelete())) { + throw new ServiceException("原出库记录不存在或已删除"); + } + + // 2. 构造新的入库记录 + RkInfo newEntry = new RkInfo(); + BeanUtils.copyProperties(original, newEntry); + newEntry.setId(null); + newEntry.setIsChuku("0"); + newEntry.setPcode(newPcode); + newEntry.setRkType(dto.getRkType()); + newEntry.setReturnTime(DateUtils.getNowDate()); + newEntry.setBillNo(BillNoUtil.generateTodayBillNo("RK")); + newEntry.setCreateBy(SecurityUtils.getUserId().toString()); + newEntry.setCreateTime(DateUtils.getNowDate()); + newEntry.setUpdateBy(null); + newEntry.setUpdateTime(null); + newEntry.setIsBorrowed("0"); + + // 3. 插入新入库记录 + int rows = rkInfoMapper.insertRkInfo(newEntry); + + // ✅ 4. 更新原记录的 is_borrowed = '0' + RkInfo update = new RkInfo(); + update.setId(originalId); + update.setIsBorrowed("0"); + update.setUpdateBy(SecurityUtils.getUsername()); + update.setUpdateTime(DateUtils.getNowDate()); + rkInfoMapper.updateById(update); + + return rows; + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c7879b3..66e7846 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -142,6 +142,16 @@ gen: # 是否允许生成文件覆盖到本地(自定义路径),默认不允许 allowOverwrite: false +agv: + job: + create-url: http://192.168.1.155:1880/api/job/create + #rfid: # device: # conn-id: 192.168.1.88:9090 + +minio: + endpoint: http://192.168.1.20:9000 + accessKey: admin + secretKey: admin123 + bucketName: jaz diff --git a/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml b/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml index e499258..4851544 100644 --- a/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml +++ b/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml @@ -5,10 +5,10 @@ - INSERT INTO inventory_match_scan (task_name,device_id, pcde, tme, scan_type, status, created_at) + INSERT INTO inventory_match_scan (task_id, device_id, pcode, tme, scan_type, status) VALUES - (#{item.taskName},#{item.deviceId}, #{item.pcde}, #{item.tme}, #{item.scanType}, #{item.status}, NOW()) + (#{item.taskId}, #{item.deviceId}, #{item.pcode}, #{item.tme}, #{item.scanType}, #{item.status}) @@ -18,9 +18,7 @@ @@ -45,61 +43,10 @@ GROUP BY s.pcde - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -145,15 +89,12 @@ AND pcde = #{dto.pcde} - AND DATE(created_at) = ]]> #{dto.tme[0]} - AND DATE(created_at) #{dto.tme[1]} + AND DATE(tme) = ]]> #{dto.tme[0]} + AND DATE(tme) #{dto.tme[1]} AND scan_type = #{dto.scanType} - - AND created_at = #{dto.createdAt} - AND status = #{dto.status} @@ -170,7 +111,6 @@ i.tme, i.scan_type AS scanType, i.status, - i.created_at AS createdAt, s.mid, s.des_mat AS desMat, s.rmn, @@ -178,12 +118,9 @@ s.des_pro AS desPro, s.bnum, s.tcde - FROM - inventory_match_scan i - LEFT JOIN - sod s ON i.pcde = s.fycde_1 - WHERE - i.pcde IS NOT NULL + FROM inventory_match_scan i + LEFT JOIN sod s ON i.pcde = s.fycde_1 + WHERE i.pcde IS NOT NULL AND i.task_name LIKE CONCAT('%', #{taskName}, '%') @@ -195,4 +132,86 @@ + + + + + + diff --git a/src/main/resources/mybatis/Inventory/AutoInventory/SodMapper.xml b/src/main/resources/mybatis/Inventory/AutoInventory/SodMapper.xml index bf3cd1e..530d972 100644 --- a/src/main/resources/mybatis/Inventory/AutoInventory/SodMapper.xml +++ b/src/main/resources/mybatis/Inventory/AutoInventory/SodMapper.xml @@ -88,16 +88,5 @@ AND rmn != 0 - - \ No newline at end of file diff --git a/src/main/resources/mybatis/Inventory/Task/InventoryTaskMapper.xml b/src/main/resources/mybatis/Inventory/Task/InventoryTaskMapper.xml index b4b7e27..a54c6c8 100644 --- a/src/main/resources/mybatis/Inventory/Task/InventoryTaskMapper.xml +++ b/src/main/resources/mybatis/Inventory/Task/InventoryTaskMapper.xml @@ -1,51 +1,88 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - select id, task_name, warehouse_id, scene_id, user_id, require_time, status, task_type, remark, created_by, created_at, updated_by, updated_at, is_delete from inventory_task + SELECT + t.id, + t.task_name, + t.warehouse_id, + w.warehouse_name AS warehouse_name, + t.scene_id, + s.scene_name AS scene_name, + t.user_id, + u.nick_name AS user_name, + t.require_time, + t.status, + t.task_type, + t.remark, + t.created_by, + t.created_at, + t.updated_by, + t.updated_at, + t.is_delete + FROM inventory_task t + LEFT JOIN warehouse_info w ON t.warehouse_id = w.warehouse_code + LEFT JOIN scene_mapping s ON t.scene_id = s.scene_code + LEFT JOIN sys_user u ON t.user_id = u.user_id - + + + + + @@ -64,7 +101,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" updated_by, updated_at, is_delete, - + #{taskName}, #{warehouseId}, @@ -79,7 +116,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{updatedBy}, #{updatedAt}, #{isDelete}, - + @@ -102,12 +139,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + UPDATE inventory_task + SET status = #{status}, + updated_at = NOW() + WHERE id = #{taskId} + + delete from inventory_task where id = #{id} - delete from inventory_task where id in + delete from inventory_task where id in #{id} diff --git a/src/main/resources/mybatis/information/DeviceInfoMapper.xml b/src/main/resources/mybatis/information/DeviceInfoMapper.xml index 07ad080..fc01374 100644 --- a/src/main/resources/mybatis/information/DeviceInfoMapper.xml +++ b/src/main/resources/mybatis/information/DeviceInfoMapper.xml @@ -1,38 +1,57 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - - + + + + + + + + + + + + - select device_id, ip_address, port, warehouse_id, create_by, create_time, update_by, update_time, is_delete from device_info + SELECT + d.device_id, + d.ip_address, + d.port, + d.warehouse_id, + d.scene_id, + w.warehouse_name AS warehouse_name, + s.scene_name AS scene_name, + d.create_by, + d.create_time, + d.update_by, + d.update_time, + d.is_delete + FROM device_info d + LEFT JOIN warehouse_info w ON d.warehouse_id = w.warehouse_code + LEFT JOIN scene_mapping s ON d.scene_id = s.scene_code - + @@ -42,23 +61,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ip_address, port, warehouse_id, + scene_id, create_by, create_time, update_by, update_time, is_delete, - + #{deviceId}, #{ipAddress}, #{port}, #{warehouseId}, + #{sceneId}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{isDelete}, - + @@ -67,6 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ip_address = #{ipAddress}, port = #{port}, warehouse_id = #{warehouseId}, + scene_id = #{sceneId}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, @@ -81,9 +103,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from device_info where device_id in + delete from device_info where device_id in #{deviceId} - \ No newline at end of file + diff --git a/src/main/resources/mybatis/information/PcdeDetailMapper.xml b/src/main/resources/mybatis/information/PcdeDetailMapper.xml index 1253b04..6339fe7 100644 --- a/src/main/resources/mybatis/information/PcdeDetailMapper.xml +++ b/src/main/resources/mybatis/information/PcdeDetailMapper.xml @@ -1,27 +1,27 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - - - - - - + + + + + + + + + + + + + - select d.id, d.location_code, d.scene, m.scene_name, d.warehouse, + select d.id, d.pcode, d.scene, m.scene_name, d.warehouse, d.encoded_id, d.tag, d.remark, d.is_delete, d.created_by, d.created_at, d.updated_by, d.updated_at from pcde_detail d @@ -31,16 +31,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -49,18 +49,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where d.id = #{id} - insert into pcde_detail - location_code, + pcode, scene, warehouse, encoded_id, @@ -71,9 +71,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" created_at, updated_by, updated_at, - + - #{locationCode}, + #{pcode}, #{scene}, #{warehouse}, #{encodedId}, @@ -84,13 +84,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{createdAt}, #{updatedBy}, #{updatedAt}, - + update pcde_detail - location_code = #{locationCode}, + pcode = #{pcode}, scene = #{scene}, warehouse = #{warehouse}, encoded_id = #{encodedId}, @@ -110,9 +110,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from pcde_detail where id in + delete from pcde_detail where id in #{id} - \ No newline at end of file + diff --git a/src/main/resources/mybatis/wisdom/AgvTaskResultMapper.xml b/src/main/resources/mybatis/wisdom/AgvTaskResultMapper.xml new file mode 100644 index 0000000..b7f02b4 --- /dev/null +++ b/src/main/resources/mybatis/wisdom/AgvTaskResultMapper.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + id, request_id, task_no, status, msg, create_by, create_time, update_by, update_time, is_delete + + + + + + + + + + INSERT INTO agv_task_result + + request_id, + task_no, + status, + msg, + create_by, + create_time, + is_delete + + VALUES + + #{requestId}, + #{taskNo}, + #{status}, + #{msg}, + #{createBy}, + NOW(), + '0' + + + + + UPDATE agv_task_result SET + request_id = #{requestId}, + task_no = #{taskNo}, + status = #{status}, + msg = #{msg}, + update_by = #{updateBy}, + update_time = NOW() + WHERE id = #{id} + + + + DELETE FROM agv_task_result WHERE id = #{id} + + + + DELETE FROM agv_task_result WHERE id IN + + #{id} + + + + diff --git a/src/main/resources/mybatis/wisdom/DdTaskMapper.xml b/src/main/resources/mybatis/wisdom/DdTaskMapper.xml new file mode 100644 index 0000000..365e381 --- /dev/null +++ b/src/main/resources/mybatis/wisdom/DdTaskMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO dd_task ( + task_no, task_dtl, task_type, task_status, mid_status, mid, num, mid_type, source_name, + target_name, operator, approver, rcptim, rid, do_count, prf, + create_by, create_time, update_by, update_time, is_delete + ) VALUES ( + #{taskNo}, #{taskDtl}, #{taskType}, #{taskStatus}, #{midStatus}, #{mid}, #{num}, #{midType}, #{sourceName}, + #{targetName}, #{operator}, #{approver}, #{rcptim}, #{rid}, #{doCount}, #{prf}, + #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{isDelete} + ) + + + + UPDATE dd_task + SET task_no = #{taskNo}, + task_dtl = #{taskDtl}, + task_type = #{taskType}, + task_status = #{taskStatus}, + mid_status = #{midStatus}, + mid = #{mid}, + num = #{num}, + mid_type = #{midType}, + source_name = #{sourceName}, + target_name = #{targetName}, + operator = #{operator}, + approver = #{approver}, + rcptim = #{rcptim}, + rid = #{rid}, + do_count = #{doCount}, + prf = #{prf}, + update_by = #{updateBy}, + update_time = #{updateTime}, + is_delete = #{isDelete} + WHERE id = #{id} + + + + DELETE FROM dd_task WHERE id IN + + #{id} + + + + + DELETE FROM dd_task WHERE id = #{id} + + + diff --git a/src/main/resources/mybatis/wisdom/MoveRecordMapper.xml b/src/main/resources/mybatis/wisdom/MoveRecordMapper.xml new file mode 100644 index 0000000..9836792 --- /dev/null +++ b/src/main/resources/mybatis/wisdom/MoveRecordMapper.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id, rk_id, entity_id, from_cangku, from_pcode, from_tray_code, + to_cangku, to_pcode, to_tray_code, move_reason, moved_by, moved_at, + create_by, create_time, update_by, update_time, is_delete + FROM move_record + + + + INSERT INTO move_record ( + rk_id, + entity_id, + from_cangku, + from_pcode, + from_tray_code, + to_cangku, + to_pcode, + to_tray_code, + move_reason, + moved_by, + moved_at, + create_by, + create_time, + update_by, + update_time, + is_delete + ) VALUES ( + #{rkId}, + #{entityId}, + #{fromCangku}, + #{fromPcode}, + #{fromTrayCode}, + #{toCangku}, + #{toPcode}, + #{toTrayCode}, + #{moveReason}, + #{movedBy}, + #{movedAt}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{isDelete} + ) + + + + + + + + + + + UPDATE move_record + + rk_id = #{rkId}, + entity_id = #{entityId}, + from_cangku = #{fromCangku}, + from_pcode = #{fromPcode}, + from_tray_code = #{fromTrayCode}, + to_cangku = #{toCangku}, + to_pcode = #{toPcode}, + to_tray_code = #{toTrayCode}, + move_reason = #{moveReason}, + moved_by = #{movedBy}, + moved_at = #{movedAt}, + update_by = #{updateBy}, + update_time = #{updateTime}, + is_delete = #{isDelete} + + WHERE id = #{id} + + + + + DELETE FROM move_record WHERE id = #{id} + + + + + DELETE FROM move_record + WHERE id IN + + #{id} + + + + diff --git a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml index 4adf498..716ff39 100644 --- a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml +++ b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml @@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -12,6 +12,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -21,6 +22,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -43,12 +46,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + @@ -59,12 +65,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ri.rk_type, st.type_name AS rk_type_name, ri.wl_type, mt.type_name AS wl_type_name, ri.cangku, wh.warehouse_name AS cangku_name, - ri.rk_time, ri.lihuo_y, ri.is_chuku, ri.remark, + ri.rk_time, ri.lihuo_y, ri.is_chuku, ri.is_borrowed,ri.remark, ri.ck_lihuo_y, ri.ck_type, sot.type_name AS ck_type_name, ri.team_code, ct.team_name, ri.ck_remark, ri.ly_time, - ri.xj, ri.xm_no, ri.xm_ms, ri.wl_no, ri.wl_ms, + ri.borrow_time, ri.return_time, + ri.xj, ri.xm_no, ri.xm_ms, ri.wl_no, ri.wl_ms,ri.xm_no_ck, ri.xm_ms_ck, ri.gys_no, ri.gys_mc, ri.jh_amt, ri.ht_dj, ri.sap_no, ri.xh, ri.jh_qty, ri.ht_qty, ri.dw, ri.real_qty, ri.pcode, ri.pcode_id, ri.tray_code, ri.entity_id, @@ -78,26 +85,52 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - insert into rk_info ( + INSERT INTO rk_info ( bill_no, rk_type, wl_type, cangku, lihuo_y, rk_time, - wl_no, wl_ms, xm_no, xm_ms, xj, sap_no, gys_no, gys_mc, + wl_no, wl_ms, xm_no, xm_ms, + xm_no_ck, xm_ms_ck, xj, sap_no, gys_no, gys_mc, jh_qty, ht_qty, jh_amt, ht_dj, dw, + borrow_time, return_time, pcode, pcode_id, tray_code, real_qty, entity_id, - remark, is_chuku, is_delete, create_by, create_time + remark, is_chuku,is_borrowed, is_delete, create_by, create_time ) - values + VALUES ( #{item.billNo}, #{item.rkType}, #{item.wlType}, #{item.cangku}, #{item.lihuoY}, #{item.rkTime}, - #{item.wlNo}, #{item.wlMs}, #{item.xmNo}, #{item.xmMs}, #{item.xj}, #{item.sapNo}, #{item.gysNo}, #{item.gysMc}, + #{item.wlNo}, #{item.wlMs}, #{item.xmNo}, #{item.xmMs}, + #{item.xmNoCk}, #{item.xmMsCk}, #{item.xj}, #{item.sapNo}, #{item.gysNo}, #{item.gysMc}, #{item.jhQty}, #{item.htQty}, #{item.jhAmt}, #{item.htDj}, #{item.dw}, + #{item.borrowTime}, #{item.returnTime}, #{item.pcode}, #{item.pcodeId}, #{item.trayCode}, #{item.realQty}, #{item.entityId}, - #{item.remark}, #{item.isChuku}, #{item.isDelete}, #{item.createBy}, #{item.createTime} + #{item.remark}, #{item.isChuku}, #{item.isBorrowed},#{item.isDelete}, #{item.createBy}, #{item.createTime} ) + + + INSERT INTO rk_info ( + rk_type, wl_type, cangku, rk_time, lihuo_y, + is_chuku, remark, bill_no, xj, xm_no, xm_ms,is_borrowed, + wl_no, wl_ms, gys_no, gys_mc, jh_amt, ht_dj, + sap_no, xh, jh_qty, ht_qty, dw, real_qty, + pcode, tray_code, entity_id, + ck_lihuo_y, ck_type, team_code, ck_remark, + ly_time, bill_no_ck, has_moved, + create_by, create_time, update_by, update_time, is_delete + ) VALUES ( + #{rkType}, #{wlType}, #{cangku}, #{rkTime}, #{lihuoY}, + #{isChuku}, #{remark}, #{billNo}, #{xj}, #{xmNo}, #{xmMs},#{isBorrowed}, + #{wlNo}, #{wlMs}, #{gysNo}, #{gysMc}, #{jhAmt}, #{htDj}, + #{sapNo}, #{xh}, #{jhQty}, #{htQty}, #{dw}, #{realQty}, + #{pcode}, #{trayCode}, #{entityId}, + #{ckLihuoY}, #{ckType}, #{teamCode}, #{ckRemark}, + #{lyTime}, #{billNoCk}, #{hasMoved}, + #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{isDelete} + ) + DELETE FROM rk_info WHERE bill_no = #{billNo} @@ -113,6 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" team_code = NULL, ly_time = NULL, ck_remark = NULL, + is_borrowed = NULL, update_time = NOW() WHERE bill_no_ck = #{billNoCk} @@ -120,7 +154,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT COUNT(*) FROM rk_info - WHERE ri.is_delete = 0 AND ri.is_chuku = 0 + WHERE is_delete = 0 AND is_chuku = 0 @@ -208,7 +248,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + + + + update rk_info @@ -229,11 +347,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" rk_time = #{rkTime}, lihuo_y = #{lihuoY}, is_chuku = #{isChuku}, + is_borrowed = #{isBorrowed}, bill_no = #{billNo}, remark = #{remark}, xj = #{xj}, xm_no = #{xmNo}, xm_ms = #{xmMs}, + xm_no_ck = #{xmNoCk}, + xm_ms_ck = #{xmMsCk}, wl_no = #{wlNo}, wl_ms = #{wlMs}, gys_no = #{gysNo}, @@ -251,12 +372,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" entity_id = #{entityId}, ck_lihuo_y = #{ckLihuoY}, ck_type = #{ckType}, - sgd_code = #{sgdCode}, - sgd_name = #{sgdName}, ly_time = #{lyTime}, + borrow_time = #{borrowTime}, + return_time = #{returnTime}, ck_remark = #{ckRemark}, - create_by = #{createBy}, - create_time = #{createTime}, + has_moved = #{hasMoved}, update_by = #{updateBy}, update_time = #{updateTime}, is_delete = #{isDelete}, @@ -266,31 +386,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update rk_info - set is_delete = 1 + + is_delete = 1 + where id = #{id} - + update rk_info - set ri.is_delete = 1 + set is_delete = 1 where id in - + #{id} - + UPDATE rk_info is_chuku = #{isChuku}, - ck_remark = #{ckRemark}, + is_borrowed = #{isBorrowed}, + bill_no_ck = #{billNoCk}, ck_type = #{ckType}, - ly_time = #{lyTime}, ck_lihuo_y = #{ckLihuoY}, team_code = #{teamCode}, - bill_no_ck = #{billNoCk}, + ck_remark = #{ckRemark}, + xm_no_ck = #{xmNoCk}, + xm_ms_ck = #{xmMsCk}, update_by = #{updateBy}, - update_time = #{updateTime} + update_time = #{updateTime}, + ly_time = #{lyTime}, + borrow_time = #{borrowTime}, + return_time = #{returnTime}, WHERE id = #{id}