From f1feaa6ae8fc84004fcfccc926eebae944861a19 Mon Sep 17 00:00:00 2001
From: 1 <1@123>
Date: 星期一, 16 三月 2026 14:23:16 +0800
Subject: [PATCH] lsh#

---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java         |  114 +++++++++++++++++++++++++++++++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/param/AgvBindAndInTParam.java |   10 +++
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java                  |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java        |   11 +++
 4 files changed, 135 insertions(+), 2 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java
index 01bb13b..fb64188 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/AgvController.java
@@ -3,11 +3,11 @@
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.server.api.service.AgvService;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
+import com.vincent.rsf.server.manager.entity.param.AgvBindAndInTParam;
 import com.vincent.rsf.server.system.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -77,4 +77,13 @@
         }
         return agvService.AGVBindAndInTaskStart(waitPakinPda, getLoginUserId());
     }
+
+    @ApiOperation("AGV缁戝畾&鍏ユ《")
+    @PostMapping("/AGV/bindAndIn/start/T")
+    public R AGVBindAndInTaskStartT(@RequestBody AgvBindAndInTParam param) {
+        if (Objects.isNull(param)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return agvService.AGVBindAndInTaskStartT(param, getLoginUserId());
+    }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java
index 253326f..d22eb9c 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/AgvService.java
@@ -2,6 +2,7 @@
 
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
+import com.vincent.rsf.server.manager.entity.param.AgvBindAndInTParam;
 
 import java.util.Map;
 
@@ -17,6 +18,7 @@
     R getStaMsgSelect(Map<String, Object> params);
 
     R AGVBindAndInTaskStart(WaitPakinParam waitPakinPda, Long loginUserId);
+    R AGVBindAndInTaskStartT(AgvBindAndInTParam param, Long loginUserId);
     R AGVBindAndInTaskStart(String barcode);
     boolean AGVBindAndInTaskStart(String barcode, String sta);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
index ae742e3..e832cae 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
@@ -1,31 +1,47 @@
 package com.vincent.rsf.server.api.service.impl;
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.vincent.rsf.framework.common.Cools;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.server.api.controller.erp.params.SyncOrderParams;
+import com.vincent.rsf.server.api.controller.erp.params.SyncOrdersItem;
 import com.vincent.rsf.server.api.service.AgvService;
+import com.vincent.rsf.server.api.service.ReceiveMsgService;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
 import com.vincent.rsf.server.manager.entity.*;
+import com.vincent.rsf.server.manager.entity.param.AgvBindAndInTParam;
 import com.vincent.rsf.server.manager.enums.LocStsType;
 import com.vincent.rsf.server.manager.enums.PakinIOStatus;
 import com.vincent.rsf.server.manager.enums.StationTypeEnum;
 import com.vincent.rsf.server.manager.enums.TaskType;
 import com.vincent.rsf.server.manager.service.*;
 import com.vincent.rsf.server.manager.service.impl.DeviceSiteServiceImpl;
+import com.vincent.rsf.server.manager.service.impl.MatnrServiceImpl;
 import com.vincent.rsf.server.manager.utils.LocManageUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 @Service
 public class AgvServiceImpl implements AgvService {
+
+    private static final String AGV_MISC_ORDER_PREFIX = "AGVT";
+    private static final DateTimeFormatter BATCH_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+
+    @Autowired
+    private ReceiveMsgService receiveMsgService;
 
     @Autowired
     private WaitPakinService waitPakinService;
@@ -36,11 +52,15 @@
     @Autowired
     private WarehouseAreasService warehouseAreasService;
     @Autowired
+    private LocService locService;
+    @Autowired
     private TaskService taskService;
     @Autowired
     private BasContainerService basContainerService;
     @Autowired
     private DeviceSiteServiceImpl deviceSiteService;
+    @Autowired
+    private MatnrServiceImpl matnrService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -72,6 +92,98 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R AGVBindAndInTaskStartT(AgvBindAndInTParam param, Long loginUserId) {
+        if (Objects.isNull(param)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Cools.isEmpty(param.getMatNr())) {
+            throw new CoolException("鐗╂枡缂栫爜涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Cools.isEmpty(param.getPalletBarcode())) {
+            throw new CoolException("鎵樼洏鐮佷笉鑳戒负绌猴紒锛�");
+        }
+
+        checkPalletBarcodeAvailable(param.getPalletBarcode());
+
+        Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>()
+                .eq(Matnr::getCode, param.getMatNr())
+                .last("limit 1"));
+        if (Objects.isNull(matnr)) {
+            throw new CoolException("鐗╂枡缂栫爜涓嶅瓨鍦細" + param.getMatNr());
+        }
+
+        long nowMillis = System.currentTimeMillis();
+        long nowSeconds = nowMillis / 1000;
+        String orderNo = buildAgvMiscOrderNo(param.getPalletBarcode(), nowMillis);
+        SyncOrderParams syncOrder = new SyncOrderParams()
+                .setWkType(SyncOrderParams.BusinessType.STK_MISCELLANEOUS)
+                .setType("in")
+                .setOrderNo(orderNo)
+                .setOrderInternalCode(nowMillis)
+                .setCreateTime(nowSeconds)
+                .setBusinessTime(nowSeconds)
+                .setAnfme(1.0)
+                .setOrderItems(Collections.singletonList(buildOrderItem(param, matnr, nowMillis, nowSeconds).setBarcode(param.getPalletBarcode())));
+        syncOrder.setStationId(param.getPalletSta());
+        receiveMsgService.syncCheckOrder(Collections.singletonList(syncOrder), loginUserId);
+
+        return R.ok(Cools.add("orderNo", orderNo).add("palletBarcode", param.getPalletBarcode()));
+    }
+
+    private SyncOrdersItem buildOrderItem(AgvBindAndInTParam param, Matnr matnr, long uniqueSeed, long nowSeconds) {
+        String suffix = String.valueOf(uniqueSeed);
+        String batch = LocalDateTime.ofInstant(Instant.ofEpochSecond(nowSeconds), ZoneId.systemDefault())
+                .format(BATCH_FORMATTER);
+        SyncOrdersItem syncOrdersItem = new SyncOrdersItem()
+                .setModel(matnr.getModel())
+                .setAnfme(1.0)
+                .setUnit(matnr.getUnit())
+                .setBaseUnitId(matnr.getUnit())
+                .setPriceUnitId(matnr.getUnit())
+                .setBatch(batch)
+                .setPlanNo(AGV_MISC_ORDER_PREFIX + "-PLAN-" + suffix)
+                .setLineId(AGV_MISC_ORDER_PREFIX + "-LINE-" + suffix)
+                .setPlatItemId("1")
+                .setPalletId(param.getPalletBarcode());
+        syncOrdersItem.setMatnr(matnr.getCode());
+        syncOrdersItem.setMaktx(matnr.getName());
+        syncOrdersItem.setSpec(matnr.getSpec());
+        return syncOrdersItem;
+    }
+
+    private String buildAgvMiscOrderNo(String palletBarcode, long uniqueSeed) {
+        String cleanBarcode = palletBarcode.replaceAll("[^A-Za-z0-9]", "");
+        if (cleanBarcode.length() > 24) {
+            cleanBarcode = cleanBarcode.substring(cleanBarcode.length() - 24);
+        }
+        return AGV_MISC_ORDER_PREFIX + cleanBarcode + uniqueSeed;
+    }
+
+    private void checkPalletBarcodeAvailable(String palletBarcode) {
+        WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+                .eq(WaitPakin::getBarcode, palletBarcode)
+                .last("limit 1"));
+        if (!Objects.isNull(waitPakin)) {
+            throw new CoolException("鎵樼洏鐮侊細" + palletBarcode + "宸茶缁勬墭鍗曪細" + waitPakin.getCode() + "浣跨敤锛侊紒");
+        }
+
+        BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
+                .eq(BasStation::getBarcode, palletBarcode)
+                .last("limit 1"));
+        if (!Objects.isNull(basStation)) {
+            throw new CoolException("鎵樼洏鐮侊細" + palletBarcode + "宸茶绔欑偣锛�" + basStation.getStationName() + "缁戝畾锛侊紒");
+        }
+
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>()
+                .eq(Loc::getBarcode, palletBarcode)
+                .last("limit 1"));
+        if (!Objects.isNull(loc)) {
+            throw new CoolException("鎵樼洏鐮侊細" + palletBarcode + "宸茶搴撲綅锛�" + loc.getCode() + "浣跨敤锛侊紒");
+        }
+    }
+
+    @Override
     public R getStaMsgSelect(Map<String, Object> params) {
         String sta = params.get("sta").toString();
         if (Cools.isEmpty(sta)) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/param/AgvBindAndInTParam.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/param/AgvBindAndInTParam.java
new file mode 100644
index 0000000..63ab03f
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/param/AgvBindAndInTParam.java
@@ -0,0 +1,10 @@
+package com.vincent.rsf.server.manager.entity.param;
+
+import lombok.Data;
+
+@Data
+public class AgvBindAndInTParam {
+    private String matNr;//鐗╂枡缂栫爜  瀵瑰簲man_matnr涓殑code
+    private String palletBarcode;//鎵樼洏鐮�
+    private String palletSta;//鎿嶄綔绔欑偣
+}

--
Gitblit v1.9.1