From 4b3fd35893972bb05fd7ab89dc624ab805093ff3 Mon Sep 17 00:00:00 2001
From: zs <zhousong@weben-smart.com>
Date: 周日, 18 5月 2025 19:47:46 +0800
Subject: [PATCH] Merge branch 'master' of http://222.71.245.114:9086/r/HIA24016N_PipeLineDemo

---
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs                                                                        |  460 +++
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeld.ts                                                                   |  275 ++
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.module.scss                                        |  253 ++
 HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs                                                                                |   73 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyQueryDrawer.ts                                                     |   44 
 HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/QueryTaskTypeInput.cs                                                                   |   25 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldQueryDrawer.ts                                                             |   44 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/index.ts                                                                                           |   14 
 HIAWms/server/src/CMS.Plugin.HIAWms/Controller/LMesOperateController.cs                                                                                        |   38 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx                       |   61 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.module.scss                                                                |    7 
 HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsTaskController.cs                                                                                            |   17 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickQueryDrawer.ts                                                     |   35 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx         |   71 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/type/type.d.ts                                                                                     |   45 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.tsx                                                                        |   80 
 Weben_CMS专用代码生成器/Code/Templete/AppService/IAppService模板.txt                                                                                                    |   14 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/Config.ts                                                            |   27 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/File.ts                                                                                |   31 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.module.scss                            |  253 ++
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPick.ts                                                                        |   41 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss               |    3 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.tsx                                                                |   80 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.tsx                                                                        |   80 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/enum.ts                                                                                        |   15 
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanController.cs                                                                               |   26 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyDrawer.ts                                                          |   44 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/type/type.d.ts                                                                                     |   45 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyQueryDrawer.ts                                             |   35 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.tsx                                                |  360 +++
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickQueryDrawer.tsx                                                       |  181 +
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs                                                                   |   53 
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanPublicController.cs                                                                         |   98 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.tsx                                    |  360 +++
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/type/type.d.ts                                                                                 |   45 
 HIAWms/server/src/CMS.Plugin.HIAWms/CMS.Plugin.HIAWms.csproj                                                                                                   |    2 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickDrawer.ts                                                          |   34 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldDrawer.ts                                                          |   34 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx                   |   61 
 PipeLineLems/pipelinelems_web/src/images/pipe-assembly-drawing-example.png                                                                                     |    0 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/File.ts                                                                            |   31 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx                       |   61 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/File.ts                                                                                |   31 
 HIAWms/hiawms_web/components.d.ts                                                                                                                              |    3 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssembly.ts                                                                |   41 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyQueryDrawer.tsx                                               |  181 +
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.module.scss                                                                |    7 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/Config.ts                                                            |   27 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss     |    3 
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs                                                          |   17 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyDrawer.ts                                                  |   34 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickDrawer.ts                                                                  |   44 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss           |    3 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss |    3 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx             |   71 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldQueryDrawer.ts                                                     |   35 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/enum.ts                                                                                            |   15 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.module.scss                                        |  253 ++
 HIAWms/hiawms_web/.vscode/settings.json                                                                                                                        |    7 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssembly.ts                                                           |  275 ++
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/CompleteAssemblyProcessInput.cs                                            |   29 
 PipeLineLems/pipelinelems_web/src/images/pipe-Weld-drawing-example.png                                                                                         |    0 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx             |   71 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyDrawer.tsx                                                    |  190 +
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldDrawer.ts                                                                  |   44 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.module.scss                                                        |    7 
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/StartProductionInput.cs                                                    |   28 
 PipeLineLems/pipelinelems_web/src/config/menu.ts                                                                                                               |   42 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss     |    3 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/config/PipeAccessoryWeld.json                                                                |    3 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickDrawer.tsx                                                            |  190 +
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/config/PipeAccessoryPick.json                                                                |    3 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssembly.ts                                                        |   79 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldDrawer.tsx                                                            |  190 +
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPick.ts                                                                   |  275 ++
 PipeLineLems/pipelinelems_web/src/widgets/WorkPlan/Views/Pages/WorkPlan/Config.ts                                                                              |   32 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeld.ts                                                                |   79 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPick.ts                                                                |   87 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickQueryDrawer.ts                                                             |   44 
 HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsTaskAppService.cs                                                                       |    9 
 管子线LMESDemo.cmsproj                                                                                                                                            |    0 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/enum.ts                                                                                            |   15 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/Config.ts                                                    |   27 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldQueryDrawer.tsx                                                       |  181 +
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss               |    3 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.tsx                                                |  367 +++
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/index.ts                                                                                       |   14 
 HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/WmsTaskDto.cs                                                                           |    5 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeld.ts                                                                        |   41 
 Weben_CMS专用代码生成器/Code/Templete/AppService/AppService模板.txt                                                                                                     |   51 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/index.ts                                                                                           |   14 
 Weben_CMS专用代码生成器/Code/Templete/Controller模板.txt                                                                                                                |   24 
 PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/config/PipeAccessoryAssembly.json                                                        |    3 
 PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs                                                                   |  146 +
 94 files changed, 6,860 insertions(+), 42 deletions(-)

diff --git a/HIAWms/hiawms_web/.vscode/settings.json b/HIAWms/hiawms_web/.vscode/settings.json
index 9e26dfe..728a996 100644
--- a/HIAWms/hiawms_web/.vscode/settings.json
+++ b/HIAWms/hiawms_web/.vscode/settings.json
@@ -1 +1,6 @@
-{}
\ No newline at end of file
+{
+    "i18n-ally.localesPaths": [
+        "public/language",
+        "src/libs/Language/i18n"
+    ]
+}
\ No newline at end of file
diff --git a/HIAWms/hiawms_web/components.d.ts b/HIAWms/hiawms_web/components.d.ts
index 135cdd6..988c7da 100644
--- a/HIAWms/hiawms_web/components.d.ts
+++ b/HIAWms/hiawms_web/components.d.ts
@@ -21,6 +21,8 @@
     Dialog: typeof import('./src/components/Dialog/index.vue')['default']
     ElButton: typeof import('element-plus/es')['ElButton']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+    ElCollapse: typeof import('element-plus/es')['ElCollapse']
+    ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElDialog: typeof import('element-plus/es')['ElDialog']
@@ -42,6 +44,7 @@
     ElPopover: typeof import('element-plus/es')['ElPopover']
     ElRadio: typeof import('element-plus/es')['ElRadio']
     ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElSwitch: typeof import('element-plus/es')['ElSwitch']
     ElTabPane: typeof import('element-plus/es')['ElTabPane']
     ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/QueryTaskTypeInput.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/QueryTaskTypeInput.cs
index 15b99a7..dbb143e 100644
--- a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/QueryTaskTypeInput.cs
+++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/QueryTaskTypeInput.cs
@@ -12,6 +12,31 @@
     /// </summary>
     public class QueryTaskTypeInput
     {
+        /// <summary>
+        /// 浠诲姟绫诲瀷
+        /// </summary>
         public TaskTypeEnum TaskType { get; set; }
+
+        /// <summary>
+        /// 鍏ュ簱鍙f湁璐�
+        /// </summary>
+        public bool InStockHasGood { get; set; }
+
+        /// <summary>
+        /// 鍑哄簱鍙f湁璐�
+        /// </summary>
+        public bool OutStockHasGood { get; set; }
+
+    }
+
+    /// <summary>
+    /// 涓嬪彂瀹屾垚鐨勪换鍔″叆鍙�.
+    /// </summary>
+    public class ExcecuteTaskInput
+    {
+        /// <summary>
+        /// 浠诲姟鍙�
+        /// </summary>
+        public string TaskNo { get; set;}
     }
 }
diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/WmsTaskDto.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/WmsTaskDto.cs
index 36eb5c1..91a608e 100644
--- a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/WmsTaskDto.cs
+++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/WmsTaskDto.cs
@@ -29,6 +29,7 @@
     {
         get
         {
+            if (TaskType == 0) return "";
             return GetEnumDescriptionUtil.GetEnumDescription(TaskType);
         }
     }
@@ -49,6 +50,7 @@
     {
         get
         {
+            if (TaskStatus == 0) return "";
             return GetEnumDescriptionUtil.GetEnumDescription(TaskStatus);
         }
     }
@@ -95,6 +97,7 @@
     {
         get
         {
+            if (Dodevicetype == 0) return "";
             return GetEnumDescriptionUtil.GetEnumDescription(Dodevicetype);
         }
     }
@@ -111,6 +114,7 @@
     {
         get
         {
+            if (TaskDodeviceStatus == 0) return "";
             return GetEnumDescriptionUtil.GetEnumDescription(TaskDodeviceStatus);
         }
     }
@@ -132,6 +136,7 @@
     {
         get
         {
+            if (SonTaskType == 0 || !SonTaskType.HasValue) return "";
             return GetEnumDescriptionUtil.GetEnumDescription(SonTaskType);
         }
     }
diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsTaskAppService.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsTaskAppService.cs
index 7f6670c..b86ef51 100644
--- a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsTaskAppService.cs
+++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsTaskAppService.cs
@@ -49,7 +49,7 @@
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    Task FinishTaskAsync(WmsTaskStatusDto input);
+    Task<WmsTaskDto> FinishTaskAsync(WmsTaskStatusDto input);
 
     /// <summary>
     /// 鍙栨秷浠诲姟
@@ -71,4 +71,11 @@
     /// <param name="input"></param>
     /// <returns></returns>
     Task<WmsTaskDto> GetToExecuteTaskAsync(QueryTaskTypeInput input);
+
+    /// <summary>
+    /// 鏇存柊浠诲姟涓烘墽琛屼腑
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    Task<WmsTaskDto> StartExecuteTaskAsync(ExcecuteTaskInput input);
 } 
diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs
index 7ede721..fdb8c6f 100644
--- a/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs
+++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs
@@ -526,8 +526,12 @@
     /// <param name="input"></param>
     /// <returns></returns>
     /// <exception cref="UserFriendlyException"></exception>
-    public async Task FinishTaskAsync(WmsTaskStatusDto input)
+    public async Task<WmsTaskDto> FinishTaskAsync(WmsTaskStatusDto input)
     {
+        if (string.IsNullOrEmpty(input.TaskNo))
+        {
+            throw new UserFriendlyException("浠诲姟鍙蜂笉鑳戒负绌�");
+        }
         using var scope = _serviceProvider.CreateScope();
         var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
         using var uow = unitOfWorkManager.Begin(requiresNew: true);
@@ -640,6 +644,8 @@
 
         await uow.SaveChangesAsync();
         await uow.CompleteAsync();
+
+        return ObjectMapper.Map<WmsTask, WmsTaskDto>(task);
     }
 
     /// <summary>
@@ -650,7 +656,10 @@
     /// <exception cref="UserFriendlyException"></exception>
     public async Task CancelTaskAysnc(WmsTaskStatusDto input)
     {
-
+        if (string.IsNullOrEmpty(input.TaskNo))
+        {
+            throw new UserFriendlyException("浠诲姟鍙蜂笉鑳戒负绌�");
+        }
         using var scope = _serviceProvider.CreateScope();
         var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
         using var uow = unitOfWorkManager.Begin(requiresNew: true);
@@ -705,7 +714,13 @@
     /// <exception cref="UserFriendlyException"></exception>
     public async Task ChangeTaskToPlaceAsync(ChangeTaskToPlaceInput input)
     {
-        var task = await wmsTaskRepository.FindByNameAsync(input.TaskNo); 
+
+        if (string.IsNullOrEmpty(input.TaskNo))
+        {
+            throw new UserFriendlyException("浠诲姟鍙蜂笉鑳戒负绌�");
+        }
+
+        var task = await wmsTaskRepository.FindByNameAsync(input.TaskNo);
         if (task == null)
         {
             throw new UserFriendlyException("浠诲姟淇℃伅涓嶅瓨鍦�");
@@ -722,13 +737,13 @@
             throw new UserFriendlyException("鐩爣搴撲綅淇℃伅涓嶅瓨鍦�");
         }
 
-        if(toPlaceInfo.IsDisabled)
+        if (toPlaceInfo.IsDisabled)
         {
             throw new UserFriendlyException("鐩爣搴撲綅宸茶绂佺敤");
         }
 
         var toplaceStock = await _wmsMaterialStockRepository.GetStockListAsync(new WmsMaterialStock { PlaceNo = input.ToPlace });
-        if (toplaceStock != null && toplaceStock.Count>0)
+        if (toplaceStock != null && toplaceStock.Count > 0)
         {
             var model = toplaceStock.FirstOrDefault();
             if (model.MaterialModel != input.MutableParam1)
@@ -755,14 +770,56 @@
         var whereConditions = DynamicGetQueryParams(queryInput);
 
         var NoStartTaskList = await wmsTaskRepository.GetTaskListAsync(whereConditions);
-        if(NoStartTaskList.Count<=0) return null;
 
-        var executeTask = NoStartTaskList.FirstOrDefault(x=>x.TaskType == input.TaskType);
-        if(executeTask == null)
+
+        if (NoStartTaskList.Count <= 0) return null;
+
+        var executeTaskList = NoStartTaskList.WhereIf(input.TaskType > 0, x => x.TaskType == input.TaskType).OrderBy(x => x.TaskType).ThenBy(x => x.TaskLevel).ToList();
+
+        var executeTask = executeTaskList.FirstOrDefault();
+        if (input.OutStockHasGood)
+        {
+            executeTask = NoStartTaskList.OrderByDescending(x => x.TaskType == TaskTypeEnum.RUKU).ThenBy(x => x.TaskLevel).FirstOrDefault();
+        }
+
+        if (executeTask == null)
         {
             return ObjectMapper.Map<WmsTask, WmsTaskDto>(NoStartTaskList.FirstOrDefault());
         }
 
+        if (executeTask.TaskType == TaskTypeEnum.CHUKU && input.OutStockHasGood)
+        {
+            return null;
+        }
+
+        if(executeTask.TaskType == TaskTypeEnum.RUKU && !input.InStockHasGood)
+        {
+            return null;
+        }
+
         return ObjectMapper.Map<WmsTask, WmsTaskDto>(executeTask);
     }
+  
+
+    /// <summary>
+    /// 鏇存柊浠诲姟涓烘墽琛屼腑
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    public async Task<WmsTaskDto> StartExecuteTaskAsync(ExcecuteTaskInput input)
+    {
+        if (string.IsNullOrEmpty(input.TaskNo))
+        {
+            throw new UserFriendlyException("浠诲姟鍙蜂笉鑳戒负绌�");
+        }
+        var task = await wmsTaskRepository.FindByNameAsync(input.TaskNo);
+        if(task == null)
+        {
+            return null;
+        }
+        task.TaskStatus = WmsTaskStatus.ZHIXINGZHONG;
+        task.TaskDodeviceStatus = TaskDodeviceStatus.SrmProgress;
+         await wmsTaskRepository.UpdateAsync(task);
+        return ObjectMapper.Map<WmsTask, WmsTaskDto>(task);
+    }
 }
diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms/CMS.Plugin.HIAWms.csproj b/HIAWms/server/src/CMS.Plugin.HIAWms/CMS.Plugin.HIAWms.csproj
index 69a13a5..5879009 100644
--- a/HIAWms/server/src/CMS.Plugin.HIAWms/CMS.Plugin.HIAWms.csproj
+++ b/HIAWms/server/src/CMS.Plugin.HIAWms/CMS.Plugin.HIAWms.csproj
@@ -11,7 +11,7 @@
     </PropertyGroup>
 
     <PropertyGroup Condition="$([MSBuild]::IsOSPlatform('Windows'))">
-        <CMSRootPath>D:\syc\CMS Editor</CMSRootPath>
+        <CMSRootPath>E:\syc_cms\CMS Editor</CMSRootPath>
         <OutputPath>$(CMSRootPath)\plugins\cms.plugin.hiawms</OutputPath>
     </PropertyGroup>
 
diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/LMesOperateController.cs b/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/LMesOperateController.cs
index 50523df..db6a442 100644
--- a/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/LMesOperateController.cs
+++ b/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/LMesOperateController.cs
@@ -1,5 +1,6 @@
 锘縰sing CMS.Extensions.Abp.AspNetCore.Mvc.Filters;
 using CMS.Plugin.HIAWms.Application.Contracts.Dtos.CommonDto;
+using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
 using CMS.Plugin.HIAWms.Application.Contracts.Services;
 using CmsQueryExtensions.Entitys;
 using Microsoft.AspNetCore.Mvc;
@@ -20,10 +21,12 @@
     public class LMesOperateController : ControllerBase
     {
         private readonly ILMesOperateAppService _mesOperateAppService;
+        private readonly IWmsMaterialStockAppService _wmsmaterialstockAppService;
 
-        public LMesOperateController(ILMesOperateAppService mesOperateAppService)
+        public LMesOperateController(ILMesOperateAppService mesOperateAppService, IWmsMaterialStockAppService wmsmaterialstockAppService)
         {
             _mesOperateAppService = mesOperateAppService;
+            _wmsmaterialstockAppService = wmsmaterialstockAppService;
         }
 
         /// <summary>
@@ -57,5 +60,38 @@
             }
 
         }
+
+
+        /// <summary>
+        /// LMes缁勭洏
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("LMes鈥嬧�婸alletizing鈥嬧��")]
+        public async Task<CmsApiResponse<WmsMaterialStockDto>> LMes鈥嬧�婸alletizing鈥嬧�婣sync(WmsMaterialStockCreateDto input)
+        {
+            try
+            {
+                var list = await _wmsmaterialstockAppService.CreateAsync(input);
+                return new CmsApiResponse<WmsMaterialStockDto>()
+                {
+                    Data = list,
+                    Code = 200,
+                    Message = "LMes缁勭洏鎴愬姛"
+                };
+            }
+            catch (Exception ex)
+            {
+                //throw; //涓嶈鎶涘嚭寮傚父锛屽惁鍒欏鏂逛細鎺ユ敹澶辫触鍛�
+                return new CmsApiResponse<WmsMaterialStockDto>()
+                {
+                    Data = null,
+                    Code = 500,
+                    Message = ex.Message
+                };
+            }
+
+        }
     }
 }
diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsTaskController.cs b/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsTaskController.cs
index e67e967..38201ac 100644
--- a/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsTaskController.cs
+++ b/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsTaskController.cs
@@ -192,9 +192,9 @@
         /// <returns></returns>
         [HttpPost]
         [Route("FinishTask")]
-        public async Task FinishTaskAsync(WmsTaskStatusDto input)
+        public async Task<WmsTaskDto> FinishTaskAsync(WmsTaskStatusDto input)
         {
-            await _wmsTaskAppService.FinishTaskAsync(input);
+            return await _wmsTaskAppService.FinishTaskAsync(input);
         }
 
         /// <summary>
@@ -227,10 +227,21 @@
         /// <param name="input"></param>
         /// <returns></returns>
         [HttpPost]
-        [Route("ToExecuteTask")]
+        [Route("GetExecuteTask")]
         public async Task<WmsTaskDto> GetToExecuteTaskAsync(QueryTaskTypeInput input)
         {
             return await _wmsTaskAppService.GetToExecuteTaskAsync(input);
         }
+        /// <summary>
+        /// 鏇存柊浠诲姟涓烘墽琛屼腑
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("ToExecuteTask")]
+        public async Task<WmsTaskDto> StartExecuteTaskAsync(ExcecuteTaskInput input)
+        {
+            return await _wmsTaskAppService.StartExecuteTaskAsync(input);
+        }
     } 
 } 
diff --git a/PipeLineLems/pipelinelems_web/src/config/menu.ts b/PipeLineLems/pipelinelems_web/src/config/menu.ts
index 286eb63..f52b44f 100644
--- a/PipeLineLems/pipelinelems_web/src/config/menu.ts
+++ b/PipeLineLems/pipelinelems_web/src/config/menu.ts
@@ -7,6 +7,27 @@
     "notPage": false
   },
   {
+    "name": "绠¢檮浠剁剨鎺�",
+    "path": "/information-base/PipeAccessoryWeld",
+    "patchName": "PipeAccessoryWeld",
+    "icon": "p",
+    "notPage": false
+  },
+  {
+    "name": "鍒嗘嫞",
+    "path": "/information-base/PipeAccessoryPick",
+    "patchName": "PipeAccessoryPick",
+    "icon": "p",
+    "notPage": false
+  },
+  {
+    "name": "绠¢檮浠惰閰�",
+    "path": "/information-base/PipeAccessoryAssembly",
+    "patchName": "PipeAccessoryAssembly",
+    "icon": "p",
+    "notPage": false
+  },
+  {
     "name": "宸ュ崟绠$悊(鏂�)",
     "path": "/information-base/OrderManagement-main",
     "patchName": "OrderManagement-main",
@@ -50,6 +71,27 @@
     "icon": "p",
     "notPage": false
   },
+  "PipeAccessoryWeld": {
+    "name": "绠¢檮浠剁剨鎺�",
+    "path": "/information-base/PipeAccessoryWeld",
+    "patchName": "PipeAccessoryWeld",
+    "icon": "p",
+    "notPage": false
+  },
+  "PipeAccessoryPick": {
+    "name": "鍒嗘嫞",
+    "path": "/information-base/PipeAccessoryPick",
+    "patchName": "PipeAccessoryPick",
+    "icon": "p",
+    "notPage": false
+  },
+  "PipeAccessoryAssembly": {
+    "name": "绠¢檮浠惰閰�",
+    "path": "/information-base/PipeAccessoryAssembly",
+    "patchName": "PipeAccessoryAssembly",
+    "icon": "p",
+    "notPage": false
+  },
   "OrderManagement-main": {
     "name": "宸ュ崟绠$悊(鏂�)",
     "path": "/information-base/OrderManagement-main",
diff --git a/PipeLineLems/pipelinelems_web/src/images/pipe-Weld-drawing-example.png b/PipeLineLems/pipelinelems_web/src/images/pipe-Weld-drawing-example.png
new file mode 100644
index 0000000..098bc13
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/images/pipe-Weld-drawing-example.png
Binary files differ
diff --git a/PipeLineLems/pipelinelems_web/src/images/pipe-assembly-drawing-example.png b/PipeLineLems/pipelinelems_web/src/images/pipe-assembly-drawing-example.png
new file mode 100644
index 0000000..4f57200
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/images/pipe-assembly-drawing-example.png
Binary files differ
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/File.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/File.ts
new file mode 100644
index 0000000..9162fef
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/File.ts
@@ -0,0 +1,31 @@
+import { importFileToService, exportFileToClient } from '@/api/file' 
+import { ElMessage } from 'element-plus' 
+import { downloadFile } from '@/utils' 
+import dayjs from 'dayjs' 
+ 
+export const useFile = () => { 
+  /** 
+   * 瀵煎叆鏂囦欢 
+   * @param url 
+   */ 
+  const importFile = async (url: string, file: File) => { 
+    const formData = new FormData() 
+    formData.append('file', file) 
+    await importFileToService(url, formData) 
+    ElMessage('瀵煎叆鎴愬姛') 
+  } 
+  /** 
+   * 瀵煎嚭鏂囦欢 
+   * @param url 
+   */ 
+  const exportFile = async (url: string, params: any, name: string) => { 
+    const res = await exportFileToClient(url, params) 
+    downloadFile(res, `${name}_${dayjs().format('YYYYMMDDHHMMss')}.xlsx`) 
+    ElMessage.success('瀵煎嚭鎴愬姛') 
+  } 
+ 
+  return { 
+    importFile, 
+    exportFile, 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssembly.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssembly.ts
new file mode 100644
index 0000000..1c9df89
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssembly.ts
@@ -0,0 +1,275 @@
+import { ref, onMounted, reactive, Ref, nextTick, computed } from 'vue' 
+import { injectModel } from '@/libs/Provider/Provider' 
+import { WmsMaterialContainer } from '../Models/PipeAccessoryAssembly' 
+import { ElMessage } from 'element-plus' 
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox' 
+import { useFile } from './File' 
+ 
+interface CurrentType { 
+  row: any 
+  index: number 
+} 
+export const useWmsMaterialContainer = (props: any, ctx?: any) => { 
+  const wmsMaterialContainer = injectModel<WmsMaterialContainer>('wmsMaterialContainer') 
+  const { exportFile } = useFile() 
+  /** 
+   * 澶撮儴閰嶇疆 
+   */ 
+  const headers = ref({}) 
+  /** 
+   * 鍔ㄦ�佸垪閰嶇疆 
+   */ 
+  const wmsMaterialContainerColumns = ref<Record<string, any>>([]) 
+  /** 
+   * 鎼滅储鍊� 
+   */ 
+  const search = ref('') 
+ 
+  /** 
+   * 鎺掑簭 
+   */ 
+  const sort = ref(0) 
+  /** 
+   * 閫夋嫨椤� 
+   */ 
+  const selection = ref([]) 
+  /** 
+   * 褰撳墠閫変腑鐨勮 
+   */ 
+  const current = ref<any>(null) 
+  /** 
+   * 鏁版嵁婧� 
+   */ 
+  const dataSource: Ref<any[]> = ref([]) 
+ 
+  /** 
+   * 琛ㄦ牸 
+   */ 
+  const tableRef = ref() 
+  const dialogConfig = reactive({ 
+    visible: false, 
+    title: '', 
+    isAdd: false, 
+  }) 
+  const dialogConfigForQuery = reactive({ 
+    visible: false, 
+    title: '', 
+    isAdd: false, 
+  }) 
+ 
+ 
+  const dialogSettingConfig = reactive({ 
+    visible: false, 
+    title: '', 
+  }) 
+ 
+  /** 
+   * 鍒嗛〉鏁版嵁 
+   */ 
+  const paginationParams = ref({}) 
+ 
+  /** 
+   * 鎵撳紑璇︽儏 
+   * @param row 
+   */ 
+  const openDetail = (row: any) => { 
+    current.value = row 
+    dialogConfig.visible = true 
+    dialogConfig.title = row.name 
+    dialogConfig.isAdd = false 
+    sort.value = row.sort 
+  } 
+ 
+  const contextMenu = [ 
+    { 
+      label: '灞曞紑璇︽儏', 
+      fn: (c: CurrentType) => { 
+        current.value = null 
+        sort.value = c.row.sort 
+        nextTick(() => openDetail(c.row)) 
+      }, 
+      divided: true, 
+      icon: 'o', 
+    }, 
+    // { 
+    //   label: '鍚戜笂娣诲姞', 
+    //   fn: (c: CurrentType, pageNum: number) => { 
+    //     current.value = null 
+    //     sort.value = c.index + 1 + (pageNum - 1) * 50 
+    //     dialogConfig.visible = true 
+    //     dialogConfig.title = '娣诲姞' 
+    //     dialogConfig.isAdd = false 
+    //   }, 
+    //   divided: true, 
+    //   icon: 'up', 
+    // }, 
+    // { 
+    //   label: '鍚戜笅娣诲姞', 
+    //   fn: (c: CurrentType, pageNum: number) => { 
+    //     current.value = null 
+    //     sort.value = c.index + 2 + (pageNum - 1) * 50 
+    //     dialogConfig.visible = true 
+    //     dialogConfig.title = '娣诲姞' 
+    //     dialogConfig.isAdd = false 
+    //   }, 
+    //   divided: true, 
+    //   icon: 'down', 
+    // }, 
+    // { 
+    //   label: '鍒涘缓鍓湰', 
+    //   fn: async ({ row }: CurrentType) => { 
+    //     await wmsMaterialContainer.cloneData([row.id]) 
+    //     ElMessage.success('鍒涘缓鍓湰鎴愬姛') 
+    //     tableRef.value?.getList() 
+    //   }, 
+    //   divided: true, 
+    //   icon: 'copy', 
+    // }, 
+    { 
+      label: '鍒犻櫎', 
+      fn: async (c: CurrentType) => { 
+        const names = selection.value.map((item: { materialId: string }) => item.materialId) 
+        ConfirmBox( 
+          `鏄惁鍒犻櫎${names.length ? names.join(',') : c.row.materialId}` 
+        ).then(async () => { 
+          const ids = selection.value.map((item: { id: string }) => item.id) 
+          await wmsMaterialContainer.deleteWmsMaterialContainers(ids.length ? ids : [c.row.id]) 
+          ElMessage.success('鍒犻櫎鎴愬姛') 
+          tableRef.value.getList() 
+        }) 
+      }, 
+      icon: 'close', 
+    }, 
+  ] 
+ 
+  const onCheck = (records: any) => { 
+    selection.value = records 
+  } 
+ 
+  const onAddWmsMaterialContainer = () => { 
+    const params = tableRef.value?.getPaginationParams() 
+    current.value = null 
+    dialogConfig.visible = true 
+    dialogConfig.isAdd = true 
+    dialogConfig.title = '娣诲姞' 
+    sort.value = params.totalCount + 1 
+  } 
+ 
+  //鐐瑰嚮鎸夐挳銆愰珮绾ф煡璇€�� 
+  const onAdvancedQuery = () => { 
+    const params = tableRef.value?.getPaginationParams() 
+    current.value = null 
+    dialogConfigForQuery.visible = true 
+    dialogConfigForQuery.isAdd = true 
+    dialogConfigForQuery.title = '楂樼骇鏌ヨ' 
+  } 
+  
+  const onConfirmWmsMaterialContainer = async () => { 
+    dialogConfig.visible = false 
+    if (dialogConfig.isAdd) { 
+      tableRef.value?.scrollToRow({ 
+        skip: true, 
+      }) 
+    } else { 
+      await tableRef.value?.getList() 
+    } 
+  } 
+  /** 
+   * 琛岀偣鍑绘椂鏇存柊current 
+   */ 
+  const onRowClick = ({ row }: any) => { 
+    if (dialogConfig.visible && current.value) { 
+      current.value = row 
+    } 
+  } 
+  /** 
+   * 瀵煎嚭 
+   */ 
+  const onExport = (data={}) => { 
+    //const params = tableRef.value?.getParams() 
+    exportFile('/api/v1/HIAWms/wmsMaterialContainer/export', data, 'wmsMaterialContainer') 
+  } 
+ 
+  /** 
+   * 鍏抽敭瀛楁悳绱� 
+   */ 
+  const onSearch = () => { 
+    tableRef.value?.getList({ 
+      Filter: search.value, 
+    }) 
+  } 
+ 
+  /** 
+   * 閲嶇疆琛ㄦ牸鏁版嵁 
+   */ 
+  const reloadList = () => { 
+    tableRef.value?.getList() 
+  } 
+  /** 
+   * 涓婁紶鎴愬姛 
+   */ 
+  const onSuccess = () => { 
+    tableRef.value?.getList() 
+    ElMessage.success('瀵煎叆鎴愬姛') 
+  } 
+  /** 
+   * 澶辫触 
+   * @param err 
+   */ 
+  const onError = (err: any) => { 
+    try { 
+      const message = JSON.parse(err.message) 
+      ElMessage.error(message.msg) 
+    } catch (error) { 
+      ElMessage.error('瀵煎叆澶辫触') 
+    } 
+  } 
+  /** 
+   * 涓婁紶閽╁瓙 
+   */ 
+  const onBeforeUpload = (file: File) => { 
+    const format = ['xlsx', 'xls', 'csv'] 
+    if (!format.includes(file.name.split('.')[1])) { 
+      ElMessage.error('瀵煎叆鏂囦欢鏍煎紡涓嶆纭紝璇峰鍏�.xlsx/.xls涓�.csv鏍煎紡鐨勬枃浠�') 
+      return false 
+    } 
+    return true 
+  } 
+ 
+  onMounted(() => { 
+    headers.value = { 
+      Authorization: `Bearer ${sessionStorage.getItem('Token')}`, 
+      'X-Project': sessionStorage.getItem('X-Project'), 
+    } 
+  }) 
+ 
+  ctx.expose({ 
+    reloadList, 
+  }) 
+ 
+  return { 
+    dataSource, 
+    contextMenu, 
+    dialogConfig, 
+    dialogConfigForQuery, 
+    dialogSettingConfig, 
+    tableRef, 
+    current, 
+    search, 
+    sort, 
+    wmsMaterialContainerColumns, 
+    paginationParams, 
+    headers, 
+    onBeforeUpload, 
+    onError, 
+    onSuccess, 
+    openDetail, 
+    onSearch, 
+    onExport, 
+    onRowClick, 
+    onConfirmWmsMaterialContainer, 
+    onCheck, 
+    onAddWmsMaterialContainer, 
+    onAdvancedQuery 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyDrawer.tsx
new file mode 100644
index 0000000..61c6f7a
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyDrawer.tsx
@@ -0,0 +1,190 @@
+import {
+  ref,
+  onMounted,
+  reactive,
+  computed,
+  Ref,
+  watch,
+  SetupContext,
+  h,
+} from 'vue'
+import { injectModel } from '@/libs/Provider/Provider'
+import { WmsMaterialContainerDrawer } from '../Models/PipeAccessoryAssemblyDrawer'
+import { ElMessage } from 'element-plus'
+import isEqual from 'lodash/isEqual'
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
+import { cloneDeep } from 'lodash'
+
+export const useWmsMaterialContainerDrawer = (props: any, ctx?: any) => {
+  const wmsMaterialContainerDrawer = injectModel<WmsMaterialContainerDrawer>(
+    'wmsMaterialContainerDrawer'
+  )
+  /**
+   * 鐢ㄦ潵瀵规瘮鐨勫垵濮嬪寲鏁版嵁
+   */
+  const initiateData: Ref<Record<string, any>> = ref({})
+  const formData = ref<Record<string, any>>({})
+  // ref
+  const formRef = ref()
+
+  const disabled = ref(false)
+
+  const current = computed(() => {
+    return props.row || null
+  })
+
+  const datePicker = (attrs) => {
+    return (
+      <el-date-picker
+        type="date"
+        format="YYYY-MM-DD HH:mm:ss"
+        formatValue="YYYY-MM-DD HH:mm:ss"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const dateTimePicker = (attrs) => {
+    return (
+      <el-date-picker
+        type="datetime"
+        format="YYYY-MM-DD HH:mm:ss"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const visible = computed({
+    get() {
+      return props.modelValue
+    },
+    set(val) {
+      ctx.emit('update:modelValue', val)
+    },
+  })
+  /**
+   * 娣诲姞鐨刦orm瀛楁
+   */
+  const formItems = reactive([
+    {
+      label: '鎵樼洏缂栧彿',
+      prop: 'containerNo',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ユ墭鐩樼紪鍙�',
+      rules: [{ required: true, message: '鎵樼洏缂栧彿涓嶈兘涓虹┖', trigger: 'blur' }],
+    },
+    {
+      label: '鐗╂枡ID',
+      prop: 'materialId',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ョ墿鏂橧D',
+      rules: [{ required: true, message: '鐗╂枡ID涓嶈兘涓虹┖', trigger: 'blur' }],
+    },
+  ])
+  /**
+   * 鏍¢獙鏄惁鏈夋暟鎹彉鍖�
+   */
+  const checkIsEqualObject = () => {
+    const data = {
+      formData: formData.value,
+    }
+    const check = isEqual(initiateData.value, data)
+    return check
+  }
+
+  const onClose = (done: () => void) => {
+    if (visible.value) {
+      if (checkIsEqualObject()) {
+        visible.value = false
+        done && done()
+      } else {
+        ConfirmBox('鏄惁淇濆瓨璁剧疆锛�')
+          .then(() => {
+            onConfirm()
+          })
+          .catch(() => {
+            visible.value = false
+            done && done()
+          })
+      }
+    }
+  }
+  /**
+   * 淇濆瓨
+   */
+  const onConfirm = async () => {
+    await formRef.value?.validate()
+    const data = {
+      containerNo: formData.value.containerNo,
+      materialId: formData.value.materialId,
+    }
+    if (!current.value) {
+      await wmsMaterialContainerDrawer.addWmsMaterialContainer(data)
+    } else {
+      const id = current.value.id
+      await wmsMaterialContainerDrawer.updateWmsMaterialContainer(id, data)
+    }
+    ElMessage.success('淇濆瓨鎴愬姛')
+    ctx.emit('confirm')
+  }
+
+  const updateCheckData = () => {
+    initiateData.value = {
+      formData: {
+        ...formData.value,
+      },
+    }
+  }
+  const updateFormItemOptions = (propName: string, enumData: any[]) => {
+    const item = formItems.find((item) => item.prop === propName)
+    if (item && enumData) {
+      item.options = enumData.map((item) => ({
+        label: item.description,
+        value: item.value,
+      }))
+    }
+  }
+  /**
+   * 閫氱敤鏌ヨ鏋氫妇
+   */
+  const commonQueryEnumForFrom = async () => {}
+  commonQueryEnumForFrom()
+  /**
+   * 寮圭獥鎵撳紑鑾峰彇璇︽儏
+   */
+  const onOpen = async () => {
+    if (current.value) {
+      const res =
+        await wmsMaterialContainerDrawer.getWmsMaterialContainerDetail(
+          current.value
+        )
+
+      formData.value = {
+        containerNo: res.containerNo,
+        materialId: res.materialId,
+        id: res.id,
+      }
+      disabled.value = true
+      updateCheckData()
+    } else {
+      formData.value = {}
+
+      disabled.value = false
+      updateCheckData()
+    }
+  }
+
+  watch(() => current.value, onOpen)
+
+  return {
+    formItems,
+    formData,
+    visible,
+    formRef,
+    onOpen,
+    onClose,
+    onConfirm,
+  }
+}
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyQueryDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyQueryDrawer.tsx
new file mode 100644
index 0000000..2689188
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyQueryDrawer.tsx
@@ -0,0 +1,181 @@
+import {
+  ref,
+  onMounted,
+  reactive,
+  computed,
+  Ref,
+  watch,
+  SetupContext,
+  h,
+} from 'vue'
+import { injectModel } from '@/libs/Provider/Provider'
+import { WmsMaterialContainerDrawer } from '../Models/PipeAccessoryAssemblyDrawer'
+import { ElMessage } from 'element-plus'
+import isEqual from 'lodash/isEqual'
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
+import { cloneDeep } from 'lodash'
+
+export const useWmsMaterialContainerQueryDrawer = (props: any, ctx?: any) => {
+  const wmsMaterialContainerDrawer = injectModel<WmsMaterialContainerDrawer>(
+    'WmsMaterialContainerDrawer'
+  )
+  /**
+   * 鐢ㄦ潵瀵规瘮鐨勫垵濮嬪寲鏁版嵁
+   */
+  const initiateData: Ref<Record<string, any>> = ref({})
+  const formData = ref<Record<string, any>>({})
+  // ref
+  const formRef = ref()
+
+  const disabled = ref(false)
+
+  const current = computed(() => {
+    return props.row || null
+  })
+
+  const inputNumber = (attrs) => {
+    return (
+      <el-input-number
+        min="1"
+        step="1"
+        precision="0"
+        {...attrs}
+      ></el-input-number>
+    )
+  }
+
+  const datePickerRange = (attrs) => {
+    return (
+      <el-date-picker
+        type="daterange"
+        value-format="YYYY-MM-DD HH:mm:ss"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const dateTimePickerRange = (attrs) => {
+    return (
+      <el-date-picker
+        type="datetimerange"
+        value-format="YYYY-MM-DD HH:mm:ss"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const visible = computed({
+    get() {
+      return props.modelValue
+    },
+    set(val) {
+      ctx.emit('update:modelValue', val)
+    },
+  })
+  /**
+   * 娣诲姞鐨刦orm瀛楁
+   */
+  const formItems = reactive([
+    {
+      label: '鎵樼洏缂栧彿',
+      prop: 'containerNo',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ユ墭鐩樼紪鍙�',
+    },
+    {
+      label: '鐗╂枡ID',
+      prop: 'materialId',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ョ墿鏂橧D',
+    },
+  ])
+  /**
+   * 鏍¢獙鏄惁鏈夋暟鎹彉鍖�
+   */
+  const checkIsEqualObject = () => {
+    const data = {
+      formData: formData.value,
+    }
+    const check = isEqual(initiateData.value, data)
+    return check
+  }
+  const commonGetFormData = () => {
+    const data = {
+      containerNo: formData.value.containerNo || '',
+      materialId: formData.value.materialId || '',
+    }
+    return data
+  }
+  const onClose = (done: () => void) => {
+    if (visible.value) {
+      visible.value = false
+      const data = commonGetFormData()
+      ctx.emit('close', data)
+    }
+  }
+  /**
+   * 纭鏌ヨ
+   */
+  const onConfirmQuery = async () => {
+    const data = commonGetFormData()
+    ctx.emit('confirmQuery', data)
+  }
+  /**
+   * 閲嶇疆鏌ヨ
+   */
+  const onReset = async () => {
+    formData.value = {}
+    formData.value.ContainerNo = ''
+    formData.value.MaterialId = ''
+    //鍚戠埗缁勪欢鍙戦�佽嚜瀹氫箟浜嬩欢
+    ctx.emit('restQuery')
+  }
+
+  const updateCheckData = () => {
+    initiateData.value = {
+      formData: {
+        ...formData.value,
+      },
+    }
+  }
+  const updateFormItemOptions = (propName: string, enumData: any[]) => {
+    const item = formItems.find((item) => item.prop === propName)
+    if (item && enumData) {
+      item.options = enumData.map((item) => ({
+        label: item.description,
+        value: item.value,
+      }))
+    }
+  }
+  /**
+   * 閫氱敤鏌ヨ鏋氫妇
+   */
+  const commonQueryEnumForFrom = async () => {}
+  commonQueryEnumForFrom()
+  /**
+   * 寮圭獥鎵撳紑鑾峰彇璇︽儏
+   */
+  const onOpen = async () => {
+    disabled.value = false
+    updateCheckData()
+  }
+
+  watch(() => current.value, onOpen)
+
+  return {
+    formItems,
+    formData,
+    visible,
+    formRef,
+    onOpen,
+    onClose,
+    onConfirmQuery,
+    onReset,
+  }
+}
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssembly.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssembly.ts
new file mode 100644
index 0000000..9bcfa04
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssembly.ts
@@ -0,0 +1,41 @@
+import { Base } from '@/libs/Base/Base' 
+import { 
+  deleteWmsMaterialContainers, 
+  addWmsMaterialContainer, 
+  cloneData, 
+} from './Service/PipeAccessoryAssembly' 
+ 
+export class WmsMaterialContainer extends Base<{ [key: string]: any }> { 
+  constructor() { 
+    super({ 
+      data: [], 
+    }) 
+  } 
+  onMounted() {} 
+  /** 
+   * 鍒犻櫎 
+   * @param id 
+   * @returns 
+   */ 
+  async deleteWmsMaterialContainers(ids: string[]) { 
+    return deleteWmsMaterialContainers(ids) 
+  } 
+ 
+  /** 
+   * 娣诲姞鏁版嵁 
+   * @param data 
+   * @returns 
+   */ 
+  addWmsMaterialContainer(data: Record<string, any>) { 
+    return addWmsMaterialContainer(data) 
+  } 
+ 
+  /** 
+   * 鍏嬮殕 
+   * @param ids 
+   * @returns 
+   */ 
+  cloneData(ids: string[]) { 
+    return cloneData(ids) 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyDrawer.ts
new file mode 100644
index 0000000..f1a806f
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyDrawer.ts
@@ -0,0 +1,44 @@
+import { Base } from '@/libs/Base/Base' 
+import { 
+  addWmsMaterialContainer, 
+  getWmsMaterialContainer, 
+  updateWmsMaterialContainer, 
+  getWmsEnumData, 
+} from './Service/PipeAccessoryAssemblyDrawer' 
+import { useGlobalState } from '@/libs/Store/Store' 
+ 
+export class WmsMaterialContainerDrawer extends Base<{ [key: string]: any }> { 
+  constructor() { 
+    super({ 
+      data: [], 
+      wmsMaterialContainer: {}, 
+    }) 
+  } 
+ 
+  /** 
+   * 娣诲姞 
+   * @param data 
+   */ 
+  async addWmsMaterialContainer(data: Record<string, any>) { 
+    return addWmsMaterialContainer(data) 
+  } 
+  /** 
+   * 鏇存柊 
+   * @param data 
+   */ 
+  async updateWmsMaterialContainer(id: string, data: Record<string, any>) { 
+    return updateWmsMaterialContainer(id, data) 
+  } 
+ 
+  /** 
+   * 鑾峰彇璇︽儏 
+   */ 
+  async getWmsMaterialContainerDetail(current: any, id?: string) { 
+    return getWmsMaterialContainer(id || current?.id) 
+  } 
+ 
+  //  鑾峰彇鏋氫妇鍊� 
+  async getWmsEnumData(data: Record<string, any>) { 
+    return getWmsEnumData(data) 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyQueryDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyQueryDrawer.ts
new file mode 100644
index 0000000..5714cba
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyQueryDrawer.ts
@@ -0,0 +1,44 @@
+import { Base } from '@/libs/Base/Base' 
+import { 
+  addWmsMaterialContainer, 
+  getWmsMaterialContainer, 
+  updateWmsMaterialContainer, 
+  getWmsEnumData, 
+} from './Service/PipeAccessoryAssemblyQueryDrawer' 
+import { useGlobalState } from '@/libs/Store/Store' 
+ 
+export class WmsMaterialContainerQueryDrawer extends Base<{ [key: string]: any }> { 
+  constructor() { 
+    super({ 
+      data: [], 
+      wmsMaterialContainer: {}, 
+    }) 
+  } 
+ 
+  /** 
+   * 娣诲姞 
+   * @param data 
+   */ 
+  async addWmsMaterialContainer(data: Record<string, any>) { 
+    return addWmsMaterialContainer(data) 
+  } 
+  /** 
+   * 鏇存柊 
+   * @param data 
+   */ 
+  async updateWmsMaterialContainer(id: string, data: Record<string, any>) { 
+    return updateWmsMaterialContainer(id, data) 
+  } 
+ 
+  /** 
+   * 鑾峰彇璇︽儏 
+   */ 
+  async getWmsMaterialContainerDetail(current: any, id?: string) { 
+    return getWmsMaterialContainer(id || current?.id) 
+  } 
+ 
+  //  鑾峰彇鏋氫妇鍊� 
+  async getWmsEnumData(data: Record<string, any>) { 
+    return getWmsEnumData(data) 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssembly.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssembly.ts
new file mode 100644
index 0000000..92614a8
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssembly.ts
@@ -0,0 +1,79 @@
+import { Base } from '@/libs/Base/Base'
+const request = Base.request
+
+/**
+ * 娣诲姞
+ * @returns
+ */
+export const addWmsMaterialContainer = (data: any) => {
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer', data)
+}
+
+/**
+ * 鎵归噺鍒犻櫎
+ * @returns
+ */
+export const deleteWmsMaterialContainers = (ids: string[]) => {
+  return request({
+    data: ids,
+    url: '/api/v1/HIAWms/wmsMaterialContainer',
+    method: 'delete',
+  })
+}
+
+/**
+ * 鍏嬮殕
+ * @returns
+ */
+export const cloneData = (data: any) => {
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer/clone', data)
+}
+
+/**
+ * 鐗╂枡鍨嬪彿鍒楄〃
+ * @returns
+ */
+export const getMaterialModelList = () => {
+  return request.get(`/api/v1/hiawms/wmsenum/ModelList`)
+}
+
+/**
+ * 搴撲綅鍙峰垪琛�
+ * @returns
+ */
+export const getPlaceNoForStockList = (data: any) => {
+  return request.get(`/api/v1/hiawms/wmsenum/placelist?placeType=${data}`)
+}
+
+/**
+ * 鍏ュ簱
+ * @returns
+ */
+export const instock = (data: any) => {
+  return request.post('/api/v1/HIAWms/wmsinsstock/bindinstock', data)
+}
+
+
+/**
+ * 鏍规嵁 绠℃缂栫爜銆佸伐搴� 鏌ヨ 浣滀笟璁″垝
+ * @returns
+ */
+export const findSingleWorkPlanByFilter = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlan/FindSingleByFilter', data)
+}
+
+/**
+ * 鏍规嵁 浠诲姟缂栧彿杩涜寮�宸�
+ * @returns
+ */
+export const startProduction  = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlanPublic/startProduction', data)
+}
+
+/**
+ * 鏍规嵁 浠诲姟缂栧彿杩涜瀹屽伐
+ * @returns
+ */
+export const finishProduction  = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlanPublic/finishProduction', data)
+}
\ No newline at end of file
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyDrawer.ts
new file mode 100644
index 0000000..fae0103
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyDrawer.ts
@@ -0,0 +1,34 @@
+import { Base } from '@/libs/Base/Base' 
+const request = Base.request 
+ 
+/** 
+ * 娣诲姞 
+ * @returns 
+ */ 
+export const addWmsMaterialContainer = (data: any) => { 
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer', data) 
+} 
+ 
+/** 
+ * 鑾峰彇璇︽儏 
+ * @returns 
+ */ 
+export const getWmsMaterialContainer = (id: string) => { 
+  return request.get(`/api/v1/HIAWms/wmsMaterialContainer/${id}`) 
+} 
+ 
+/** 
+ * 鏇存柊 
+ * @returns 
+ */ 
+export const updateWmsMaterialContainer = (id: string, data: Record<string, any>) => { 
+  return request.put(`/api/v1/HIAWms/wmsMaterialContainer/${id}`, data) 
+} 
+ 
+/** 
+ * 鑾峰彇鏋氫妇 
+ * @returns 
+ */ 
+export const getWmsEnumData = (data: any) => { 
+  return request.post('/api/v1/HIAWms/WmsEnum', data) 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyQueryDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyQueryDrawer.ts
new file mode 100644
index 0000000..8f2a1a3
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyQueryDrawer.ts
@@ -0,0 +1,35 @@
+import { Base } from '@/libs/Base/Base' 
+const request = Base.request 
+ 
+/** 
+ * 娣诲姞 
+ * @returns 
+ */ 
+export const addWmsMaterialContainer = (data: any) => { 
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer', data) 
+} 
+ 
+/** 
+ * 鑾峰彇璇︽儏 
+ * @returns 
+ */ 
+export const getWmsMaterialContainer = (id: string) => { 
+  return request.get(`/api/v1/HIAWms/wmsMaterialContainer/${id}`) 
+} 
+ 
+/** 
+ * 鏇存柊 
+ * @returns 
+ */ 
+export const updateWmsMaterialContainer = (id: string, data: Record<string, any>) => { 
+  return request.put(`/api/v1/HIAWms/wmsMaterialContainer/${id}`, data) 
+} 
+ 
+/** 
+ * 鑾峰彇鏋氫妇 
+ * @returns 
+ */ 
+export const getWmsEnumData = (data: any) => { 
+  return request.post('/api/v1/HIAWms/WmsEnum', data) 
+} 
+ 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss
new file mode 100644
index 0000000..177adca
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss
@@ -0,0 +1,3 @@
+.drawer { 
+  width: 800px; 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx
new file mode 100644
index 0000000..d594ce8
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx
@@ -0,0 +1,61 @@
+import { SetupContext, defineComponent } from 'vue' 
+import BaseDrawer from '@/components/BaseDrawer/BaseDrawer' 
+import styles from './WmsMaterialContainerDrawer.module.scss' 
+import { useWmsMaterialContainerDrawer } from '../../../../Controllers/PipeAccessoryAssemblyDrawer.tsx' 
+import DyForm from '@/components/DyForm/DyForm' 
+ 
+// @ts-ignore 
+export default defineComponent<{ 
+  [key: string]: any 
+}>({ 
+  name: '寮圭獥', 
+  props: { 
+    modelValue: { 
+      type: Boolean, 
+      default: false, 
+    }, 
+    title: { 
+      type: String, 
+      default: '', 
+    }, 
+    row: { 
+      type: Object, 
+    }, 
+    sort: { 
+      type: Number, 
+      default: 0, 
+    }, 
+  }, 
+  emits: ['update:modelValue', 'close', 'submit', 'confirm'], 
+  setup(props: Record<string, any>, ctx: SetupContext) { 
+    const { 
+      onClose, 
+      onConfirm, 
+      onOpen, 
+      formRef, 
+      visible, 
+      formItems, 
+      formData, 
+    } = useWmsMaterialContainerDrawer(props, ctx) 
+    return () => ( 
+      <BaseDrawer 
+        class={styles.drawer} 
+        size="800px" 
+        title={props.title || '娣诲姞'} 
+        v-model={visible.value} 
+        close-on-click-modal={true} 
+        onConfirm={onConfirm} 
+        onOpen={onOpen} 
+        before-close={onClose} 
+        onClose={onClose} 
+      > 
+        <DyForm 
+          ref={formRef} 
+          formData={formData.value} 
+          labelWidth="106px" 
+          formItemProps={formItems} 
+        ></DyForm> 
+      </BaseDrawer> 
+    ) 
+  }, 
+}) 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss
new file mode 100644
index 0000000..177adca
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss
@@ -0,0 +1,3 @@
+.drawer { 
+  width: 800px; 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx
new file mode 100644
index 0000000..72fed0c
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx
@@ -0,0 +1,71 @@
+/* 
+ * 鐗╂枡鍩虹淇℃伅鏌ヨ寮瑰嚭妗� 
+*/ 
+import { SetupContext, defineComponent } from 'vue' 
+import BaseQueryDrawer from '@/components/BaseQueryDrawer/BaseQueryDrawer' 
+import styles from './WmsMaterialContainerQueryDrawer.module.scss' 
+import { useWmsMaterialContainerQueryDrawer } from '../../../../Controllers/PipeAccessoryAssemblyQueryDrawer.tsx' 
+import DyForm from '@/components/DyForm/DyForm' 
+ 
+// @ts-ignore 
+export default defineComponent<{ 
+  [key: string]: any 
+}>({ 
+  name: '寮圭獥', 
+  props: { 
+    //鏋氫妇绫诲瀷瀛楀吀 
+    enumListDict:{ 
+      type: Array as () => Array<{ key: string; value: object }>, // 瀹氫箟鏁扮粍鍏冪礌绫诲瀷 
+      default: () => [] // 榛樿鍊� 
+    }, 
+    modelValue: { 
+      type: Boolean, 
+      default: false, 
+    }, 
+    title: { 
+      type: String, 
+      default: '', 
+    }, 
+    row: { 
+      type: Object, 
+    }, 
+    sort: { 
+      type: Number, 
+      default: 0, 
+    }, 
+  }, 
+  emits: ['update:modelValue', 'close', 'submit', 'confirmquery1'], 
+  setup(props: Record<string, any>, ctx: SetupContext) { 
+    const { 
+      onClose, 
+      onConfirmQuery, 
+      onOpen, 
+      onReset, 
+      formRef, 
+      visible, 
+      formItems, 
+      formData, 
+    } = useWmsMaterialContainerQueryDrawer(props, ctx) 
+    return () => ( 
+      <BaseQueryDrawer 
+        class={styles.drawer} 
+        size="800px" 
+        title={props.title || '楂樼骇鏌ヨ'} 
+        v-model={visible.value} 
+        close-on-click-modal={true} 
+        onReset={onReset} 
+        onConfirmQueryForBase={onConfirmQuery} 
+        onOpen={onOpen} 
+        before-close={onClose} 
+        onClose={onClose} 
+      > 
+        <DyForm 
+          ref={formRef} 
+          formData={formData.value} 
+          labelWidth="106px" 
+          formItemProps={formItems} 
+        ></DyForm> 
+      </BaseQueryDrawer> 
+    ) 
+  }, 
+}) 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/Config.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/Config.ts
new file mode 100644
index 0000000..5e6ddfc
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/Config.ts
@@ -0,0 +1,27 @@
+export const columns = [ 
+  { 
+    type: 'seq', 
+    width: 60, 
+    title: '搴忓彿', 
+  }, 
+  { 
+  field: 'containerNo', 
+  title: '鎵樼洏缂栧彿', 
+}, 
+{ 
+  field: 'materialId', 
+  title: '鐗╂枡ID', 
+}, 
+{ 
+  field: 'sort', 
+  title: '', 
+}, 
+{ 
+  field: 'creationTime', 
+  title: '鏄惁绂佺敤', 
+}, 
+{ 
+  field: 'deletionTime', 
+  title: '', 
+},  
+] 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.module.scss
new file mode 100644
index 0000000..f0789b7
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.module.scss
@@ -0,0 +1,253 @@
+.pipeAccessoryAssemblyContent { 
+  width: 100%; 
+  height: 100%; 
+  // height: 100% !important; 
+  // overflow-y: auto !important; /* 鍐呭瓒呭嚭鏃舵樉绀烘粴鍔ㄦ潯 */
+  // padding-bottom: 20px; /* 閬垮厤鍐呭琚簳閮ㄩ伄鎸� */
+ 
+  .pipeAccessoryAssemblyList { 
+    width: 100%; 
+    height: calc(100% - 70px); 
+  } 
+  .headerContent { 
+    display: flex; 
+    justify-content: space-between; 
+    align-items: center; 
+    height: 43px; 
+  } 
+  .header { 
+    margin-bottom: 12px; 
+    display: flex; 
+    justify-content: flex-end; 
+    align-items: center; 
+  } 
+
+  .h5Form {
+    display: flex;
+    flex-direction: column;
+    gap: 20px; // 琛ㄥ崟椤逛箣闂寸殑闂磋窛
+
+    .el-form-item {
+      margin-bottom: 0; // 绉婚櫎榛樿鐨勫簳閮ㄨ竟璺�
+       width: 100% !important; // 鍗犳弧鐖跺鍣ㄥ搴�
+    }
+
+    .el-form-item__label {
+      display: block;
+      text-align: left;
+      margin-bottom: 8px;
+      font-weight: 500;
+    }
+  }
+} 
+ 
+.tagBox { 
+  width: auto; 
+  min-width: 80px; 
+  height: 24px; 
+  background: #ffffff; 
+  border-radius: 19px 19px 19px 19px; 
+  opacity: 1; 
+  border: 1px dashed #bcc4cc; 
+  width: 50px; 
+  height: 20px; 
+  font-size: 14px; 
+  font-family: PingFang SC, PingFang SC; 
+  font-weight: 400; 
+  color: #5a84ff; 
+  display: flex; 
+  justify-content: center; 
+  align-items: center; 
+  // cursor: pointer; 
+} 
+ 
+.group { 
+  display: flex; 
+  justify-content: space-between; 
+  align-items: center; 
+} 
+ 
+.groupTable { 
+  width: 100%; 
+} 
+ 
+.overBox { 
+  width: 100%; 
+  height: calc(100% - 20px); 
+  overflow: auto; 
+  :global(.cs-collapse-item__header) { 
+    background-color: #f1f1f1; 
+    padding: 0 20px; 
+    height: 35px; 
+    font-size: 16px; 
+    font-family: PingFang SC, PingFang SC; 
+    font-weight: 500; 
+  } 
+  :global(.cs-collapse-item__content) { 
+    padding-bottom: 0px; 
+  } 
+} 
+.groupHeader { 
+  width: 100%; 
+  height: 30px; 
+  background: #ccc; 
+} 
+ 
+.hideBlock { 
+  display: none; 
+} 
+.queryForm { 
+  padding: 10px; 
+  background: #f5f7fa; 
+  margin-bottom: 0px; 
+  border-radius: 4px; 
+   
+  .el-form-item { 
+    margin-right: 20px; 
+    margin-bottom: 0; 
+     
+    // 缁熶竴杈撳叆妗嗗拰閫夋嫨妗嗙殑瀹藉害 
+    .el-input, .el-select { 
+      width: 200px; // 璁剧疆缁熶竴鐨勫搴� 
+    } 
+     
+    // 閫夋嫨妗嗗唴閮ㄨ緭鍏ユ鏍峰紡 
+    .el-select .el-input__wrapper { 
+      height: 32px; // 涓庤緭鍏ユ楂樺害涓�鑷� 
+      padding: 1px 11px; // 涓庤緭鍏ユ鍐呰竟璺濅竴鑷� 
+    } 
+     
+    // 鏃ユ湡閫夋嫨鍣ㄥ搴� 
+    .el-date-editor { 
+      width: 220px; 
+    } 
+  } 
+} 
+ 
+// 濡傛灉闇�瑕佹洿绮剧‘鐨勬帶鍒讹紝鍙互鍗曠嫭璁剧疆 
+.formItem { 
+  width: 200px; 
+   
+  &.el-input, &.el-select { 
+    width: 100%; 
+  } 
+} 
+  
+
+
+.newPageContent {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 20px;
+  padding: 20px;
+  background-color: white;
+
+  .info-block {
+    background-color: #f9f9f9;
+    border: 1px solid #eaeaea;
+    border-radius: 5px;
+    padding: 20px;
+    width: calc(33.33% - 20px);
+
+    .block-title {
+      font-size: 20px;
+      font-weight: bold;
+      margin-bottom: 15px;
+    }
+
+    .info-tags {
+      display: flex;
+      flex-wrap: wrap;
+      gap: 10px;
+
+      .info-tag {
+        display: flex;
+        align-items: center;
+        gap: 5px;
+
+        .tag-label {
+          font-weight: bold;
+        }
+      }
+    }
+
+    .action-buttons {
+      display: flex;
+      gap: 10px;
+      margin-top: 20px;
+    }
+
+    .equipment-image {
+      width: 100%;
+      height: auto;
+      margin-top: 20px;
+    }
+
+    .status-normal {
+      color: green;
+    }
+  }
+
+  .process-table {
+    width: 100%;
+    margin-top: 20px;
+
+    .el-table {
+      border: 1px solid #eaeaea;
+      border-radius: 5px;
+    }
+  }
+}
+
+
+.modelRrow {
+  display: flex; /* 寮规�у竷灞� */
+  gap: 20px; /* 鎺т欢闂磋窛 */
+  align-items: center; /* 鍨傜洿灞呬腑 */
+  margin-bottom: 12px; /* 搴曢儴闂磋窛 */
+  width: 100%;
+
+  .el-form-item {
+    flex: 1 !important; /* 鍧囧垎绌洪棿 */
+    margin-bottom: 0;
+    max-width: none; // 绉婚櫎鏈�澶у搴﹂檺鍒�
+  }
+
+  .el-select {
+    width: 100%; // 纭繚Select鍗犳弧鐖跺鍣ㄥ搴�
+    
+    // 绉婚櫎鍙兘褰卞搷瀹藉害鐨勫唴閮ㄦ牱寮�
+    .el-input__wrapper {
+      width: 100%;
+    }
+  }
+
+  // 鍝嶅簲寮忚璁�
+  @media (max-width: 1200px) {
+    .model-row {
+      flex-wrap: wrap;
+      
+      .el-form-item {
+        flex: 1 0 calc(50% - 10px); // 鍦ㄤ腑绛夊睆骞曚笂姣忚鏄剧ず2涓�
+        margin-bottom: 10px;
+      }
+    }
+  }
+  
+  @media (max-width: 768px) {
+    .model-row {
+      flex-direction: column;
+      
+      .el-form-item {
+        width: 100%; // 鍦ㄥ皬灞忓箷涓婃瘡琛屾樉绀�1涓�
+      }
+    }
+  }
+}
+
+.action-buttons {
+  display: flex;
+  gap: 10px;
+  margin-top: 20px;
+}
+
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.tsx
new file mode 100644
index 0000000..b27033c
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.tsx
@@ -0,0 +1,360 @@
+import { defineComponent, onMounted, ref } from 'vue'
+import type { Ref } from 'vue'
+import styles from './PipeAccessoryAssembly.module.scss'
+import pipeImage from '@/images/pipe-assembly-drawing-example.png'
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox' 
+import {
+  ElInput,
+  ElForm,
+  ElFormItem,
+  ElButton,
+  ElSelect,
+  ElOption,
+  ElMessage,
+  ElCol,
+} from 'element-plus'
+import {
+  getPlaceNoForStockList,
+  getMaterialModelList,
+  instock,
+  findSingleWorkPlanByFilter,
+  startProduction,
+  finishProduction
+} from '@/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssembly'
+import { Message } from '@element-plus/icons-vue/dist/types'
+
+export default defineComponent({
+  name: 'PipeAccessoryAssembly',
+  setup() {
+    // 鏌ヨ琛ㄥ崟鏁版嵁
+const queryForm = ref({
+  pipeSpecCode: '',
+  processRouteNumber: '',
+  taskCode: '',
+  length: '',
+  projectNumber: '',
+  shipNumber: '',
+  material: '',
+  outerDiameter: '',
+  thickness: '',
+  plannedStartTime: '',
+  plannedEndTime: '',
+  workstationCode: '',
+  processName: '',
+  equipmentCode: ''
+})
+
+    // 鏁版嵁婧�
+    const modelOptions = ref<Array<{ value: string; label: string }>>([])
+    const placeNoOptions = ref<Array<{ value: string; label: string }>>([])
+
+    onMounted(() => {
+      // 缁勪欢鎸傝浇鍚庤幏鍙栧瀷鍙峰垪琛ㄥ拰搴撲綅鍙峰垪琛�
+      getModelList()
+      getPlaceNoList()
+    })
+
+    // 缁勭洏鎿嶄綔
+    const handlePalletize = () => {
+      console.log('缁勭洏鎿嶄綔', queryForm.value)
+      // 杩欓噷娣诲姞缁勭洏閫昏緫
+    }
+
+    // 缁勭洏鍏ュ簱鎿嶄綔
+    const handlePalletizeStorage = () => {
+      console.log('缁勭洏鍏ュ簱鎿嶄綔', queryForm.value)
+      instock(queryForm.value), resetQueryForm()
+      ElMessage.success({
+        message: '缁勭洏鍏ュ簱鎴愬姛',
+        type: 'success',
+      })
+      // 杩欓噷娣诲姞缁勭洏鍏ュ簱閫昏緫
+    }
+
+    const resetQueryForm = () => {
+      queryForm.value.materialModel = ''
+      queryForm.value.placeNo = ''
+      queryForm.value.materialBatch = ''
+      queryForm.value.stockNumber = ''
+    }
+
+    const getModelList = async () => {
+      const models = await getMaterialModelList()
+      modelOptions.value = models.map((item: string) => ({
+        value: item.materialModel,
+        label: item.materialModelDesc,
+      }))
+    }
+
+    const getPlaceNoList = async () => {
+      const placeNos = await getPlaceNoForStockList(2)
+      console.log('搴撲綅鍙峰垪琛�:', placeNos)
+      placeNoOptions.value = placeNos.map((item: string) => ({
+        value: item.placeNo,
+        label: item.placeNoDesc,
+      }))
+    }
+    const handleChange =async (value) => {
+      console.log('杈撳叆鍐呭纭:', value); // 澶卞幓鐒︾偣鎴栧洖杞︽椂瑙﹀彂
+      // 鍦ㄦ澶勬坊鍔犱笟鍔¢�昏緫锛堝鏍¢獙銆佹彁浜ょ瓑锛�
+      const param={
+        pipeSpecCode:value,
+        pipeSpecCode_FilterMode:2,//绮惧噯鏌ヨ
+        processName:'瑁呴厤宸ュ簭',
+        processName_FilterMode:2,//绮惧噯鏌ヨ
+      }
+      const workPlan = await findSingleWorkPlanByFilter(param);
+      console.log('杩斿洖:'+workPlan);
+      if(workPlan==''){
+        ElMessage.error('娌℃湁鎵惧埌鏁版嵁'); 
+        queryForm.value ={ pipeSpecCode: '',
+          processRouteNumber: '',
+          taskCode: '',
+          length: '',
+          projectNumber: '',
+          shipNumber: '',
+          material: '',
+          outerDiameter: '',
+          thickness: '',
+          plannedStartTime: '',
+          plannedEndTime: '',
+          workstationCode: '',
+          processName: '',
+          equipmentCode: ''}
+      }else{
+        queryForm.value=workPlan;
+      }
+    };
+
+    // 寮�宸ヤ簨浠跺鐞�
+    const startWork = () => {
+      console.log('鎵ц寮�宸ユ搷浣�');
+      if(queryForm.value.pipeSpecCode==''){
+        ElMessage.error('璇疯緭鍏ョ娈电紪鐮�'); 
+        return
+      }
+      ConfirmBox( 
+                `纭畾瑕佸皢绠℃缂栫爜${queryForm.value.pipeSpecCode}寮�宸ュ悧` 
+              ).then(async () => { 
+                //鎮ㄧ殑涓氬姟閫昏緫
+                const param={
+                  taskCode:queryForm.value.taskCode,
+                };
+                const ret = await startProduction(param);
+      console.log('杩斿洖:'+ret);
+                if(ret.code="200"){
+                  ElMessage.success('寮�宸ユ垚鍔�'); 
+                }else{
+                  ElMessage.error('寮�宸ュけ璐�:'+ret.message); 
+                }
+              }) 
+    } 
+    // 瀹屽伐浜嬩欢澶勭悊
+    const finishWork = () => {
+      console.log('鎵ц寮�宸ユ搷浣�');
+      if(queryForm.value.pipeSpecCode==''){
+        ElMessage.error('璇疯緭鍏ョ娈电紪鐮�'); 
+        return
+      }
+      ConfirmBox( 
+                `纭畾瑕佸皢绠℃缂栫爜${queryForm.value.pipeSpecCode}瀹屽伐鍚梎 
+              ).then(async () => { 
+                //鎮ㄧ殑涓氬姟閫昏緫
+                const param={
+                  pipeSpecCode:queryForm.value.pipeSpecCode,
+                  processName:queryForm.value.processName,
+                };
+                const ret = await finishProduction(param);
+      console.log('杩斿洖:'+ret);
+                if(ret.code="200"){
+                  ElMessage.success('瀹屽伐鎴愬姛'); 
+                }else{
+                  ElMessage.error('瀹屽伐澶辫触:'+ret.message); 
+                }
+              }) 
+    }
+    const tableData = ref([
+      { sequence: 1, flangeA: 'RF-200-1.6MPa', flangeB: 'WN-200-1.6MPa' },
+      { sequence: 2, flangeA: 'WN-250-2.5MPa', flangeB: 'SO-250-2.5MPa' },
+      { sequence: 3, flangeA: 'PL-300-1.0MPa', flangeB: 'RF-300-1.0MPa' },
+      { sequence: 4, flangeA: 'SO-150-2.0MPa', flangeB: 'WN-150-2.0MPa' },
+      { sequence: 5, flangeA: 'RF-400-1.6MPa', flangeB: 'PL-400-1.6MPa' },
+      { sequence: 6, flangeA: 'WN-200-4.0MPa', flangeB: 'SO-200-4.0MPa' },
+      { sequence: 7, flangeA: 'SO-300-1.6MPa', flangeB: 'RF-300-1.6MPa' },
+      { sequence: 8, flangeA: 'PL-250-1.0MPa', flangeB: 'WN-250-1.0MPa' },
+      { sequence: 9, flangeA: 'RF-150-2.5MPa', flangeB: 'SO-150-2.5MPa' },
+      { sequence: 10, flangeA: 'WN-400-2.0MPa', flangeB: 'PL-400-2.0MPa' }
+    ]);
+
+
+    return () => {
+      return (
+        <div
+          class={styles.PipeAccessoryAssemblyContent}
+          style="overflow-y: auto !important;  height: 100%;"
+        >
+             <ElFormItem label="绠℃缂栫爜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.pipeSpecCode}
+                    clearable
+                    class={styles.formInput}
+                    onInput={handleChange}
+                  />
+                </ElFormItem>
+          <div class={styles.actionButtons}>
+            <ElButton type="warning" onClick={startWork}>寮�宸�</ElButton>
+            <ElButton type="warning" onClick={finishWork}>瀹屽伐</ElButton>
+            {/* <ElButton type="warning">鏆傚仠</ElButton>
+            <ElButton type="warning">鑷姩</ElButton>
+            <ElButton type="warning">璐ㄦ</ElButton> */}
+          </div>
+
+          <h2 class={styles.blockTitle}>褰撳墠浠诲姟</h2>
+          <ElForm label-position="left" >
+             
+                <ElFormItem label="鐗╂枡娴佸悜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.processRouteNumber}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="浠诲姟缂栧彿&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.taskCode}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="绠℃闀垮害&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.length}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="椤圭洰&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍙�">
+                  <ElInput
+                    v-model={queryForm.value.projectNumber}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="鑸�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍙�">
+                  <ElInput
+                    v-model={queryForm.value.shipNumber}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="鏉�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;璐�">
+                  <ElInput
+                    v-model={queryForm.value.material}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="澶�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;寰�">
+                  <ElInput
+                    v-model={queryForm.value.outerDiameter}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="澹�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍘�">
+                  <ElInput
+                    v-model={queryForm.value.thickness}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="璁″垝寮�濮嬫椂闂�">
+                  <ElInput
+                    v-model={queryForm.value.plannedStartTime}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="璁″垝瀹屾垚鏃堕棿">
+                  <ElInput
+                    v-model={queryForm.value.plannedEndTime}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+              </ElForm>
+
+              <h2 class={styles.blockTitle}>褰撳墠宸ヤ綅/璁惧淇℃伅</h2>
+          <ElForm label-position="left" >
+                <ElFormItem label="宸ヤ綅浠g爜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.workstationCode}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="宸ュ簭鍚嶇О&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.processName}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="璁惧浠g爜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.equipmentCode}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                {/* <ElFormItem label="璁惧鐘舵��">
+                  <ElInput
+                    v-model={queryForm.value.materialBatch}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem> */}
+                {/* <ElFormItem label="鎿嶄綔浜�">
+                  <ElInput
+                    v-model={queryForm.value.materialBatch}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem> */}
+              </ElForm>
+
+          {/* <div class="info-block">
+            <h2 class="block-title">宸ヨ壓淇℃伅</h2>
+            <el-table stripe  v-model:dataSource={tableData}>
+              <el-table-column prop="sequence" label="搴�"></el-table-column>
+              <el-table-column prop="flangeA" label="娉曞叞A"></el-table-column>
+              <el-table-column prop="flangeB" label="娉曞叞B"></el-table-column>
+            </el-table>
+          </div> */}
+          <h2 class="block-title">鍥剧焊</h2>
+          <img
+            src={pipeImage}
+            alt="璁惧鍥剧墖"
+            style="height:1250px;"
+            class="equipment-image"
+          ></img>
+        </div>
+      )
+    }
+  },
+})
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.module.scss
new file mode 100644
index 0000000..b250814
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.module.scss
@@ -0,0 +1,7 @@
+.PipeAccessoryAssembly { 
+  background-color: #fff; 
+  border-radius: 5px 5px 0 0; 
+  width: 100%; 
+  height: 100%; 
+  border: 1px solid #dbdbdb; 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.tsx
new file mode 100644
index 0000000..0d03f55
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.tsx
@@ -0,0 +1,80 @@
+import {
+  Component,
+  DefineComponent,
+  defineComponent,
+  markRaw,
+  ref,
+  SetupContext,
+  onMounted,
+} from 'vue'
+import styles from './PipeAccessoryAssembly.module.scss'
+import Tab from '@/components/Tab/Tab'
+import { useProvideModels } from '@/libs/Provider/app'
+import { usePermission } from '@/libs/Permission/Permission'
+import { permissionCodes } from '../enum'
+import { ModuleType, TabItem } from '../type/Type'
+import { getEntityNames } from '@/hooks/hook'
+import TabPane from '@/components/Tab/TabPane'
+
+const Models: ModuleType = import.meta.glob('./config/*.json', {
+  eager: true,
+})
+
+const entityNames = getEntityNames(Models)
+
+const nameToLabelMap = [{ name: 'PipeAccessoryAssembly', label: '绠¢檮浠惰閰�' }]
+
+export default defineComponent({
+  name: 'PipeAccessoryAssembly',
+
+  setup(props, ctx: SetupContext) {
+    useProvideModels()
+    usePermission(props, permissionCodes)
+
+    const rf = ref<{
+      [key: string]: any
+    }>({})
+
+    const tabData = ref<TabItem[]>([])
+
+    const onTabChange = (v: string) => {
+      rf.value?.[v]?.reloadList()
+    }
+
+    const initTableData = async () => {
+      for (const i in entityNames) {
+        const name = entityNames[i]
+        const module = await import(`./Pages/${name}/${name}.tsx`)
+        const PipeAccessoryAssembly = markRaw(module.default)
+        const foundLabel =
+          nameToLabelMap.find((item) => item.name === name)?.label || name
+        tabData.value.push({
+          label: foundLabel,
+          name,
+          component: PipeAccessoryAssembly,
+        })
+      }
+    }
+
+    initTableData()
+
+    return () => {
+      return (
+        <div class={styles.PipeAccessoryAssembly}>
+          <Tab data={tabData.value} type="list" onTab={onTabChange}>
+            {tabData.value.map((widgetInfo) => {
+              const Widget: any = widgetInfo.component
+              return (
+                <TabPane label={widgetInfo.label} name={widgetInfo.name}>
+                  <Widget
+                    ref={(r: any) => (rf.value['PipeAccessoryAssembly'] = r)}
+                  ></Widget>
+                </TabPane>
+              )
+            })}
+          </Tab>
+        </div>
+      )
+    }
+  },
+})
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/config/PipeAccessoryAssembly.json b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/config/PipeAccessoryAssembly.json
new file mode 100644
index 0000000..5280937
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/config/PipeAccessoryAssembly.json
@@ -0,0 +1,3 @@
+{ 
+  "name": "PipeAccessoryAssembly" 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/enum.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/enum.ts
new file mode 100644
index 0000000..780463e
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/enum.ts
@@ -0,0 +1,15 @@
+export interface TabType { 
+  label: string 
+  name: string 
+  columns?: any[] 
+  data?: any[] 
+  isFooter: boolean 
+  [key: string]: any 
+} 
+ 
+export const permissionCodes = { 
+  'PipeAccessoryAssembly-list': '鍒楄〃-鍒楄〃', 
+  'PipeAccessoryAssembly-add': '鍒楄〃-娣诲姞', 
+  'PipeAccessoryAssembly-import': '鍒楄〃-瀵煎叆', 
+  'PipeAccessoryAssembly-output': '鍒楄〃-杈撳嚭', 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/index.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/index.ts
new file mode 100644
index 0000000..546c227
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/index.ts
@@ -0,0 +1,14 @@
+import PipeAccessoryAssembly from './Views/PipeAccessoryAssembly'
+import Setting from '@/components/Setting/Setting'
+import { provider } from '@/provider/index'
+import p from '../../assets/svg/p.svg'
+
+export default {
+  is: 'PipeAccessoryAssembly',
+  name: '绠¢檮浠惰閰�',
+  category: 'run',
+  icon: p,
+  authorizationRequired: false,
+  canvasView: provider(PipeAccessoryAssembly),
+  settingsView: Setting,
+}
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/type/type.d.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/type/type.d.ts
new file mode 100644
index 0000000..aa8d450
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/type/type.d.ts
@@ -0,0 +1,45 @@
+import { Component } from 'vue' 
+ 
+export interface DataItemType { 
+  id?: string 
+  name?: string 
+  code?: string 
+  description?: string 
+  label?: string 
+  value?: string | number 
+} 
+ 
+export interface WmsMaterialContainerBaseType { 
+  id?: string 
+  name?: string 
+  code?: string 
+  value?: number 
+  description?: string 
+  options?: Array<DataItemType> 
+  abilityValue?: number | string 
+  data?: DataItemType 
+  defaultValue?: string | number 
+  flow: string 
+} 
+ 
+export interface FlowDefinitionType { 
+  id?: string 
+  name?: string 
+  code?: string 
+  description?: string 
+} 
+ 
+export type ModuleType = Record< 
+  string, 
+  { 
+    default: Record<string, string> 
+    name: string 
+  } 
+> 
+ 
+export interface TabItem { 
+  name: string 
+  label: string 
+  component: Component 
+  hidden?: boolean 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/File.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/File.ts
new file mode 100644
index 0000000..9162fef
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/File.ts
@@ -0,0 +1,31 @@
+import { importFileToService, exportFileToClient } from '@/api/file' 
+import { ElMessage } from 'element-plus' 
+import { downloadFile } from '@/utils' 
+import dayjs from 'dayjs' 
+ 
+export const useFile = () => { 
+  /** 
+   * 瀵煎叆鏂囦欢 
+   * @param url 
+   */ 
+  const importFile = async (url: string, file: File) => { 
+    const formData = new FormData() 
+    formData.append('file', file) 
+    await importFileToService(url, formData) 
+    ElMessage('瀵煎叆鎴愬姛') 
+  } 
+  /** 
+   * 瀵煎嚭鏂囦欢 
+   * @param url 
+   */ 
+  const exportFile = async (url: string, params: any, name: string) => { 
+    const res = await exportFileToClient(url, params) 
+    downloadFile(res, `${name}_${dayjs().format('YYYYMMDDHHMMss')}.xlsx`) 
+    ElMessage.success('瀵煎嚭鎴愬姛') 
+  } 
+ 
+  return { 
+    importFile, 
+    exportFile, 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPick.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPick.ts
new file mode 100644
index 0000000..62b7f91
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPick.ts
@@ -0,0 +1,275 @@
+import { ref, onMounted, reactive, Ref, nextTick, computed } from 'vue' 
+import { injectModel } from '@/libs/Provider/Provider' 
+import { WmsMaterialContainer } from '../Models/PipeAccessoryPick' 
+import { ElMessage } from 'element-plus' 
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox' 
+import { useFile } from './File' 
+ 
+interface CurrentType { 
+  row: any 
+  index: number 
+} 
+export const useWmsMaterialContainer = (props: any, ctx?: any) => { 
+  const wmsMaterialContainer = injectModel<WmsMaterialContainer>('wmsMaterialContainer') 
+  const { exportFile } = useFile() 
+  /** 
+   * 澶撮儴閰嶇疆 
+   */ 
+  const headers = ref({}) 
+  /** 
+   * 鍔ㄦ�佸垪閰嶇疆 
+   */ 
+  const wmsMaterialContainerColumns = ref<Record<string, any>>([]) 
+  /** 
+   * 鎼滅储鍊� 
+   */ 
+  const search = ref('') 
+ 
+  /** 
+   * 鎺掑簭 
+   */ 
+  const sort = ref(0) 
+  /** 
+   * 閫夋嫨椤� 
+   */ 
+  const selection = ref([]) 
+  /** 
+   * 褰撳墠閫変腑鐨勮 
+   */ 
+  const current = ref<any>(null) 
+  /** 
+   * 鏁版嵁婧� 
+   */ 
+  const dataSource: Ref<any[]> = ref([]) 
+ 
+  /** 
+   * 琛ㄦ牸 
+   */ 
+  const tableRef = ref() 
+  const dialogConfig = reactive({ 
+    visible: false, 
+    title: '', 
+    isAdd: false, 
+  }) 
+  const dialogConfigForQuery = reactive({ 
+    visible: false, 
+    title: '', 
+    isAdd: false, 
+  }) 
+ 
+ 
+  const dialogSettingConfig = reactive({ 
+    visible: false, 
+    title: '', 
+  }) 
+ 
+  /** 
+   * 鍒嗛〉鏁版嵁 
+   */ 
+  const paginationParams = ref({}) 
+ 
+  /** 
+   * 鎵撳紑璇︽儏 
+   * @param row 
+   */ 
+  const openDetail = (row: any) => { 
+    current.value = row 
+    dialogConfig.visible = true 
+    dialogConfig.title = row.name 
+    dialogConfig.isAdd = false 
+    sort.value = row.sort 
+  } 
+ 
+  const contextMenu = [ 
+    { 
+      label: '灞曞紑璇︽儏', 
+      fn: (c: CurrentType) => { 
+        current.value = null 
+        sort.value = c.row.sort 
+        nextTick(() => openDetail(c.row)) 
+      }, 
+      divided: true, 
+      icon: 'o', 
+    }, 
+    // { 
+    //   label: '鍚戜笂娣诲姞', 
+    //   fn: (c: CurrentType, pageNum: number) => { 
+    //     current.value = null 
+    //     sort.value = c.index + 1 + (pageNum - 1) * 50 
+    //     dialogConfig.visible = true 
+    //     dialogConfig.title = '娣诲姞' 
+    //     dialogConfig.isAdd = false 
+    //   }, 
+    //   divided: true, 
+    //   icon: 'up', 
+    // }, 
+    // { 
+    //   label: '鍚戜笅娣诲姞', 
+    //   fn: (c: CurrentType, pageNum: number) => { 
+    //     current.value = null 
+    //     sort.value = c.index + 2 + (pageNum - 1) * 50 
+    //     dialogConfig.visible = true 
+    //     dialogConfig.title = '娣诲姞' 
+    //     dialogConfig.isAdd = false 
+    //   }, 
+    //   divided: true, 
+    //   icon: 'down', 
+    // }, 
+    // { 
+    //   label: '鍒涘缓鍓湰', 
+    //   fn: async ({ row }: CurrentType) => { 
+    //     await wmsMaterialContainer.cloneData([row.id]) 
+    //     ElMessage.success('鍒涘缓鍓湰鎴愬姛') 
+    //     tableRef.value?.getList() 
+    //   }, 
+    //   divided: true, 
+    //   icon: 'copy', 
+    // }, 
+    { 
+      label: '鍒犻櫎', 
+      fn: async (c: CurrentType) => { 
+        const names = selection.value.map((item: { materialId: string }) => item.materialId) 
+        ConfirmBox( 
+          `鏄惁鍒犻櫎${names.length ? names.join(',') : c.row.materialId}` 
+        ).then(async () => { 
+          const ids = selection.value.map((item: { id: string }) => item.id) 
+          await wmsMaterialContainer.deleteWmsMaterialContainers(ids.length ? ids : [c.row.id]) 
+          ElMessage.success('鍒犻櫎鎴愬姛') 
+          tableRef.value.getList() 
+        }) 
+      }, 
+      icon: 'close', 
+    }, 
+  ] 
+ 
+  const onCheck = (records: any) => { 
+    selection.value = records 
+  } 
+ 
+  const onAddWmsMaterialContainer = () => { 
+    const params = tableRef.value?.getPaginationParams() 
+    current.value = null 
+    dialogConfig.visible = true 
+    dialogConfig.isAdd = true 
+    dialogConfig.title = '娣诲姞' 
+    sort.value = params.totalCount + 1 
+  } 
+ 
+  //鐐瑰嚮鎸夐挳銆愰珮绾ф煡璇€�� 
+  const onAdvancedQuery = () => { 
+    const params = tableRef.value?.getPaginationParams() 
+    current.value = null 
+    dialogConfigForQuery.visible = true 
+    dialogConfigForQuery.isAdd = true 
+    dialogConfigForQuery.title = '楂樼骇鏌ヨ' 
+  } 
+  
+  const onConfirmWmsMaterialContainer = async () => { 
+    dialogConfig.visible = false 
+    if (dialogConfig.isAdd) { 
+      tableRef.value?.scrollToRow({ 
+        skip: true, 
+      }) 
+    } else { 
+      await tableRef.value?.getList() 
+    } 
+  } 
+  /** 
+   * 琛岀偣鍑绘椂鏇存柊current 
+   */ 
+  const onRowClick = ({ row }: any) => { 
+    if (dialogConfig.visible && current.value) { 
+      current.value = row 
+    } 
+  } 
+  /** 
+   * 瀵煎嚭 
+   */ 
+  const onExport = (data={}) => { 
+    //const params = tableRef.value?.getParams() 
+    exportFile('/api/v1/HIAWms/wmsMaterialContainer/export', data, 'wmsMaterialContainer') 
+  } 
+ 
+  /** 
+   * 鍏抽敭瀛楁悳绱� 
+   */ 
+  const onSearch = () => { 
+    tableRef.value?.getList({ 
+      Filter: search.value, 
+    }) 
+  } 
+ 
+  /** 
+   * 閲嶇疆琛ㄦ牸鏁版嵁 
+   */ 
+  const reloadList = () => { 
+    tableRef.value?.getList() 
+  } 
+  /** 
+   * 涓婁紶鎴愬姛 
+   */ 
+  const onSuccess = () => { 
+    tableRef.value?.getList() 
+    ElMessage.success('瀵煎叆鎴愬姛') 
+  } 
+  /** 
+   * 澶辫触 
+   * @param err 
+   */ 
+  const onError = (err: any) => { 
+    try { 
+      const message = JSON.parse(err.message) 
+      ElMessage.error(message.msg) 
+    } catch (error) { 
+      ElMessage.error('瀵煎叆澶辫触') 
+    } 
+  } 
+  /** 
+   * 涓婁紶閽╁瓙 
+   */ 
+  const onBeforeUpload = (file: File) => { 
+    const format = ['xlsx', 'xls', 'csv'] 
+    if (!format.includes(file.name.split('.')[1])) { 
+      ElMessage.error('瀵煎叆鏂囦欢鏍煎紡涓嶆纭紝璇峰鍏�.xlsx/.xls涓�.csv鏍煎紡鐨勬枃浠�') 
+      return false 
+    } 
+    return true 
+  } 
+ 
+  onMounted(() => { 
+    headers.value = { 
+      Authorization: `Bearer ${sessionStorage.getItem('Token')}`, 
+      'X-Project': sessionStorage.getItem('X-Project'), 
+    } 
+  }) 
+ 
+  ctx.expose({ 
+    reloadList, 
+  }) 
+ 
+  return { 
+    dataSource, 
+    contextMenu, 
+    dialogConfig, 
+    dialogConfigForQuery, 
+    dialogSettingConfig, 
+    tableRef, 
+    current, 
+    search, 
+    sort, 
+    wmsMaterialContainerColumns, 
+    paginationParams, 
+    headers, 
+    onBeforeUpload, 
+    onError, 
+    onSuccess, 
+    openDetail, 
+    onSearch, 
+    onExport, 
+    onRowClick, 
+    onConfirmWmsMaterialContainer, 
+    onCheck, 
+    onAddWmsMaterialContainer, 
+    onAdvancedQuery 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickDrawer.tsx
new file mode 100644
index 0000000..d807a74
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickDrawer.tsx
@@ -0,0 +1,190 @@
+import {
+  ref,
+  onMounted,
+  reactive,
+  computed,
+  Ref,
+  watch,
+  SetupContext,
+  h,
+} from 'vue'
+import { injectModel } from '@/libs/Provider/Provider'
+import { WmsMaterialContainerDrawer } from '../Models/PipeAccessoryPickDrawer'
+import { ElMessage } from 'element-plus'
+import isEqual from 'lodash/isEqual'
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
+import { cloneDeep } from 'lodash'
+
+export const useWmsMaterialContainerDrawer = (props: any, ctx?: any) => {
+  const wmsMaterialContainerDrawer = injectModel<WmsMaterialContainerDrawer>(
+    'wmsMaterialContainerDrawer'
+  )
+  /**
+   * 鐢ㄦ潵瀵规瘮鐨勫垵濮嬪寲鏁版嵁
+   */
+  const initiateData: Ref<Record<string, any>> = ref({})
+  const formData = ref<Record<string, any>>({})
+  // ref
+  const formRef = ref()
+
+  const disabled = ref(false)
+
+  const current = computed(() => {
+    return props.row || null
+  })
+
+  const datePicker = (attrs) => {
+    return (
+      <el-date-picker
+        type="date"
+        format="YYYY-MM-DD HH:mm:ss"
+        formatValue="YYYY-MM-DD HH:mm:ss"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const dateTimePicker = (attrs) => {
+    return (
+      <el-date-picker
+        type="datetime"
+        format="YYYY-MM-DD HH:mm:ss"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const visible = computed({
+    get() {
+      return props.modelValue
+    },
+    set(val) {
+      ctx.emit('update:modelValue', val)
+    },
+  })
+  /**
+   * 娣诲姞鐨刦orm瀛楁
+   */
+  const formItems = reactive([
+    {
+      label: '鎵樼洏缂栧彿',
+      prop: 'containerNo',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ユ墭鐩樼紪鍙�',
+      rules: [{ required: true, message: '鎵樼洏缂栧彿涓嶈兘涓虹┖', trigger: 'blur' }],
+    },
+    {
+      label: '鐗╂枡ID',
+      prop: 'materialId',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ョ墿鏂橧D',
+      rules: [{ required: true, message: '鐗╂枡ID涓嶈兘涓虹┖', trigger: 'blur' }],
+    },
+  ])
+  /**
+   * 鏍¢獙鏄惁鏈夋暟鎹彉鍖�
+   */
+  const checkIsEqualObject = () => {
+    const data = {
+      formData: formData.value,
+    }
+    const check = isEqual(initiateData.value, data)
+    return check
+  }
+
+  const onClose = (done: () => void) => {
+    if (visible.value) {
+      if (checkIsEqualObject()) {
+        visible.value = false
+        done && done()
+      } else {
+        ConfirmBox('鏄惁淇濆瓨璁剧疆锛�')
+          .then(() => {
+            onConfirm()
+          })
+          .catch(() => {
+            visible.value = false
+            done && done()
+          })
+      }
+    }
+  }
+  /**
+   * 淇濆瓨
+   */
+  const onConfirm = async () => {
+    await formRef.value?.validate()
+    const data = {
+      containerNo: formData.value.containerNo,
+      materialId: formData.value.materialId,
+    }
+    if (!current.value) {
+      await wmsMaterialContainerDrawer.addWmsMaterialContainer(data)
+    } else {
+      const id = current.value.id
+      await wmsMaterialContainerDrawer.updateWmsMaterialContainer(id, data)
+    }
+    ElMessage.success('淇濆瓨鎴愬姛')
+    ctx.emit('confirm')
+  }
+
+  const updateCheckData = () => {
+    initiateData.value = {
+      formData: {
+        ...formData.value,
+      },
+    }
+  }
+  const updateFormItemOptions = (propName: string, enumData: any[]) => {
+    const item = formItems.find((item) => item.prop === propName)
+    if (item && enumData) {
+      item.options = enumData.map((item) => ({
+        label: item.description,
+        value: item.value,
+      }))
+    }
+  }
+  /**
+   * 閫氱敤鏌ヨ鏋氫妇
+   */
+  const commonQueryEnumForFrom = async () => {}
+  commonQueryEnumForFrom()
+  /**
+   * 寮圭獥鎵撳紑鑾峰彇璇︽儏
+   */
+  const onOpen = async () => {
+    if (current.value) {
+      const res =
+        await wmsMaterialContainerDrawer.getWmsMaterialContainerDetail(
+          current.value
+        )
+
+      formData.value = {
+        containerNo: res.containerNo,
+        materialId: res.materialId,
+        id: res.id,
+      }
+      disabled.value = true
+      updateCheckData()
+    } else {
+      formData.value = {}
+
+      disabled.value = false
+      updateCheckData()
+    }
+  }
+
+  watch(() => current.value, onOpen)
+
+  return {
+    formItems,
+    formData,
+    visible,
+    formRef,
+    onOpen,
+    onClose,
+    onConfirm,
+  }
+}
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickQueryDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickQueryDrawer.tsx
new file mode 100644
index 0000000..b7179ed
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickQueryDrawer.tsx
@@ -0,0 +1,181 @@
+import {
+  ref,
+  onMounted,
+  reactive,
+  computed,
+  Ref,
+  watch,
+  SetupContext,
+  h,
+} from 'vue'
+import { injectModel } from '@/libs/Provider/Provider'
+import { WmsMaterialContainerDrawer } from '../Models/PipeAccessoryPickDrawer'
+import { ElMessage } from 'element-plus'
+import isEqual from 'lodash/isEqual'
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
+import { cloneDeep } from 'lodash'
+
+export const useWmsMaterialContainerQueryDrawer = (props: any, ctx?: any) => {
+  const wmsMaterialContainerDrawer = injectModel<WmsMaterialContainerDrawer>(
+    'WmsMaterialContainerDrawer'
+  )
+  /**
+   * 鐢ㄦ潵瀵规瘮鐨勫垵濮嬪寲鏁版嵁
+   */
+  const initiateData: Ref<Record<string, any>> = ref({})
+  const formData = ref<Record<string, any>>({})
+  // ref
+  const formRef = ref()
+
+  const disabled = ref(false)
+
+  const current = computed(() => {
+    return props.row || null
+  })
+
+  const inputNumber = (attrs) => {
+    return (
+      <el-input-number
+        min="1"
+        step="1"
+        precision="0"
+        {...attrs}
+      ></el-input-number>
+    )
+  }
+
+  const datePickerRange = (attrs) => {
+    return (
+      <el-date-picker
+        type="daterange"
+        value-format="YYYY-MM-DD HH:mm:ss"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const dateTimePickerRange = (attrs) => {
+    return (
+      <el-date-picker
+        type="datetimerange"
+        value-format="YYYY-MM-DD HH:mm:ss"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const visible = computed({
+    get() {
+      return props.modelValue
+    },
+    set(val) {
+      ctx.emit('update:modelValue', val)
+    },
+  })
+  /**
+   * 娣诲姞鐨刦orm瀛楁
+   */
+  const formItems = reactive([
+    {
+      label: '鎵樼洏缂栧彿',
+      prop: 'containerNo',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ユ墭鐩樼紪鍙�',
+    },
+    {
+      label: '鐗╂枡ID',
+      prop: 'materialId',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ョ墿鏂橧D',
+    },
+  ])
+  /**
+   * 鏍¢獙鏄惁鏈夋暟鎹彉鍖�
+   */
+  const checkIsEqualObject = () => {
+    const data = {
+      formData: formData.value,
+    }
+    const check = isEqual(initiateData.value, data)
+    return check
+  }
+  const commonGetFormData = () => {
+    const data = {
+      containerNo: formData.value.containerNo || '',
+      materialId: formData.value.materialId || '',
+    }
+    return data
+  }
+  const onClose = (done: () => void) => {
+    if (visible.value) {
+      visible.value = false
+      const data = commonGetFormData()
+      ctx.emit('close', data)
+    }
+  }
+  /**
+   * 纭鏌ヨ
+   */
+  const onConfirmQuery = async () => {
+    const data = commonGetFormData()
+    ctx.emit('confirmQuery', data)
+  }
+  /**
+   * 閲嶇疆鏌ヨ
+   */
+  const onReset = async () => {
+    formData.value = {}
+    formData.value.ContainerNo = ''
+    formData.value.MaterialId = ''
+    //鍚戠埗缁勪欢鍙戦�佽嚜瀹氫箟浜嬩欢
+    ctx.emit('restQuery')
+  }
+
+  const updateCheckData = () => {
+    initiateData.value = {
+      formData: {
+        ...formData.value,
+      },
+    }
+  }
+  const updateFormItemOptions = (propName: string, enumData: any[]) => {
+    const item = formItems.find((item) => item.prop === propName)
+    if (item && enumData) {
+      item.options = enumData.map((item) => ({
+        label: item.description,
+        value: item.value,
+      }))
+    }
+  }
+  /**
+   * 閫氱敤鏌ヨ鏋氫妇
+   */
+  const commonQueryEnumForFrom = async () => {}
+  commonQueryEnumForFrom()
+  /**
+   * 寮圭獥鎵撳紑鑾峰彇璇︽儏
+   */
+  const onOpen = async () => {
+    disabled.value = false
+    updateCheckData()
+  }
+
+  watch(() => current.value, onOpen)
+
+  return {
+    formItems,
+    formData,
+    visible,
+    formRef,
+    onOpen,
+    onClose,
+    onConfirmQuery,
+    onReset,
+  }
+}
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPick.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPick.ts
new file mode 100644
index 0000000..33fee96
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPick.ts
@@ -0,0 +1,41 @@
+import { Base } from '@/libs/Base/Base' 
+import { 
+  deleteWmsMaterialContainers, 
+  addWmsMaterialContainer, 
+  cloneData, 
+} from './Service/PipeAccessoryPick' 
+ 
+export class WmsMaterialContainer extends Base<{ [key: string]: any }> { 
+  constructor() { 
+    super({ 
+      data: [], 
+    }) 
+  } 
+  onMounted() {} 
+  /** 
+   * 鍒犻櫎 
+   * @param id 
+   * @returns 
+   */ 
+  async deleteWmsMaterialContainers(ids: string[]) { 
+    return deleteWmsMaterialContainers(ids) 
+  } 
+ 
+  /** 
+   * 娣诲姞鏁版嵁 
+   * @param data 
+   * @returns 
+   */ 
+  addWmsMaterialContainer(data: Record<string, any>) { 
+    return addWmsMaterialContainer(data) 
+  } 
+ 
+  /** 
+   * 鍏嬮殕 
+   * @param ids 
+   * @returns 
+   */ 
+  cloneData(ids: string[]) { 
+    return cloneData(ids) 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickDrawer.ts
new file mode 100644
index 0000000..456f2b2
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickDrawer.ts
@@ -0,0 +1,44 @@
+import { Base } from '@/libs/Base/Base' 
+import { 
+  addWmsMaterialContainer, 
+  getWmsMaterialContainer, 
+  updateWmsMaterialContainer, 
+  getWmsEnumData, 
+} from './Service/PipeAccessoryPickDrawer' 
+import { useGlobalState } from '@/libs/Store/Store' 
+ 
+export class WmsMaterialContainerDrawer extends Base<{ [key: string]: any }> { 
+  constructor() { 
+    super({ 
+      data: [], 
+      wmsMaterialContainer: {}, 
+    }) 
+  } 
+ 
+  /** 
+   * 娣诲姞 
+   * @param data 
+   */ 
+  async addWmsMaterialContainer(data: Record<string, any>) { 
+    return addWmsMaterialContainer(data) 
+  } 
+  /** 
+   * 鏇存柊 
+   * @param data 
+   */ 
+  async updateWmsMaterialContainer(id: string, data: Record<string, any>) { 
+    return updateWmsMaterialContainer(id, data) 
+  } 
+ 
+  /** 
+   * 鑾峰彇璇︽儏 
+   */ 
+  async getWmsMaterialContainerDetail(current: any, id?: string) { 
+    return getWmsMaterialContainer(id || current?.id) 
+  } 
+ 
+  //  鑾峰彇鏋氫妇鍊� 
+  async getWmsEnumData(data: Record<string, any>) { 
+    return getWmsEnumData(data) 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickQueryDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickQueryDrawer.ts
new file mode 100644
index 0000000..3374aa6
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickQueryDrawer.ts
@@ -0,0 +1,44 @@
+import { Base } from '@/libs/Base/Base' 
+import { 
+  addWmsMaterialContainer, 
+  getWmsMaterialContainer, 
+  updateWmsMaterialContainer, 
+  getWmsEnumData, 
+} from './Service/PipeAccessoryPickQueryDrawer' 
+import { useGlobalState } from '@/libs/Store/Store' 
+ 
+export class WmsMaterialContainerQueryDrawer extends Base<{ [key: string]: any }> { 
+  constructor() { 
+    super({ 
+      data: [], 
+      wmsMaterialContainer: {}, 
+    }) 
+  } 
+ 
+  /** 
+   * 娣诲姞 
+   * @param data 
+   */ 
+  async addWmsMaterialContainer(data: Record<string, any>) { 
+    return addWmsMaterialContainer(data) 
+  } 
+  /** 
+   * 鏇存柊 
+   * @param data 
+   */ 
+  async updateWmsMaterialContainer(id: string, data: Record<string, any>) { 
+    return updateWmsMaterialContainer(id, data) 
+  } 
+ 
+  /** 
+   * 鑾峰彇璇︽儏 
+   */ 
+  async getWmsMaterialContainerDetail(current: any, id?: string) { 
+    return getWmsMaterialContainer(id || current?.id) 
+  } 
+ 
+  //  鑾峰彇鏋氫妇鍊� 
+  async getWmsEnumData(data: Record<string, any>) { 
+    return getWmsEnumData(data) 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPick.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPick.ts
new file mode 100644
index 0000000..23b4619
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPick.ts
@@ -0,0 +1,87 @@
+import { Base } from '@/libs/Base/Base'
+const request = Base.request
+
+/**
+ * 娣诲姞
+ * @returns
+ */
+export const addWmsMaterialContainer = (data: any) => {
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer', data)
+}
+
+/**
+ * 鎵归噺鍒犻櫎
+ * @returns
+ */
+export const deleteWmsMaterialContainers = (ids: string[]) => {
+  return request({
+    data: ids,
+    url: '/api/v1/HIAWms/wmsMaterialContainer',
+    method: 'delete',
+  })
+}
+
+/**
+ * 鍏嬮殕
+ * @returns
+ */
+export const cloneData = (data: any) => {
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer/clone', data)
+}
+
+/**
+ * 鐗╂枡鍨嬪彿鍒楄〃
+ * @returns
+ */
+export const getMaterialModelList = () => {
+  return request.get(`/api/v1/hiawms/wmsenum/ModelList`)
+}
+
+/**
+ * 搴撲綅鍙峰垪琛�
+ * @returns
+ */
+export const getPlaceNoForStockList = (data: any) => {
+  return request.get(`/api/v1/hiawms/wmsenum/placelist?placeType=${data}`)
+}
+
+/**
+ * 鍏ュ簱
+ * @returns
+ */
+export const instock = (data: any) => {
+  return request.post('/api/v1/HIAWms/wmsinsstock/bindinstock', data)
+}
+
+
+/**
+ * 鏍规嵁 绠℃缂栫爜銆佸伐搴� 鏌ヨ 浣滀笟璁″垝
+ * @returns
+ */
+export const findSingleWorkPlanByFilter = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlan/FindSingleByFilter', data)
+}
+
+/**
+ * 鏍规嵁 浠诲姟缂栧彿杩涜寮�宸�
+ * @returns
+ */
+export const startProduction  = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlanPublic/startProduction', data)
+}
+
+/**
+ * 鏍规嵁 浠诲姟缂栧彿杩涜瀹屽伐
+ * @returns
+ */
+export const finishProduction  = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlanPublic/finishProduction', data)
+}
+
+/**
+ * 鏍规嵁 浠诲姟缂栧彿杩涜瀹屽伐
+ * @returns
+ */
+export const pick  = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlanPublic/pick', data)
+}
\ No newline at end of file
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickDrawer.ts
new file mode 100644
index 0000000..fae0103
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickDrawer.ts
@@ -0,0 +1,34 @@
+import { Base } from '@/libs/Base/Base' 
+const request = Base.request 
+ 
+/** 
+ * 娣诲姞 
+ * @returns 
+ */ 
+export const addWmsMaterialContainer = (data: any) => { 
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer', data) 
+} 
+ 
+/** 
+ * 鑾峰彇璇︽儏 
+ * @returns 
+ */ 
+export const getWmsMaterialContainer = (id: string) => { 
+  return request.get(`/api/v1/HIAWms/wmsMaterialContainer/${id}`) 
+} 
+ 
+/** 
+ * 鏇存柊 
+ * @returns 
+ */ 
+export const updateWmsMaterialContainer = (id: string, data: Record<string, any>) => { 
+  return request.put(`/api/v1/HIAWms/wmsMaterialContainer/${id}`, data) 
+} 
+ 
+/** 
+ * 鑾峰彇鏋氫妇 
+ * @returns 
+ */ 
+export const getWmsEnumData = (data: any) => { 
+  return request.post('/api/v1/HIAWms/WmsEnum', data) 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickQueryDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickQueryDrawer.ts
new file mode 100644
index 0000000..8f2a1a3
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickQueryDrawer.ts
@@ -0,0 +1,35 @@
+import { Base } from '@/libs/Base/Base' 
+const request = Base.request 
+ 
+/** 
+ * 娣诲姞 
+ * @returns 
+ */ 
+export const addWmsMaterialContainer = (data: any) => { 
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer', data) 
+} 
+ 
+/** 
+ * 鑾峰彇璇︽儏 
+ * @returns 
+ */ 
+export const getWmsMaterialContainer = (id: string) => { 
+  return request.get(`/api/v1/HIAWms/wmsMaterialContainer/${id}`) 
+} 
+ 
+/** 
+ * 鏇存柊 
+ * @returns 
+ */ 
+export const updateWmsMaterialContainer = (id: string, data: Record<string, any>) => { 
+  return request.put(`/api/v1/HIAWms/wmsMaterialContainer/${id}`, data) 
+} 
+ 
+/** 
+ * 鑾峰彇鏋氫妇 
+ * @returns 
+ */ 
+export const getWmsEnumData = (data: any) => { 
+  return request.post('/api/v1/HIAWms/WmsEnum', data) 
+} 
+ 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss
new file mode 100644
index 0000000..177adca
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss
@@ -0,0 +1,3 @@
+.drawer { 
+  width: 800px; 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx
new file mode 100644
index 0000000..b450041
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx
@@ -0,0 +1,61 @@
+import { SetupContext, defineComponent } from 'vue' 
+import BaseDrawer from '@/components/BaseDrawer/BaseDrawer' 
+import styles from './WmsMaterialContainerDrawer.module.scss' 
+import { useWmsMaterialContainerDrawer } from '../../../../Controllers/PipeAccessoryPickDrawer.tsx' 
+import DyForm from '@/components/DyForm/DyForm' 
+ 
+// @ts-ignore 
+export default defineComponent<{ 
+  [key: string]: any 
+}>({ 
+  name: '寮圭獥', 
+  props: { 
+    modelValue: { 
+      type: Boolean, 
+      default: false, 
+    }, 
+    title: { 
+      type: String, 
+      default: '', 
+    }, 
+    row: { 
+      type: Object, 
+    }, 
+    sort: { 
+      type: Number, 
+      default: 0, 
+    }, 
+  }, 
+  emits: ['update:modelValue', 'close', 'submit', 'confirm'], 
+  setup(props: Record<string, any>, ctx: SetupContext) { 
+    const { 
+      onClose, 
+      onConfirm, 
+      onOpen, 
+      formRef, 
+      visible, 
+      formItems, 
+      formData, 
+    } = useWmsMaterialContainerDrawer(props, ctx) 
+    return () => ( 
+      <BaseDrawer 
+        class={styles.drawer} 
+        size="800px" 
+        title={props.title || '娣诲姞'} 
+        v-model={visible.value} 
+        close-on-click-modal={true} 
+        onConfirm={onConfirm} 
+        onOpen={onOpen} 
+        before-close={onClose} 
+        onClose={onClose} 
+      > 
+        <DyForm 
+          ref={formRef} 
+          formData={formData.value} 
+          labelWidth="106px" 
+          formItemProps={formItems} 
+        ></DyForm> 
+      </BaseDrawer> 
+    ) 
+  }, 
+}) 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss
new file mode 100644
index 0000000..177adca
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss
@@ -0,0 +1,3 @@
+.drawer { 
+  width: 800px; 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx
new file mode 100644
index 0000000..ced4098
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx
@@ -0,0 +1,71 @@
+/* 
+ * 鐗╂枡鍩虹淇℃伅鏌ヨ寮瑰嚭妗� 
+*/ 
+import { SetupContext, defineComponent } from 'vue' 
+import BaseQueryDrawer from '@/components/BaseQueryDrawer/BaseQueryDrawer' 
+import styles from './WmsMaterialContainerQueryDrawer.module.scss' 
+import { useWmsMaterialContainerQueryDrawer } from '../../../../Controllers/PipeAccessoryPickQueryDrawer.tsx' 
+import DyForm from '@/components/DyForm/DyForm' 
+ 
+// @ts-ignore 
+export default defineComponent<{ 
+  [key: string]: any 
+}>({ 
+  name: '寮圭獥', 
+  props: { 
+    //鏋氫妇绫诲瀷瀛楀吀 
+    enumListDict:{ 
+      type: Array as () => Array<{ key: string; value: object }>, // 瀹氫箟鏁扮粍鍏冪礌绫诲瀷 
+      default: () => [] // 榛樿鍊� 
+    }, 
+    modelValue: { 
+      type: Boolean, 
+      default: false, 
+    }, 
+    title: { 
+      type: String, 
+      default: '', 
+    }, 
+    row: { 
+      type: Object, 
+    }, 
+    sort: { 
+      type: Number, 
+      default: 0, 
+    }, 
+  }, 
+  emits: ['update:modelValue', 'close', 'submit', 'confirmquery1'], 
+  setup(props: Record<string, any>, ctx: SetupContext) { 
+    const { 
+      onClose, 
+      onConfirmQuery, 
+      onOpen, 
+      onReset, 
+      formRef, 
+      visible, 
+      formItems, 
+      formData, 
+    } = useWmsMaterialContainerQueryDrawer(props, ctx) 
+    return () => ( 
+      <BaseQueryDrawer 
+        class={styles.drawer} 
+        size="800px" 
+        title={props.title || '楂樼骇鏌ヨ'} 
+        v-model={visible.value} 
+        close-on-click-modal={true} 
+        onReset={onReset} 
+        onConfirmQueryForBase={onConfirmQuery} 
+        onOpen={onOpen} 
+        before-close={onClose} 
+        onClose={onClose} 
+      > 
+        <DyForm 
+          ref={formRef} 
+          formData={formData.value} 
+          labelWidth="106px" 
+          formItemProps={formItems} 
+        ></DyForm> 
+      </BaseQueryDrawer> 
+    ) 
+  }, 
+}) 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/Config.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/Config.ts
new file mode 100644
index 0000000..5e6ddfc
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/Config.ts
@@ -0,0 +1,27 @@
+export const columns = [ 
+  { 
+    type: 'seq', 
+    width: 60, 
+    title: '搴忓彿', 
+  }, 
+  { 
+  field: 'containerNo', 
+  title: '鎵樼洏缂栧彿', 
+}, 
+{ 
+  field: 'materialId', 
+  title: '鐗╂枡ID', 
+}, 
+{ 
+  field: 'sort', 
+  title: '', 
+}, 
+{ 
+  field: 'creationTime', 
+  title: '鏄惁绂佺敤', 
+}, 
+{ 
+  field: 'deletionTime', 
+  title: '', 
+},  
+] 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.module.scss
new file mode 100644
index 0000000..597d57e
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.module.scss
@@ -0,0 +1,253 @@
+.pipeAccessoryPickContent { 
+  width: 100%; 
+  height: 100%; 
+  // height: 100% !important; 
+  // overflow-y: auto !important; /* 鍐呭瓒呭嚭鏃舵樉绀烘粴鍔ㄦ潯 */
+  // padding-bottom: 20px; /* 閬垮厤鍐呭琚簳閮ㄩ伄鎸� */
+ 
+  .pipeAccessoryPickList { 
+    width: 100%; 
+    height: calc(100% - 70px); 
+  } 
+  .headerContent { 
+    display: flex; 
+    justify-content: space-between; 
+    align-items: center; 
+    height: 43px; 
+  } 
+  .header { 
+    margin-bottom: 12px; 
+    display: flex; 
+    justify-content: flex-end; 
+    align-items: center; 
+  } 
+
+  .h5Form {
+    display: flex;
+    flex-direction: column;
+    gap: 20px; // 琛ㄥ崟椤逛箣闂寸殑闂磋窛
+
+    .el-form-item {
+      margin-bottom: 0; // 绉婚櫎榛樿鐨勫簳閮ㄨ竟璺�
+       width: 100% !important; // 鍗犳弧鐖跺鍣ㄥ搴�
+    }
+
+    .el-form-item__label {
+      display: block;
+      text-align: left;
+      margin-bottom: 8px;
+      font-weight: 500;
+    }
+  }
+} 
+ 
+.tagBox { 
+  width: auto; 
+  min-width: 80px; 
+  height: 24px; 
+  background: #ffffff; 
+  border-radius: 19px 19px 19px 19px; 
+  opacity: 1; 
+  border: 1px dashed #bcc4cc; 
+  width: 50px; 
+  height: 20px; 
+  font-size: 14px; 
+  font-family: PingFang SC, PingFang SC; 
+  font-weight: 400; 
+  color: #5a84ff; 
+  display: flex; 
+  justify-content: center; 
+  align-items: center; 
+  // cursor: pointer; 
+} 
+ 
+.group { 
+  display: flex; 
+  justify-content: space-between; 
+  align-items: center; 
+} 
+ 
+.groupTable { 
+  width: 100%; 
+} 
+ 
+.overBox { 
+  width: 100%; 
+  height: calc(100% - 20px); 
+  overflow: auto; 
+  :global(.cs-collapse-item__header) { 
+    background-color: #f1f1f1; 
+    padding: 0 20px; 
+    height: 35px; 
+    font-size: 16px; 
+    font-family: PingFang SC, PingFang SC; 
+    font-weight: 500; 
+  } 
+  :global(.cs-collapse-item__content) { 
+    padding-bottom: 0px; 
+  } 
+} 
+.groupHeader { 
+  width: 100%; 
+  height: 30px; 
+  background: #ccc; 
+} 
+ 
+.hideBlock { 
+  display: none; 
+} 
+.queryForm { 
+  padding: 10px; 
+  background: #f5f7fa; 
+  margin-bottom: 0px; 
+  border-radius: 4px; 
+   
+  .el-form-item { 
+    margin-right: 20px; 
+    margin-bottom: 0; 
+     
+    // 缁熶竴杈撳叆妗嗗拰閫夋嫨妗嗙殑瀹藉害 
+    .el-input, .el-select { 
+      width: 200px; // 璁剧疆缁熶竴鐨勫搴� 
+    } 
+     
+    // 閫夋嫨妗嗗唴閮ㄨ緭鍏ユ鏍峰紡 
+    .el-select .el-input__wrapper { 
+      height: 32px; // 涓庤緭鍏ユ楂樺害涓�鑷� 
+      padding: 1px 11px; // 涓庤緭鍏ユ鍐呰竟璺濅竴鑷� 
+    } 
+     
+    // 鏃ユ湡閫夋嫨鍣ㄥ搴� 
+    .el-date-editor { 
+      width: 220px; 
+    } 
+  } 
+} 
+ 
+// 濡傛灉闇�瑕佹洿绮剧‘鐨勬帶鍒讹紝鍙互鍗曠嫭璁剧疆 
+.formItem { 
+  width: 200px; 
+   
+  &.el-input, &.el-select { 
+    width: 100%; 
+  } 
+} 
+  
+
+
+.newPageContent {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 20px;
+  padding: 20px;
+  background-color: white;
+
+  .info-block {
+    background-color: #f9f9f9;
+    border: 1px solid #eaeaea;
+    border-radius: 5px;
+    padding: 20px;
+    width: calc(33.33% - 20px);
+
+    .block-title {
+      font-size: 20px;
+      font-weight: bold;
+      margin-bottom: 15px;
+    }
+
+    .info-tags {
+      display: flex;
+      flex-wrap: wrap;
+      gap: 10px;
+
+      .info-tag {
+        display: flex;
+        align-items: center;
+        gap: 5px;
+
+        .tag-label {
+          font-weight: bold;
+        }
+      }
+    }
+
+    .action-buttons {
+      display: flex;
+      gap: 10px;
+      margin-top: 20px;
+    }
+
+    .equipment-image {
+      width: 100%;
+      height: auto;
+      margin-top: 20px;
+    }
+
+    .status-normal {
+      color: green;
+    }
+  }
+
+  .process-table {
+    width: 100%;
+    margin-top: 20px;
+
+    .el-table {
+      border: 1px solid #eaeaea;
+      border-radius: 5px;
+    }
+  }
+}
+
+
+.modelRrow {
+  display: flex; /* 寮规�у竷灞� */
+  gap: 20px; /* 鎺т欢闂磋窛 */
+  align-items: center; /* 鍨傜洿灞呬腑 */
+  margin-bottom: 12px; /* 搴曢儴闂磋窛 */
+  width: 100%;
+
+  .el-form-item {
+    flex: 1 !important; /* 鍧囧垎绌洪棿 */
+    margin-bottom: 0;
+    max-width: none; // 绉婚櫎鏈�澶у搴﹂檺鍒�
+  }
+
+  .el-select {
+    width: 100%; // 纭繚Select鍗犳弧鐖跺鍣ㄥ搴�
+    
+    // 绉婚櫎鍙兘褰卞搷瀹藉害鐨勫唴閮ㄦ牱寮�
+    .el-input__wrapper {
+      width: 100%;
+    }
+  }
+
+  // 鍝嶅簲寮忚璁�
+  @media (max-width: 1200px) {
+    .model-row {
+      flex-wrap: wrap;
+      
+      .el-form-item {
+        flex: 1 0 calc(50% - 10px); // 鍦ㄤ腑绛夊睆骞曚笂姣忚鏄剧ず2涓�
+        margin-bottom: 10px;
+      }
+    }
+  }
+  
+  @media (max-width: 768px) {
+    .model-row {
+      flex-direction: column;
+      
+      .el-form-item {
+        width: 100%; // 鍦ㄥ皬灞忓箷涓婃瘡琛屾樉绀�1涓�
+      }
+    }
+  }
+}
+
+.action-buttons {
+  display: flex;
+  gap: 10px;
+  margin-top: 20px;
+}
+
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.tsx
new file mode 100644
index 0000000..7261c72
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.tsx
@@ -0,0 +1,367 @@
+import { defineComponent, onMounted, ref } from 'vue'
+import type { Ref } from 'vue'
+import styles from './PipeAccessoryPick.module.scss'
+
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox' 
+import {
+  ElInput,
+  ElForm,
+  ElFormItem,
+  ElButton,
+  ElSelect,
+  ElOption,
+  ElMessage,
+  ElCol,
+} from 'element-plus'
+import {
+  getPlaceNoForStockList,
+  getMaterialModelList,
+  instock,
+  findSingleWorkPlanByFilter,
+  pick,
+  finishProduction
+} from '@/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPick'
+import { Message } from '@element-plus/icons-vue/dist/types'
+
+export default defineComponent({
+  name: 'PipeAccessoryPick',
+  setup() {
+    // 鏌ヨ琛ㄥ崟鏁版嵁
+const queryForm = ref({
+  pipeSpecCode: '',
+  continerNo:'',
+  processRouteNumber: '',
+  taskCode: '',
+  length: '',
+  projectNumber: '',
+  shipNumber: '',
+  material: '',
+  outerDiameter: '',
+  thickness: '',
+  plannedStartTime: '',
+  plannedEndTime: '',
+  workstationCode: '',
+  processName: '',
+  equipmentCode: ''
+})
+
+    // 鏁版嵁婧�
+    const modelOptions = ref<Array<{ value: string; label: string }>>([])
+    const placeNoOptions = ref<Array<{ value: string; label: string }>>([])
+
+    onMounted(() => {
+      // 缁勪欢鎸傝浇鍚庤幏鍙栧瀷鍙峰垪琛ㄥ拰搴撲綅鍙峰垪琛�
+      getModelList()
+      getPlaceNoList()
+    })
+
+    // 缁勭洏鎿嶄綔
+    const handlePalletize = () => {
+      console.log('缁勭洏鎿嶄綔', queryForm.value)
+      // 杩欓噷娣诲姞缁勭洏閫昏緫
+    }
+
+    // 缁勭洏鍏ュ簱鎿嶄綔
+    const handlePalletizeStorage = () => {
+      console.log('缁勭洏鍏ュ簱鎿嶄綔', queryForm.value)
+      instock(queryForm.value), resetQueryForm()
+      ElMessage.success({
+        message: '缁勭洏鍏ュ簱鎴愬姛',
+        type: 'success',
+      })
+      // 杩欓噷娣诲姞缁勭洏鍏ュ簱閫昏緫
+    }
+
+    const resetQueryForm = () => {
+      queryForm.value.materialModel = ''
+      queryForm.value.placeNo = ''
+      queryForm.value.materialBatch = ''
+      queryForm.value.stockNumber = ''
+    }
+
+    const getModelList = async () => {
+      const models = await getMaterialModelList()
+      modelOptions.value = models.map((item: string) => ({
+        value: item.materialModel,
+        label: item.materialModelDesc,
+      }))
+    }
+
+    const getPlaceNoList = async () => {
+      const placeNos = await getPlaceNoForStockList(2)
+      console.log('搴撲綅鍙峰垪琛�:', placeNos)
+      placeNoOptions.value = placeNos.map((item: string) => ({
+        value: item.placeNo,
+        label: item.placeNoDesc,
+      }))
+    }
+    const handleChange =async (value) => {
+      console.log('杈撳叆鍐呭纭:', value); // 澶卞幓鐒︾偣鎴栧洖杞︽椂瑙﹀彂
+      // 鍦ㄦ澶勬坊鍔犱笟鍔¢�昏緫锛堝鏍¢獙銆佹彁浜ょ瓑锛�
+      const param={
+        pipeSpecCode:value,
+        pipeSpecCode_FilterMode:2,//绮惧噯鏌ヨ
+        processName:'瑁呴厤宸ュ簭',
+        processName_FilterMode:2,//绮惧噯鏌ヨ
+      }
+      const workPlan = await findSingleWorkPlanByFilter(param);
+      console.log('杩斿洖:'+workPlan);
+      if(workPlan==''){
+        ElMessage.error('娌℃湁鎵惧埌鏁版嵁'); 
+        queryForm.value ={ pipeSpecCode: '',
+          continerNo:'',
+          processRouteNumber: '',
+          taskCode: '',
+          length: '',
+          projectNumber: '',
+          shipNumber: '',
+          material: '',
+          outerDiameter: '',
+          thickness: '',
+          plannedStartTime: '',
+          plannedEndTime: '',
+          workstationCode: '',
+          processName: '',
+          equipmentCode: ''}
+      }else{
+        queryForm.value=workPlan;
+      }
+    };
+
+    // 鍒嗘嫞浜嬩欢澶勭悊
+    const startWork = () => {
+      console.log('鎵ц寮�宸ユ搷浣�');
+      if(queryForm.value.pipeSpecCode==''){
+        ElMessage.error('璇疯緭鍏ョ娈电紪鐮�'); 
+        return
+      }
+      if(queryForm.value.continerNo==''){
+        ElMessage.error('璇疯緭鍏ユ墭鐩樺彿'); 
+        return
+      }
+      ConfirmBox( 
+                `纭畾瑕佸皢绠℃缂栫爜${queryForm.value.pipeSpecCode}鍒嗘嫞鍚梎 
+              ).then(async () => { 
+                //鎮ㄧ殑涓氬姟閫昏緫
+                const param={
+                  pipeSpecCode:queryForm.value.pipeSpecCode,
+                  continerNo:queryForm.value.continerNo,
+                };
+                const ret = await pick(param);
+      console.log('杩斿洖:'+ret);
+                if(ret.code="200"){
+                  ElMessage.success('鍒嗘嫞鎴愬姛'); 
+                }else{
+                  ElMessage.error('鍒嗘嫞澶辫触:'+ret.message); 
+                }
+              }) 
+    } 
+    // 瀹屽伐浜嬩欢澶勭悊
+    const finishWork = () => {
+      console.log('鎵ц寮�宸ユ搷浣�');
+      if(queryForm.value.pipeSpecCode==''){
+        ElMessage.error('璇疯緭鍏ョ娈电紪鐮�'); 
+        return
+      }
+      ConfirmBox( 
+                `纭畾瑕佸皢绠℃缂栫爜${queryForm.value.pipeSpecCode}瀹屽伐鍚梎 
+              ).then(async () => { 
+                //鎮ㄧ殑涓氬姟閫昏緫
+                const param={
+                  pipeSpecCode:queryForm.value.pipeSpecCode,
+                  processName:queryForm.value.processName,
+                };
+                const ret = await finishProduction(param);
+      console.log('杩斿洖:'+ret);
+                if(ret.code="200"){
+                  ElMessage.success('瀹屽伐鎴愬姛'); 
+                }else{
+                  ElMessage.error('瀹屽伐澶辫触:'+ret.message); 
+                }
+              }) 
+    }
+    const tableData = ref([
+      { sequence: 1, flangeA: 'RF-200-1.6MPa', flangeB: 'WN-200-1.6MPa' },
+      { sequence: 2, flangeA: 'WN-250-2.5MPa', flangeB: 'SO-250-2.5MPa' },
+      { sequence: 3, flangeA: 'PL-300-1.0MPa', flangeB: 'RF-300-1.0MPa' },
+      { sequence: 4, flangeA: 'SO-150-2.0MPa', flangeB: 'WN-150-2.0MPa' },
+      { sequence: 5, flangeA: 'RF-400-1.6MPa', flangeB: 'PL-400-1.6MPa' },
+      { sequence: 6, flangeA: 'WN-200-4.0MPa', flangeB: 'SO-200-4.0MPa' },
+      { sequence: 7, flangeA: 'SO-300-1.6MPa', flangeB: 'RF-300-1.6MPa' },
+      { sequence: 8, flangeA: 'PL-250-1.0MPa', flangeB: 'WN-250-1.0MPa' },
+      { sequence: 9, flangeA: 'RF-150-2.5MPa', flangeB: 'SO-150-2.5MPa' },
+      { sequence: 10, flangeA: 'WN-400-2.0MPa', flangeB: 'PL-400-2.0MPa' }
+    ]);
+
+
+    return () => {
+      return (
+        <div
+          class={styles.PipeAccessoryPickContent}
+          style="overflow-y: auto !important;  height: 100%;"
+        >
+             <ElFormItem label="绠℃缂栫爜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.pipeSpecCode}
+                    clearable
+                    class={styles.formInput}
+                    onInput={handleChange}
+                  />
+                </ElFormItem>
+                <ElFormItem label="鎵樼洏鍙�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.continerNo}
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+          <div class={styles.actionButtons}>
+            <ElButton type="warning" onClick={startWork}>鍒嗘嫞</ElButton>
+            {/* <ElButton type="warning" onClick={finishWork}>瀹屽伐</ElButton> */}
+            {/* <ElButton type="warning">鏆傚仠</ElButton>
+            <ElButton type="warning">鑷姩</ElButton>
+            <ElButton type="warning">璐ㄦ</ElButton> */}
+          </div>
+
+          <h2 class={styles.blockTitle}>褰撳墠浠诲姟</h2>
+          <ElForm label-position="left" >
+             
+                <ElFormItem label="鐗╂枡娴佸悜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.processRouteNumber}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="浠诲姟缂栧彿&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.taskCode}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="绠℃闀垮害&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.length}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="椤圭洰&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍙�">
+                  <ElInput
+                    v-model={queryForm.value.projectNumber}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="鑸�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍙�">
+                  <ElInput
+                    v-model={queryForm.value.shipNumber}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="鏉�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;璐�">
+                  <ElInput
+                    v-model={queryForm.value.material}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="澶�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;寰�">
+                  <ElInput
+                    v-model={queryForm.value.outerDiameter}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="澹�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍘�">
+                  <ElInput
+                    v-model={queryForm.value.thickness}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="璁″垝寮�濮嬫椂闂�">
+                  <ElInput
+                    v-model={queryForm.value.plannedStartTime}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="璁″垝瀹屾垚鏃堕棿">
+                  <ElInput
+                    v-model={queryForm.value.plannedEndTime}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+              </ElForm>
+
+              <h2 class={styles.blockTitle}>褰撳墠宸ヤ綅/璁惧淇℃伅</h2>
+          <ElForm label-position="left" >
+                <ElFormItem label="宸ヤ綅浠g爜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.workstationCode}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="宸ュ簭鍚嶇О&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.processName}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="璁惧浠g爜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.equipmentCode}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                {/* <ElFormItem label="璁惧鐘舵��">
+                  <ElInput
+                    v-model={queryForm.value.materialBatch}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem> */}
+                {/* <ElFormItem label="鎿嶄綔浜�">
+                  <ElInput
+                    v-model={queryForm.value.materialBatch}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem> */}
+              </ElForm>
+
+          {/* <div class="info-block">
+            <h2 class="block-title">宸ヨ壓淇℃伅</h2>
+            <el-table stripe  v-model:dataSource={tableData}>
+              <el-table-column prop="sequence" label="搴�"></el-table-column>
+              <el-table-column prop="flangeA" label="娉曞叞A"></el-table-column>
+              <el-table-column prop="flangeB" label="娉曞叞B"></el-table-column>
+            </el-table>
+          </div> */}
+        </div>
+      )
+    }
+  },
+})
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.module.scss
new file mode 100644
index 0000000..7c8d5b3
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.module.scss
@@ -0,0 +1,7 @@
+.PipeAccessoryPick { 
+  background-color: #fff; 
+  border-radius: 5px 5px 0 0; 
+  width: 100%; 
+  height: 100%; 
+  border: 1px solid #dbdbdb; 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.tsx
new file mode 100644
index 0000000..83ef666
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.tsx
@@ -0,0 +1,80 @@
+import {
+  Component,
+  DefineComponent,
+  defineComponent,
+  markRaw,
+  ref,
+  SetupContext,
+  onMounted,
+} from 'vue'
+import styles from './PipeAccessoryPick.module.scss'
+import Tab from '@/components/Tab/Tab'
+import { useProvideModels } from '@/libs/Provider/app'
+import { usePermission } from '@/libs/Permission/Permission'
+import { permissionCodes } from '../enum'
+import { ModuleType, TabItem } from '../type/Type'
+import { getEntityNames } from '@/hooks/hook'
+import TabPane from '@/components/Tab/TabPane'
+
+const Models: ModuleType = import.meta.glob('./config/*.json', {
+  eager: true,
+})
+
+const entityNames = getEntityNames(Models)
+
+const nameToLabelMap = [{ name: 'PipeAccessoryPick', label: '鍒嗘嫞' }]
+
+export default defineComponent({
+  name: 'PipeAccessoryPick',
+
+  setup(props, ctx: SetupContext) {
+    useProvideModels()
+    usePermission(props, permissionCodes)
+
+    const rf = ref<{
+      [key: string]: any
+    }>({})
+
+    const tabData = ref<TabItem[]>([])
+
+    const onTabChange = (v: string) => {
+      rf.value?.[v]?.reloadList()
+    }
+
+    const initTableData = async () => {
+      for (const i in entityNames) {
+        const name = entityNames[i]
+        const module = await import(`./Pages/${name}/${name}.tsx`)
+        const PipeAccessoryPick = markRaw(module.default)
+        const foundLabel =
+          nameToLabelMap.find((item) => item.name === name)?.label || name
+        tabData.value.push({
+          label: foundLabel,
+          name,
+          component: PipeAccessoryPick,
+        })
+      }
+    }
+
+    initTableData()
+
+    return () => {
+      return (
+        <div class={styles.PipeAccessoryPick}>
+          <Tab data={tabData.value} type="list" onTab={onTabChange}>
+            {tabData.value.map((widgetInfo) => {
+              const Widget: any = widgetInfo.component
+              return (
+                <TabPane label={widgetInfo.label} name={widgetInfo.name}>
+                  <Widget
+                    ref={(r: any) => (rf.value['PipeAccessoryPick'] = r)}
+                  ></Widget>
+                </TabPane>
+              )
+            })}
+          </Tab>
+        </div>
+      )
+    }
+  },
+})
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/config/PipeAccessoryPick.json b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/config/PipeAccessoryPick.json
new file mode 100644
index 0000000..153a75e
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/config/PipeAccessoryPick.json
@@ -0,0 +1,3 @@
+{ 
+  "name": "PipeAccessoryPick" 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/enum.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/enum.ts
new file mode 100644
index 0000000..52c35ae
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/enum.ts
@@ -0,0 +1,15 @@
+export interface TabType { 
+  label: string 
+  name: string 
+  columns?: any[] 
+  data?: any[] 
+  isFooter: boolean 
+  [key: string]: any 
+} 
+ 
+export const permissionCodes = { 
+  'PipeAccessoryPick-list': '鍒楄〃-鍒楄〃', 
+  'PipeAccessoryPick-add': '鍒楄〃-娣诲姞', 
+  'PipeAccessoryPick-import': '鍒楄〃-瀵煎叆', 
+  'PipeAccessoryPick-output': '鍒楄〃-杈撳嚭', 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/index.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/index.ts
new file mode 100644
index 0000000..0554855
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/index.ts
@@ -0,0 +1,14 @@
+import PipeAccessoryPick from './Views/PipeAccessoryPick'
+import Setting from '@/components/Setting/Setting'
+import { provider } from '@/provider/index'
+import p from '../../assets/svg/p.svg'
+
+export default {
+  is: 'PipeAccessoryPick',
+  name: '鍒嗘嫞',
+  category: 'run',
+  icon: p,
+  authorizationRequired: false,
+  canvasView: provider(PipeAccessoryPick),
+  settingsView: Setting,
+}
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/type/type.d.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/type/type.d.ts
new file mode 100644
index 0000000..aa8d450
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/type/type.d.ts
@@ -0,0 +1,45 @@
+import { Component } from 'vue' 
+ 
+export interface DataItemType { 
+  id?: string 
+  name?: string 
+  code?: string 
+  description?: string 
+  label?: string 
+  value?: string | number 
+} 
+ 
+export interface WmsMaterialContainerBaseType { 
+  id?: string 
+  name?: string 
+  code?: string 
+  value?: number 
+  description?: string 
+  options?: Array<DataItemType> 
+  abilityValue?: number | string 
+  data?: DataItemType 
+  defaultValue?: string | number 
+  flow: string 
+} 
+ 
+export interface FlowDefinitionType { 
+  id?: string 
+  name?: string 
+  code?: string 
+  description?: string 
+} 
+ 
+export type ModuleType = Record< 
+  string, 
+  { 
+    default: Record<string, string> 
+    name: string 
+  } 
+> 
+ 
+export interface TabItem { 
+  name: string 
+  label: string 
+  component: Component 
+  hidden?: boolean 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/File.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/File.ts
new file mode 100644
index 0000000..9162fef
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/File.ts
@@ -0,0 +1,31 @@
+import { importFileToService, exportFileToClient } from '@/api/file' 
+import { ElMessage } from 'element-plus' 
+import { downloadFile } from '@/utils' 
+import dayjs from 'dayjs' 
+ 
+export const useFile = () => { 
+  /** 
+   * 瀵煎叆鏂囦欢 
+   * @param url 
+   */ 
+  const importFile = async (url: string, file: File) => { 
+    const formData = new FormData() 
+    formData.append('file', file) 
+    await importFileToService(url, formData) 
+    ElMessage('瀵煎叆鎴愬姛') 
+  } 
+  /** 
+   * 瀵煎嚭鏂囦欢 
+   * @param url 
+   */ 
+  const exportFile = async (url: string, params: any, name: string) => { 
+    const res = await exportFileToClient(url, params) 
+    downloadFile(res, `${name}_${dayjs().format('YYYYMMDDHHMMss')}.xlsx`) 
+    ElMessage.success('瀵煎嚭鎴愬姛') 
+  } 
+ 
+  return { 
+    importFile, 
+    exportFile, 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeld.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeld.ts
new file mode 100644
index 0000000..889b4dc
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeld.ts
@@ -0,0 +1,275 @@
+import { ref, onMounted, reactive, Ref, nextTick, computed } from 'vue' 
+import { injectModel } from '@/libs/Provider/Provider' 
+import { WmsMaterialContainer } from '../Models/PipeAccessoryWeld' 
+import { ElMessage } from 'element-plus' 
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox' 
+import { useFile } from './File' 
+ 
+interface CurrentType { 
+  row: any 
+  index: number 
+} 
+export const useWmsMaterialContainer = (props: any, ctx?: any) => { 
+  const wmsMaterialContainer = injectModel<WmsMaterialContainer>('wmsMaterialContainer') 
+  const { exportFile } = useFile() 
+  /** 
+   * 澶撮儴閰嶇疆 
+   */ 
+  const headers = ref({}) 
+  /** 
+   * 鍔ㄦ�佸垪閰嶇疆 
+   */ 
+  const wmsMaterialContainerColumns = ref<Record<string, any>>([]) 
+  /** 
+   * 鎼滅储鍊� 
+   */ 
+  const search = ref('') 
+ 
+  /** 
+   * 鎺掑簭 
+   */ 
+  const sort = ref(0) 
+  /** 
+   * 閫夋嫨椤� 
+   */ 
+  const selection = ref([]) 
+  /** 
+   * 褰撳墠閫変腑鐨勮 
+   */ 
+  const current = ref<any>(null) 
+  /** 
+   * 鏁版嵁婧� 
+   */ 
+  const dataSource: Ref<any[]> = ref([]) 
+ 
+  /** 
+   * 琛ㄦ牸 
+   */ 
+  const tableRef = ref() 
+  const dialogConfig = reactive({ 
+    visible: false, 
+    title: '', 
+    isAdd: false, 
+  }) 
+  const dialogConfigForQuery = reactive({ 
+    visible: false, 
+    title: '', 
+    isAdd: false, 
+  }) 
+ 
+ 
+  const dialogSettingConfig = reactive({ 
+    visible: false, 
+    title: '', 
+  }) 
+ 
+  /** 
+   * 鍒嗛〉鏁版嵁 
+   */ 
+  const paginationParams = ref({}) 
+ 
+  /** 
+   * 鎵撳紑璇︽儏 
+   * @param row 
+   */ 
+  const openDetail = (row: any) => { 
+    current.value = row 
+    dialogConfig.visible = true 
+    dialogConfig.title = row.name 
+    dialogConfig.isAdd = false 
+    sort.value = row.sort 
+  } 
+ 
+  const contextMenu = [ 
+    { 
+      label: '灞曞紑璇︽儏', 
+      fn: (c: CurrentType) => { 
+        current.value = null 
+        sort.value = c.row.sort 
+        nextTick(() => openDetail(c.row)) 
+      }, 
+      divided: true, 
+      icon: 'o', 
+    }, 
+    // { 
+    //   label: '鍚戜笂娣诲姞', 
+    //   fn: (c: CurrentType, pageNum: number) => { 
+    //     current.value = null 
+    //     sort.value = c.index + 1 + (pageNum - 1) * 50 
+    //     dialogConfig.visible = true 
+    //     dialogConfig.title = '娣诲姞' 
+    //     dialogConfig.isAdd = false 
+    //   }, 
+    //   divided: true, 
+    //   icon: 'up', 
+    // }, 
+    // { 
+    //   label: '鍚戜笅娣诲姞', 
+    //   fn: (c: CurrentType, pageNum: number) => { 
+    //     current.value = null 
+    //     sort.value = c.index + 2 + (pageNum - 1) * 50 
+    //     dialogConfig.visible = true 
+    //     dialogConfig.title = '娣诲姞' 
+    //     dialogConfig.isAdd = false 
+    //   }, 
+    //   divided: true, 
+    //   icon: 'down', 
+    // }, 
+    // { 
+    //   label: '鍒涘缓鍓湰', 
+    //   fn: async ({ row }: CurrentType) => { 
+    //     await wmsMaterialContainer.cloneData([row.id]) 
+    //     ElMessage.success('鍒涘缓鍓湰鎴愬姛') 
+    //     tableRef.value?.getList() 
+    //   }, 
+    //   divided: true, 
+    //   icon: 'copy', 
+    // }, 
+    { 
+      label: '鍒犻櫎', 
+      fn: async (c: CurrentType) => { 
+        const names = selection.value.map((item: { materialId: string }) => item.materialId) 
+        ConfirmBox( 
+          `鏄惁鍒犻櫎${names.length ? names.join(',') : c.row.materialId}` 
+        ).then(async () => { 
+          const ids = selection.value.map((item: { id: string }) => item.id) 
+          await wmsMaterialContainer.deleteWmsMaterialContainers(ids.length ? ids : [c.row.id]) 
+          ElMessage.success('鍒犻櫎鎴愬姛') 
+          tableRef.value.getList() 
+        }) 
+      }, 
+      icon: 'close', 
+    }, 
+  ] 
+ 
+  const onCheck = (records: any) => { 
+    selection.value = records 
+  } 
+ 
+  const onAddWmsMaterialContainer = () => { 
+    const params = tableRef.value?.getPaginationParams() 
+    current.value = null 
+    dialogConfig.visible = true 
+    dialogConfig.isAdd = true 
+    dialogConfig.title = '娣诲姞' 
+    sort.value = params.totalCount + 1 
+  } 
+ 
+  //鐐瑰嚮鎸夐挳銆愰珮绾ф煡璇€�� 
+  const onAdvancedQuery = () => { 
+    const params = tableRef.value?.getPaginationParams() 
+    current.value = null 
+    dialogConfigForQuery.visible = true 
+    dialogConfigForQuery.isAdd = true 
+    dialogConfigForQuery.title = '楂樼骇鏌ヨ' 
+  } 
+  
+  const onConfirmWmsMaterialContainer = async () => { 
+    dialogConfig.visible = false 
+    if (dialogConfig.isAdd) { 
+      tableRef.value?.scrollToRow({ 
+        skip: true, 
+      }) 
+    } else { 
+      await tableRef.value?.getList() 
+    } 
+  } 
+  /** 
+   * 琛岀偣鍑绘椂鏇存柊current 
+   */ 
+  const onRowClick = ({ row }: any) => { 
+    if (dialogConfig.visible && current.value) { 
+      current.value = row 
+    } 
+  } 
+  /** 
+   * 瀵煎嚭 
+   */ 
+  const onExport = (data={}) => { 
+    //const params = tableRef.value?.getParams() 
+    exportFile('/api/v1/HIAWms/wmsMaterialContainer/export', data, 'wmsMaterialContainer') 
+  } 
+ 
+  /** 
+   * 鍏抽敭瀛楁悳绱� 
+   */ 
+  const onSearch = () => { 
+    tableRef.value?.getList({ 
+      Filter: search.value, 
+    }) 
+  } 
+ 
+  /** 
+   * 閲嶇疆琛ㄦ牸鏁版嵁 
+   */ 
+  const reloadList = () => { 
+    tableRef.value?.getList() 
+  } 
+  /** 
+   * 涓婁紶鎴愬姛 
+   */ 
+  const onSuccess = () => { 
+    tableRef.value?.getList() 
+    ElMessage.success('瀵煎叆鎴愬姛') 
+  } 
+  /** 
+   * 澶辫触 
+   * @param err 
+   */ 
+  const onError = (err: any) => { 
+    try { 
+      const message = JSON.parse(err.message) 
+      ElMessage.error(message.msg) 
+    } catch (error) { 
+      ElMessage.error('瀵煎叆澶辫触') 
+    } 
+  } 
+  /** 
+   * 涓婁紶閽╁瓙 
+   */ 
+  const onBeforeUpload = (file: File) => { 
+    const format = ['xlsx', 'xls', 'csv'] 
+    if (!format.includes(file.name.split('.')[1])) { 
+      ElMessage.error('瀵煎叆鏂囦欢鏍煎紡涓嶆纭紝璇峰鍏�.xlsx/.xls涓�.csv鏍煎紡鐨勬枃浠�') 
+      return false 
+    } 
+    return true 
+  } 
+ 
+  onMounted(() => { 
+    headers.value = { 
+      Authorization: `Bearer ${sessionStorage.getItem('Token')}`, 
+      'X-Project': sessionStorage.getItem('X-Project'), 
+    } 
+  }) 
+ 
+  ctx.expose({ 
+    reloadList, 
+  }) 
+ 
+  return { 
+    dataSource, 
+    contextMenu, 
+    dialogConfig, 
+    dialogConfigForQuery, 
+    dialogSettingConfig, 
+    tableRef, 
+    current, 
+    search, 
+    sort, 
+    wmsMaterialContainerColumns, 
+    paginationParams, 
+    headers, 
+    onBeforeUpload, 
+    onError, 
+    onSuccess, 
+    openDetail, 
+    onSearch, 
+    onExport, 
+    onRowClick, 
+    onConfirmWmsMaterialContainer, 
+    onCheck, 
+    onAddWmsMaterialContainer, 
+    onAdvancedQuery 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldDrawer.tsx
new file mode 100644
index 0000000..5e7c825
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldDrawer.tsx
@@ -0,0 +1,190 @@
+import {
+  ref,
+  onMounted,
+  reactive,
+  computed,
+  Ref,
+  watch,
+  SetupContext,
+  h,
+} from 'vue'
+import { injectModel } from '@/libs/Provider/Provider'
+import { WmsMaterialContainerDrawer } from '../Models/PipeAccessoryWeldDrawer'
+import { ElMessage } from 'element-plus'
+import isEqual from 'lodash/isEqual'
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
+import { cloneDeep } from 'lodash'
+
+export const useWmsMaterialContainerDrawer = (props: any, ctx?: any) => {
+  const wmsMaterialContainerDrawer = injectModel<WmsMaterialContainerDrawer>(
+    'wmsMaterialContainerDrawer'
+  )
+  /**
+   * 鐢ㄦ潵瀵规瘮鐨勫垵濮嬪寲鏁版嵁
+   */
+  const initiateData: Ref<Record<string, any>> = ref({})
+  const formData = ref<Record<string, any>>({})
+  // ref
+  const formRef = ref()
+
+  const disabled = ref(false)
+
+  const current = computed(() => {
+    return props.row || null
+  })
+
+  const datePicker = (attrs) => {
+    return (
+      <el-date-picker
+        type="date"
+        format="YYYY-MM-DD HH:mm:ss"
+        formatValue="YYYY-MM-DD HH:mm:ss"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const dateTimePicker = (attrs) => {
+    return (
+      <el-date-picker
+        type="datetime"
+        format="YYYY-MM-DD HH:mm:ss"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const visible = computed({
+    get() {
+      return props.modelValue
+    },
+    set(val) {
+      ctx.emit('update:modelValue', val)
+    },
+  })
+  /**
+   * 娣诲姞鐨刦orm瀛楁
+   */
+  const formItems = reactive([
+    {
+      label: '鎵樼洏缂栧彿',
+      prop: 'containerNo',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ユ墭鐩樼紪鍙�',
+      rules: [{ required: true, message: '鎵樼洏缂栧彿涓嶈兘涓虹┖', trigger: 'blur' }],
+    },
+    {
+      label: '鐗╂枡ID',
+      prop: 'materialId',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ョ墿鏂橧D',
+      rules: [{ required: true, message: '鐗╂枡ID涓嶈兘涓虹┖', trigger: 'blur' }],
+    },
+  ])
+  /**
+   * 鏍¢獙鏄惁鏈夋暟鎹彉鍖�
+   */
+  const checkIsEqualObject = () => {
+    const data = {
+      formData: formData.value,
+    }
+    const check = isEqual(initiateData.value, data)
+    return check
+  }
+
+  const onClose = (done: () => void) => {
+    if (visible.value) {
+      if (checkIsEqualObject()) {
+        visible.value = false
+        done && done()
+      } else {
+        ConfirmBox('鏄惁淇濆瓨璁剧疆锛�')
+          .then(() => {
+            onConfirm()
+          })
+          .catch(() => {
+            visible.value = false
+            done && done()
+          })
+      }
+    }
+  }
+  /**
+   * 淇濆瓨
+   */
+  const onConfirm = async () => {
+    await formRef.value?.validate()
+    const data = {
+      containerNo: formData.value.containerNo,
+      materialId: formData.value.materialId,
+    }
+    if (!current.value) {
+      await wmsMaterialContainerDrawer.addWmsMaterialContainer(data)
+    } else {
+      const id = current.value.id
+      await wmsMaterialContainerDrawer.updateWmsMaterialContainer(id, data)
+    }
+    ElMessage.success('淇濆瓨鎴愬姛')
+    ctx.emit('confirm')
+  }
+
+  const updateCheckData = () => {
+    initiateData.value = {
+      formData: {
+        ...formData.value,
+      },
+    }
+  }
+  const updateFormItemOptions = (propName: string, enumData: any[]) => {
+    const item = formItems.find((item) => item.prop === propName)
+    if (item && enumData) {
+      item.options = enumData.map((item) => ({
+        label: item.description,
+        value: item.value,
+      }))
+    }
+  }
+  /**
+   * 閫氱敤鏌ヨ鏋氫妇
+   */
+  const commonQueryEnumForFrom = async () => {}
+  commonQueryEnumForFrom()
+  /**
+   * 寮圭獥鎵撳紑鑾峰彇璇︽儏
+   */
+  const onOpen = async () => {
+    if (current.value) {
+      const res =
+        await wmsMaterialContainerDrawer.getWmsMaterialContainerDetail(
+          current.value
+        )
+
+      formData.value = {
+        containerNo: res.containerNo,
+        materialId: res.materialId,
+        id: res.id,
+      }
+      disabled.value = true
+      updateCheckData()
+    } else {
+      formData.value = {}
+
+      disabled.value = false
+      updateCheckData()
+    }
+  }
+
+  watch(() => current.value, onOpen)
+
+  return {
+    formItems,
+    formData,
+    visible,
+    formRef,
+    onOpen,
+    onClose,
+    onConfirm,
+  }
+}
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldQueryDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldQueryDrawer.tsx
new file mode 100644
index 0000000..7cca403
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldQueryDrawer.tsx
@@ -0,0 +1,181 @@
+import {
+  ref,
+  onMounted,
+  reactive,
+  computed,
+  Ref,
+  watch,
+  SetupContext,
+  h,
+} from 'vue'
+import { injectModel } from '@/libs/Provider/Provider'
+import { WmsMaterialContainerDrawer } from '../Models/PipeAccessoryWeldDrawer'
+import { ElMessage } from 'element-plus'
+import isEqual from 'lodash/isEqual'
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
+import { cloneDeep } from 'lodash'
+
+export const useWmsMaterialContainerQueryDrawer = (props: any, ctx?: any) => {
+  const wmsMaterialContainerDrawer = injectModel<WmsMaterialContainerDrawer>(
+    'WmsMaterialContainerDrawer'
+  )
+  /**
+   * 鐢ㄦ潵瀵规瘮鐨勫垵濮嬪寲鏁版嵁
+   */
+  const initiateData: Ref<Record<string, any>> = ref({})
+  const formData = ref<Record<string, any>>({})
+  // ref
+  const formRef = ref()
+
+  const disabled = ref(false)
+
+  const current = computed(() => {
+    return props.row || null
+  })
+
+  const inputNumber = (attrs) => {
+    return (
+      <el-input-number
+        min="1"
+        step="1"
+        precision="0"
+        {...attrs}
+      ></el-input-number>
+    )
+  }
+
+  const datePickerRange = (attrs) => {
+    return (
+      <el-date-picker
+        type="daterange"
+        value-format="YYYY-MM-DD HH:mm:ss"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const dateTimePickerRange = (attrs) => {
+    return (
+      <el-date-picker
+        type="datetimerange"
+        value-format="YYYY-MM-DD HH:mm:ss"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+        {...attrs}
+      ></el-date-picker>
+    )
+  }
+
+  const visible = computed({
+    get() {
+      return props.modelValue
+    },
+    set(val) {
+      ctx.emit('update:modelValue', val)
+    },
+  })
+  /**
+   * 娣诲姞鐨刦orm瀛楁
+   */
+  const formItems = reactive([
+    {
+      label: '鎵樼洏缂栧彿',
+      prop: 'containerNo',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ユ墭鐩樼紪鍙�',
+    },
+    {
+      label: '鐗╂枡ID',
+      prop: 'materialId',
+      el: 'input',
+      //disabled: disabled,
+      placeholder: '璇疯緭鍏ョ墿鏂橧D',
+    },
+  ])
+  /**
+   * 鏍¢獙鏄惁鏈夋暟鎹彉鍖�
+   */
+  const checkIsEqualObject = () => {
+    const data = {
+      formData: formData.value,
+    }
+    const check = isEqual(initiateData.value, data)
+    return check
+  }
+  const commonGetFormData = () => {
+    const data = {
+      containerNo: formData.value.containerNo || '',
+      materialId: formData.value.materialId || '',
+    }
+    return data
+  }
+  const onClose = (done: () => void) => {
+    if (visible.value) {
+      visible.value = false
+      const data = commonGetFormData()
+      ctx.emit('close', data)
+    }
+  }
+  /**
+   * 纭鏌ヨ
+   */
+  const onConfirmQuery = async () => {
+    const data = commonGetFormData()
+    ctx.emit('confirmQuery', data)
+  }
+  /**
+   * 閲嶇疆鏌ヨ
+   */
+  const onReset = async () => {
+    formData.value = {}
+    formData.value.ContainerNo = ''
+    formData.value.MaterialId = ''
+    //鍚戠埗缁勪欢鍙戦�佽嚜瀹氫箟浜嬩欢
+    ctx.emit('restQuery')
+  }
+
+  const updateCheckData = () => {
+    initiateData.value = {
+      formData: {
+        ...formData.value,
+      },
+    }
+  }
+  const updateFormItemOptions = (propName: string, enumData: any[]) => {
+    const item = formItems.find((item) => item.prop === propName)
+    if (item && enumData) {
+      item.options = enumData.map((item) => ({
+        label: item.description,
+        value: item.value,
+      }))
+    }
+  }
+  /**
+   * 閫氱敤鏌ヨ鏋氫妇
+   */
+  const commonQueryEnumForFrom = async () => {}
+  commonQueryEnumForFrom()
+  /**
+   * 寮圭獥鎵撳紑鑾峰彇璇︽儏
+   */
+  const onOpen = async () => {
+    disabled.value = false
+    updateCheckData()
+  }
+
+  watch(() => current.value, onOpen)
+
+  return {
+    formItems,
+    formData,
+    visible,
+    formRef,
+    onOpen,
+    onClose,
+    onConfirmQuery,
+    onReset,
+  }
+}
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeld.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeld.ts
new file mode 100644
index 0000000..870e78c
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeld.ts
@@ -0,0 +1,41 @@
+import { Base } from '@/libs/Base/Base' 
+import { 
+  deleteWmsMaterialContainers, 
+  addWmsMaterialContainer, 
+  cloneData, 
+} from './Service/PipeAccessoryWeld' 
+ 
+export class WmsMaterialContainer extends Base<{ [key: string]: any }> { 
+  constructor() { 
+    super({ 
+      data: [], 
+    }) 
+  } 
+  onMounted() {} 
+  /** 
+   * 鍒犻櫎 
+   * @param id 
+   * @returns 
+   */ 
+  async deleteWmsMaterialContainers(ids: string[]) { 
+    return deleteWmsMaterialContainers(ids) 
+  } 
+ 
+  /** 
+   * 娣诲姞鏁版嵁 
+   * @param data 
+   * @returns 
+   */ 
+  addWmsMaterialContainer(data: Record<string, any>) { 
+    return addWmsMaterialContainer(data) 
+  } 
+ 
+  /** 
+   * 鍏嬮殕 
+   * @param ids 
+   * @returns 
+   */ 
+  cloneData(ids: string[]) { 
+    return cloneData(ids) 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldDrawer.ts
new file mode 100644
index 0000000..15a646a
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldDrawer.ts
@@ -0,0 +1,44 @@
+import { Base } from '@/libs/Base/Base' 
+import { 
+  addWmsMaterialContainer, 
+  getWmsMaterialContainer, 
+  updateWmsMaterialContainer, 
+  getWmsEnumData, 
+} from './Service/PipeAccessoryWeldDrawer' 
+import { useGlobalState } from '@/libs/Store/Store' 
+ 
+export class WmsMaterialContainerDrawer extends Base<{ [key: string]: any }> { 
+  constructor() { 
+    super({ 
+      data: [], 
+      wmsMaterialContainer: {}, 
+    }) 
+  } 
+ 
+  /** 
+   * 娣诲姞 
+   * @param data 
+   */ 
+  async addWmsMaterialContainer(data: Record<string, any>) { 
+    return addWmsMaterialContainer(data) 
+  } 
+  /** 
+   * 鏇存柊 
+   * @param data 
+   */ 
+  async updateWmsMaterialContainer(id: string, data: Record<string, any>) { 
+    return updateWmsMaterialContainer(id, data) 
+  } 
+ 
+  /** 
+   * 鑾峰彇璇︽儏 
+   */ 
+  async getWmsMaterialContainerDetail(current: any, id?: string) { 
+    return getWmsMaterialContainer(id || current?.id) 
+  } 
+ 
+  //  鑾峰彇鏋氫妇鍊� 
+  async getWmsEnumData(data: Record<string, any>) { 
+    return getWmsEnumData(data) 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldQueryDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldQueryDrawer.ts
new file mode 100644
index 0000000..ae26d8f
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldQueryDrawer.ts
@@ -0,0 +1,44 @@
+import { Base } from '@/libs/Base/Base' 
+import { 
+  addWmsMaterialContainer, 
+  getWmsMaterialContainer, 
+  updateWmsMaterialContainer, 
+  getWmsEnumData, 
+} from './Service/PipeAccessoryWeldQueryDrawer' 
+import { useGlobalState } from '@/libs/Store/Store' 
+ 
+export class WmsMaterialContainerQueryDrawer extends Base<{ [key: string]: any }> { 
+  constructor() { 
+    super({ 
+      data: [], 
+      wmsMaterialContainer: {}, 
+    }) 
+  } 
+ 
+  /** 
+   * 娣诲姞 
+   * @param data 
+   */ 
+  async addWmsMaterialContainer(data: Record<string, any>) { 
+    return addWmsMaterialContainer(data) 
+  } 
+  /** 
+   * 鏇存柊 
+   * @param data 
+   */ 
+  async updateWmsMaterialContainer(id: string, data: Record<string, any>) { 
+    return updateWmsMaterialContainer(id, data) 
+  } 
+ 
+  /** 
+   * 鑾峰彇璇︽儏 
+   */ 
+  async getWmsMaterialContainerDetail(current: any, id?: string) { 
+    return getWmsMaterialContainer(id || current?.id) 
+  } 
+ 
+  //  鑾峰彇鏋氫妇鍊� 
+  async getWmsEnumData(data: Record<string, any>) { 
+    return getWmsEnumData(data) 
+  } 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeld.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeld.ts
new file mode 100644
index 0000000..92614a8
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeld.ts
@@ -0,0 +1,79 @@
+import { Base } from '@/libs/Base/Base'
+const request = Base.request
+
+/**
+ * 娣诲姞
+ * @returns
+ */
+export const addWmsMaterialContainer = (data: any) => {
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer', data)
+}
+
+/**
+ * 鎵归噺鍒犻櫎
+ * @returns
+ */
+export const deleteWmsMaterialContainers = (ids: string[]) => {
+  return request({
+    data: ids,
+    url: '/api/v1/HIAWms/wmsMaterialContainer',
+    method: 'delete',
+  })
+}
+
+/**
+ * 鍏嬮殕
+ * @returns
+ */
+export const cloneData = (data: any) => {
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer/clone', data)
+}
+
+/**
+ * 鐗╂枡鍨嬪彿鍒楄〃
+ * @returns
+ */
+export const getMaterialModelList = () => {
+  return request.get(`/api/v1/hiawms/wmsenum/ModelList`)
+}
+
+/**
+ * 搴撲綅鍙峰垪琛�
+ * @returns
+ */
+export const getPlaceNoForStockList = (data: any) => {
+  return request.get(`/api/v1/hiawms/wmsenum/placelist?placeType=${data}`)
+}
+
+/**
+ * 鍏ュ簱
+ * @returns
+ */
+export const instock = (data: any) => {
+  return request.post('/api/v1/HIAWms/wmsinsstock/bindinstock', data)
+}
+
+
+/**
+ * 鏍规嵁 绠℃缂栫爜銆佸伐搴� 鏌ヨ 浣滀笟璁″垝
+ * @returns
+ */
+export const findSingleWorkPlanByFilter = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlan/FindSingleByFilter', data)
+}
+
+/**
+ * 鏍规嵁 浠诲姟缂栧彿杩涜寮�宸�
+ * @returns
+ */
+export const startProduction  = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlanPublic/startProduction', data)
+}
+
+/**
+ * 鏍规嵁 浠诲姟缂栧彿杩涜瀹屽伐
+ * @returns
+ */
+export const finishProduction  = (data: any) => {
+  return request.post('/api/v1/PipeLineLems/WorkPlanPublic/finishProduction', data)
+}
\ No newline at end of file
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldDrawer.ts
new file mode 100644
index 0000000..fae0103
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldDrawer.ts
@@ -0,0 +1,34 @@
+import { Base } from '@/libs/Base/Base' 
+const request = Base.request 
+ 
+/** 
+ * 娣诲姞 
+ * @returns 
+ */ 
+export const addWmsMaterialContainer = (data: any) => { 
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer', data) 
+} 
+ 
+/** 
+ * 鑾峰彇璇︽儏 
+ * @returns 
+ */ 
+export const getWmsMaterialContainer = (id: string) => { 
+  return request.get(`/api/v1/HIAWms/wmsMaterialContainer/${id}`) 
+} 
+ 
+/** 
+ * 鏇存柊 
+ * @returns 
+ */ 
+export const updateWmsMaterialContainer = (id: string, data: Record<string, any>) => { 
+  return request.put(`/api/v1/HIAWms/wmsMaterialContainer/${id}`, data) 
+} 
+ 
+/** 
+ * 鑾峰彇鏋氫妇 
+ * @returns 
+ */ 
+export const getWmsEnumData = (data: any) => { 
+  return request.post('/api/v1/HIAWms/WmsEnum', data) 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldQueryDrawer.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldQueryDrawer.ts
new file mode 100644
index 0000000..8f2a1a3
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldQueryDrawer.ts
@@ -0,0 +1,35 @@
+import { Base } from '@/libs/Base/Base' 
+const request = Base.request 
+ 
+/** 
+ * 娣诲姞 
+ * @returns 
+ */ 
+export const addWmsMaterialContainer = (data: any) => { 
+  return request.post('/api/v1/HIAWms/wmsMaterialContainer', data) 
+} 
+ 
+/** 
+ * 鑾峰彇璇︽儏 
+ * @returns 
+ */ 
+export const getWmsMaterialContainer = (id: string) => { 
+  return request.get(`/api/v1/HIAWms/wmsMaterialContainer/${id}`) 
+} 
+ 
+/** 
+ * 鏇存柊 
+ * @returns 
+ */ 
+export const updateWmsMaterialContainer = (id: string, data: Record<string, any>) => { 
+  return request.put(`/api/v1/HIAWms/wmsMaterialContainer/${id}`, data) 
+} 
+ 
+/** 
+ * 鑾峰彇鏋氫妇 
+ * @returns 
+ */ 
+export const getWmsEnumData = (data: any) => { 
+  return request.post('/api/v1/HIAWms/WmsEnum', data) 
+} 
+ 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss
new file mode 100644
index 0000000..177adca
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss
@@ -0,0 +1,3 @@
+.drawer { 
+  width: 800px; 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx
new file mode 100644
index 0000000..713568e
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx
@@ -0,0 +1,61 @@
+import { SetupContext, defineComponent } from 'vue' 
+import BaseDrawer from '@/components/BaseDrawer/BaseDrawer' 
+import styles from './WmsMaterialContainerDrawer.module.scss' 
+import { useWmsMaterialContainerDrawer } from '../../../../Controllers/PipeAccessoryWeldDrawer.tsx' 
+import DyForm from '@/components/DyForm/DyForm' 
+ 
+// @ts-ignore 
+export default defineComponent<{ 
+  [key: string]: any 
+}>({ 
+  name: '寮圭獥', 
+  props: { 
+    modelValue: { 
+      type: Boolean, 
+      default: false, 
+    }, 
+    title: { 
+      type: String, 
+      default: '', 
+    }, 
+    row: { 
+      type: Object, 
+    }, 
+    sort: { 
+      type: Number, 
+      default: 0, 
+    }, 
+  }, 
+  emits: ['update:modelValue', 'close', 'submit', 'confirm'], 
+  setup(props: Record<string, any>, ctx: SetupContext) { 
+    const { 
+      onClose, 
+      onConfirm, 
+      onOpen, 
+      formRef, 
+      visible, 
+      formItems, 
+      formData, 
+    } = useWmsMaterialContainerDrawer(props, ctx) 
+    return () => ( 
+      <BaseDrawer 
+        class={styles.drawer} 
+        size="800px" 
+        title={props.title || '娣诲姞'} 
+        v-model={visible.value} 
+        close-on-click-modal={true} 
+        onConfirm={onConfirm} 
+        onOpen={onOpen} 
+        before-close={onClose} 
+        onClose={onClose} 
+      > 
+        <DyForm 
+          ref={formRef} 
+          formData={formData.value} 
+          labelWidth="106px" 
+          formItemProps={formItems} 
+        ></DyForm> 
+      </BaseDrawer> 
+    ) 
+  }, 
+}) 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss
new file mode 100644
index 0000000..177adca
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss
@@ -0,0 +1,3 @@
+.drawer { 
+  width: 800px; 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx
new file mode 100644
index 0000000..61faabf
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx
@@ -0,0 +1,71 @@
+/* 
+ * 鐗╂枡鍩虹淇℃伅鏌ヨ寮瑰嚭妗� 
+*/ 
+import { SetupContext, defineComponent } from 'vue' 
+import BaseQueryDrawer from '@/components/BaseQueryDrawer/BaseQueryDrawer' 
+import styles from './WmsMaterialContainerQueryDrawer.module.scss' 
+import { useWmsMaterialContainerQueryDrawer } from '../../../../Controllers/PipeAccessoryWeldQueryDrawer.tsx' 
+import DyForm from '@/components/DyForm/DyForm' 
+ 
+// @ts-ignore 
+export default defineComponent<{ 
+  [key: string]: any 
+}>({ 
+  name: '寮圭獥', 
+  props: { 
+    //鏋氫妇绫诲瀷瀛楀吀 
+    enumListDict:{ 
+      type: Array as () => Array<{ key: string; value: object }>, // 瀹氫箟鏁扮粍鍏冪礌绫诲瀷 
+      default: () => [] // 榛樿鍊� 
+    }, 
+    modelValue: { 
+      type: Boolean, 
+      default: false, 
+    }, 
+    title: { 
+      type: String, 
+      default: '', 
+    }, 
+    row: { 
+      type: Object, 
+    }, 
+    sort: { 
+      type: Number, 
+      default: 0, 
+    }, 
+  }, 
+  emits: ['update:modelValue', 'close', 'submit', 'confirmquery1'], 
+  setup(props: Record<string, any>, ctx: SetupContext) { 
+    const { 
+      onClose, 
+      onConfirmQuery, 
+      onOpen, 
+      onReset, 
+      formRef, 
+      visible, 
+      formItems, 
+      formData, 
+    } = useWmsMaterialContainerQueryDrawer(props, ctx) 
+    return () => ( 
+      <BaseQueryDrawer 
+        class={styles.drawer} 
+        size="800px" 
+        title={props.title || '楂樼骇鏌ヨ'} 
+        v-model={visible.value} 
+        close-on-click-modal={true} 
+        onReset={onReset} 
+        onConfirmQueryForBase={onConfirmQuery} 
+        onOpen={onOpen} 
+        before-close={onClose} 
+        onClose={onClose} 
+      > 
+        <DyForm 
+          ref={formRef} 
+          formData={formData.value} 
+          labelWidth="106px" 
+          formItemProps={formItems} 
+        ></DyForm> 
+      </BaseQueryDrawer> 
+    ) 
+  }, 
+}) 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/Config.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/Config.ts
new file mode 100644
index 0000000..5e6ddfc
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/Config.ts
@@ -0,0 +1,27 @@
+export const columns = [ 
+  { 
+    type: 'seq', 
+    width: 60, 
+    title: '搴忓彿', 
+  }, 
+  { 
+  field: 'containerNo', 
+  title: '鎵樼洏缂栧彿', 
+}, 
+{ 
+  field: 'materialId', 
+  title: '鐗╂枡ID', 
+}, 
+{ 
+  field: 'sort', 
+  title: '', 
+}, 
+{ 
+  field: 'creationTime', 
+  title: '鏄惁绂佺敤', 
+}, 
+{ 
+  field: 'deletionTime', 
+  title: '', 
+},  
+] 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.module.scss
new file mode 100644
index 0000000..9fb101e
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.module.scss
@@ -0,0 +1,253 @@
+.pipeAccessoryWeldContent { 
+  width: 100%; 
+  height: 100%; 
+  // height: 100% !important; 
+  // overflow-y: auto !important; /* 鍐呭瓒呭嚭鏃舵樉绀烘粴鍔ㄦ潯 */
+  // padding-bottom: 20px; /* 閬垮厤鍐呭琚簳閮ㄩ伄鎸� */
+ 
+  .pipeAccessoryWeldList { 
+    width: 100%; 
+    height: calc(100% - 70px); 
+  } 
+  .headerContent { 
+    display: flex; 
+    justify-content: space-between; 
+    align-items: center; 
+    height: 43px; 
+  } 
+  .header { 
+    margin-bottom: 12px; 
+    display: flex; 
+    justify-content: flex-end; 
+    align-items: center; 
+  } 
+
+  .h5Form {
+    display: flex;
+    flex-direction: column;
+    gap: 20px; // 琛ㄥ崟椤逛箣闂寸殑闂磋窛
+
+    .el-form-item {
+      margin-bottom: 0; // 绉婚櫎榛樿鐨勫簳閮ㄨ竟璺�
+       width: 100% !important; // 鍗犳弧鐖跺鍣ㄥ搴�
+    }
+
+    .el-form-item__label {
+      display: block;
+      text-align: left;
+      margin-bottom: 8px;
+      font-weight: 500;
+    }
+  }
+} 
+ 
+.tagBox { 
+  width: auto; 
+  min-width: 80px; 
+  height: 24px; 
+  background: #ffffff; 
+  border-radius: 19px 19px 19px 19px; 
+  opacity: 1; 
+  border: 1px dashed #bcc4cc; 
+  width: 50px; 
+  height: 20px; 
+  font-size: 14px; 
+  font-family: PingFang SC, PingFang SC; 
+  font-weight: 400; 
+  color: #5a84ff; 
+  display: flex; 
+  justify-content: center; 
+  align-items: center; 
+  // cursor: pointer; 
+} 
+ 
+.group { 
+  display: flex; 
+  justify-content: space-between; 
+  align-items: center; 
+} 
+ 
+.groupTable { 
+  width: 100%; 
+} 
+ 
+.overBox { 
+  width: 100%; 
+  height: calc(100% - 20px); 
+  overflow: auto; 
+  :global(.cs-collapse-item__header) { 
+    background-color: #f1f1f1; 
+    padding: 0 20px; 
+    height: 35px; 
+    font-size: 16px; 
+    font-family: PingFang SC, PingFang SC; 
+    font-weight: 500; 
+  } 
+  :global(.cs-collapse-item__content) { 
+    padding-bottom: 0px; 
+  } 
+} 
+.groupHeader { 
+  width: 100%; 
+  height: 30px; 
+  background: #ccc; 
+} 
+ 
+.hideBlock { 
+  display: none; 
+} 
+.queryForm { 
+  padding: 10px; 
+  background: #f5f7fa; 
+  margin-bottom: 0px; 
+  border-radius: 4px; 
+   
+  .el-form-item { 
+    margin-right: 20px; 
+    margin-bottom: 0; 
+     
+    // 缁熶竴杈撳叆妗嗗拰閫夋嫨妗嗙殑瀹藉害 
+    .el-input, .el-select { 
+      width: 200px; // 璁剧疆缁熶竴鐨勫搴� 
+    } 
+     
+    // 閫夋嫨妗嗗唴閮ㄨ緭鍏ユ鏍峰紡 
+    .el-select .el-input__wrapper { 
+      height: 32px; // 涓庤緭鍏ユ楂樺害涓�鑷� 
+      padding: 1px 11px; // 涓庤緭鍏ユ鍐呰竟璺濅竴鑷� 
+    } 
+     
+    // 鏃ユ湡閫夋嫨鍣ㄥ搴� 
+    .el-date-editor { 
+      width: 220px; 
+    } 
+  } 
+} 
+ 
+// 濡傛灉闇�瑕佹洿绮剧‘鐨勬帶鍒讹紝鍙互鍗曠嫭璁剧疆 
+.formItem { 
+  width: 200px; 
+   
+  &.el-input, &.el-select { 
+    width: 100%; 
+  } 
+} 
+  
+
+
+.newPageContent {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 20px;
+  padding: 20px;
+  background-color: white;
+
+  .info-block {
+    background-color: #f9f9f9;
+    border: 1px solid #eaeaea;
+    border-radius: 5px;
+    padding: 20px;
+    width: calc(33.33% - 20px);
+
+    .block-title {
+      font-size: 20px;
+      font-weight: bold;
+      margin-bottom: 15px;
+    }
+
+    .info-tags {
+      display: flex;
+      flex-wrap: wrap;
+      gap: 10px;
+
+      .info-tag {
+        display: flex;
+        align-items: center;
+        gap: 5px;
+
+        .tag-label {
+          font-weight: bold;
+        }
+      }
+    }
+
+    .action-buttons {
+      display: flex;
+      gap: 10px;
+      margin-top: 20px;
+    }
+
+    .equipment-image {
+      width: 100%;
+      height: auto;
+      margin-top: 20px;
+    }
+
+    .status-normal {
+      color: green;
+    }
+  }
+
+  .process-table {
+    width: 100%;
+    margin-top: 20px;
+
+    .el-table {
+      border: 1px solid #eaeaea;
+      border-radius: 5px;
+    }
+  }
+}
+
+
+.modelRrow {
+  display: flex; /* 寮规�у竷灞� */
+  gap: 20px; /* 鎺т欢闂磋窛 */
+  align-items: center; /* 鍨傜洿灞呬腑 */
+  margin-bottom: 12px; /* 搴曢儴闂磋窛 */
+  width: 100%;
+
+  .el-form-item {
+    flex: 1 !important; /* 鍧囧垎绌洪棿 */
+    margin-bottom: 0;
+    max-width: none; // 绉婚櫎鏈�澶у搴﹂檺鍒�
+  }
+
+  .el-select {
+    width: 100%; // 纭繚Select鍗犳弧鐖跺鍣ㄥ搴�
+    
+    // 绉婚櫎鍙兘褰卞搷瀹藉害鐨勫唴閮ㄦ牱寮�
+    .el-input__wrapper {
+      width: 100%;
+    }
+  }
+
+  // 鍝嶅簲寮忚璁�
+  @media (max-width: 1200px) {
+    .model-row {
+      flex-wrap: wrap;
+      
+      .el-form-item {
+        flex: 1 0 calc(50% - 10px); // 鍦ㄤ腑绛夊睆骞曚笂姣忚鏄剧ず2涓�
+        margin-bottom: 10px;
+      }
+    }
+  }
+  
+  @media (max-width: 768px) {
+    .model-row {
+      flex-direction: column;
+      
+      .el-form-item {
+        width: 100%; // 鍦ㄥ皬灞忓箷涓婃瘡琛屾樉绀�1涓�
+      }
+    }
+  }
+}
+
+.action-buttons {
+  display: flex;
+  gap: 10px;
+  margin-top: 20px;
+}
+
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.tsx
new file mode 100644
index 0000000..2135fad
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.tsx
@@ -0,0 +1,360 @@
+import { defineComponent, onMounted, ref } from 'vue'
+import type { Ref } from 'vue'
+import styles from './PipeAccessoryWeld.module.scss'
+import pipeImage from '@/images/pipe-Weld-drawing-example.png'
+import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox' 
+import {
+  ElInput,
+  ElForm,
+  ElFormItem,
+  ElButton,
+  ElSelect,
+  ElOption,
+  ElMessage,
+  ElCol,
+} from 'element-plus'
+import {
+  getPlaceNoForStockList,
+  getMaterialModelList,
+  instock,
+  findSingleWorkPlanByFilter,
+  startProduction,
+  finishProduction
+} from '@/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeld'
+import { Message } from '@element-plus/icons-vue/dist/types'
+
+export default defineComponent({
+  name: 'PipeAccessoryWeld',
+  setup() {
+    // 鏌ヨ琛ㄥ崟鏁版嵁
+const queryForm = ref({
+  pipeSpecCode: '',
+  processRouteNumber: '',
+  taskCode: '',
+  length: '',
+  projectNumber: '',
+  shipNumber: '',
+  material: '',
+  outerDiameter: '',
+  thickness: '',
+  plannedStartTime: '',
+  plannedEndTime: '',
+  workstationCode: '',
+  processName: '',
+  equipmentCode: ''
+})
+
+    // 鏁版嵁婧�
+    const modelOptions = ref<Array<{ value: string; label: string }>>([])
+    const placeNoOptions = ref<Array<{ value: string; label: string }>>([])
+
+    onMounted(() => {
+      // 缁勪欢鎸傝浇鍚庤幏鍙栧瀷鍙峰垪琛ㄥ拰搴撲綅鍙峰垪琛�
+      getModelList()
+      getPlaceNoList()
+    })
+
+    // 缁勭洏鎿嶄綔
+    const handlePalletize = () => {
+      console.log('缁勭洏鎿嶄綔', queryForm.value)
+      // 杩欓噷娣诲姞缁勭洏閫昏緫
+    }
+
+    // 缁勭洏鍏ュ簱鎿嶄綔
+    const handlePalletizeStorage = () => {
+      console.log('缁勭洏鍏ュ簱鎿嶄綔', queryForm.value)
+      instock(queryForm.value), resetQueryForm()
+      ElMessage.success({
+        message: '缁勭洏鍏ュ簱鎴愬姛',
+        type: 'success',
+      })
+      // 杩欓噷娣诲姞缁勭洏鍏ュ簱閫昏緫
+    }
+
+    const resetQueryForm = () => {
+      queryForm.value.materialModel = ''
+      queryForm.value.placeNo = ''
+      queryForm.value.materialBatch = ''
+      queryForm.value.stockNumber = ''
+    }
+
+    const getModelList = async () => {
+      const models = await getMaterialModelList()
+      modelOptions.value = models.map((item: string) => ({
+        value: item.materialModel,
+        label: item.materialModelDesc,
+      }))
+    }
+
+    const getPlaceNoList = async () => {
+      const placeNos = await getPlaceNoForStockList(2)
+      console.log('搴撲綅鍙峰垪琛�:', placeNos)
+      placeNoOptions.value = placeNos.map((item: string) => ({
+        value: item.placeNo,
+        label: item.placeNoDesc,
+      }))
+    }
+    const handleChange =async (value) => {
+      console.log('杈撳叆鍐呭纭:', value); // 澶卞幓鐒︾偣鎴栧洖杞︽椂瑙﹀彂
+      // 鍦ㄦ澶勬坊鍔犱笟鍔¢�昏緫锛堝鏍¢獙銆佹彁浜ょ瓑锛�
+      const param={
+        pipeSpecCode:value,
+        pipeSpecCode_FilterMode:2,//绮惧噯鏌ヨ
+        processName:'鐒婃帴宸ュ簭',
+        processName_FilterMode:2,//绮惧噯鏌ヨ
+      }
+      const workPlan = await findSingleWorkPlanByFilter(param);
+      console.log('杩斿洖:'+workPlan);
+      if(workPlan==''){
+        ElMessage.error('娌℃湁鎵惧埌鏁版嵁'); 
+        queryForm.value ={ pipeSpecCode: '',
+          processRouteNumber: '',
+          taskCode: '',
+          length: '',
+          projectNumber: '',
+          shipNumber: '',
+          material: '',
+          outerDiameter: '',
+          thickness: '',
+          plannedStartTime: '',
+          plannedEndTime: '',
+          workstationCode: '',
+          processName: '',
+          equipmentCode: ''}
+      }else{
+        queryForm.value=workPlan;
+      }
+    };
+
+    // 寮�宸ヤ簨浠跺鐞�
+    const startWork = () => {
+      console.log('鎵ц寮�宸ユ搷浣�');
+      if(queryForm.value.pipeSpecCode==''){
+        ElMessage.error('璇疯緭鍏ョ娈电紪鐮�'); 
+        return
+      }
+      ConfirmBox( 
+                `纭畾瑕佸皢绠℃缂栫爜${queryForm.value.pipeSpecCode}寮�宸ュ悧` 
+              ).then(async () => { 
+                //鎮ㄧ殑涓氬姟閫昏緫
+                const param={
+                  taskCode:queryForm.value.taskCode,
+                };
+                const ret = await startProduction(param);
+      console.log('杩斿洖:'+ret);
+                if(ret.code="200"){
+                  ElMessage.success('寮�宸ユ垚鍔�'); 
+                }else{
+                  ElMessage.error('寮�宸ュけ璐�:'+ret.message); 
+                }
+              }) 
+    } 
+    // 瀹屽伐浜嬩欢澶勭悊
+    const finishWork = () => {
+      console.log('鎵ц寮�宸ユ搷浣�');
+      if(queryForm.value.pipeSpecCode==''){
+        ElMessage.error('璇疯緭鍏ョ娈电紪鐮�'); 
+        return
+      }
+      ConfirmBox( 
+                `纭畾瑕佸皢绠℃缂栫爜${queryForm.value.pipeSpecCode}瀹屽伐鍚梎 
+              ).then(async () => { 
+                //鎮ㄧ殑涓氬姟閫昏緫
+                const param={
+                  pipeSpecCode:queryForm.value.pipeSpecCode,
+                  processName:queryForm.value.processName,
+                };
+                const ret = await finishProduction(param);
+      console.log('杩斿洖:'+ret);
+                if(ret.code="200"){
+                  ElMessage.success('瀹屽伐鎴愬姛'); 
+                }else{
+                  ElMessage.error('瀹屽伐澶辫触:'+ret.message); 
+                }
+              }) 
+    }
+    const tableData = ref([
+      { sequence: 1, flangeA: 'RF-200-1.6MPa', flangeB: 'WN-200-1.6MPa' },
+      { sequence: 2, flangeA: 'WN-250-2.5MPa', flangeB: 'SO-250-2.5MPa' },
+      { sequence: 3, flangeA: 'PL-300-1.0MPa', flangeB: 'RF-300-1.0MPa' },
+      { sequence: 4, flangeA: 'SO-150-2.0MPa', flangeB: 'WN-150-2.0MPa' },
+      { sequence: 5, flangeA: 'RF-400-1.6MPa', flangeB: 'PL-400-1.6MPa' },
+      { sequence: 6, flangeA: 'WN-200-4.0MPa', flangeB: 'SO-200-4.0MPa' },
+      { sequence: 7, flangeA: 'SO-300-1.6MPa', flangeB: 'RF-300-1.6MPa' },
+      { sequence: 8, flangeA: 'PL-250-1.0MPa', flangeB: 'WN-250-1.0MPa' },
+      { sequence: 9, flangeA: 'RF-150-2.5MPa', flangeB: 'SO-150-2.5MPa' },
+      { sequence: 10, flangeA: 'WN-400-2.0MPa', flangeB: 'PL-400-2.0MPa' }
+    ]);
+
+
+    return () => {
+      return (
+        <div
+          class={styles.PipeAccessoryWeldContent}
+          style="overflow-y: auto !important;  height: 100%;"
+        >
+             <ElFormItem label="绠℃缂栫爜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.pipeSpecCode}
+                    clearable
+                    class={styles.formInput}
+                    onInput={handleChange}
+                  />
+                </ElFormItem>
+          <div class={styles.actionButtons}>
+            <ElButton type="warning" onClick={startWork}>寮�宸�</ElButton>
+            <ElButton type="warning" onClick={finishWork}>瀹屽伐</ElButton>
+            {/* <ElButton type="warning">鏆傚仠</ElButton>
+            <ElButton type="warning">鑷姩</ElButton>
+            <ElButton type="warning">璐ㄦ</ElButton> */}
+          </div>
+
+          <h2 class={styles.blockTitle}>褰撳墠浠诲姟</h2>
+          <ElForm label-position="left" >
+             
+                <ElFormItem label="鐗╂枡娴佸悜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.processRouteNumber}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="浠诲姟缂栧彿&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.taskCode}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="绠℃闀垮害&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.length}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="椤圭洰&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍙�">
+                  <ElInput
+                    v-model={queryForm.value.projectNumber}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="鑸�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍙�">
+                  <ElInput
+                    v-model={queryForm.value.shipNumber}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="鏉�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;璐�">
+                  <ElInput
+                    v-model={queryForm.value.material}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="澶�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;寰�">
+                  <ElInput
+                    v-model={queryForm.value.outerDiameter}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="澹�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍘�">
+                  <ElInput
+                    v-model={queryForm.value.thickness}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="璁″垝寮�濮嬫椂闂�">
+                  <ElInput
+                    v-model={queryForm.value.plannedStartTime}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="璁″垝瀹屾垚鏃堕棿">
+                  <ElInput
+                    v-model={queryForm.value.plannedEndTime}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+              </ElForm>
+
+              <h2 class={styles.blockTitle}>褰撳墠宸ヤ綅/璁惧淇℃伅</h2>
+          <ElForm label-position="left" >
+                <ElFormItem label="宸ヤ綅浠g爜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.workstationCode}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="宸ュ簭鍚嶇О&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.processName}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                <ElFormItem label="璁惧浠g爜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;">
+                  <ElInput
+                    v-model={queryForm.value.equipmentCode}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem>
+                {/* <ElFormItem label="璁惧鐘舵��">
+                  <ElInput
+                    v-model={queryForm.value.materialBatch}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem> */}
+                {/* <ElFormItem label="鎿嶄綔浜�">
+                  <ElInput
+                    v-model={queryForm.value.materialBatch}
+                    disabled
+                    clearable
+                    class={styles.formInput}
+                  />
+                </ElFormItem> */}
+              </ElForm>
+
+          {/* <div class="info-block">
+            <h2 class="block-title">宸ヨ壓淇℃伅</h2>
+            <el-table stripe  v-model:dataSource={tableData}>
+              <el-table-column prop="sequence" label="搴�"></el-table-column>
+              <el-table-column prop="flangeA" label="娉曞叞A"></el-table-column>
+              <el-table-column prop="flangeB" label="娉曞叞B"></el-table-column>
+            </el-table>
+          </div> */}
+          <h2 class="block-title">鍥剧焊</h2>
+          <img
+            src={pipeImage}
+            alt="璁惧鍥剧墖"
+            style="height:1250px;"
+            class="equipment-image"
+          ></img>
+        </div>
+      )
+    }
+  },
+})
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.module.scss b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.module.scss
new file mode 100644
index 0000000..6eea6eb
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.module.scss
@@ -0,0 +1,7 @@
+.PipeAccessoryWeld { 
+  background-color: #fff; 
+  border-radius: 5px 5px 0 0; 
+  width: 100%; 
+  height: 100%; 
+  border: 1px solid #dbdbdb; 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.tsx b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.tsx
new file mode 100644
index 0000000..cb45e4e
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.tsx
@@ -0,0 +1,80 @@
+import {
+  Component,
+  DefineComponent,
+  defineComponent,
+  markRaw,
+  ref,
+  SetupContext,
+  onMounted,
+} from 'vue'
+import styles from './PipeAccessoryWeld.module.scss'
+import Tab from '@/components/Tab/Tab'
+import { useProvideModels } from '@/libs/Provider/app'
+import { usePermission } from '@/libs/Permission/Permission'
+import { permissionCodes } from '../enum'
+import { ModuleType, TabItem } from '../type/Type'
+import { getEntityNames } from '@/hooks/hook'
+import TabPane from '@/components/Tab/TabPane'
+
+const Models: ModuleType = import.meta.glob('./config/*.json', {
+  eager: true,
+})
+
+const entityNames = getEntityNames(Models)
+
+const nameToLabelMap = [{ name: 'PipeAccessoryWeld', label: '绠¢檮浠剁剨鎺�' }]
+
+export default defineComponent({
+  name: 'PipeAccessoryWeld',
+
+  setup(props, ctx: SetupContext) {
+    useProvideModels()
+    usePermission(props, permissionCodes)
+
+    const rf = ref<{
+      [key: string]: any
+    }>({})
+
+    const tabData = ref<TabItem[]>([])
+
+    const onTabChange = (v: string) => {
+      rf.value?.[v]?.reloadList()
+    }
+
+    const initTableData = async () => {
+      for (const i in entityNames) {
+        const name = entityNames[i]
+        const module = await import(`./Pages/${name}/${name}.tsx`)
+        const PipeAccessoryWeld = markRaw(module.default)
+        const foundLabel =
+          nameToLabelMap.find((item) => item.name === name)?.label || name
+        tabData.value.push({
+          label: foundLabel,
+          name,
+          component: PipeAccessoryWeld,
+        })
+      }
+    }
+
+    initTableData()
+
+    return () => {
+      return (
+        <div class={styles.PipeAccessoryWeld}>
+          <Tab data={tabData.value} type="list" onTab={onTabChange}>
+            {tabData.value.map((widgetInfo) => {
+              const Widget: any = widgetInfo.component
+              return (
+                <TabPane label={widgetInfo.label} name={widgetInfo.name}>
+                  <Widget
+                    ref={(r: any) => (rf.value['PipeAccessoryWeld'] = r)}
+                  ></Widget>
+                </TabPane>
+              )
+            })}
+          </Tab>
+        </div>
+      )
+    }
+  },
+})
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/config/PipeAccessoryWeld.json b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/config/PipeAccessoryWeld.json
new file mode 100644
index 0000000..3443780
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/config/PipeAccessoryWeld.json
@@ -0,0 +1,3 @@
+{ 
+  "name": "PipeAccessoryWeld" 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/enum.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/enum.ts
new file mode 100644
index 0000000..d3a0c5f
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/enum.ts
@@ -0,0 +1,15 @@
+export interface TabType { 
+  label: string 
+  name: string 
+  columns?: any[] 
+  data?: any[] 
+  isFooter: boolean 
+  [key: string]: any 
+} 
+ 
+export const permissionCodes = { 
+  'PipeAccessoryWeld-list': '鍒楄〃-鍒楄〃', 
+  'PipeAccessoryWeld-add': '鍒楄〃-娣诲姞', 
+  'PipeAccessoryWeld-import': '鍒楄〃-瀵煎叆', 
+  'PipeAccessoryWeld-output': '鍒楄〃-杈撳嚭', 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/index.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/index.ts
new file mode 100644
index 0000000..5914271
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/index.ts
@@ -0,0 +1,14 @@
+import PipeAccessoryWeld from './Views/PipeAccessoryWeld'
+import Setting from '@/components/Setting/Setting'
+import { provider } from '@/provider/index'
+import p from '../../assets/svg/p.svg'
+
+export default {
+  is: 'PipeAccessoryWeld',
+  name: '绠¢檮浠剁剨鎺�',
+  category: 'run',
+  icon: p,
+  authorizationRequired: false,
+  canvasView: provider(PipeAccessoryWeld),
+  settingsView: Setting,
+}
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/type/type.d.ts b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/type/type.d.ts
new file mode 100644
index 0000000..aa8d450
--- /dev/null
+++ b/PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/type/type.d.ts
@@ -0,0 +1,45 @@
+import { Component } from 'vue' 
+ 
+export interface DataItemType { 
+  id?: string 
+  name?: string 
+  code?: string 
+  description?: string 
+  label?: string 
+  value?: string | number 
+} 
+ 
+export interface WmsMaterialContainerBaseType { 
+  id?: string 
+  name?: string 
+  code?: string 
+  value?: number 
+  description?: string 
+  options?: Array<DataItemType> 
+  abilityValue?: number | string 
+  data?: DataItemType 
+  defaultValue?: string | number 
+  flow: string 
+} 
+ 
+export interface FlowDefinitionType { 
+  id?: string 
+  name?: string 
+  code?: string 
+  description?: string 
+} 
+ 
+export type ModuleType = Record< 
+  string, 
+  { 
+    default: Record<string, string> 
+    name: string 
+  } 
+> 
+ 
+export interface TabItem { 
+  name: string 
+  label: string 
+  component: Component 
+  hidden?: boolean 
+} 
diff --git a/PipeLineLems/pipelinelems_web/src/widgets/WorkPlan/Views/Pages/WorkPlan/Config.ts b/PipeLineLems/pipelinelems_web/src/widgets/WorkPlan/Views/Pages/WorkPlan/Config.ts
index e051aae..de41e2e 100644
--- a/PipeLineLems/pipelinelems_web/src/widgets/WorkPlan/Views/Pages/WorkPlan/Config.ts
+++ b/PipeLineLems/pipelinelems_web/src/widgets/WorkPlan/Views/Pages/WorkPlan/Config.ts
@@ -10,6 +10,21 @@
   width:160, 
 }, 
 { 
+  field: 'pipeSpecCode', 
+  title: '绠℃缂栫爜', 
+  width:160, 
+}, 
+{ 
+  field: 'pipeSectionName', 
+  title: '绠℃鍚嶇О', 
+  width:160, 
+}, 
+{ 
+  field: 'processName', 
+  title: '宸ュ簭鍚嶇О', 
+  width:160, 
+}, 
+{ 
   field: 'workPlanStatusDesc', 
   title: '璁″垝鐘舵��', 
   width:160, 
@@ -119,11 +134,7 @@
   title: '椤圭洰鍙�', 
   width:160, 
 }, 
-{ 
-  field: 'processName', 
-  title: '宸ュ簭鍚嶇О', 
-  width:160, 
-}, 
+
 { 
   field: 'pipeFittingCode', 
   title: '绠′欢缂栫爜', 
@@ -134,16 +145,7 @@
   title: '椤哄簭鍙�', 
   width:160, 
 }, 
-{ 
-  field: 'pipeSpecCode', 
-  title: '绠℃缂栫爜', 
-  width:160, 
-}, 
-{ 
-  field: 'pipeSectionName', 
-  title: '绠℃鍚嶇О', 
-  width:160, 
-}, 
+
 { 
   field: 'outerDiameter', 
   title: '澶栧緞(mm)', 
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/CompleteAssemblyProcessInput.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/CompleteAssemblyProcessInput.cs
new file mode 100644
index 0000000..f0f5d8b
--- /dev/null
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/CompleteAssemblyProcessInput.cs
@@ -0,0 +1,29 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan
+{
+    /// <summary>
+    /// 瑁呴厤宸ュ簭瀹屽伐 杈撳叆鍙傛暟妯″瀷
+    /// </summary>
+    [Serializable]
+    public class CompleteAssemblyProcessInput
+    {
+
+        /// <summary>
+        /// 绠℃缂栫爜
+        /// </summary>
+        public string PipeSpecCode { get; set; }
+
+        /// <summary>
+        /// 宸ュ簭鍚嶇О
+        /// </summary>
+        public string ProcessName { get; set; }
+
+
+
+    }
+}
\ No newline at end of file
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/StartProductionInput.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/StartProductionInput.cs
new file mode 100644
index 0000000..eb74166
--- /dev/null
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/StartProductionInput.cs
@@ -0,0 +1,28 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan
+{
+    /// <summary>
+    /// 寮�宸ヨ緭鍏ュ弬鏁版ā鍨�
+    /// </summary>
+    [Serializable]
+    public class StartProductionInput
+    {
+
+        /// <summary>
+        /// 浠诲姟缂栫爜
+        /// </summary>
+        public string TaskCode { get; set; }
+
+        ///// <summary>
+        ///// 宸ュ簭鍚嶇О
+        ///// </summary>
+        //public string ProcessName { get; set; }
+
+
+    }
+}
\ No newline at end of file
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs
index 1910392..4e92385 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs
@@ -1,3 +1,4 @@
+using Ao.Stock.Mirror;
 using CMS.Plugin.PipeLineLems.Application.Contracts.Dtos.WorkPlan;
 using CMS.Plugin.PipeLineLems.Domain.WorkPlan;
 using CmsQueryExtensions.Entitys;
@@ -69,4 +70,20 @@
     /// <returns></returns> 
     /// <exception cref="UserFriendlyException"></exception> 
     Task<WorkPlan> GetSingleByFilterAsync(Expression<Func<WorkPlan, bool>> whereConditions, bool is鈥婱ultipleThrowException = false, CancellationToken cancellationToken = default);
+
+
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇浣滀笟璁″垝琛ㄥ垪琛�
+    /// </summary> 
+    /// <param name="input"></param> 
+    /// <returns></returns> 
+    Task<List<WorkPlanDto>> FindListByFilterAsync(GetWorkPlanInput input, CancellationToken cancellationToken = default);
+    
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇鍗曚釜浣滀笟璁″垝琛�
+    /// </summary> 
+    /// <param name="input"></param> 
+    /// <returns></returns> 
+    Task<WorkPlanDto> FindSingleByFilterAsync(GetWorkPlanInput input, CancellationToken cancellationToken = default);
+    
 }
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs
index 06bd5f4..884a9c5 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs
@@ -49,6 +49,14 @@
     /// <returns></returns>
     public async Task<MesOrderResponse> CommonPick(IServiceProvider _serviceProvider, PickInput input, MyCurrentUser myCurrentUser)
     {
+        if (string.IsNullOrEmpty(input.PipeSpecCode))
+        {
+            throw new UserFriendlyException("璇疯緭鍏ョ娈电紪鐮�");
+        };
+        if (string.IsNullOrEmpty(input.ContinerNo))
+        {
+            throw new UserFriendlyException("璇疯緭鍏ユ墭鐩樺彿");
+        };
         //1銆佽褰曞垎鎷h褰曡〃
         //2銆佹洿鏂颁綔涓氳鍒掕〃鐨勭姸鎬� =宸插垎鎷�
         //3銆佸啓鍏� 鍒嗘嫞鍙橀噺
@@ -61,6 +69,7 @@
         var traceProvider = _serviceProvider.GetRequiredService<ITraceProvider>();
         var materialProvider = _serviceProvider.GetRequiredService<IMaterialProvider>();
         var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
+        var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
 
         //Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?>
         //            {
@@ -103,6 +112,9 @@
         var firstWorkPlans = await workPlanAppService.GetListByFilterAsync(x => x.PipeSpecCode == input.PipeSpecCode);
 
         var firstWorkPlan = await workPlanAppService.GetSingleByFilterAsync(x => x.PipeSpecCode == input.PipeSpecCode);
+
+        var callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.DataIdentifier == firstWorkPlan.DataIdentifier);
+
         var rawPipe_DataIdentifier = await materialProvider.FindByNameAsync("鍘熸枡绠℃爣璇�");
         var rawPipe_MaterialMode = await materialProvider.FindByNameAsync("鍘熸枡绠″瀷鍙�");
         var rawPipe_Batch = await materialProvider.FindByNameAsync("鍘熸枡绠℃壒娆�");
@@ -141,7 +153,7 @@
                     Quantity = 1,
                     MaterialId = rawPipe_Batch.MaterialId,
                     MaterialDetailId = rawPipe_Batch.MaterialDetails.First().Id,
-                    Value = "111",//鎵规鏆傛椂鍐欐
+                    Value = callMaterialOrder.MaterialBatch,//鎵规鏆傛椂鍐欐
 
                 });
             }
@@ -154,7 +166,30 @@
             string _value = "";
             if (item.Name == "鍒嗘嫞鏂瑰悜")
             {
-                _value = "鐭瑁呴厤";
+                _value = "鐭鍒嗘嫞";
+            }
+            if (item.Name == "鍒嗘嫞鎵樼洏鍙�")
+            {
+                _value = input.ContinerNo;
+            }
+            if (item.Name == "鍒嗘嫞浜�")
+            {
+                _value = myCurrentUser.UserAccount;
+            }
+            //item.Key
+            TraceParamModel traceParamModel = new TraceParamModel()
+            {
+                Key = item.Key,
+                Value = _value
+            };
+            traceModel.Params.Add(traceParamModel);
+        };
+        foreach (var item in workSection.FormulaParameters)
+        {
+            string _value = "";
+            if (item.Name == "鍒嗘嫞鏂瑰悜")
+            {
+                _value = "鐭鍒嗘嫞";
             }
             if (item.Name == "鍒嗘嫞鎵樼洏鍙�")
             {
@@ -566,6 +601,427 @@
     }
 
     /// <summary>
+    ///瑁呴厤/鐒婃帴寮�宸�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <param name="_serviceProvider"></param>
+    /// <param name="myCurrentUser"></param>
+    /// <returns></returns>
+    /// <exception cref="UserFriendlyException"></exception>
+    public async Task<MesOrderResponse> StartProduction(StartProductionInput input, IServiceProvider _serviceProvider, MyCurrentUser myCurrentUser)
+    {
+        if (string.IsNullOrEmpty(input.TaskCode.ToString()))
+        {
+            throw new UserFriendlyException("浠诲姟缂栫爜涓嶈兘涓虹┖");
+        }
+
+        string processName = "";
+
+        VariableService _variableService = _serviceProvider.GetRequiredService<VariableService>();
+        var callMaterialOrderRepository = _serviceProvider.GetRequiredService<ICallMaterialOrderRepository>();
+        var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
+        var callMaterialOrderRecordRepository = _serviceProvider.GetRequiredService<ICallMaterialOrderRecordRepository>();
+        var orderManager = _serviceProvider.GetRequiredService<IOrderManager>();
+        var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
+
+        // 鏌ユ壘鏁版嵁
+
+        var workPlan = await workPlanRepository.GetSingleByFilterAsync(x => x.TaskCode == input.TaskCode);
+        if (workPlan == null)
+        {
+            throw new UserFriendlyException($"鎵句笉鍒颁綔涓氳鍒�");
+        }
+        if (workPlan.ProcessName == "瑁呴厤宸ュ簭")
+        {
+            processName = "瑁呴厤";
+        }
+        else if (workPlan.ProcessName == "鐒婃帴宸ュ簭")
+        {
+            processName = "鐒婃帴";
+        }
+
+        // 楠岃瘉鐘舵��
+        if (workPlan.WorkPlanStatus != Domain.Shared.Enums.WorkPlanStatusEnum.鏆傚仠涓� && workPlan.WorkPlanStatus != Domain.Shared.Enums.WorkPlanStatusEnum.鏈敓浜�)
+        {
+            //鏆傛椂娉ㄩ噴
+            //throw new UserFriendlyException($"浠诲姟缂栫爜 '{input.TaskCode}' 鐨勫綍鐘舵�佷负 '{workPlan.WorkPlanStatus}'锛屼笉鍏佽寮�宸�");
+        }
+
+        var callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.DataIdentifier == workPlan.DataIdentifier);
+        #region 浜嬪姟
+
+        using var scope = _serviceProvider.CreateScope();
+        var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
+        using var uow = unitOfWorkManager.Begin(requiresNew: true);
+
+        try
+        {
+            #region 鏁版嵁澶勭悊
+
+            //1銆佹洿鏂颁綔涓氳鍒掕〃涓� 鐢熶骇涓�
+            //2銆佺粰PLC鍙戝伐鑹哄弬鏁版寚浠�,骞跺啓鍏� plc涓� 浜у搧id
+            //if (workPlan.ProcessName == "瑁呴厤宸ュ簭")
+            //{
+            //    workPlan.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.鐢熶骇涓�;
+            //}
+            //else if (workPlan.ProcessName == "鐒婃帴宸ュ簭")
+            //{
+            //    workPlan.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.宸插畬鎴�;
+            //}
+            workPlan.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.鐢熶骇涓�;
+
+            await workPlanRepository.UpdateAsync(workPlan);
+
+            Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?>
+                        {
+                            { $"{processName}_ProductID", workPlan.PipeSpecCode },
+                            { $"{processName}绠℃缂栫爜", workPlan.PipeSpecCode },
+                            { $"{processName}绠℃鍚嶇О", workPlan.PipeSectionName },
+                            { $"{processName}鍘熸枡绠℃壒娆�", callMaterialOrder.MaterialBatch },
+                            { $"{processName}鍘熸枡绠″瀷鍙�", callMaterialOrder.MaterialMode },
+                            { $"{processName}鍘熸枡绠℃爣璇�", callMaterialOrder.DataIdentifier },
+                            { $"{processName}椤圭洰鍙�", workPlan.ProjectNumber },
+                            { $"{processName}鑸瑰彿", workPlan.ShipNumber },
+
+                            //閲囬泦鏁版嵁妯℃嫙鍐欏叆
+                            { $"{processName}鍘嬪姏", "10.0 MPa" },
+                            { $"{processName}閫熷害", "18mm/s"},
+
+                            { $"{processName}浜�", myCurrentUser.UserAccount},
+                            { $"{processName}闂撮殭","15mm"},
+                            { $"{processName}浣嶇疆", "10,23,24"},
+                        };
+            _variableService.WriteValueAsync(keyValuePairs);
+
+
+            #endregion
+
+            await uow.CompleteAsync();
+
+            // 杩斿洖缁撴灉
+            var response = new MesOrderResponse
+            {
+                Code = "200",
+                Message = "澶勭悊鎴愬姛",
+                Time = DateTime.UtcNow
+            };
+            return response;
+        }
+        catch (Exception)
+        {
+            await uow.RollbackAsync();
+            throw;
+        }
+        finally
+        {
+
+        }
+
+
+
+        #endregion
+    }
+
+
+
+    /// <summary>
+    /// 瑁呴厤宸ュ簭瀹屽伐
+    /// </summary>
+    /// <param name="_serviceProvider"></param>
+    /// <param name="input"></param>
+    /// <param name="myCurrentUser"></param>
+    /// <returns></returns>
+    public async Task<MesOrderResponse> CompleteAssemblyProcess(IServiceProvider _serviceProvider, CompleteAssemblyProcessInput input, MyCurrentUser myCurrentUser)
+    {
+        //1銆佽褰曞垎鎷h褰曡〃
+        //2銆佹洿鏂颁綔涓氳鍒掕〃鐨勭姸鎬� =宸插垎鎷�
+        //3銆佸啓鍏� 鍒嗘嫞鍙橀噺
+        //4銆佸啓鍏ヨ拷婧姤琛�
+        //5銆佺墿鏂欑粍鐩�
+
+        if (string.IsNullOrEmpty(input.PipeSpecCode))
+        {
+            throw new UserFriendlyException($"绠℃缂栫爜涓嶈兘涓虹┖");
+        }
+
+
+        VariableService _variableService = _serviceProvider.GetRequiredService<VariableService>();
+        var _workSectionManager = _serviceProvider.GetRequiredService<IWorkSectionManager>();
+        var _workStationManager = _serviceProvider.GetRequiredService<IWorkStationManager>();
+        var traceProvider = _serviceProvider.GetRequiredService<ITraceProvider>();
+        var materialProvider = _serviceProvider.GetRequiredService<IMaterialProvider>();
+        var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
+        var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
+        var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
+
+        string processName = "";
+        //鐗╂枡鍙傛暟鍒楄〃
+        var firstWorkPlan = await workPlanAppService.GetSingleByFilterAsync(x => x.PipeSpecCode == input.PipeSpecCode && x.ProcessName == input.ProcessName);
+        if (firstWorkPlan == null)
+        {
+            throw new UserFriendlyException($"鎵句笉鍒颁綔涓氳鍒�");
+        }
+        if (firstWorkPlan.ProcessName == "瑁呴厤宸ュ簭")
+        {
+            processName = "瑁呴厤";
+        }
+        else if (firstWorkPlan.ProcessName == "鐒婃帴宸ュ簭")
+        {
+            processName = "鐒婃帴";
+        }
+
+        await CompleteHandleOutStoreFinish(_serviceProvider, processName, true);
+
+        //鏍规嵁宸ュ簭鍚嶈幏鍙栧伐搴忓璞�
+        var workSection = await _workSectionManager.GetByNameAsync($"{processName}宸ュ簭");
+        var workStation = await _workStationManager.GetByNameAsync($"{processName}宸ヤ綅");
+        //鍐欏叆杩芥函鎶ヨ〃
+        var finishTime = DateTime.Now;
+        TraceModel traceModel = new TraceModel()
+        {
+            SerialNumber = input.PipeSpecCode,
+            WorkSectionId = workSection.Id,
+            WorkSectionName = workSection.Name,
+            WorkStationName = workStation.Name,
+
+            FinishTime = finishTime,
+            IsQualified = true,
+            UnqualifiedReason = "",
+            ProductModel = "",
+            ProductName = "",
+
+        };
+        traceModel.Params = new List<TraceParamModel>();
+        foreach (var item in workSection.ProcessParameters)
+        {
+            var value = "ssss";
+            traceModel.Params.Add(new TraceParamModel()
+            {
+                Key = item.Key,
+                Value = value.SafeString()
+            });
+        }
+
+        #region 浜嬪姟
+
+        using var scope = _serviceProvider.CreateScope();
+        var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
+        using var uow = unitOfWorkManager.Begin(requiresNew: true);
+
+        try
+        {
+            #region 鏁版嵁澶勭悊
+
+
+
+            firstWorkPlan.WorkPlanStatus = Domain.Shared.Enums.WorkPlanStatusEnum.宸插畬鎴�;
+            await workPlanRepository.UpdateAsync(firstWorkPlan);
+
+            var callMaterialOrder = await callMaterialOrderAppService.GetSingleByFilterAsync(x => x.DataIdentifier == firstWorkPlan.DataIdentifier);
+
+            var rawPipe_DataIdentifier = await materialProvider.FindByNameAsync("鍘熸枡绠℃爣璇�");
+            var rawPipe_MaterialMode = await materialProvider.FindByNameAsync("鍘熸枡绠″瀷鍙�");
+            var rawPipe_Batch = await materialProvider.FindByNameAsync("鍘熸枡绠℃壒娆�");
+            var rawPipe_ProjectNumber = await materialProvider.FindByNameAsync("椤圭洰鍙�");
+            var rawPipe_ShipNumber = await materialProvider.FindByNameAsync("鑸瑰彿");
+            List<TraceMaterialModel> _MaterialParams = new List<TraceMaterialModel>();
+            foreach (var item in workSection.MaterialParameters)
+            {
+                if (item.Name == "鍘熸枡绠″瀷鍙�")
+                {
+                    _MaterialParams.Add(new TraceMaterialModel()
+                    {
+                        Key = item.Key,
+                        Quantity = 1,
+                        MaterialId = rawPipe_MaterialMode.MaterialId,
+                        MaterialDetailId = rawPipe_MaterialMode.MaterialDetails.First().Id,
+                        Value = firstWorkPlan.MaterialMode
+
+                    });
+                }
+                if (item.Name == "鍘熸枡绠℃爣璇�")
+                {
+                    _MaterialParams.Add(new TraceMaterialModel()
+                    {
+                        Key = item.Key,
+                        Quantity = 1,
+                        MaterialId = rawPipe_DataIdentifier.MaterialId,
+                        MaterialDetailId = rawPipe_DataIdentifier.MaterialDetails.First().Id,
+                        Value = firstWorkPlan.DataIdentifier,
+
+                    });
+                }
+                if (item.Name == "鍘熸枡绠℃壒娆�")
+                {
+                    _MaterialParams.Add(new TraceMaterialModel()
+                    {
+                        Key = item.Key,
+                        Quantity = 1,
+                        MaterialId = rawPipe_Batch.MaterialId,
+                        MaterialDetailId = rawPipe_Batch.MaterialDetails.First().Id,
+                        Value = callMaterialOrder.MaterialBatch,//鎵规鏆傛椂鍐欐
+
+                    });
+                }
+                if (item.Name == "椤圭洰鍙�")
+                {
+                    _MaterialParams.Add(new TraceMaterialModel()
+                    {
+                        Key = item.Key,
+                        Quantity = 1,
+                        MaterialId = rawPipe_ProjectNumber.MaterialId,
+                        MaterialDetailId = rawPipe_ProjectNumber.MaterialDetails.First().Id,
+                        Value = firstWorkPlan.ProjectNumber,
+
+                    });
+                }
+                if (item.Name == "鑸瑰彿")
+                {
+                    _MaterialParams.Add(new TraceMaterialModel()
+                    {
+                        Key = item.Key,
+                        Quantity = 1,
+                        MaterialId = rawPipe_ShipNumber.MaterialId,
+                        MaterialDetailId = rawPipe_ShipNumber.MaterialDetails.First().Id,
+                        Value = firstWorkPlan.ShipNumber,
+
+                    });
+                }
+            };
+
+            //閰嶇疆杩囩▼鍙傛暟(閲囬泦鍙傛暟銆侀厤鏂瑰弬鏁�)
+            traceModel.Params = new List<TraceParamModel>();
+            foreach (var item in workSection.ProcessParameters)
+            {
+                string _value = "";
+
+                //閲囬泦鍙傛暟
+                if (item.Name == $"{processName}鍘嬪姏")
+                {
+                    var _getValue = await _variableService.ReadValueAsync($"{processName}鍘嬪姏");
+                    _value = _getValue.Content.Value.SafeString().ToString();
+                }
+                if (item.Name == $"{processName}浣嶇疆")
+                {
+                    var _getValue = await _variableService.ReadValueAsync($"{processName}浣嶇疆");
+                    _value = _getValue.Content.Value.SafeString().ToString();
+                }
+                if (item.Name == $"{processName}閫熷害")
+                {
+                    var _getValue = await _variableService.ReadValueAsync($"{processName}閫熷害");
+                    _value = _getValue.Content.Value.SafeString().ToString();
+                }
+
+                if (item.Name == $"{processName}闂撮殭")
+                {
+                    _value = "15mm";
+                }
+                if (item.Name == $"{processName}浜�")
+                {
+                    _value = myCurrentUser.UserAccount;
+                }
+                //item.Key
+                TraceParamModel traceParamModel = new TraceParamModel()
+                {
+                    Key = item.Key,
+                    Value = _value
+                };
+                traceModel.Params.Add(traceParamModel);
+            };
+            foreach (var item in workSection.FormulaParameters)
+            {
+                string _value = "";
+
+                //閲囬泦鍙傛暟
+                if (item.Name == $"{processName}鍘嬪姏")
+                {
+                    var _getValue = await _variableService.ReadValueAsync($"{processName}鍘嬪姏");
+                    _value = _getValue.Content.Value.SafeString().ToString();
+                }
+                if (item.Name == $"{processName}浣嶇疆")
+                {
+                    var _getValue = await _variableService.ReadValueAsync($"{processName}浣嶇疆");
+                    _value = _getValue.Content.Value.SafeString().ToString();
+                }
+                if (item.Name == $"{processName}閫熷害")
+                {
+                    var _getValue = await _variableService.ReadValueAsync($"{processName}閫熷害");
+                    _value = _getValue.Content.Value.SafeString().ToString();
+                }
+
+                if (item.Name == $"{processName}闂撮殭")
+                {
+                    _value = "15mm";
+                }
+                if (item.Name == $"{processName}浜�")
+                {
+                    _value = myCurrentUser.UserAccount;
+                }
+                //item.Key
+                TraceParamModel traceParamModel = new TraceParamModel()
+                {
+                    Key = item.Key,
+                    Value = _value
+                };
+                traceModel.Params.Add(traceParamModel);
+            };
+
+            traceModel.MaterialParams = _MaterialParams;
+
+            await traceProvider.CreateTraceAsync(traceModel);
+
+            var response = new MesOrderResponse
+            {
+                Code = "200",
+                Data = "",
+                Message = "澶勭悊鎴愬姛",
+                Time = DateTime.UtcNow
+            };
+            return response;
+
+            #endregion
+
+            await uow.CompleteAsync();
+        }
+        catch (Exception)
+        {
+            await uow.RollbackAsync();
+            throw;
+        }
+        finally
+        {
+
+        }
+
+
+
+        #endregion
+
+    }
+
+
+    /// <summary>
+    /// 鍏叡澶勭悊 鍝嶅簲鍑虹珯瀹屾垚淇″彿
+    /// </summary>
+    /// <param name="_serviceProvider"></param>
+    /// <param name="input"></param>
+    /// <param name="myCurrentUser"></param>
+    /// <returns></returns>
+    public async Task CompleteHandleOutStoreFinish(IServiceProvider _serviceProvider, string processName, bool isOutResult)
+    {
+
+        VariableService _variableService = _serviceProvider.GetRequiredService<VariableService>();
+
+        Dictionary<string, object?> keyValuePairs = new Dictionary<string, object?>
+                    {
+                        { $"{processName}鍑虹珯瀹屾垚",isOutResult},
+                        { $"{processName}鍑虹珯缁撴灉",isOutResult? "鎴愬姛":""},
+                    };
+        await _variableService.WriteValueAsync(keyValuePairs);
+
+    }
+
+    /// <summary>
     /// 鐢熸垚闅忔満鐨刉msTaskNo
     /// </summary>
     /// <returns>闅忔満鐢熸垚鐨勪换鍔$紪鍙�</returns>
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs
index ce8adc5..01ffc44 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs
@@ -12,6 +12,7 @@
 using Volo.Abp.ObjectMapping;
 using Volo.Abp.Users;
 using CmsQueryExtensions.Entitys;
+using System.Collections.Generic;
 
 namespace CMS.Plugin.PipeLineLems.Application.Implements;
 
@@ -543,4 +544,56 @@
     {
         return await _workPlanRepository.GetSingleByFilterAsync(whereConditions, is鈥婱ultipleThrowException);
     }
+
+
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇浣滀笟璁″垝琛ㄥ垪琛�
+    /// </summary> 
+    /// <param name="input"></param> 
+    /// <returns></returns> 
+    public virtual async Task<List<WorkPlanDto>> FindListByFilterAsync(GetWorkPlanInput input, CancellationToken cancellationToken = default)
+    {
+        Check.NotNull(input, nameof(input));
+
+        if (input.Sorting.IsNullOrWhiteSpace())
+        {
+            input.Sorting = nameof(WorkPlan.Sort);
+        }
+
+        #region 鍔ㄦ�佹瀯閫犳煡璇㈡潯浠�  
+
+        //鍔ㄦ�佹瀯閫犳煡璇㈡潯浠�  
+        var whereConditions = DynamicGetQueryParams(input);
+
+        #endregion
+
+        var list = await _workPlanRepository.GetListByFilterAsync(whereConditions?.data);
+
+        return new List<WorkPlanDto>(ObjectMapper.Map<List<WorkPlan>, List<WorkPlanDto>>(list));
+    }
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇鍗曚釜浣滀笟璁″垝琛�
+    /// </summary> 
+    /// <param name="input"></param> 
+    /// <returns></returns> 
+    public virtual async Task<WorkPlanDto> FindSingleByFilterAsync(GetWorkPlanInput input, CancellationToken cancellationToken = default)
+    {
+        Check.NotNull(input, nameof(input));
+
+        if (input.Sorting.IsNullOrWhiteSpace())
+        {
+            input.Sorting = nameof(WorkPlan.Sort);
+        }
+
+        #region 鍔ㄦ�佹瀯閫犳煡璇㈡潯浠�  
+
+        //鍔ㄦ�佹瀯閫犳煡璇㈡潯浠�  
+        var whereConditions = DynamicGetQueryParams(input);
+
+        #endregion
+
+        var dataObj = await _workPlanRepository.GetSingleByFilterAsync(whereConditions?.data);
+
+        return (ObjectMapper.Map<WorkPlan, WorkPlanDto>(dataObj));
+    }
 }
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanController.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanController.cs
index 7e797c8..16f075a 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanController.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanController.cs
@@ -11,6 +11,8 @@
 using Volo.Abp;
 using Volo.Abp.Application.Dtos;
 using CmsQueryExtensions.Entitys;
+using CMS.Plugin.PipeLineLems.Domain.WorkPlan;
+using System.Linq.Expressions;
 
 namespace CMS.Plugin.PipeLineLems.Controller
 {
@@ -63,6 +65,30 @@
         }
 
         /// <summary> 
+        /// 鏍规嵁鏉′欢鑾峰彇浣滀笟璁″垝琛ㄥ垪琛�
+        /// </summary> 
+        /// <param name="input"></param> 
+        /// <returns></returns> 
+        [HttpPost]
+        [Route("FindListByFilter")]
+        public virtual async Task<List<WorkPlanDto>> FindListByFilterAsync(GetWorkPlanInput input)
+        {
+            return await _workPlanAppService.FindListByFilterAsync(input);
+        }
+        /// <summary> 
+        /// 鏍规嵁鏉′欢鑾峰彇鍗曚釜浣滀笟璁″垝琛�
+        /// </summary> 
+        /// <param name="input"></param> 
+        /// <returns></returns> 
+        [HttpPost]
+        [Route("FindSingleByFilter")]
+        public virtual async Task<WorkPlanDto> FindSingleByFilterAsync(GetWorkPlanInput input)
+        {
+
+            return await _workPlanAppService.FindSingleByFilterAsync(input);
+        }
+
+        /// <summary> 
         /// 鍒涘缓浣滀笟璁″垝琛� 
         /// </summary> 
         /// <param name="input">鍒涘缓鍙傛暟</param> 
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanPublicController.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanPublicController.cs
index 0ad0a16..c2ecf7d 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanPublicController.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanPublicController.cs
@@ -60,12 +60,23 @@
         [Route("Pick")]
         public virtual async Task<MesOrderResponse> Pick([FromBody] PickInput input)
         {
-            MyCurrentUser myCurrentUser = new MyCurrentUser()
+            try
             {
-                UserAccount = _currentUser.UserAccount,
-                UserId = _currentUser.UserId
-            };
-            return await sharedService.CommonPick(_serviceProvider, input, myCurrentUser);
+                MyCurrentUser myCurrentUser = new MyCurrentUser()
+                {
+                    UserAccount = _currentUser.UserAccount,
+                    UserId = _currentUser.UserId
+                };
+                return await sharedService.CommonPick(_serviceProvider, input, myCurrentUser);
+            }
+            catch (Exception ex)
+            {
+                return new MesOrderResponse()
+                {
+                    Code = "400",
+                    Message = ex.Message
+                };
+            }
         }
 
 
@@ -79,14 +90,81 @@
         [Route("CallMaterial")]
         public virtual async Task<MesOrderResponse> CallMaterial([FromBody] CallMaterialByDataIdentifierInput input)
         {
-            MyCurrentUser myCurrentUser = new MyCurrentUser()
+            try
             {
-                UserAccount = _currentUser.UserAccount,
-                UserId = _currentUser.UserId
-            };
-            return await sharedService.CallMaterial(input, _serviceProvider, myCurrentUser);
+                MyCurrentUser myCurrentUser = new MyCurrentUser()
+                {
+                    UserAccount = _currentUser.UserAccount,
+                    UserId = _currentUser.UserId
+                };
+                return await sharedService.CallMaterial(input, _serviceProvider, myCurrentUser);
+            }
+            catch (Exception ex)
+            {
+                return new MesOrderResponse()
+                {
+                    Code = "400",
+                    Message = ex.Message
+                };
+            }
         }
 
+        /// <summary>
+        /// 寮�宸�
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [Authorize]
+        [HttpPost]
+        [Route("StartProduction")]
+        public virtual async Task<MesOrderResponse> StartProduction([FromBody] StartProductionInput input)
+        {
+            try
+            {
+                MyCurrentUser myCurrentUser = new MyCurrentUser()
+                {
+                    UserAccount = _currentUser.UserAccount,
+                    UserId = _currentUser.UserId
+                };
+                return await sharedService.StartProduction(input, _serviceProvider, myCurrentUser);
+            }
+            catch (Exception ex)
+            {
+                return new MesOrderResponse()
+                {
+                    Code = "400",
+                    Message = ex.Message
+                };
+            }
+        }
 
+        /// <summary>
+        /// 瀹屽伐
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [Authorize]
+        [HttpPost]
+        [Route("FinishProduction")]
+        public virtual async Task<MesOrderResponse> FinishProduction([FromBody] CompleteAssemblyProcessInput input)
+        {
+            try
+            {
+                MyCurrentUser myCurrentUser = new MyCurrentUser()
+                {
+                    UserAccount = _currentUser.UserAccount,
+                    UserId = _currentUser.UserId
+                };
+                return await sharedService.CompleteAssemblyProcess(_serviceProvider, input, myCurrentUser);
+            }
+            catch (Exception ex)
+            {
+                return new MesOrderResponse()
+                {
+                    Code = "400",
+                    Message = ex.Message
+                };
+            }
+        }
     }
 }
diff --git a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs
index 3d83626..a15f5b9 100644
--- a/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs
+++ b/PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs
@@ -22,6 +22,8 @@
 using System.Collections.Generic;
 using CMS.Framework.AspNetCore.Users;
 using NPOI.SS.Formula.Functions;
+using CMS.Plugin.PipeLineLems.Application.Implements;
+using CmsQueryExtensions.Entitys;
 
 namespace CMS.Plugin.PipeLineLems.ProjectService
 {
@@ -90,6 +92,9 @@
                 { "璇锋眰鐢熸垚鎵撶爜浜у搧鐮佷俊鍙�", "璇锋眰鐢熸垚鎵撶爜浜у搧鐮佷俊鍙�(鎻忚堪)" },
                 { "璇锋眰鐢熸垚鍒囧壊浜у搧鐮佷俊鍙�", "璇锋眰鐢熸垚鍒囧壊浜у搧鐮佷俊鍙�(鎻忚堪)" },
                 { "鍒囧壊杩涚珯淇″彿", "鍒囧壊杩涚珯淇″彿(鎻忚堪)" },
+
+                { "瑁呴厤瀹屽伐淇″彿", "瑁呴厤瀹屽伐淇″彿(鎻忚堪)" },
+                { "鐒婃帴瀹屽伐淇″彿", "鐒婃帴瀹屽伐淇″彿(鎻忚堪)" },
             };
 
             // 鍒涘缓閫氶亾鐩戝惉
@@ -253,6 +258,43 @@
                         _ = Task.Run(async () =>
                         {
                             await HanlderForCutByCreateProductWhenFlaseAsync();
+                        });
+                    }
+                }
+
+
+                if (changed.Name == "瑁呴厤瀹屽伐淇″彿")
+                {
+                    if (changed.New?.Value.SafeString().ToBool() == true)
+                    {
+                        _ = Task.Run(async () =>
+                        {
+                            await HanlderFor瑁呴厤瀹屽伐淇″彿Async();
+                        });
+                    }
+                    else
+                    {
+                        _ = Task.Run(async () =>
+                        {
+                            await HanlderFor瀹屽伐淇″彿WhenFalseAsync("瑁呴厤");
+                        });
+                    }
+                }
+
+                if (changed.Name == "鐒婃帴瀹屽伐淇″彿")
+                {
+                    if (changed.New?.Value.SafeString().ToBool() == true)
+                    {
+                        _ = Task.Run(async () =>
+                        {
+                            await HanlderFor鐒婃帴瀹屽伐淇″彿Async();
+                        });
+                    }
+                    else
+                    {
+                        _ = Task.Run(async () =>
+                        {
+                            await HanlderFor瀹屽伐淇″彿WhenFalseAsync("鐒婃帴");
                         });
                     }
                 }
@@ -778,5 +820,109 @@
                     };
             var ret = _variableService.WriteValueAsync(keyValuePairs_productID);
         }
+
+
+
+        /// <summary>
+        /// 瑁呴厤瀹屽伐淇″彿=true鏃�
+        /// </summary>
+        /// <returns></returns>
+        private async Task HanlderFor瑁呴厤瀹屽伐淇″彿Async()
+        {
+
+            var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
+            var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
+            var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
+
+            var pipeSpecCode = await _variableService.ReadValueAsync("瑁呴厤绠℃缂栫爜");
+
+            if (string.IsNullOrEmpty(pipeSpecCode?.Content?.Value.SafeString().ToString()))
+            {
+
+            }
+            else
+            {
+
+
+
+                var myPipeSpecCode = pipeSpecCode.Content.Value.SafeString().ToString();
+                CallMaterialOrder callMaterialOrder = null;
+                try
+                {
+                    var sharedService = _serviceProvider.GetRequiredService<SharedService>();
+                    var userName = await _variableService.ReadValueAsync("瑁呴厤浜�");
+                    MyCurrentUser myCurrentUser = new MyCurrentUser()
+                    {
+                        UserAccount = userName.Content.Value.SafeString().ToString()
+                    };
+                    sharedService.CompleteAssemblyProcess(_serviceProvider, new Application.Contracts.Dtos.WorkPlan.CompleteAssemblyProcessInput() { PipeSpecCode = myPipeSpecCode, ProcessName="瑁呴厤宸ュ簭" }, myCurrentUser);
+
+                }
+                catch (Exception)
+                {
+
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鐒婃帴瀹屽伐淇″彿=true鏃�
+        /// </summary>
+        /// <returns></returns>
+        private async Task HanlderFor鐒婃帴瀹屽伐淇″彿Async()
+        {
+
+            var workPlanAppService = _serviceProvider.GetRequiredService<IWorkPlanAppService>();
+            var workPlanRepository = _serviceProvider.GetRequiredService<IWorkPlanRepository>();
+            var callMaterialOrderAppService = _serviceProvider.GetRequiredService<ICallMaterialOrderAppService>();
+
+            var pipeSpecCode = await _variableService.ReadValueAsync("鐒婃帴绠℃缂栫爜");
+
+            if (string.IsNullOrEmpty(pipeSpecCode?.Content?.Value.SafeString().ToString()))
+            {
+
+            }
+            else
+            {
+
+
+
+                var myPipeSpecCode = pipeSpecCode.Content.Value.SafeString().ToString();
+                CallMaterialOrder callMaterialOrder = null;
+                try
+                {
+                    var sharedService = _serviceProvider.GetRequiredService<SharedService>();
+                    var userName = await _variableService.ReadValueAsync("鐒婃帴浜�");
+                    MyCurrentUser myCurrentUser = new MyCurrentUser()
+                    {
+                        UserAccount = userName.Content.Value.SafeString().ToString()
+                    };
+                    sharedService.CompleteAssemblyProcess(_serviceProvider, new Application.Contracts.Dtos.WorkPlan.CompleteAssemblyProcessInput() { PipeSpecCode = myPipeSpecCode, ProcessName = "鐒婃帴宸ュ簭" }, myCurrentUser);
+
+                }
+                catch (Exception)
+                {
+
+                }
+            }
+        }
+
+        /// <summary>
+        /// 瀹屽伐淇″彿=false鏃�
+        /// </summary>
+        /// <returns></returns>
+        private async Task HanlderFor瀹屽伐淇″彿WhenFalseAsync(string processName)
+        {
+            try
+            {
+                var sharedService = _serviceProvider.GetRequiredService<SharedService>();
+                await sharedService.CompleteHandleOutStoreFinish(_serviceProvider, processName, false);
+            }
+            catch (Exception)
+            {
+
+
+            }
+        }
     }
 }
diff --git "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/AppService/AppService\346\250\241\346\235\277.txt" "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/AppService/AppService\346\250\241\346\235\277.txt"
index 2a60352..03b02e3 100644
--- "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/AppService/AppService\346\250\241\346\235\277.txt"
+++ "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/AppService/AppService\346\250\241\346\235\277.txt"
@@ -441,4 +441,55 @@
     {
         return await _$EntityInstanceName$Repository.GetSingleByFilterAsync(whereConditions, is鈥婱ultipleThrowException);
     }
+
+     /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇$ChinaComment$鍒楄〃
+    /// </summary> 
+    /// <param name="input"></param> 
+    /// <returns></returns> 
+    public virtual async Task<List<$EntityName$Dto>> FindListByFilterAsync(Get$EntityName$Input input, CancellationToken cancellationToken = default)
+    {
+        Check.NotNull(input, nameof(input));
+
+        if (input.Sorting.IsNullOrWhiteSpace())
+        {
+            input.Sorting = nameof($EntityName$.Sort);
+        }
+
+        #region 鍔ㄦ�佹瀯閫犳煡璇㈡潯浠�  
+
+        //鍔ㄦ�佹瀯閫犳煡璇㈡潯浠�  
+        var whereConditions = DynamicGetQueryParams(input);
+
+        #endregion
+
+        var list = await _$EntityInstanceName$Repository.GetListByFilterAsync(whereConditions?.data);
+
+        return new List<$EntityName$Dto>(ObjectMapper.Map<List<$EntityName$>, List<$EntityName$Dto>>(list));
+    }
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇鍗曚釜$ChinaComment$
+    /// </summary> 
+    /// <param name="input"></param> 
+    /// <returns></returns> 
+    public virtual async Task<$EntityName$Dto> FindSingleByFilterAsync(Get$EntityName$Input input, CancellationToken cancellationToken = default)
+    {
+        Check.NotNull(input, nameof(input));
+
+        if (input.Sorting.IsNullOrWhiteSpace())
+        {
+            input.Sorting = nameof($EntityName$.Sort);
+        }
+
+        #region 鍔ㄦ�佹瀯閫犳煡璇㈡潯浠�  
+
+        //鍔ㄦ�佹瀯閫犳煡璇㈡潯浠�  
+        var whereConditions = DynamicGetQueryParams(input);
+
+        #endregion
+
+        var dataObj = await _$EntityInstanceName$Repository.GetSingleByFilterAsync(whereConditions?.data);
+
+        return (ObjectMapper.Map<$EntityName$, $EntityName$Dto>(dataObj));
+    }
 }
diff --git "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/AppService/IAppService\346\250\241\346\235\277.txt" "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/AppService/IAppService\346\250\241\346\235\277.txt"
index 6ed0b79..972c752 100644
--- "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/AppService/IAppService\346\250\241\346\235\277.txt"
+++ "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/AppService/IAppService\346\250\241\346\235\277.txt"
@@ -82,4 +82,18 @@
     /// <returns></returns>
     /// <exception cref="UserFriendlyException"></exception>
     Task<$EntityName$> GetSingleByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, bool is鈥婱ultipleThrowException = false, CancellationToken cancellationToken = default);
+
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇$ChinaComment$鍒楄〃
+    /// </summary> 
+    /// <param name="input"></param> 
+    /// <returns></returns> 
+    Task<List<$EntityName$Dto>> FindListByFilterAsync(Get$EntityName$Input input, CancellationToken cancellationToken = default);
+    
+    /// <summary> 
+    /// 鏍规嵁鏉′欢鑾峰彇鍗曚釜$ChinaComment$
+    /// </summary> 
+    /// <param name="input"></param> 
+    /// <returns></returns> 
+    Task<$EntityName$Dto> FindSingleByFilterAsync(Get$EntityName$Input input, CancellationToken cancellationToken = default);
 }
diff --git "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/Controller\346\250\241\346\235\277.txt" "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/Controller\346\250\241\346\235\277.txt"
index 59f98c4..86e5ec5 100644
--- "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/Controller\346\250\241\346\235\277.txt"
+++ "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Code/Templete/Controller\346\250\241\346\235\277.txt"
@@ -62,6 +62,30 @@
             return _$EntityInstanceName$AppService.GetListAsync(input);
         }
 
+        /// <summary> 
+        /// 根据条件获取$ChinaComment$
+        /// </summary> 
+        /// <param name="input">查询参数</param> 
+        /// <returns></returns> 
+        [HttpPost]
+        [Route("FindListByFilter")]
+        public virtual async Task<List<$EntityName$Dto>> FindListByFilterAsync([FromBody]Get$EntityName$Input input)
+        {
+            return await _$EntityInstanceName$AppService.FindListByFilterAsync(input);
+        }
+        /// <summary> 
+        /// 根据条件获取单个$ChinaComment$
+        /// </summary> 
+        /// <param name="input">查询参数</param> 
+        /// <returns></returns> 
+        [HttpPost]
+        [Route("FindSingleByFilter")]
+        public virtual async Task<$EntityName$Dto> FindSingleByFilterAsync([FromBody]Get$EntityName$Input input)
+        {
+
+            return await _$EntityInstanceName$AppService.FindSingleByFilterAsync(input);
+        }
+
         /// <summary>
         /// 创建$ChinaComment$
         /// </summary>
diff --git "a/\347\256\241\345\255\220\347\272\277LMESDemo.cmsproj" "b/\347\256\241\345\255\220\347\272\277LMESDemo.cmsproj"
index eb04755..335cc93 100644
--- "a/\347\256\241\345\255\220\347\272\277LMESDemo.cmsproj"
+++ "b/\347\256\241\345\255\220\347\272\277LMESDemo.cmsproj"
Binary files differ

--
Gitblit v1.9.3