zs
2025-05-18 4b3fd35893972bb05fd7ab89dc624ab805093ff3
Merge branch 'master' of http://222.71.245.114:9086/r/HIA24016N_PipeLineDemo
已添加73个文件
已修改21个文件
6902 ■■■■■ 文件已修改
HIAWms/hiawms_web/.vscode/settings.json 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/components.d.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/QueryTaskTypeInput.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/WmsTaskDto.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsTaskAppService.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms/CMS.Plugin.HIAWms.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms/Controller/LMesOperateController.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsTaskController.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/config/menu.ts 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/images/pipe-Weld-drawing-example.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/images/pipe-assembly-drawing-example.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/File.ts 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssembly.ts 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyDrawer.tsx 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Controllers/PipeAccessoryAssemblyQueryDrawer.tsx 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssembly.ts 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyDrawer.ts 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/PipeAccessoryAssemblyQueryDrawer.ts 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssembly.ts 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyDrawer.ts 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Models/Service/PipeAccessoryAssemblyQueryDrawer.ts 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/Config.ts 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.module.scss 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/PipeAccessoryAssembly/PipeAccessoryAssembly.tsx 360 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.module.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/PipeAccessoryAssembly.tsx 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/config/PipeAccessoryAssembly.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/enum.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/index.ts 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/type/type.d.ts 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/File.ts 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPick.ts 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickDrawer.tsx 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Controllers/PipeAccessoryPickQueryDrawer.tsx 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPick.ts 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickDrawer.ts 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/PipeAccessoryPickQueryDrawer.ts 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPick.ts 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickDrawer.ts 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Models/Service/PipeAccessoryPickQueryDrawer.ts 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/Config.ts 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.module.scss 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/PipeAccessoryPick/PipeAccessoryPick.tsx 367 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.module.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/PipeAccessoryPick.tsx 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/config/PipeAccessoryPick.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/enum.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/index.ts 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/type/type.d.ts 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/File.ts 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeld.ts 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldDrawer.tsx 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Controllers/PipeAccessoryWeldQueryDrawer.tsx 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeld.ts 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldDrawer.ts 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/PipeAccessoryWeldQueryDrawer.ts 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeld.ts 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldDrawer.ts 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Models/Service/PipeAccessoryWeldQueryDrawer.ts 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.tsx 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.tsx 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/Config.ts 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.module.scss 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/PipeAccessoryWeld/PipeAccessoryWeld.tsx 360 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.module.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/PipeAccessoryWeld.tsx 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/config/PipeAccessoryWeld.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/enum.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/index.ts 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/type/type.d.ts 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/pipelinelems_web/src/widgets/WorkPlan/Views/Pages/WorkPlan/Config.ts 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/CompleteAssemblyProcessInput.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/StartProductionInput.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs 460 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanController.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/Controller/WorkPlanPublicController.cs 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems/ProjectService/PipeLineLemsProjectService.cs 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/AppService/AppService模板.txt 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/AppService/IAppService模板.txt 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/Controller模板.txt 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
管子线LMESDemo.cmsproj 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/.vscode/settings.json
@@ -1 +1,6 @@
{}
{
    "i18n-ally.localesPaths": [
        "public/language",
        "src/libs/Language/i18n"
    ]
}
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']
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>
        /// å…¥åº“口有货
        /// </summary>
        public bool InStockHasGood { get; set; }
        /// <summary>
        /// å‡ºåº“口有货
        /// </summary>
        public bool OutStockHasGood { get; set; }
    }
    /// <summary>
    /// ä¸‹å‘完成的任务入参.
    /// </summary>
    public class ExcecuteTaskInput
    {
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        public string TaskNo { get; set;}
    }
}
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);
        }
    }
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);
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);
    }
}
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>
HIAWms/server/src/CMS.Plugin.HIAWms/Controller/LMesOperateController.cs
@@ -1,5 +1,6 @@
using 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​​Palletizing​​")]
        public async Task<CmsApiResponse<WmsMaterialStockDto>> LMes​​Palletizing​​Async(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
                };
            }
        }
    }
}
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);
        }
    } 
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",
PipeLineLems/pipelinelems_web/src/images/pipe-Weld-drawing-example.png
PipeLineLems/pipelinelems_web/src/images/pipe-assembly-drawing-example.png
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,
  }
}
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
  }
}
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)
    },
  })
  /**
   * æ·»åŠ çš„form字段
   */
  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: '请输入物料ID',
      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,
  }
}
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)
    },
  })
  /**
   * æ·»åŠ çš„form字段
   */
  const formItems = reactive([
    {
      label: '托盘编号',
      prop: 'containerNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入托盘编号',
    },
    {
      label: '物料ID',
      prop: 'materialId',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入物料ID',
    },
  ])
  /**
   * æ ¡éªŒæ˜¯å¦æœ‰æ•°æ®å˜åŒ–
   */
  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,
  }
}
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)
  }
}
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)
  }
}
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)
  }
}
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)
}
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)
}
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)
}
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
.drawer {
  width: 800px;
}
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>
    )
  },
})
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
.drawer {
  width: 800px;
}
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>
    )
  },
})
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: '',
},
]
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;
}
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="工位代码&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="设备代码&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>
      )
    }
  },
})
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;
}
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>
      )
    }
  },
})
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryAssembly/Views/config/PipeAccessoryAssembly.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
{
  "name": "PipeAccessoryAssembly"
}
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': '列表-输出',
}
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,
}
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
}
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,
  }
}
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
  }
}
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)
    },
  })
  /**
   * æ·»åŠ çš„form字段
   */
  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: '请输入物料ID',
      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,
  }
}
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)
    },
  })
  /**
   * æ·»åŠ çš„form字段
   */
  const formItems = reactive([
    {
      label: '托盘编号',
      prop: 'containerNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入托盘编号',
    },
    {
      label: '物料ID',
      prop: 'materialId',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入物料ID',
    },
  ])
  /**
   * æ ¡éªŒæ˜¯å¦æœ‰æ•°æ®å˜åŒ–
   */
  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,
  }
}
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)
  }
}
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)
  }
}
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)
  }
}
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)
}
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)
}
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)
}
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
.drawer {
  width: 800px;
}
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>
    )
  },
})
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
.drawer {
  width: 800px;
}
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>
    )
  },
})
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: '',
},
]
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;
}
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="工位代码&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="设备代码&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>
      )
    }
  },
})
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;
}
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>
      )
    }
  },
})
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryPick/Views/config/PipeAccessoryPick.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
{
  "name": "PipeAccessoryPick"
}
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': '列表-输出',
}
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,
}
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
}
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,
  }
}
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
  }
}
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)
    },
  })
  /**
   * æ·»åŠ çš„form字段
   */
  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: '请输入物料ID',
      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,
  }
}
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)
    },
  })
  /**
   * æ·»åŠ çš„form字段
   */
  const formItems = reactive([
    {
      label: '托盘编号',
      prop: 'containerNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入托盘编号',
    },
    {
      label: '物料ID',
      prop: 'materialId',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入物料ID',
    },
  ])
  /**
   * æ ¡éªŒæ˜¯å¦æœ‰æ•°æ®å˜åŒ–
   */
  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,
  }
}
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)
  }
}
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)
  }
}
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)
  }
}
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)
}
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)
}
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)
}
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerDrawer/WmsMaterialContainerDrawer.module.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
.drawer {
  width: 800px;
}
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>
    )
  },
})
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/Pages/Dialog/WmsMaterialContainerQueryDrawer/WmsMaterialContainerQueryDrawer.module.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
.drawer {
  width: 800px;
}
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>
    )
  },
})
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: '',
},
]
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;
}
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="工位代码&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="设备代码&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>
      )
    }
  },
})
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;
}
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>
      )
    }
  },
})
PipeLineLems/pipelinelems_web/src/widgets/PipeAccessoryWeld/Views/config/PipeAccessoryWeld.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
{
  "name": "PipeAccessoryWeld"
}
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': '列表-输出',
}
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,
}
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
}
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)', 
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/CompleteAssemblyProcessInput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
using 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; }
    }
}
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/StartProductionInput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
using 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; }
    }
}
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​MultipleThrowException = 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);
}
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、记录分拣记录表
        //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、记录分拣记录表
        //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>
    /// ç”Ÿæˆéšæœºçš„WmsTaskNo
    /// </summary>
    /// <returns>随机生成的任务编号</returns>
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​MultipleThrowException);
    }
    /// <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));
    }
}
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> 
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
                };
            }
        }
    }
}
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)
            {
            }
        }
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/AppService/AppServiceÄ£°å.txt
@@ -441,4 +441,55 @@
    {
        return await _$EntityInstanceName$Repository.GetSingleByFilterAsync(whereConditions, is​MultipleThrowException);
    }
     /// <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));
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/AppService/IAppServiceÄ£°å.txt
@@ -82,4 +82,18 @@
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    Task<$EntityName$> GetSingleByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, bool is​MultipleThrowException = 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);
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/ControllerÄ£°å.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>
¹Ü×ÓÏßLMESDemo.cmsproj
Binary files differ