From a57445f55e84b7cf6bd26cf152a0ffa7f62f54f2 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期四, 25 九月 2025 20:06:59 +0800
Subject: [PATCH] 添加容器管理 商品档案管理

---
 src/main/java/com/zy/asrs/entity/Task.java                          |    9 
 src/main/webapp/static/js/mat/mat.js                                |    7 
 src/main/java/com/zy/asrs/entity/param/AgvCallParams.java           |    3 
 src/main/webapp/static/js/basContainer/basContainer.js              |  249 +++++++++++++
 src/main/java/com/zy/asrs/controller/BasStationController.java      |   40 +-
 src/main/java/com/zy/asrs/entity/BasStation.java                    |    1 
 src/main/java/com/zy/asrs/enums/CommonEnum.java                     |   25 +
 src/main/java/com/zy/asrs/service/impl/BasContainerServiceImpl.java |   12 
 src/main/webapp/static/js/task/task.js                              |   14 
 src/main/java/com/zy/asrs/entity/Mat.java                           |   27 +
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java       |  163 ++++++++
 src/main/java/com/zy/asrs/service/BasContainerService.java          |    8 
 src/main/webapp/static/js/common.js                                 |    2 
 src/main/java/com/zy/asrs/mapper/BasContainerMapper.java            |   12 
 src/main/java/com/zy/asrs/service/MobileService.java                |    8 
 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java         |  116 +++++
 src/main/resources/mapper/BasContainerMapper.xml                    |   12 
 src/main/java/com/zy/asrs/controller/TaskController.java            |   47 +-
 src/main/java/com/zy/asrs/controller/MobileController.java          |   10 
 src/main/java/com/zy/asrs/entity/BasContainer.java                  |   88 ++++
 src/main/java/com/zy/asrs/enums/MatTagType.java                     |   20 +
 src/main/java/basContainer.sql                                      |   18 
 src/main/java/com/zy/common/CodeBuilder.java                        |    2 
 src/main/webapp/views/basStation/basStation.html                    |    3 
 src/main/webapp/views/basContainer/basContainer.html                |   92 ++++
 src/main/java/com/zy/asrs/enums/ContainerType.java                  |   27 +
 src/main/java/com/zy/asrs/controller/BasContainerController.java    |  125 ++++++
 27 files changed, 1,056 insertions(+), 84 deletions(-)

diff --git a/src/main/java/basContainer.sql b/src/main/java/basContainer.sql
new file mode 100644
index 0000000..e1cd330
--- /dev/null
+++ b/src/main/java/basContainer.sql
@@ -0,0 +1,18 @@
+-- save basContainer record
+-- mysql
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'basContainer/basContainer.html', 'basContainer绠$悊', null , '2', null , '1');
+
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'basContainer#view', '鏌ヨ', '', '3', '0', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'basContainer#btn-add', '鏂板', '', '3', '1', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'basContainer#btn-edit', '缂栬緫', '', '3', '2', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'basContainer#btn-delete', '鍒犻櫎', '', '3', '3', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'basContainer#btn-export', '瀵煎嚭', '', '3', '4', '1');
+
+-- sqlserver
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'basContainer/basContainer.html', N'basContainer绠$悊', null, '2', null, '1');
+
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'basContainer#view', N'鏌ヨ', '90623', '3', '0', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'basContainer#btn-add', N'鏂板', '90623', '3', '1', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'basContainer#btn-edit', N'缂栬緫', '90623', '3', '2', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'basContainer#btn-delete', N'鍒犻櫎', '90623', '3', '3', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'basContainer#btn-export', N'瀵煎嚭', '90623', '3', '4', '1');
diff --git a/src/main/java/com/zy/asrs/controller/BasContainerController.java b/src/main/java/com/zy/asrs/controller/BasContainerController.java
new file mode 100644
index 0000000..c9efadb
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/BasContainerController.java
@@ -0,0 +1,125 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.common.DateUtils;
+import com.zy.asrs.entity.BasContainer;
+import com.zy.asrs.service.BasContainerService;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class BasContainerController extends BaseController {
+
+    @Autowired
+    private BasContainerService basContainerService;
+
+    @RequestMapping(value = "/basContainer/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(basContainerService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/basContainer/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam(required = false)String condition,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<BasContainer> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(BasContainer.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(basContainerService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/basContainer/add/auth")
+    @ManagerAuth
+    public R add(BasContainer basContainer) {
+        basContainerService.insert(basContainer);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/basContainer/update/auth")
+	@ManagerAuth
+    public R update(BasContainer basContainer){
+        if (Cools.isEmpty(basContainer) || null==basContainer.getId()){
+            return R.error();
+        }
+        basContainerService.updateById(basContainer);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/basContainer/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            basContainerService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/basContainer/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<BasContainer> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("basContainer"));
+        convert(map, wrapper);
+        List<BasContainer> list = basContainerService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/basContainerQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<BasContainer> wrapper = new EntityWrapper<>();
+        wrapper.like("_id", condition);
+        Page<BasContainer> page = basContainerService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (BasContainer basContainer : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", basContainer.getId());
+            map.put("value", basContainer.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/basContainer/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<BasContainer> wrapper = new EntityWrapper<BasContainer>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != basContainerService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(BasContainer.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/BasStationController.java b/src/main/java/com/zy/asrs/controller/BasStationController.java
index b26e914..c562cc7 100644
--- a/src/main/java/com/zy/asrs/controller/BasStationController.java
+++ b/src/main/java/com/zy/asrs/controller/BasStationController.java
@@ -32,24 +32,26 @@
 
     @RequestMapping(value = "/basStation/list/auth")
     @ManagerAuth
-    public R list(@RequestParam(defaultValue = "1")Integer curr,
-                  @RequestParam(defaultValue = "10")Integer limit,
-                  @RequestParam(required = false)String orderByField,
-                  @RequestParam(required = false)String orderByType,
-                  @RequestParam(required = false)String condition,
-                  @RequestParam Map<String, Object> param){
+    public R list(@RequestParam(defaultValue = "1") Integer curr,
+                  @RequestParam(defaultValue = "10") Integer limit,
+                  @RequestParam(required = false) String orderByField,
+                  @RequestParam(required = false) String orderByType,
+                  @RequestParam(required = false) String condition,
+                  @RequestParam Map<String, Object> param) {
         EntityWrapper<BasStation> wrapper = new EntityWrapper<>();
         excludeTrash(param);
         convert(param, wrapper);
         allLike(BasStation.class, param.keySet(), wrapper, condition);
-        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        if (!Cools.isEmpty(orderByField)) {
+            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
+        }
         return R.ok(basStationService.selectPage(new Page<>(curr, limit), wrapper));
     }
 
-    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
-        for (Map.Entry<String, Object> entry : map.entrySet()){
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper) {
+        for (Map.Entry<String, Object> entry : map.entrySet()) {
             String val = String.valueOf(entry.getValue());
-            if (val.contains(RANGE_TIME_LINK)){
+            if (val.contains(RANGE_TIME_LINK)) {
                 String[] dates = val.split(RANGE_TIME_LINK);
                 wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                 wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
@@ -70,10 +72,10 @@
         return R.ok();
     }
 
-	@RequestMapping(value = "/basStation/update/auth")
-	@ManagerAuth
-    public R update(BasStation basStation){
-        if (Cools.isEmpty(basStation) || null==basStation.getId()){
+    @RequestMapping(value = "/basStation/update/auth")
+    @ManagerAuth
+    public R update(BasStation basStation) {
+        if (Cools.isEmpty(basStation) || null == basStation.getId()) {
             return R.error();
         }
         basStationService.updateById(basStation);
@@ -82,8 +84,8 @@
 
     @RequestMapping(value = "/basStation/delete/auth")
     @ManagerAuth
-    public R delete(@RequestParam(value="ids[]") Long[] ids){
-         for (Long id : ids){
+    public R delete(@RequestParam(value = "ids[]") Long[] ids) {
+        for (Long id : ids) {
             basStationService.deleteById(id);
         }
         return R.ok();
@@ -91,7 +93,7 @@
 
     @RequestMapping(value = "/basStation/export/auth")
     @ManagerAuth
-    public R export(@RequestBody JSONObject param){
+    public R export(@RequestBody JSONObject param) {
         EntityWrapper<BasStation> wrapper = new EntityWrapper<>();
         List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
         Map<String, Object> map = excludeTrash(param.getJSONObject("basStation"));
@@ -107,7 +109,7 @@
         wrapper.like("dev_no", condition);
         Page<BasStation> page = basStationService.selectPage(new Page<>(0, 10), wrapper);
         List<Map<String, Object>> result = new ArrayList<>();
-        for (BasStation basStation : page.getRecords()){
+        for (BasStation basStation : page.getRecords()) {
             Map<String, Object> map = new HashMap<>();
             map.put("id", basStation.getId());
             map.put("value", basStation.getId());
@@ -120,7 +122,7 @@
     @ManagerAuth
     public R query(@RequestBody JSONObject param) {
         Wrapper<BasStation> wrapper = new EntityWrapper<BasStation>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
-        if (null != basStationService.selectOne(wrapper)){
+        if (null != basStationService.selectOne(wrapper)) {
             return R.parse(BaseRes.REPEAT).add(getComment(BasStation.class, String.valueOf(param.get("key"))));
         }
         return R.ok();
diff --git a/src/main/java/com/zy/asrs/controller/MobileController.java b/src/main/java/com/zy/asrs/controller/MobileController.java
index 6909e83..95e7cda 100644
--- a/src/main/java/com/zy/asrs/controller/MobileController.java
+++ b/src/main/java/com/zy/asrs/controller/MobileController.java
@@ -167,6 +167,16 @@
     }
 
 
+    @PostMapping("/cache/out/call")
+    @ApiOperation("鍛煎彨AGV鎼繍")
+    @ManagerAuth
+    public R OutCallAgv(@RequestBody AgvCallParams params) {
+        if (Objects.isNull(params)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return mobileService.OutCallAgv(params, getUserId());
+    }
+
 
     // 缁勬墭 ----------------------------------------------------------------------------------------------------
 
diff --git a/src/main/java/com/zy/asrs/controller/TaskController.java b/src/main/java/com/zy/asrs/controller/TaskController.java
index 2faafe5..b453629 100644
--- a/src/main/java/com/zy/asrs/controller/TaskController.java
+++ b/src/main/java/com/zy/asrs/controller/TaskController.java
@@ -32,25 +32,29 @@
 
     @RequestMapping(value = "/task/list/auth")
     @ManagerAuth
-    public R list(@RequestParam(defaultValue = "1")Integer curr,
-                  @RequestParam(defaultValue = "10")Integer limit,
-                  @RequestParam(required = false)String orderByField,
-                  @RequestParam(required = false)String orderByType,
-                  @RequestParam(required = false)String condition,
-                  @RequestParam Map<String, Object> param){
+    public R list(@RequestParam(defaultValue = "1") Integer curr,
+                  @RequestParam(defaultValue = "10") Integer limit,
+                  @RequestParam(required = false) String orderByField,
+                  @RequestParam(required = false) String orderByType,
+                  @RequestParam(required = false) String condition,
+                  @RequestParam Map<String, Object> param) {
         EntityWrapper<Task> wrapper = new EntityWrapper<>();
         excludeTrash(param);
         convert(param, wrapper);
         allLike(Task.class, param.keySet(), wrapper, condition);
-        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "desc".equals(orderByType));}
-        if (Cools.isEmpty(orderByField)) {wrapper.orderDesc(Arrays.asList("wrk_no"));}
+        if (!Cools.isEmpty(orderByField)) {
+            wrapper.orderBy(humpToLine(orderByField), "desc".equals(orderByType));
+        }
+        if (Cools.isEmpty(orderByField)) {
+            wrapper.orderDesc(Arrays.asList("wrk_no"));
+        }
         return R.ok(taskService.selectPage(new Page<>(curr, limit), wrapper));
     }
 
-    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
-        for (Map.Entry<String, Object> entry : map.entrySet()){
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper) {
+        for (Map.Entry<String, Object> entry : map.entrySet()) {
             String val = String.valueOf(entry.getValue());
-            if (val.contains(RANGE_TIME_LINK)){
+            if (val.contains(RANGE_TIME_LINK)) {
                 String[] dates = val.split(RANGE_TIME_LINK);
                 wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                 wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
@@ -67,10 +71,10 @@
         return R.ok();
     }
 
-	@RequestMapping(value = "/task/update/auth")
-	@ManagerAuth
-    public R update(Task task){
-        if (Cools.isEmpty(task) || null==task.getId()){
+    @RequestMapping(value = "/task/update/auth")
+    @ManagerAuth
+    public R update(Task task) {
+        if (Cools.isEmpty(task) || null == task.getId()) {
             return R.error();
         }
         taskService.updateById(task);
@@ -79,8 +83,8 @@
 
     @RequestMapping(value = "/task/delete/auth")
     @ManagerAuth
-    public R delete(@RequestParam(value="ids[]") Long[] ids){
-         for (Long id : ids){
+    public R delete(@RequestParam(value = "ids[]") Long[] ids) {
+        for (Long id : ids) {
             taskService.deleteById(id);
         }
         return R.ok();
@@ -90,7 +94,7 @@
     @RequestMapping("/task/control")
     @ManagerAuth(memo = "鎵嬪姩澶勭悊宸ヤ綔妗�")
     public R handControlWrkMast(@RequestParam String workNo,
-                                @RequestParam Integer type){
+                                @RequestParam Integer type) {
         if (type == 1) {
             taskService.completeWrkMast(workNo, getUserId());
             return R.ok("宸ヤ綔妗e凡瀹屾垚");
@@ -105,10 +109,9 @@
     }
 
 
-
     @RequestMapping(value = "/task/export/auth")
     @ManagerAuth
-    public R export(@RequestBody JSONObject param){
+    public R export(@RequestBody JSONObject param) {
         EntityWrapper<Task> wrapper = new EntityWrapper<>();
         List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
         Map<String, Object> map = excludeTrash(param.getJSONObject("task"));
@@ -124,7 +127,7 @@
         wrapper.like("id", condition);
         Page<Task> page = taskService.selectPage(new Page<>(0, 10), wrapper);
         List<Map<String, Object>> result = new ArrayList<>();
-        for (Task task : page.getRecords()){
+        for (Task task : page.getRecords()) {
             Map<String, Object> map = new HashMap<>();
             map.put("id", task.getId());
             map.put("value", task.getId());
@@ -137,7 +140,7 @@
     @ManagerAuth
     public R query(@RequestBody JSONObject param) {
         Wrapper<Task> wrapper = new EntityWrapper<Task>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
-        if (null != taskService.selectOne(wrapper)){
+        if (null != taskService.selectOne(wrapper)) {
             return R.parse(BaseRes.REPEAT).add(getComment(Task.class, String.valueOf(param.get("key"))));
         }
         return R.ok();
diff --git a/src/main/java/com/zy/asrs/entity/BasContainer.java b/src/main/java/com/zy/asrs/entity/BasContainer.java
new file mode 100644
index 0000000..5dc10ee
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasContainer.java
@@ -0,0 +1,88 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zy.asrs.enums.CommonEnum;
+import com.zy.asrs.enums.ContainerType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+@TableName("asr_bas_container")
+public class BasContainer implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    /**
+     * 涓婚敭
+     */
+    @ApiModelProperty(value= "涓婚敭")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 瀹瑰櫒缂栫爜
+     */
+    @ApiModelProperty(value= "瀹瑰櫒缂栫爜")
+    private String barcode;
+
+    @ApiModelProperty("瀹瑰櫒绫诲瀷")
+    private String type;
+
+    @ApiModelProperty("鏄惁娣锋斁")
+    private Integer flagMix;
+
+    @ApiModelProperty("鏈�澶ф贩鏀剧绫�")
+    private Integer mixMax;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public BasContainer() {}
+
+    public BasContainer(String barcode) {
+        this.barcode = barcode;
+    }
+
+
+    public String getType$() {
+        if (Cools.isEmpty(type)) {
+            return "鏂欑";
+        }
+        if (type.equals(ContainerType.CONTAINER_TYPE_BOX.type)) {
+            return ContainerType.CONTAINER_TYPE_BOX.desc;
+        } else if (type.equals(ContainerType.CONTAINER_TYPE_SALVER.type)) {
+            return ContainerType.CONTAINER_TYPE_SALVER.desc;
+        } else if (type.equals(ContainerType.CONTAINER_TYPE_CAGE.type)) {
+            return ContainerType.CONTAINER_TYPE_CAGE.desc;
+        }
+        return null;
+    }
+
+    public String getFlagMix$() {
+        if (Cools.isEmpty(flagMix)) {
+            return null;
+        }
+        if (flagMix.equals(CommonEnum.COMMON_ENUM_N.type)) {
+            return CommonEnum.COMMON_ENUM_N.desc;
+        } else if (flagMix.equals(CommonEnum.COMMON_ENUM_Y.type)) {
+            return CommonEnum.COMMON_ENUM_Y.desc;
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasStation.java b/src/main/java/com/zy/asrs/entity/BasStation.java
index eccdf1a..d2c4670 100644
--- a/src/main/java/com/zy/asrs/entity/BasStation.java
+++ b/src/main/java/com/zy/asrs/entity/BasStation.java
@@ -32,7 +32,6 @@
      * 涓婚敭
      */
     @ApiModelProperty(value= "涓婚敭")
-    @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
     /**
diff --git a/src/main/java/com/zy/asrs/entity/Mat.java b/src/main/java/com/zy/asrs/entity/Mat.java
index f666131..bdd9654 100644
--- a/src/main/java/com/zy/asrs/entity/Mat.java
+++ b/src/main/java/com/zy/asrs/entity/Mat.java
@@ -7,6 +7,8 @@
 import com.baomidou.mybatisplus.enums.IdType;
 import com.core.common.Cools;
 import com.core.common.SpringUtils;
+import com.zy.asrs.enums.ContainerType;
+import com.zy.asrs.service.BasContainerService;
 import com.zy.asrs.service.TagService;
 import com.zy.common.utils.Synchro;
 import com.zy.system.entity.User;
@@ -164,7 +166,7 @@
     private String manuDate;
 
     /**
-     * 鍝侀」鏁�
+     * 鍝侀」鏁�/鏈�澶х粍鎵樻暟閲�
      */
     @ApiModelProperty(value= "鍝侀」鏁�")
     @ExcelProperty(value = "鍝侀」鏁�")
@@ -185,6 +187,11 @@
     @ApiModelProperty(value= "閲嶉噺")
     @ExcelProperty(value = "閲嶉噺")
     private Double weight;
+
+    @ApiModelProperty(value= "鏈�澶х粍鎵樹笂闄�")
+    @ExcelProperty(value = "鏈�澶х粍鎵樹笂闄�")
+    @TableField("up_qty")
+    private Double upQty;
 
     /**
      * 闀垮害
@@ -300,6 +307,10 @@
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
+    @ApiModelProperty("搴撲綅绫诲瀷")
+    @TableField("loc_type")
+    private Long locType;
+
     /**
      * 澶囨敞
      */
@@ -416,6 +427,20 @@
         return null;
     }
 
+    public String getLocType$(){
+        if (Cools.isEmpty(locType)) {
+            return "鏂欑";
+        }
+        if (locType.equals(ContainerType.CONTAINER_TYPE_BOX.type)) {
+            return ContainerType.CONTAINER_TYPE_BOX.desc;
+        } else if (locType.equals(ContainerType.CONTAINER_TYPE_SALVER.type)) {
+            return ContainerType.CONTAINER_TYPE_SALVER.desc;
+        } else if (locType.equals(ContainerType.CONTAINER_TYPE_CAGE.type)) {
+            return ContainerType.CONTAINER_TYPE_CAGE.desc;
+        }
+        return null;
+    }
+
     public String getBeBatch$(){
         if (null == this.beBatch){ return null; }
         switch (this.beBatch){
diff --git a/src/main/java/com/zy/asrs/entity/Task.java b/src/main/java/com/zy/asrs/entity/Task.java
index 51fff6b..79496f2 100644
--- a/src/main/java/com/zy/asrs/entity/Task.java
+++ b/src/main/java/com/zy/asrs/entity/Task.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.entity;
 
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
 import com.baomidou.mybatisplus.enums.IdType;
 import com.baomidou.mybatisplus.annotations.TableField;
@@ -396,8 +397,8 @@
 
 
     public String getStaNo$(){
-        BasDevpService service = SpringUtils.getBean(BasDevpService.class);
-        BasDevp basDevp = service.selectById(this.staNo);
+        BasStationService service = SpringUtils.getBean(BasStationService.class);
+        BasStation basDevp = service.selectOne(new EntityWrapper<BasStation>().eq("dev_no", this.staNo));
         if (!Cools.isEmpty(basDevp)){
             return String.valueOf(basDevp.getDevNo());
         }
@@ -405,8 +406,8 @@
     }
 
     public String getSourceStaNo$(){
-        BasDevpService service = SpringUtils.getBean(BasDevpService.class);
-        BasDevp basDevp = service.selectById(this.sourceStaNo);
+        BasStationService service = SpringUtils.getBean(BasStationService.class);
+        BasStation basDevp = service.selectOne(new EntityWrapper<BasStation>().eq("dev_no", this.sourceStaNo));
         if (!Cools.isEmpty(basDevp)){
             return String.valueOf(basDevp.getDevNo());
         }
diff --git a/src/main/java/com/zy/asrs/entity/param/AgvCallParams.java b/src/main/java/com/zy/asrs/entity/param/AgvCallParams.java
index 62886aa..7fc4bc4 100644
--- a/src/main/java/com/zy/asrs/entity/param/AgvCallParams.java
+++ b/src/main/java/com/zy/asrs/entity/param/AgvCallParams.java
@@ -14,6 +14,9 @@
     @ApiModelProperty("璧峰浣嶇疆")
     private String orgSite;
 
+    @ApiModelProperty("婧愬簱浣�")
+    private String orgLoc;
+
     @ApiModelProperty("缁堢偣浣嶇疆")
     private String tarSite;
 
diff --git a/src/main/java/com/zy/asrs/enums/CommonEnum.java b/src/main/java/com/zy/asrs/enums/CommonEnum.java
new file mode 100644
index 0000000..f6faefa
--- /dev/null
+++ b/src/main/java/com/zy/asrs/enums/CommonEnum.java
@@ -0,0 +1,25 @@
+package com.zy.asrs.enums;
+
+/**
+ * @author Ryan
+ * @date 2025/9/25
+ * @description: 閫氱敤绫诲瀷鏋氫妇
+ * @version 1.0
+ */
+public enum CommonEnum {
+
+    //閫氱敤绫诲瀷
+    COMMON_ENUM_Y(0, "鍚�"),
+    //閫氱敤
+    COMMON_ENUM_N(1, "鏄�");
+
+    public Integer type;
+
+    public String desc;
+
+    CommonEnum(Integer type, String desc) {
+        this.type = type;
+        this.desc = desc;
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/enums/ContainerType.java b/src/main/java/com/zy/asrs/enums/ContainerType.java
new file mode 100644
index 0000000..379d1aa
--- /dev/null
+++ b/src/main/java/com/zy/asrs/enums/ContainerType.java
@@ -0,0 +1,27 @@
+package com.zy.asrs.enums;
+
+public enum ContainerType {
+
+    //鏂欑
+    CONTAINER_TYPE_BOX("12", "鏂欑"),
+    //鎵樼洏
+    CONTAINER_TYPE_SALVER("14", "鎵樼洏"),
+
+    CONTAINER_TYPE_CAGE("13", "绗兼"),
+
+    CONTAINER_TYPE_CAR("3", "鍙拌溅"),
+    ;
+
+    public Long type;
+
+    public String desc;
+
+    ContainerType(String type, String desc) {
+        this.type = Long.valueOf(type);
+        this.desc = desc;
+    }
+
+
+
+
+}
diff --git a/src/main/java/com/zy/asrs/enums/MatTagType.java b/src/main/java/com/zy/asrs/enums/MatTagType.java
new file mode 100644
index 0000000..dbf9a6d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/enums/MatTagType.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.enums;
+
+public enum MatTagType {
+    //涓欢
+    MAT_TAGT_YPE_MIDDLE("13", "涓欢"),
+    //灏忎欢
+    MAT_TAGT_YPE_SMALL("12", "灏忎欢"),
+    //婊よ姱
+    MAT_TAGT_YPE_XIN("14", "婊よ姱")
+    ;
+
+    public String id;
+
+    public String type;
+
+    MatTagType(String id, String type) {
+        this.type = type;
+        this.id = id;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasContainerMapper.java b/src/main/java/com/zy/asrs/mapper/BasContainerMapper.java
new file mode 100644
index 0000000..c7b3df9
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasContainerMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.BasContainer;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasContainerMapper extends BaseMapper<BasContainer> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasContainerService.java b/src/main/java/com/zy/asrs/service/BasContainerService.java
new file mode 100644
index 0000000..925a7af
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasContainerService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.BasContainer;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface BasContainerService extends IService<BasContainer> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/MobileService.java b/src/main/java/com/zy/asrs/service/MobileService.java
index 779f434..2455c90 100644
--- a/src/main/java/com/zy/asrs/service/MobileService.java
+++ b/src/main/java/com/zy/asrs/service/MobileService.java
@@ -91,4 +91,12 @@
      * @version 1.0
      */
     R getMatsByQRcode(PakinMatsByQRParams params);
+
+    /**
+     * @author Ryan
+     * @date 2025/9/24
+     * @description: 鍛煎彨AGV鍑哄簱鎼繍
+     * @version 1.0
+     */
+    R OutCallAgv(AgvCallParams params, Long userId);
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/BasContainerServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasContainerServiceImpl.java
new file mode 100644
index 0000000..c4fbcbf
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasContainerServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.BasContainerMapper;
+import com.zy.asrs.entity.BasContainer;
+import com.zy.asrs.service.BasContainerService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("basContainerService")
+public class BasContainerServiceImpl extends ServiceImpl<BasContainerMapper, BasContainer> implements BasContainerService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
index c02566b..716a7ed 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -8,6 +8,7 @@
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.param.*;
+import com.zy.asrs.enums.CommonEnum;
 import com.zy.asrs.enums.LocStsType;
 import com.zy.asrs.mapper.LocMastMapper;
 import com.zy.asrs.mapper.ManLocDetlMapper;
@@ -28,6 +29,8 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -107,6 +110,10 @@
 
     @Autowired
     private TaskDetlService taskDetlService;
+    @Autowired
+    private BasStationService basStationService;
+    @Autowired
+    private BasContainerService basContainerService;
 
     @Override
     @Transactional
@@ -578,7 +585,6 @@
         }
 
         Date now = new Date();
-
         // 鏃犲崟缁勬墭
         if (Cools.isEmpty(param.getOrderNo())) {
             // 鐢熸垚鍏ュ簱閫氱煡妗�
@@ -595,19 +601,21 @@
                 }
             });
 
-
             for (DetlDto detlDto : detlDtos) {
                 Mat mat = matService.selectByMatnr(detlDto.getMatnr());
                 if (Cools.isEmpty(mat)) {
                     throw new CoolException(detlDto.getMatnr() + "鍟嗗搧妗f涓嶅瓨鍦�");
                 }
+                if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) {
+                    throw new CoolException("鐗╂枡锛�" + detlDto.getMatnr() + "鍗曟鏈�澶х粍鎵樹笂闄愪负锛�" + mat.getUpQty());
+                }
                 WaitPakin waitPakin = new WaitPakin();
                 BeanUtils.copyProperties(mat, waitPakin);
                 waitPakin.setBatch(detlDto.getBatch());
-                waitPakin.setZpallet(param.getBarcode());   // 鎵樼洏鐮�
-                waitPakin.setIoStatus("N");     // 鍏ュ嚭鐘舵��
-                waitPakin.setAnfme(detlDto.getAnfme());  // 鏁伴噺
-                waitPakin.setStatus("Y");    // 鐘舵��
+                waitPakin.setZpallet(param.getBarcode());
+                waitPakin.setIoStatus("N");
+                waitPakin.setAnfme(detlDto.getAnfme());
+                waitPakin.setStatus("Y");
                 waitPakin.setAppeUser(userId);
                 waitPakin.setAppeTime(now);
                 waitPakin.setModiUser(userId);
@@ -654,11 +662,41 @@
                     detlDtos.add(detlDto);
                 }
             });
+
+            BasContainer container = basContainerService.selectOne(new EntityWrapper<BasContainer>().eq("barcode", param.getBarcode()));
+            if (Objects.isNull(container)) {
+                throw new CoolException("鏁版嵁閿欒锛氬鍣ㄧ爜涓嶅瓨鍦紒锛�");
+            }
+            if (container.getMixMax() < detlDtos.size()) {
+                throw new CoolException("瓒呭嚭瀹瑰櫒鏈�澶ф贩瑁呮暟閲忥紝褰撳墠瀹瑰櫒鏈�澶ф暟閲忎负锛�" + container.getMixMax() + "!!");
+            }
+            Set<String> matnrs = detlDtos.stream().map(DetlDto::getMatnr).collect(Collectors.toSet());
+            List<Mat> mats = matService.selectList(new EntityWrapper<Mat>().in("matnr", matnrs));
+            Set<Long> tagIds = mats.stream().map(Mat::getTagId).collect(Collectors.toSet());
+            if (tagIds.size() > 1) {
+                throw new CoolException("缁勬墭鐗╂枡绫诲瀷涓嶄竴鑷达紝鍙湁鐩稿悓鐨勭墿鏂欏垎绫绘墠鍙互缁勬墭锛侊紒");
+            }
+            //杩樺彲浠ユ斁鍏ュ灏戠鐗╂枡
+            Integer suplus = container.getMixMax();
             for (DetlDto detlDto : detlDtos) {
                 Mat mat = matService.selectByMatnr(detlDto.getMatnr());
                 if (Cools.isEmpty(mat)) {
                     throw new CoolException(detlDto.getMatnr() + "鍟嗗搧妗f涓嶅瓨鍦�");
                 }
+
+                //鏈�澶氬彲鏀炬暟閲�
+                Double singleMax = mat.getUpQty() * suplus;
+                if (singleMax.compareTo(detlDto.getAnfme()) < 0) {
+                    throw new CoolException("鍗曟鏈�澶х粍鎵樹笂闄愪负锛�" + singleMax);
+                }
+                BigDecimal decimal = new BigDecimal(detlDto.getAnfme() / mat.getUpQty());
+                //褰撳墠鐗╂枡闇�瑕佸崰鐢ㄦ枡绠辨牸鏁�
+                Integer curr = decimal.setScale(0, RoundingMode.CEILING).intValue();
+                suplus = suplus - curr;
+                if (suplus == 0 || suplus < 0) {
+                    throw new CoolException("鐗╂枡锛�" + detlDto.getMatnr() + ", 瓒呭嚭褰撳墠鎵樼洏瑁呰浇涓婇檺锛侊紒");
+                }
+
                 WaitPakin waitPakin = new WaitPakin();
                 BeanUtils.copyProperties(mat, waitPakin);
 //                waitPakin.sync(mat);
@@ -1209,6 +1247,117 @@
 
     /**
      * @author Ryan
+     * @date 2025/9/24
+     * @description: AGV鍛煎彨鎼繍
+     * @version 1.0
+     */
+    @Override
+    public R OutCallAgv(AgvCallParams params, Long userId) {
+        LocCache locCaches = locCacheService.selectOne(new EntityWrapper<LocCache>()
+                .eq("loc_sts", LocStsType.LOC_STS_TYPE_F.type)
+                .eq("frozen", 0)
+                .orderDesc(Arrays.asList("sort", "first_time"))
+                .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
+        if (Objects.isNull(locCaches)) {
+            throw new CoolException("鏆傛棤婊¤冻闇�姹傚簱浣嶏紒");
+        }
+        BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>()
+                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type)
+                .eq("dev_no", params.getTarSite()));
+        if (Objects.isNull(station)) {
+            throw new CoolException("绔欑偣姝e湪鎵ц浠诲姟锛侊紒");
+        }
+
+        generateOutTask(station, locCaches, userId);
+
+        return R.ok();
+    }
+
+    /**
+     * @author Ryan
+     * @date 2025/9/25
+     * @description: 鍛煎彨AGV鐢熸垚鍑哄簱浠诲姟
+     * @version 1.0
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void generateOutTask(BasStation station, LocCache loc, Long userId) {
+        // 鑾峰彇宸ヤ綔鍙�
+        int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
+        // 淇濆瓨宸ヤ綔妗�
+        Task task = new Task();
+        task.setWrkNo(workNo)
+                .setIoTime(new Date())
+                .setWrkSts(11L) // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+                .setIoType(101) // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
+                .setTaskType("agv")
+                .setIoPri(10D)
+                .setFullPlt("Y") // 婊℃澘锛歒
+                .setPicking("N") // 鎷f枡
+                .setExitMk("N")// 閫�鍑�
+                .setStaNo(station.getDevNo())
+                .setSourceLocNo(loc.getLocNo())
+                .setEmptyMk(loc.getLocSts().equals("D") ? "Y" : "N")// 绌烘澘
+                .setBarcode(loc.getBarcode())// 鎵樼洏鐮�
+                .setLinkMis("N")
+                .setAppeUser(userId)
+                .setAppeTime(new Date())
+                .setModiUser(userId)
+                .setModiTime(new Date());
+        if (!taskService.insert(task)) {
+            throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+        }
+        List<LocDetl> detls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_id", loc.getId()));
+        if (Objects.isNull(detls) || detls.isEmpty()) {
+            throw new CoolException("鏁版嵁閿欒锛氬簱浣嶆槑缁嗕负绌猴紒锛�");
+        }
+        List<TaskDetl> taskDetls = new ArrayList<>();
+        detls.forEach(pakin -> {
+            TaskDetl wrkDetl = new TaskDetl();
+            BeanUtils.copyProperties(pakin, wrkDetl);
+            wrkDetl.setWrkNo(workNo)
+                    .setIoTime(new Date())
+                    .setOrderNo(pakin.getOrderNo())
+                    .setAnfme(pakin.getAnfme())
+                    .setZpallet(pakin.getZpallet())
+                    .setBatch(pakin.getBatch())
+                    .setMatnr(pakin.getMatnr())
+                    .setMaktx(pakin.getMaktx())
+                    .setAppeUser(userId)
+                    .setUnit(pakin.getUnit())
+                    .setModel(pakin.getModel())
+                    .setAppeTime(new Date())
+                    .setModiUser(userId);
+            taskDetls.add(wrkDetl);
+        });
+
+        //淇濆瓨宸ヤ綔妗f槑缁�
+        if (!taskDetlService.insertBatch(taskDetls)) {
+            throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+        }
+
+        loc.setLocSts(LocStsType.LOC_STS_TYPE_R.type);
+        loc.setModiUser(userId);
+        loc.setModiTime(new Date());
+
+        if (!locCacheService.updateById(loc)) {
+            throw new CoolException("鏇存柊搴撲綅鐘舵�佷俊鎭紒锛�");
+        }
+
+        // 淇敼鐩爣绔欑偣淇℃伅
+        if (station.getLocSts().equals("O")) {
+            station.setLocSts("S"); // S.鍏ュ簱棰勭害
+            station.setModiTime(new Date());
+            station.setModiUser(userId);
+            if (!basStationService.updateById(station)) {
+                throw new CoolException("鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
+            }
+        } else {
+            throw new CoolException("绉昏浆澶辫触锛岀洰鏍囧簱浣嶇姸鎬侊細" + station.getLocSts());
+        }
+    }
+
+    /**
+     * @author Ryan
      * @date 2025/9/22
      * @description: 鐢熸垚AGV鎼繍浠诲姟
      * @version 1.0
@@ -1225,7 +1374,7 @@
         Task task = new Task();
         task.setWrkNo(workNo)
                 .setIoTime(new Date())
-                .setWrkSts(11L) // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+                .setWrkSts(1L) // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
                 .setIoType(11) // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
                 .setTaskType("agv")
                 .setIoPri(10D)
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index 308d93b..9bab122 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -6,8 +6,10 @@
 import com.zy.asrs.entity.*;
 import com.zy.asrs.enums.LocStsType;
 import com.zy.asrs.service.*;
+import com.zy.asrs.service.impl.BasStationServiceImpl;
 import com.zy.asrs.service.impl.LocCacheServiceImpl;
 import com.zy.asrs.service.impl.OrderPakinServiceImpl;
+import com.zy.asrs.service.impl.TaskDetlServiceImpl;
 import com.zy.asrs.task.AbstractHandler;
 import com.zy.asrs.task.core.ReturnT;
 import lombok.extern.slf4j.Slf4j;
@@ -50,6 +52,10 @@
     private OrderPakinService orderPakinService;
     @Autowired
     private TaskService taskService;
+    @Autowired
+    private TaskDetlService taskDetlService;
+    @Autowired
+    private BasStationServiceImpl basStationService;
 
     public ReturnT<String> start(WrkMast wrkMast) {
         // 4.鍏ュ簱瀹屾垚
@@ -471,18 +477,16 @@
                                 if (!orderDetlPakoutService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                         orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                         wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
-//                                    exceptionHandle("鍏ㄦ澘鍑哄簱 ===>> 鏇存柊璁㈠崟瀹屾垚鏁伴噺澶辫触锛沎workNo={0}],[locNo={1}]",
-//                                            wrkMast.getWrkNo(), wrkMast.getLocNo());
                                     TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                     return FAIL.setMsg("鍏ㄦ澘鍑哄簱 ===>> 鏇存柊璁㈠崟瀹屾垚鏁伴噺澶辫触; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                                 }
                             }
                         } catch (Exception ignore) {
+
                         }
                     }
                     // 鍒犻櫎宸ヤ綔妗f簮搴撲綅鐨勫簱瀛樻槑缁�
                     if (!locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", wrkMast.getSourceLocNo()))) {
-//                        exceptionHandle("鍏ㄦ澘鍑哄簱 ===>> 鍒犻櫎搴撳瓨鏄庣粏澶辫触锛沎workNo={0}],[sourceLocNo={1}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                         return FAIL.setMsg("鍏ㄦ澘鍑哄簱 ===>> 鍒犻櫎搴撳瓨鏄庣粏澶辫触; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                     }
@@ -493,7 +497,6 @@
                         locMast.setModiTime(now);
                         locMast.setIoTime(now);
                         if (!locMastService.updateById(locMast)) {
-//                            exceptionHandle("鍏ㄦ澘鍑哄簱 ===>> 淇敼婧愬簱浣嶇姸鎬佸け璐ワ紱[workNo={0}],[sourceLocNo={1}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                             return FAIL.setMsg("鍏ㄦ澘鍑哄簱 ===>> 淇敼婧愬簱浣嶇姸鎬佸け璐�; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                         }
@@ -575,13 +578,103 @@
      * @version 1.0
      */
     @Transactional(rollbackFor = Exception.class)
-    public ReturnT<String> AgvStart(Task wrkMast) {
+    public ReturnT<String> AgvStart(Task task) {
+        // 4.鍏ュ簱瀹屾垚
+        if (task.getWrkSts() == 4) {
+            return agvDoIn(task);
+            // 14.鍑哄簱瀹屾垚
+        } else if (task.getWrkSts() == 14) {
+            return agvDoOut(task);
+        }
+        return SUCCESS;
+    }
+
+
+    /**
+     * @author Ryan
+     * @date 2025/9/25
+     * @description: AGV鍑哄簱浠诲姟
+     * @version 1.0
+     */
+    public ReturnT<String> agvDoOut(Task task) {
+        if (task.getIoType().equals(101)) {
+            Date now = new Date();
+            LocCache locMast = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no" ,task.getSourceLocNo()));
+            if (Objects.isNull(locMast)) {
+                throw new RuntimeException("鏁版嵁閿欒锛氬簱浣嶄俊鎭笉鑳戒负绌猴紒锛�");
+            }
+            List<TaskDetl> wrkDetls101 = taskDetlService.selectList(new EntityWrapper<TaskDetl>().eq("wrk_no", task.getWrkNo()));
+            if (wrkDetls101.isEmpty()) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return FAIL.setMsg("鍏ㄦ澘鍑哄簱 ===>> 宸ヤ綔鏄庣粏妗d负绌�; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
+            }
+            for (TaskDetl wrkDetl : wrkDetls101) {
+                // 鏇存柊璁㈠崟瀹屾垚鏁伴噺
+                OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
+                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
+                if (orderDetlPakout == null) {
+                    orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
+                            wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
+                }
+                try {
+                    if (!Cools.isEmpty(orderDetlPakout)) {
+                        if (!orderDetlPakoutService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
+                                orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
+                                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return FAIL.setMsg("鍏ㄦ澘鍑哄簱 ===>> 鏇存柊璁㈠崟瀹屾垚鏁伴噺澶辫触; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
+                        }
+                    }
+                } catch (Exception ignore) {
+                }
+            }
+            // 鍒犻櫎宸ヤ綔妗f簮搴撲綅鐨勫簱瀛樻槑缁�
+            if (!locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", task.getSourceLocNo()))) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return FAIL.setMsg("鍏ㄦ澘鍑哄簱 ===>> 鍒犻櫎搴撳瓨鏄庣粏澶辫触; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
+            }
+            // 淇敼婧愬簱浣嶇姸鎬� R ===>> O
+            if (locMast.getLocSts().equals(LocStsType.LOC_STS_TYPE_R.type)) {
+                locMast.setLocSts(LocStsType.LOC_STS_TYPE_O.type);
+                locMast.setBarcode("");
+                locMast.setModiTime(now);
+                locMast.setIoTime(now);
+                if (!locCacheService.updateById(locMast)) {
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return FAIL.setMsg("鍏ㄦ澘鍑哄簱 ===>> 淇敼婧愬簱浣嶇姸鎬佸け璐�; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
+                }
+            } else {
+                throw new CoolException("褰撳墠搴撲綅鐘舵��" + locMast.getLocSts() + ", 鏃犳硶鎵ц鍑哄簱鎿嶄綔锛侊紒");
+            }
+
+            BasStation devNo = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getStaNo()));
+            if (Objects.isNull(devNo)) {
+                throw new CoolException("绔欑偣锛�" + task.getSourceStaNo() + ", 涓嶅瓨鍦紒锛�");
+            }
+            devNo.setLocSts(LocStsType.LOC_STS_TYPE_F.type);
+            devNo.setModiTime(new Date());
+            if (!basStationService.updateById(devNo)) {
+                throw new CoolException("绔欑偣淇℃伅淇敼澶辫触锛侊紒");
+            }
+//            task.setWrkSts(15L);
+//            if (!taskService.updateById(task)) {
+//                throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+//            }
+        } else {
+
+        }
+        return SUCCESS;
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    public ReturnT<String> agvDoIn(Task wrkMast) {
         LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", wrkMast.getLocNo()));
         if (Objects.isNull(locCache)) {
             throw new CoolException("鏁版嵁閿欒锛屽簱浣嶄笉瀛樺湪锛侊紒");
         }
         if (!locCache.getLocSts().equals(LocStsType.LOC_STS_TYPE_S.type)) {
-            throw new CoolException("褰撳墠搴撲綅鐘舵�佷负锛�" +  LocStsType.LOC_STS_TYPE_S.type +  "." +  LocStsType.LOC_STS_TYPE_S.desc  + "锛屼笉鏄嚭搴撻绾︾姸鎬�");
+            throw new CoolException("褰撳墠搴撲綅鐘舵�佷负锛�" + LocStsType.LOC_STS_TYPE_S.type + "." + LocStsType.LOC_STS_TYPE_S.desc + "锛屼笉鏄嚭搴撻绾︾姸鎬�");
         }
         List<WaitPakin> apallet = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", wrkMast.getBarcode()));
         if (Objects.isNull(apallet)) {
@@ -626,17 +719,6 @@
         if (Objects.isNull(pakins) || pakins.isEmpty()) {
             throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
         }
-
-//        pakins.forEach(orderPakin -> {
-//            orderPakin.setSettle(4L);
-//            if (!orderPakinService.updateById(orderPakin)) {
-//                throw new CoolException("鍗曟嵁淇敼澶辫触锛侊紒");
-//            }
-//            List<OrderDetlPakin> detlPakins = orderDetlPakinService.selectList(new EntityWrapper<OrderDetlPakin>().eq("order_id", orderPakin.getId()));
-//            if (Objects.isNull(detlPakins) || detlPakins.isEmpty()) {
-//                throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�");
-//            }
-//        });
 
         return SUCCESS;
     }
diff --git a/src/main/java/com/zy/common/CodeBuilder.java b/src/main/java/com/zy/common/CodeBuilder.java
index e83f56e..ed14c1d 100644
--- a/src/main/java/com/zy/common/CodeBuilder.java
+++ b/src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@
         generator.url="127.0.0.1:1433;databasename=jsxswms";
         generator.username="sa";
         generator.password="Skyouc#23";
-        generator.table="agv_task_detl_log";
+        generator.table="asr_bas_container";
         generator.packagePath="com.zy.asrs";
         generator.build();
     }
diff --git a/src/main/resources/mapper/BasContainerMapper.xml b/src/main/resources/mapper/BasContainerMapper.xml
new file mode 100644
index 0000000..844171a
--- /dev/null
+++ b/src/main/resources/mapper/BasContainerMapper.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.BasContainerMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasContainer">
+        <id column="Id" property="Id" />
+        <result column="barcode" property="barcode" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/webapp/static/js/basContainer/basContainer.js b/src/main/webapp/static/js/basContainer/basContainer.js
new file mode 100644
index 0000000..e63b6af
--- /dev/null
+++ b/src/main/webapp/static/js/basContainer/basContainer.js
@@ -0,0 +1,249 @@
+var pageCurr;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#basContainer',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/basContainer/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-120',
+        cols: [[
+            {type: 'checkbox'}
+            ,{field: 'barcode', align: 'center',title: '瀹瑰櫒缂栫爜'}
+            ,{field: 'type$', align: 'center',title: '瀹瑰櫒绫诲瀷'}
+            ,{field: 'flagMix$', align: 'center',title: '鏄惁娣锋斁'}
+            ,{field: 'mixMax', align: 'center',title: '娣锋斁绉嶇被'}
+            ,{field: 'createTime', align: 'center',title: '鍒涘缓鏃堕棿'}
+            ,{field: 'updateTime', align: 'center',title: '淇敼鏃堕棿'}
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:120}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(basContainer)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {curr: 1}
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(basContainer)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch(obj.event) {
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+               if (checkStatus.length === 0) {
+                   layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                   return;
+               }
+               del(checkStatus.map(function (d) {
+                   return d.id;
+               }));
+               break;
+            case 'exportData':
+                admin.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'basContainer': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/basContainer/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(basContainer)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case "del":
+                del([data.id]);
+                break;
+        }
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '璁㈠崟鐘舵��',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                layDateRender(mData);
+                form.val('detail', mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/basContainer/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            $.ajax({
+                url: baseUrl+"/basContainer/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                        tableReload();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '.layui-laydate-range'
+                ,type: 'datetime'
+                ,range: true
+            });
+
+        }, 300);
+    }
+    layDateRender();
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    tableIns.reload({
+        where: searchData,
+        page: {curr: pageCurr}
+     });
+}
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index 9328d87..e003331 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -183,9 +183,7 @@
     {field: 'matnr', align: 'center',title: '鍟嗗搧缂栧彿锛堝搧鍙凤級', width: 180}
     // {field: 'id', align: 'center',title: 'ID'}
     // ,{field: 'uuid', align: 'center',title: '缂栧彿'}
-    // ,{field: 'tagId$', align: 'center',title: '鎵�灞炲綊绫�'}
     ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О锛堝搧鍚嶏級', width: 200}
-    // ,{field: 'name', align: 'center',title: '鍒悕'}
     ,{field: 'specs', align: 'center',title: '瑙勬牸'}
     ,{field: 'model', align: 'center',title: '浠g爜', hide: true}
     ,{field: 'color', align: 'center',title: '棰滆壊', hide: true}
diff --git a/src/main/webapp/static/js/mat/mat.js b/src/main/webapp/static/js/mat/mat.js
index 2805440..3e02ded 100644
--- a/src/main/webapp/static/js/mat/mat.js
+++ b/src/main/webapp/static/js/mat/mat.js
@@ -5,9 +5,10 @@
     var cols = [
         {type: 'checkbox'}
         ,{field: 'tagId$', align: 'center',title: '褰掔被', templet: '#tagTpl'}
-        ,{field: 'store_max', align: 'center',title: '搴撳瓨涓婇檺'}
-        ,{field: 'store_min', align: 'center',title: '搴撳瓨涓嬮檺'}
-        ,{field: 'store_max_date', align: 'center',title: '搴撻緞涓婇檺(澶�)'}
+        ,{field: 'locType$', align: 'center',title: '搴撲綅绫诲瀷'}
+        // ,{field: 'store_max', align: 'center',title: '搴撳瓨涓婇檺'}
+        // ,{field: 'store_min', align: 'center',title: '搴撳瓨涓嬮檺'}
+        // ,{field: 'store_max_date', align: 'center',title: '搴撻緞涓婇檺(澶�)'}
     ];
     cols.push.apply(cols, matCols);
     cols.push(
diff --git a/src/main/webapp/static/js/task/task.js b/src/main/webapp/static/js/task/task.js
index 618cef1..6235ea8 100644
--- a/src/main/webapp/static/js/task/task.js
+++ b/src/main/webapp/static/js/task/task.js
@@ -22,23 +22,23 @@
         height: 'full-120',
         cols: [[
             {type: 'checkbox'}
-            , {field: 'wrkNo', align: 'center', title: '宸ヤ綔鍙�', sort: true, width: 115}
+            , {field: 'wrkNo', align: 'center', title: '宸ヤ綔鍙�', sort: true, width: 105}
             , {field: 'ioTime$', align: 'center', title: '宸ヤ綔鏃堕棿', width: 160}
             , {field: 'wrkSts$', align: 'center', title: '宸ヤ綔鐘舵��', width: 150}
             , {field: 'ioType$', align: 'center', title: '鍏ュ嚭搴撶被鍨�', width: 150}
-            , {field: 'ioPri', align: 'center', title: '浼樺厛绾�'}
+            , {field: 'ioPri', align: 'center', title: '浼樺厛绾�', width: 80}
             , {field: 'taskType$', align: 'center', title: '浠诲姟绫诲瀷'}
             , {field: 'crnNo$', align: 'center', title: '鍫嗗灈鏈�', hide: true}
             , {field: 'sourceStaNo$', align: 'center', title: '婧愮珯'}
-            , {field: 'staNo$', align: 'center', title: '鐩爣绔�'}
-            , {field: 'sourceLocNo', align: 'center', title: '婧愬簱浣�'}
-            , {field: 'locNo', align: 'center', title: '鐩爣搴撲綅'}
-            , {field: 'barcode', align: 'center', title: '鏉$爜'}
+            , {field: 'staNo$', align: 'center', title: '鐩爣绔�', width: 120}
+            , {field: 'sourceLocNo', align: 'center', title: '婧愬簱浣�', width: 120}
+            , {field: 'locNo', align: 'center', title: '鐩爣搴撲綅', width: 120}
+            , {field: 'barcode', align: 'center', title: '鏉$爜', width: 110}
             , {field: 'preHave', align: 'center', title: '鍏堝叆鍝�', hide: true}
             , {field: 'takeNone', align: 'center', title: '绌烘搷浣�', hide: true}
             , {field: 'modiUser$', align: 'center', title: '淇敼浜哄憳', hide: true}
             , {field: 'modiTime$', align: 'center', title: '淇敼鏃堕棿', hide: true, width: 160}
-            , {fixed: 'right', title: '鎿嶄綔', align: 'center', toolbar: '#operate', width: 250}
+            , {fixed: 'right', title: '鎿嶄綔', align: 'center', toolbar: '#operate', width: 200}
         ]],
         request: {
             pageName: 'curr',
diff --git a/src/main/webapp/views/basContainer/basContainer.html b/src/main/webapp/views/basContainer/basContainer.html
new file mode 100644
index 0000000..f4ee0cf
--- /dev/null
+++ b/src/main/webapp/views/basContainer/basContainer.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-form toolbar" id="search-box">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="id" placeholder="缂栧彿" autocomplete="off">
+                        </div>
+                    </div>
+                     <div class="layui-inline" style="width: 300px">
+                        <div class="layui-input-inline">
+                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="condition" placeholder="璇疯緭鍏�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">&emsp;
+                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                            <i class="layui-icon">&#xe666;</i>閲嶇疆
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="basContainer" lay-filter="basContainer"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">鍒犻櫎</a>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/basContainer/basContainer.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
+        <input name="id" type="hidden">
+        <div class="layui-row">
+            <div class="layui-col-md12">
+                <div class="layui-form-item">
+                    <label class="layui-form-label">瀹瑰櫒缂栫爜: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="barcode" placeholder="璇疯緭鍏ュ鍣ㄧ紪鐮�">
+                    </div>
+                </div>
+
+             </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+</html>
+
diff --git a/src/main/webapp/views/basStation/basStation.html b/src/main/webapp/views/basStation/basStation.html
index 33836e2..ec8de94 100644
--- a/src/main/webapp/views/basStation/basStation.html
+++ b/src/main/webapp/views/basStation/basStation.html
@@ -73,6 +73,9 @@
         <div class="layui-row">
             <div class="layui-col-md12">
                 <div class="layui-form-item">
+                    <input class="layui-input" name="id" style="display: none">
+                </div>
+                <div class="layui-form-item">
                     <label class="layui-form-label layui-form-required">缂栧彿: </label>
                     <div class="layui-input-block">
                         <input class="layui-input" name="devNo" placeholder="璇疯緭鍏ョ紪鍙�" lay-vertype="tips"

--
Gitblit v1.9.1