payne
2024-04-23 f76acac54523d67590f8f07c404e005524eff464
修改
已修改8个文件
3863 ■■■■■ 文件已修改
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Admin.NET.Application.xml 616 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/Common/ExWarehouse/ExWarehouseService.cs 576 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsJob/WmsTask/WmsTaskService.cs 1140 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsOrder/WmsTakeMaterialOrder/WmsTakeMaterialOrderService.cs 1168 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsPda/CallEmpty/CallEmptyService.cs 206 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Core/Entity/WmsBase/WmsArea.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Core/Entity/WmsBase/WmsPlace.cs 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Core/Entity/WmsBase/WmsWarehouse.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Admin.NET.Application.xml
@@ -405,43 +405,6 @@
            账面数量
            </summary>
        </member>
        <member name="T:Admin.NET.Application.ExWarehouseService">
            <summary>
            出库管理服务
            </summary>
        </member>
        <member name="M:Admin.NET.Application.ExWarehouseService.#ctor(Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsArea,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsTask,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainer,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainerPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterial,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialStock,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialContainer,Furion.DatabaseAccessor.MasterDbContextLocator})">
            <summary>
            构造函数
            </summary>
        </member>
        <member name="M:Admin.NET.Application.ExWarehouseService.Page(Admin.NET.Application.ExWarehouseSearch)">
            <summary>
            分页查询物料出库管理信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.ExWarehouseService.AutoExWarehouse(System.Collections.Generic.List{Admin.NET.Application.ExWarehouseInput})">
            <summary>
            自动出库
            </summary>
            <param name="inputs"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.ExWarehouseService.ManualExWarehouse(System.Collections.Generic.List{Admin.NET.Application.ExWarehouseInput})">
            <summary>
            人工出库
            </summary>
            <param name="inputs"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.ExWarehouseService.CallAirflare(Admin.NET.Application.CallAirflareInput)">
            <summary>
            呼叫空托
            </summary>
            <returns></returns>
        </member>
        <member name="T:Admin.NET.Application.WmsAreaDto">
            <summary>
            库区信息输出参数
@@ -676,103 +639,6 @@
            <summary>
            签核状态
            </summary>
        </member>
        <member name="T:Admin.NET.Application.WmsAreaService">
            <summary>
            库区信息服务
            </summary>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.#ctor(Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsArea,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.SysDictType,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.SysDictData,Furion.DatabaseAccessor.MasterDbContextLocator},Admin.NET.Application.ISysExcelTemplateService)">
            <summary>
            构造函数
            </summary>
            <param name="wmsAreaRep"></param>
            <param name="sysDictTypeRep"></param>
            <param name="sysDictDataRep"></param>
            <param name="sysExcelTemplateService"></param>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.Page(Admin.NET.Application.WmsAreaSearch)">
            <summary>
            分页查询库区信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.ListNonPageAsync(Admin.NET.Application.WmsAreaSearchNonPage)">
            <summary>
            不分页查询库区信息列表
            </summary>
            <param name="input">库区信息查询参数</param>
            <returns>(库区信息)实例列表</returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.Add(Admin.NET.Application.AddWmsAreaInput)">
            <summary>
            增加库区信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.Delete(Admin.NET.Application.DeleteWmsAreaInput)">
            <summary>
            删除库区信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.Update(Admin.NET.Application.UpdateWmsAreaInput)">
            <summary>
            更新库区信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.Get(Admin.NET.Application.QueryeWmsAreaInput)">
            <summary>
            获取库区信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.List(Admin.NET.Application.WmsAreaInput)">
            <summary>
            获取库区信息列表
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.TaskWmsArea">
            <summary>
            组装车间获取库区
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.GetAreaEntranceList">
            <summary>
            获取仓库下拉框
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.FromExcelAsync(Microsoft.AspNetCore.Http.IFormFile,Admin.NET.Core.ImportExcelType)">
            <summary>
            Excel模板导入库区信息功能
            </summary>
            <param name="file">Excel模板文件</param>
            <param name="importExcelType">Excel导入方式</param>
            <returns>导入的记录数</returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.DownloadExcelTemplate(System.String)">
            <summary>
            根据版本下载库区信息的Excel导入模板
            </summary>
            <param name="version">模板版本</param>
            <returns>下载的模板文件</returns>
        </member>
        <member name="M:Admin.NET.Application.WmsAreaService.ToExcelAsync(Admin.NET.Application.WmsAreaSearchNonPage)">
            <summary>
            根据库区信息查询参数导出Excel
            </summary>
            <param name="input">库区信息查询参数</param>
            <returns>导出的Excel文件</returns>
        </member>
        <member name="T:Admin.NET.Application.WmsContainerDto">
            <summary>
@@ -3001,84 +2867,6 @@
            <summary>
            库区信息输出参数
            </summary>
        </member>
        <member name="T:Admin.NET.Application.WmsPlaceService">
            <summary>
            库位信息服务
            </summary>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.#ctor(Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsArea},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsPlace,Furion.DatabaseAccessor.MasterDbContextLocator})">
            <summary>
            构造函数
            </summary>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.Page(Admin.NET.Application.WmsPlaceSearch)">
            <summary>
            分页查询库位信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.AddNew(Admin.NET.Application.AddWmsPlaceInput)">
            <summary>
            增加库位信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.Delete(Admin.NET.Application.DeleteWmsPlaceInput)">
            <summary>
            删除库位信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.MoreLock(Admin.NET.Application.MoreLockInput)">
            <summary>
            批量锁定
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.MoreUnlock(Admin.NET.Application.MoreLockInput)">
            <summary>
            批量解锁
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.Update(Admin.NET.Application.UpdateWmsPlaceInput)">
            <summary>
            更新库位信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.Get(Admin.NET.Application.QueryeWmsPlaceInput)">
            <summary>
            获取库位信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.List(Admin.NET.Application.WmsPlaceInput)">
            <summary>
            获取库位信息列表
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.FkWmsAreaList">
            <summary>
            获取WmsArea列表
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsPlaceService.GetFAisle">
            <summary>
            获取熟化库巷道
            </summary>
            <returns></returns>
        </member>
        <member name="T:Admin.NET.Application.WmsWarehouseEntranceDto">
            <summary>
@@ -15288,86 +15076,6 @@
            任务号
            </summary>
        </member>
        <member name="T:Admin.NET.Application.WareWcsToWmsService">
            <summary>
            WCS调用服务
            </summary>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.#ctor(Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsOrder,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsOrderDetails,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsTask,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialContainer,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainerPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialStock,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainer,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.LesPackWarehouse,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.LesDeviceWaring,Furion.DatabaseAccessor.MasterDbContextLocator})">
            <summary>
            构造函数
            </summary>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.GetSendTask">
            <summary>
            定时查询WCS可以下发的出入库任务(10条)
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.UpdateTask(Admin.NET.Application.UpdateTaskInput)">
            <summary>
            更新任务信息
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.GetPlace(Admin.NET.Application.GetPlaceInput)">
            <summary>
            获取库位信息
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.CreateRelocation(Admin.NET.Application.CreateRelocationInput)">
            <summary>
            创建移库任务
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.CancelTask(Admin.NET.Application.FinishTaskInput)">
            <summary>
            取消任务
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.CheckPack">
            <summary>
            wcs读取接口判断物料是否组盘出库 true代表已经组盘出库
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.AddDeviceWaring(Admin.NET.Application.AddDeviceWaringInput)">
            <summary>
            设备报警信息
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.GetOneRowByAisle(System.Int32)">
            <summary>
            根据巷道获取外侧第一排
            </summary>
            <param name="Aisle"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.GetTwoRowByAisle(System.Int32)">
            <summary>
            根据巷道获取内侧第二排
            </summary>
            <param name="Aisle"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.GetThreeRowByAisle(System.Int32)">
            <summary>
            根据巷道获取外侧第二排
            </summary>
            <param name="Aisle"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WareWcsToWmsService.GetFourRowByAisle(System.Int32)">
            <summary>
            根据巷道获取外侧第一排
            </summary>
            <param name="Aisle"></param>
            <returns></returns>
        </member>
        <member name="T:Admin.NET.Application.BaseCustomerService">
            <summary>
            客户档案服务
@@ -17645,64 +17353,6 @@
            层
            </summary>
        </member>
        <member name="T:Admin.NET.Application.LocationViewService">
            <summary>
            库位试图服务
            </summary>
        </member>
        <member name="M:Admin.NET.Application.LocationViewService.#ctor(Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsArea,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialStock,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainerPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainer,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialContainer,Furion.DatabaseAccessor.MasterDbContextLocator})">
            <summary>
            构造函数
            </summary>
        </member>
        <member name="M:Admin.NET.Application.LocationViewService.GetArea">
            <summary>
            获取库区信息
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.LocationViewService.GetPalceAisle(Admin.NET.Application.GetPalceAisleInput)">
            <summary>
            根据库区获取巷道
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.LocationViewService.GetPalceRowno(Admin.NET.Application.GetPalceAisleRownoInput)">
            <summary>
            根据库区和巷道获取排
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.LocationViewService.GetPalceList(Admin.NET.Application.GetPalceListInput)">
            <summary>
            根据库区 排获取库位信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.LocationViewService.GetMaterialDetail(Admin.NET.Application.GetMaterialDetailInput)">
            <summary>
            根据库位获取对应信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.LocationViewService.UpdatePalceIslock(Admin.NET.Application.GetMaterialDetailInput)">
            <summary>
            修改库位锁定信息
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.LocationViewService.UpdatePalceKongXian(Admin.NET.Application.GetMaterialDetailInput)">
            <summary>
            将库位置为空闲
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="T:Admin.NET.Application.MaterialStockDto">
            <summary>
            库存信息(熟化库)输出参数
@@ -18895,133 +18545,6 @@
            <summary>
            入库来源
            </summary>
        </member>
        <member name="T:Admin.NET.Application.WmsTaskService">
            <summary>
            任务管理服务
            </summary>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.#ctor(Furion.DatabaseAccessor.IRepository{Admin.NET.Core.SysDictType,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.SysDictData,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsTask,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsWarehouseEntrance,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsOrder,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsOrderDetails,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainerPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialStock,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainer,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialContainer,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsArea,Furion.DatabaseAccessor.MasterDbContextLocator},Admin.NET.Application.ISysExcelTemplateService)">
            <summary>
            构造函数
            </summary>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.Page(Admin.NET.Application.WmsTaskSearch)">
            <summary>
            分页查询出入库任务管理
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.ListNonPageAsync(Admin.NET.Application.WmsTaskSearchNonPage)">
            <summary>
            不分页查询出入库任务管理列表
            </summary>
            <param name="input">出入库任务管理查询参数</param>
            <returns>(出入库任务管理)实例列表</returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.Add(Admin.NET.Application.AddWmsTaskInput)">
            <summary>
            增加出入库任务管理
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.Delete(Admin.NET.Application.DeleteWmsTaskInput)">
            <summary>
            删除出入库任务管理
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.Update(Admin.NET.Application.UpdateWmsTaskInput)">
            <summary>
            更新出入库任务管理
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.Finish(Admin.NET.Application.WmsTaskFinishInput)">
            <summary>
            强制完成
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.UpwardTaskLevel(Admin.NET.Application.UpdateTaskLevelInput)">
            <summary>
            更新优先级(向上)
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.DownTaskLevel(Admin.NET.Application.UpdateTaskLevelInput)">
            <summary>
            更新优先级(向下)
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.CancelTask(Admin.NET.Application.CancelInput)">
            <summary>
            取消
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.BatchCancel(Admin.NET.Application.BatchCancelInput)">
            <summary>
            批量取消
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.BatchBreak(Admin.NET.Application.BatchBreakInput)">
            <summary>
            批量暂停
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.BatchContinue(Admin.NET.Application.BatchContinueInput)">
            <summary>
            批量继续
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.Get(Admin.NET.Application.QueryeWmsTaskInput)">
            <summary>
            获取出入库任务管理
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.List(Admin.NET.Application.TaskInput)">
            <summary>
            获取出入库任务管理列表
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.FromExcelAsync(Microsoft.AspNetCore.Http.IFormFile,Admin.NET.Core.ImportExcelType)">
            <summary>
            Excel模板导入出入库任务管理功能
            </summary>
            <param name="file">Excel模板文件</param>
            <param name="importExcelType">Excel导入方式</param>
            <returns>导入的记录数</returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.DownloadExcelTemplate(System.String)">
            <summary>
            根据版本下载出入库任务管理的Excel导入模板
            </summary>
            <param name="version">模板版本</param>
            <returns>下载的模板文件</returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTaskService.ToExcelAsync(Admin.NET.Application.WmsTaskSearchNonPage)">
            <summary>
            根据出入库任务管理查询参数导出Excel
            </summary>
            <param name="input">出入库任务管理(熟化库)查询参数</param>
            <returns>导出的Excel文件</returns>
        </member>
        <member name="T:Admin.NET.Application.WmsDumpOrderDto">
            <summary>
@@ -24174,145 +23697,6 @@
            <summary>
            请求状态
            </summary>
        </member>
        <member name="T:Admin.NET.Application.WmsTakeMaterialOrderService">
            <summary>
            领料单服务
            </summary>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.Page(Admin.NET.Application.WmsTakeMaterialOrderSearch)">
            <summary>
            分页查询领料单
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.ListNonPageAsync(Admin.NET.Application.WmsTakeMaterialOrderSearchNonPage)">
            <summary>
            不分页查询领料单列表
            </summary>
            <param name="input">领料单查询参数</param>
            <returns>(领料单)实例列表</returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.PageDetail(Admin.NET.Application.TakePageDetailInput)">
            <summary>
            获取单据明细
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.StockPage(Admin.NET.Application.TakeMaterialStockSearch)">
            <summary>
            分页查询物料库存
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.GetMaterialNoList">
            <summary>
            物料编码下拉框
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.GetProjectCodeList">
            <summary>
            项目编码下拉框
            </summary>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.Add(Admin.NET.Application.AddWmsTakeMaterialOrderInput)">
            <summary>
            增加领料单
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.TakeOrderAdd">
            <summary>
            增加领料单(yigo系统获取)
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.ReturnTakeOrder(Admin.NET.Application.ReturnTakeOrderInput)">
            <summary>
            领料下架接口(yigo系统)
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.DistributeOrder(Admin.NET.Application.DistributeOrderInput)">
            <summary>
            下发领料单
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.Delete(Admin.NET.Application.DeleteWmsTakeMaterialOrderInput)">
            <summary>
            删除领料单
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.Update(Admin.NET.Application.UpdateWmsTakeMaterialOrderInput)">
            <summary>
            更新领料单
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.Get(Admin.NET.Application.QueryeWmsTakeMaterialOrderInput)">
            <summary>
            获取领料单
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.List(Admin.NET.Application.WmsTakeMaterialOrderInput)">
            <summary>
            获取领料单列表
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.FromExcelAsync(Microsoft.AspNetCore.Http.IFormFile,Admin.NET.Core.ImportExcelType)">
            <summary>
            Excel模板导入领料单功能
            </summary>
            <param name="file">Excel模板文件</param>
            <param name="importExcelType">Excel导入方式</param>
            <returns>导入的记录数</returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.DownloadExcelTemplate(System.String)">
            <summary>
            根据版本下载领料单的Excel导入模板
            </summary>
            <param name="version">模板版本</param>
            <returns>下载的模板文件</returns>
        </member>
        <member name="M:Admin.NET.Application.WmsTakeMaterialOrderService.ToExcelAsync(Admin.NET.Application.WmsTakeMaterialOrderSearchNonPage)">
            <summary>
            根据领料单查询参数导出Excel
            </summary>
            <param name="input">领料单查询参数</param>
            <returns>导出的Excel文件</returns>
        </member>
        <member name="T:Admin.NET.Application.CallEmptyService">
            <summary>
            Pda空托出库
            </summary>
        </member>
        <member name="M:Admin.NET.Application.CallEmptyService.#ctor(Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsOrder,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsOrderDetails,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsTask,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsArea,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsWarehouseEntrance,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialContainer,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainer,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsContainerPlace,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsMaterialStock,Furion.DatabaseAccessor.MasterDbContextLocator},Furion.DatabaseAccessor.IRepository{Admin.NET.Core.WmsOrderType,Furion.DatabaseAccessor.MasterDbContextLocator})">
            <summary>
            构造函数
            </summary>
        </member>
        <member name="M:Admin.NET.Application.CallEmptyService.PdaContainerOut(Admin.NET.Application.PdaContainerOutInput)">
            <summary>
            提交出库
            </summary>
            <returns></returns>
        </member>
        <member name="T:Admin.NET.Application.PdaContainerOutInput">
            <summary>
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/Common/ExWarehouse/ExWarehouseService.cs
@@ -1,323 +1,323 @@
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Yitter.IdGenerator;
using Admin.NET.Core;
//using Furion.DatabaseAccessor;
//using Furion.DependencyInjection;
//using Furion.DynamicApiController;
//using Furion.FriendlyException;
//using Mapster;
//using Microsoft.AspNetCore.Mvc;
//using Microsoft.EntityFrameworkCore;
//using Yitter.IdGenerator;
//using Admin.NET.Core;
namespace Admin.NET.Application
{
    /// <summary>
    /// 出库管理服务
    /// </summary>
    [ApiDescriptionSettings("自己的业务", Name = "ExWarehouse", Order = 100)]
    [Route("api/[Controller]")]
    public class ExWarehouseService : IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
        private readonly IRepository<WmsMaterial, MasterDbContextLocator> _wmsMaterialRep;
        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
//namespace Admin.NET.Application
//{
//    /// <summary>
//    /// 出库管理服务
//    /// </summary>
//    [ApiDescriptionSettings("自己的业务", Name = "ExWarehouse", Order = 100)]
//    [Route("api/[Controller]")]
//    public class ExWarehouseService : IDynamicApiController, ITransient
//    {
//        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
//        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
//        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
//        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
//        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
//        private readonly IRepository<WmsMaterial, MasterDbContextLocator> _wmsMaterialRep;
//        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
//        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
        /// <summary>
        /// 构造函数
        /// </summary>
        public ExWarehouseService(
                        IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
                        IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
                        IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep,
                        IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
                        IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRep,
                        IRepository<WmsMaterial, MasterDbContextLocator> wmsMaterialRep,
                        IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
                        IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep
            )
        {
            this._wmsAreaRep = wmsAreaRep;
            this._wmsPlaceRep = wmsPlaceRep;
            this._wmsTaskRep = wmsTaskRep;
            this._wmsContainerRep = wmsContainerRep;
            this._wmsContainerPlaceRep = wmsContainerPlaceRep;
            this._wmsMaterialRep = wmsMaterialRep;
            this._wmsMaterialStockRep = wmsMaterialStockRep;
            this._wmsMaterialContainerRep = wmsMaterialContainerRep;
        }
//        /// <summary>
//        /// 构造函数
//        /// </summary>
//        public ExWarehouseService(
//                        IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
//                        IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
//                        IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep,
//                        IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
//                        IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRep,
//                        IRepository<WmsMaterial, MasterDbContextLocator> wmsMaterialRep,
//                        IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
//                        IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep
//            )
//        {
//            this._wmsAreaRep = wmsAreaRep;
//            this._wmsPlaceRep = wmsPlaceRep;
//            this._wmsTaskRep = wmsTaskRep;
//            this._wmsContainerRep = wmsContainerRep;
//            this._wmsContainerPlaceRep = wmsContainerPlaceRep;
//            this._wmsMaterialRep = wmsMaterialRep;
//            this._wmsMaterialStockRep = wmsMaterialStockRep;
//            this._wmsMaterialContainerRep = wmsMaterialContainerRep;
//        }
        
        /// <summary>
        /// 分页查询物料出库管理信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("page")]
        public async Task<PageResult<ExWareHouseOutput>> Page([FromQuery] ExWarehouseSearch input)
        {
            var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
                      .Where (!string.IsNullOrEmpty(input.MaterialName), u => EF.Functions.Like(u.MaterialName, $"%{input.MaterialName.Trim()}%"))
                      .ProjectToType<ExWareHouseOutput>()
                      .ToListAsync();
            return wmsMaterialStocks.ToADPagedList(input.PageNo, input.PageSize);
        }
//        /// <summary>
//        /// 分页查询物料出库管理信息
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("page")]
//        public async Task<PageResult<ExWareHouseOutput>> Page([FromQuery] ExWarehouseSearch input)
//        {
//            var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
//                      .Where (!string.IsNullOrEmpty(input.MaterialName), u => EF.Functions.Like(u.MaterialName, $"%{input.MaterialName.Trim()}%"))
//                      .ProjectToType<ExWareHouseOutput>()
//                      .ToListAsync();
//            return wmsMaterialStocks.ToADPagedList(input.PageNo, input.PageSize);
//        }
        /// <summary>
        /// 自动出库
        /// </summary>
        /// <param name="inputs"></param>
        /// <returns></returns>
        [HttpPost("AutoExWarehouse")]
        [UnitOfWork]
        public async Task AutoExWarehouse(List<ExWarehouseInput> inputs)
        {
            // 根据托盘号、库位编号去重
            var containerCodeDistinct = inputs.Select(u => new { u.ContainerCode, u.PlaceCode }).Distinct().ToList();
            if (containerCodeDistinct.Count <= 0) throw Oops.Oh("暂无库存出库");
//        /// <summary>
//        /// 自动出库
//        /// </summary>
//        /// <param name="inputs"></param>
//        /// <returns></returns>
//        [HttpPost("AutoExWarehouse")]
//        [UnitOfWork]
//        public async Task AutoExWarehouse(List<ExWarehouseInput> inputs)
//        {
//            // 根据托盘号、库位编号去重
//            var containerCodeDistinct = inputs.Select(u => new { u.ContainerCode, u.PlaceCode }).Distinct().ToList();
//            if (containerCodeDistinct.Count <= 0) throw Oops.Oh("暂无库存出库");
            // 查询库区名称
            var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库"));
            if (wmsArea != null) throw Oops.Oh("库区不存在");
//            // 查询库区名称
//            var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库"));
//            if (wmsArea != null) throw Oops.Oh("库区不存在");
            foreach (var item in containerCodeDistinct)
            {
                var wmsMaterialContainerList = new List<WmsMaterialContainer>();
                // 判断任务
                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(p => p.ContainerCode == item.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG);
                if (wmsTask != null) throw Oops.Oh("周转箱号存在未完成的任务!");
//            foreach (var item in containerCodeDistinct)
//            {
//                var wmsMaterialContainerList = new List<WmsMaterialContainer>();
//                // 判断任务
//                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(p => p.ContainerCode == item.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG);
//                if (wmsTask != null) throw Oops.Oh("周转箱号存在未完成的任务!");
                // 检查周转箱号信息
                var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == item.ContainerCode);
                if (wmsContainer == null) throw Oops.Oh("库存中没有该:" + wmsContainer.ContainerCode + "托盘!");
//                // 检查周转箱号信息
//                var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == item.ContainerCode);
//                if (wmsContainer == null) throw Oops.Oh("库存中没有该:" + wmsContainer.ContainerCode + "托盘!");
                // 检查库位信息
                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == item.PlaceCode);
                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
//                // 检查库位信息
//                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == item.PlaceCode);
//                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
//                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
                // 更新状态为“待出”
                wmsPlace.PlaceStatus = PlaceStatus.DAICHU;
                await _wmsPlaceRep.UpdateAsync(wmsPlace);
//                // 更新状态为“待出”
//                wmsPlace.PlaceStatus = PlaceStatus.DAICHU;
//                await _wmsPlaceRep.UpdateAsync(wmsPlace);
                // 检查库存
                var wmsMaterialStockList = inputs.Where(u => u.ContainerCode == wmsContainer.ContainerCode && u.PlaceCode == wmsPlace.PlaceCode).ToList();
                if (wmsMaterialStockList.Count <= 0) throw Oops.Oh("库存数据异常!");
//                // 检查库存
//                var wmsMaterialStockList = inputs.Where(u => u.ContainerCode == wmsContainer.ContainerCode && u.PlaceCode == wmsPlace.PlaceCode).ToList();
//                if (wmsMaterialStockList.Count <= 0) throw Oops.Oh("库存数据异常!");
                // 检查库位与周转箱号关系
                var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.ContainerId == wmsContainer.Id
                && p.PlaceCode == wmsPlace.PlaceCode && p.PlaceId == wmsPlace.Id && p.ContainerPlaceStatus == CommonStatus.ENABLE);
                if (wmsContainerPlace == null) throw Oops.Oh("托盘号与库位关系不存在!");
//                // 检查库位与周转箱号关系
//                var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.ContainerId == wmsContainer.Id
//                && p.PlaceCode == wmsPlace.PlaceCode && p.PlaceId == wmsPlace.Id && p.ContainerPlaceStatus == CommonStatus.ENABLE);
//                if (wmsContainerPlace == null) throw Oops.Oh("托盘号与库位关系不存在!");
                // 不是空料箱才会有组盘关系
                if (wmsPlace.EmptyContainer == YesOrNot.N)
                {
                    // 检查物料与周转箱号关系
                    wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync();
                    if (wmsMaterialContainerList.Count <= 0) throw Oops.Oh("周转箱号与物料关系不存在!");
                }
                else
                {
                    // 更新空料箱库存
                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsContainer.ContainerCode);
                    if (wmsMaterialStock.Source == RuKuSourceEnum.KONGTUO)
                    {
                        wmsMaterialStock.PlaceCode = "N/A";
                        await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
                    }
                }
                if (wmsTask == null)
                {
                    string taskNo = "CHUKU" + DateTime.Today.ToString("yyyyMMdd");
                    var wmsTaskModel = await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => EF.Functions.Like(u.TaskNo, $"%{taskNo}%"));
                    if (wmsTaskModel == null)
                    {
                        taskNo = taskNo + "0001";
                    }
                    else
                    {
                        //获取流水号最大的数据
                        var maxSerialNumber = await _wmsTaskRep.MaxAsync(t => t.TaskNo);
                        taskNo = Comm.GenerateNewInvoiceNumber(maxSerialNumber, 1);
                    }
//                // 不是空料箱才会有组盘关系
//                if (wmsPlace.EmptyContainer == YesOrNot.N)
//                {
//                    // 检查物料与周转箱号关系
//                    wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync();
//                    if (wmsMaterialContainerList.Count <= 0) throw Oops.Oh("周转箱号与物料关系不存在!");
//                }
//                else
//                {
//                    // 更新空料箱库存
//                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsContainer.ContainerCode);
//                    if (wmsMaterialStock.Source == RuKuSourceEnum.KONGTUO)
//                    {
//                        wmsMaterialStock.PlaceCode = "N/A";
//                        await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
//                    }
//                }
//                if (wmsTask == null)
//                {
//                    string taskNo = "CHUKU" + DateTime.Today.ToString("yyyyMMdd");
//                    var wmsTaskModel = await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => EF.Functions.Like(u.TaskNo, $"%{taskNo}%"));
//                    if (wmsTaskModel == null)
//                    {
//                        taskNo = taskNo + "0001";
//                    }
//                    else
//                    {
//                        //获取流水号最大的数据
//                        var maxSerialNumber = await _wmsTaskRep.MaxAsync(t => t.TaskNo);
//                        taskNo = Comm.GenerateNewInvoiceNumber(maxSerialNumber, 1);
//                    }
                    // 新增任务
                    var takmodel = new WmsTask()
                    {
                        TaskNo = taskNo,//YitIdHelper.NextId().ToString(),
                        TaskModel = TaskModel.QUANZIDONG,
                        TaskType = TaskType.CHUKU,
                        TaskLevel = 1,
                        TaskStatus = TaskStatusEnum.WEIZHIXING,
                        ContainerCode = wmsContainer.ContainerCode,
                        SourcePlace = wmsPlace.PlaceCode,
                        Aisle = wmsPlace.Aisle,
                        ToPlace = "出库口",
                        AreaName = wmsArea.AreaName,
                        Description = wmsPlace.EmptyContainer == YesOrNot.Y ? "空托" : "物料",
                        OrderNo = wmsMaterialContainerList.Count <= 0 ? "N/A" : wmsMaterialContainerList.FirstOrDefault().OrderNo,
                        TaskDodeviceStatus = TaskDodeviceStatusEnum.W,
                        IsRead = true
                    };
                    await _wmsTaskRep.InsertAsync(takmodel);
                }
            }
        }
//                    // 新增任务
//                    var takmodel = new WmsTask()
//                    {
//                        TaskNo = taskNo,//YitIdHelper.NextId().ToString(),
//                        TaskModel = TaskModel.QUANZIDONG,
//                        TaskType = TaskType.CHUKU,
//                        TaskLevel = 1,
//                        TaskStatus = TaskStatusEnum.WEIZHIXING,
//                        ContainerCode = wmsContainer.ContainerCode,
//                        SourcePlace = wmsPlace.PlaceCode,
//                        Aisle = wmsPlace.Aisle,
//                        ToPlace = "出库口",
//                        AreaName = wmsArea.AreaName,
//                        Description = wmsPlace.EmptyContainer == YesOrNot.Y ? "空托" : "物料",
//                        OrderNo = wmsMaterialContainerList.Count <= 0 ? "N/A" : wmsMaterialContainerList.FirstOrDefault().OrderNo,
//                        TaskDodeviceStatus = TaskDodeviceStatusEnum.W,
//                        IsRead = true
//                    };
//                    await _wmsTaskRep.InsertAsync(takmodel);
//                }
//            }
//        }
        /// <summary>
        /// 人工出库
        /// </summary>
        /// <param name="inputs"></param>
        /// <returns></returns>
        [HttpPost("manualExWarehouse")]
        [UnitOfWork]
        public async Task ManualExWarehouse(List<ExWarehouseInput> inputs)
        {
            // 根据托盘号、库位编号去重
            var containerCodeDistinct = inputs.Select(u => new { u.ContainerCode, u.PlaceCode }).Distinct().ToList();
            if (containerCodeDistinct.Count <= 0) throw Oops.Oh("暂无库存出库");
//        /// <summary>
//        /// 人工出库
//        /// </summary>
//        /// <param name="inputs"></param>
//        /// <returns></returns>
//        [HttpPost("manualExWarehouse")]
//        [UnitOfWork]
//        public async Task ManualExWarehouse(List<ExWarehouseInput> inputs)
//        {
//            // 根据托盘号、库位编号去重
//            var containerCodeDistinct = inputs.Select(u => new { u.ContainerCode, u.PlaceCode }).Distinct().ToList();
//            if (containerCodeDistinct.Count <= 0) throw Oops.Oh("暂无库存出库");
            // 查询库区名称
            var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库"));
            if (wmsArea != null) throw Oops.Oh("库区不存在");
//            // 查询库区名称
//            var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库"));
//            if (wmsArea != null) throw Oops.Oh("库区不存在");
            foreach (var item in containerCodeDistinct)
            {
                var wmsMaterialContainerList = new List<WmsMaterialContainer>();
                // 判断任务
                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(p => p.ContainerCode == item.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG);
                if (wmsTask != null) throw Oops.Oh("托盘号存在未完成的任务!");
//            foreach (var item in containerCodeDistinct)
//            {
//                var wmsMaterialContainerList = new List<WmsMaterialContainer>();
//                // 判断任务
//                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(p => p.ContainerCode == item.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG);
//                if (wmsTask != null) throw Oops.Oh("托盘号存在未完成的任务!");
                // 检查托盘号信息
                var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == item.ContainerCode);
                if (wmsContainer == null) throw Oops.Oh("周转箱号不存在!");
//                // 检查托盘号信息
//                var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == item.ContainerCode);
//                if (wmsContainer == null) throw Oops.Oh("周转箱号不存在!");
                // 检查库位信息
                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == item.PlaceCode);
                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
//                // 检查库位信息
//                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == item.PlaceCode);
//                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
//                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
                // 检查库存
                var wmsMaterialStockList = inputs.Where(u => u.ContainerCode == wmsContainer.ContainerCode && u.PlaceCode == wmsPlace.PlaceCode).ToList();
                if (wmsMaterialStockList.Count <= 0) throw Oops.Oh("库存数据异常!");
//                // 检查库存
//                var wmsMaterialStockList = inputs.Where(u => u.ContainerCode == wmsContainer.ContainerCode && u.PlaceCode == wmsPlace.PlaceCode).ToList();
//                if (wmsMaterialStockList.Count <= 0) throw Oops.Oh("库存数据异常!");
                // 检查库位与托盘号关系
                var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.ContainerId == wmsContainer.Id
                && p.PlaceCode == wmsPlace.PlaceCode && p.PlaceId == wmsPlace.Id && p.ContainerPlaceStatus == CommonStatus.ENABLE);
                if (wmsContainerPlace == null) throw Oops.Oh("托盘号与库位关系不存在!");
//                // 检查库位与托盘号关系
//                var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.ContainerId == wmsContainer.Id
//                && p.PlaceCode == wmsPlace.PlaceCode && p.PlaceId == wmsPlace.Id && p.ContainerPlaceStatus == CommonStatus.ENABLE);
//                if (wmsContainerPlace == null) throw Oops.Oh("托盘号与库位关系不存在!");
                // 不是空托才会有组盘关系
                if (wmsPlace.EmptyContainer == YesOrNot.N)
                {
                    // 检查物料与空托号关系
                    wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync();
                    if (wmsMaterialContainerList.Count <= 0) throw Oops.Oh("托盘号与物料关系不存在!");
                }
                else
                {
                    // 更新空料箱库存
                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsContainer.ContainerCode);
                    if (wmsMaterialStock.Source == RuKuSourceEnum.KONGTUO)
                    {
                        await _wmsMaterialStockRep.DeleteAsync(wmsMaterialStock);
                    }
                }
//                // 不是空托才会有组盘关系
//                if (wmsPlace.EmptyContainer == YesOrNot.N)
//                {
//                    // 检查物料与空托号关系
//                    wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync();
//                    if (wmsMaterialContainerList.Count <= 0) throw Oops.Oh("托盘号与物料关系不存在!");
//                }
//                else
//                {
//                    // 更新空料箱库存
//                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsContainer.ContainerCode);
//                    if (wmsMaterialStock.Source == RuKuSourceEnum.KONGTUO)
//                    {
//                        await _wmsMaterialStockRep.DeleteAsync(wmsMaterialStock);
//                    }
//                }
                if (wmsTask == null)
                {
                    //构建出库物料和周转箱号关系
                    var orderNo = "N/A";
                    if (wmsMaterialContainerList.Count > 0) orderNo = YitIdHelper.NextId().ToString();
//                if (wmsTask == null)
//                {
//                    //构建出库物料和周转箱号关系
//                    var orderNo = "N/A";
//                    if (wmsMaterialContainerList.Count > 0) orderNo = YitIdHelper.NextId().ToString();
                    foreach (var wmsMaterialContaine in wmsMaterialContainerList)
                    {
                        //更新状态为”删除“
                        wmsMaterialContaine.BindStatus = CommonStatus.DELETED;
                        await _wmsMaterialContainerRep.UpdateNowAsync(wmsMaterialContaine);
//                    foreach (var wmsMaterialContaine in wmsMaterialContainerList)
//                    {
//                        //更新状态为”删除“
//                        wmsMaterialContaine.BindStatus = CommonStatus.DELETED;
//                        await _wmsMaterialContainerRep.UpdateNowAsync(wmsMaterialContaine);
                        //新增组盘绑定记录 正常
                        var addWmsMaterialContainer = wmsMaterialContaine;
                        addWmsMaterialContainer.Id = YitIdHelper.NextId();
                        addWmsMaterialContainer.OrderNo = orderNo;
                        addWmsMaterialContainer.BindStatus = CommonStatus.ENABLE;
                        await _wmsMaterialContainerRep.InsertNowAsync(addWmsMaterialContainer);
                        // 这里没有分拣操作直接更新库存信息
                        var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsMaterialContaine.ContainerCode);
                        wmsMaterialStock.PlaceCode = "N/A";
                        wmsMaterialStock.StockNumber -= wmsMaterialContaine.BindQuantity;
                        await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
                    }
//                        //新增组盘绑定记录 正常
//                        var addWmsMaterialContainer = wmsMaterialContaine;
//                        addWmsMaterialContainer.Id = YitIdHelper.NextId();
//                        addWmsMaterialContainer.OrderNo = orderNo;
//                        addWmsMaterialContainer.BindStatus = CommonStatus.ENABLE;
//                        await _wmsMaterialContainerRep.InsertNowAsync(addWmsMaterialContainer);
//                        // 这里没有分拣操作直接更新库存信息
//                        var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsMaterialContaine.ContainerCode);
//                        wmsMaterialStock.PlaceCode = "N/A";
//                        wmsMaterialStock.StockNumber -= wmsMaterialContaine.BindQuantity;
//                        await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
//                    }
                    string taskNo = "CHUKU" + DateTime.Today.ToString("yyyyMMdd");
                    var wmsTaskModel = await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => EF.Functions.Like(u.TaskNo, $"%{taskNo}%"));
                    if (wmsTaskModel == null)
                    {
                        taskNo = taskNo + "0001";
                    }
                    else
                    {
                        //获取流水号最大的数据
                        var maxSerialNumber = await _wmsTaskRep.MaxAsync(t => t.TaskNo);
                        taskNo = Comm.GenerateNewInvoiceNumber(maxSerialNumber, 1);
                    }
                    // 新增任务
                    var addWmsTask = new WmsTask()
                    {
                        TaskNo = taskNo,//YitIdHelper.NextId().ToString(),
                        TaskModel = TaskModel.SHOUDONG,
                        TaskType = TaskType.CHUKU,
                        TaskLevel = 1,
                        TaskStatus = TaskStatusEnum.WANCHENG,
                        ContainerCode = wmsContainer.ContainerCode,
                        SourcePlace = wmsPlace.PlaceCode,
                        Aisle = wmsPlace.Aisle,
                        ToPlace = "出库口",
                        AreaName = wmsArea.AreaName,
                        Description = wmsPlace.EmptyContainer == YesOrNot.Y ? "空托" : "物料",
                        OrderNo = orderNo,
                        TaskDodeviceStatus=TaskDodeviceStatusEnum.W,
                        UpdatedTime = DateTime.Now,
                    };
                    await _wmsTaskRep.InsertAsync(addWmsTask);
//                    string taskNo = "CHUKU" + DateTime.Today.ToString("yyyyMMdd");
//                    var wmsTaskModel = await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => EF.Functions.Like(u.TaskNo, $"%{taskNo}%"));
//                    if (wmsTaskModel == null)
//                    {
//                        taskNo = taskNo + "0001";
//                    }
//                    else
//                    {
//                        //获取流水号最大的数据
//                        var maxSerialNumber = await _wmsTaskRep.MaxAsync(t => t.TaskNo);
//                        taskNo = Comm.GenerateNewInvoiceNumber(maxSerialNumber, 1);
//                    }
//                    // 新增任务
//                    var addWmsTask = new WmsTask()
//                    {
//                        TaskNo = taskNo,//YitIdHelper.NextId().ToString(),
//                        TaskModel = TaskModel.SHOUDONG,
//                        TaskType = TaskType.CHUKU,
//                        TaskLevel = 1,
//                        TaskStatus = TaskStatusEnum.WANCHENG,
//                        ContainerCode = wmsContainer.ContainerCode,
//                        SourcePlace = wmsPlace.PlaceCode,
//                        Aisle = wmsPlace.Aisle,
//                        ToPlace = "出库口",
//                        AreaName = wmsArea.AreaName,
//                        Description = wmsPlace.EmptyContainer == YesOrNot.Y ? "空托" : "物料",
//                        OrderNo = orderNo,
//                        TaskDodeviceStatus=TaskDodeviceStatusEnum.W,
//                        UpdatedTime = DateTime.Now,
//                    };
//                    await _wmsTaskRep.InsertAsync(addWmsTask);
                    // 更新库位与周转箱号关系表状态为“删除”
                    wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
                    await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
//                    // 更新库位与周转箱号关系表状态为“删除”
//                    wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
//                    await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
                    // 更新库位为“空闲”
                    wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
                    wmsPlace.Islock = YesOrNot.N;
                    wmsPlace.EmptyContainer = YesOrNot.N;
                    await _wmsPlaceRep.UpdateAsync(wmsPlace);
//                    // 更新库位为“空闲”
//                    wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
//                    wmsPlace.Islock = YesOrNot.N;
//                    wmsPlace.EmptyContainer = YesOrNot.N;
//                    await _wmsPlaceRep.UpdateAsync(wmsPlace);
                    // 更新周转箱号状态为“空闲”
                    wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
                    await _wmsContainerRep.UpdateAsync(wmsContainer);
                }
            }
        }
//                    // 更新周转箱号状态为“空闲”
//                    wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
//                    await _wmsContainerRep.UpdateAsync(wmsContainer);
//                }
//            }
//        }
        /// <summary>
        /// 呼叫空托
        /// </summary>
        /// <returns></returns>
        [HttpPost("callairflare")]
        [UnitOfWork]
        public async Task CallAirflare(CallAirflareInput input)
        {
            //获取库位中存货是空托的库位
            var wmsPlace = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.CUNHUO && u.EmptyContainer== YesOrNot.Y).ToListAsync();
            if (wmsPlace.Count > 0)
            {
//        /// <summary>
//        /// 呼叫空托
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("callairflare")]
//        [UnitOfWork]
//        public async Task CallAirflare(CallAirflareInput input)
//        {
//            //获取库位中存货是空托的库位
//            var wmsPlace = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.CUNHUO && u.EmptyContainer== YesOrNot.Y).ToListAsync();
//            if (wmsPlace.Count > 0)
//            {
                
            }
        }
    }
}
//            }
//        }
//    }
//}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsJob/WmsTask/WmsTaskService.cs
@@ -1,624 +1,624 @@
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
using System.Text;
using System.Web;
using Admin.NET.Core;
using Yitter.IdGenerator;
using StackExchange.Redis;
//using Furion.DatabaseAccessor;
//using Furion.DependencyInjection;
//using Furion.DynamicApiController;
//using Furion.FriendlyException;
//using Mapster;
//using Microsoft.AspNetCore.Http;
//using Microsoft.AspNetCore.Mvc;
//using Microsoft.EntityFrameworkCore;
//using System.Linq.Dynamic.Core;
//using System.Text;
//using System.Web;
//using Admin.NET.Core;
//using Yitter.IdGenerator;
//using StackExchange.Redis;
namespace Admin.NET.Application
{
    /// <summary>
    /// 任务管理服务
    /// </summary>
    [ApiDescriptionSettings("仓库作业", Name = "WmsTask", Order = 102)]
    [Route("api/[Controller]")]
    public class WmsTaskService : IDynamicApiController, ITransient
    {
        private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
        private readonly IRepository<WmsWarehouseEntrance, MasterDbContextLocator> _wmsWarehouseEntranceRep;
        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
        private readonly IRepository<WmsOrder, MasterDbContextLocator> _wmsOrderRep;
        private readonly IRepository<WmsOrderDetails, MasterDbContextLocator> _wmsOrderDetailsRep;
        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
        private readonly ISysExcelTemplateService _sysExcelTemplateService;
        private readonly static object _lock = new();
//namespace Admin.NET.Application
//{
//    /// <summary>
//    /// 任务管理服务
//    /// </summary>
//    [ApiDescriptionSettings("仓库作业", Name = "WmsTask", Order = 102)]
//    [Route("api/[Controller]")]
//    public class WmsTaskService : IDynamicApiController, ITransient
//    {
//        private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
//        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
//        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
//        private readonly IRepository<WmsWarehouseEntrance, MasterDbContextLocator> _wmsWarehouseEntranceRep;
//        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
//        private readonly IRepository<WmsOrder, MasterDbContextLocator> _wmsOrderRep;
//        private readonly IRepository<WmsOrderDetails, MasterDbContextLocator> _wmsOrderDetailsRep;
//        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
//        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
//        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
//        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
//        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
//        private readonly ISysExcelTemplateService _sysExcelTemplateService;
//        private readonly static object _lock = new();
        /// <summary>
        /// 构造函数
        /// </summary>
        public WmsTaskService(
            IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep,
            IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep,
            IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep,
            IRepository<WmsWarehouseEntrance, MasterDbContextLocator> wmsWarehouseEntranceRep,
            IRepository<WmsOrder, MasterDbContextLocator> wmsOrderRep,
            IRepository<WmsOrderDetails, MasterDbContextLocator> wmsOrderDetailsRep,
            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
            IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRep,
            IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
            IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
            IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep,
            IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
            ISysExcelTemplateService sysExcelTemplateService
        )
        {
            _sysDictTypeRep = sysDictTypeRep;
            _sysDictDataRep = sysDictDataRep;
            _wmsTaskRep = wmsTaskRep;
            _wmsWarehouseEntranceRep = wmsWarehouseEntranceRep;
            _wmsOrderRep = wmsOrderRep;
            _wmsOrderDetailsRep = wmsOrderDetailsRep;
            _wmsPlaceRep = wmsPlaceRep;
            _wmsContainerPlaceRep = wmsContainerPlaceRep;
            _wmsMaterialStockRep = wmsMaterialStockRep;
            _wmsContainerRep = wmsContainerRep;
            _wmsMaterialContainerRep = wmsMaterialContainerRep;
            _wmsAreaRep= wmsAreaRep;
            _sysExcelTemplateService = sysExcelTemplateService;
        }
//        /// <summary>
//        /// 构造函数
//        /// </summary>
//        public WmsTaskService(
//            IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep,
//            IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep,
//            IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep,
//            IRepository<WmsWarehouseEntrance, MasterDbContextLocator> wmsWarehouseEntranceRep,
//            IRepository<WmsOrder, MasterDbContextLocator> wmsOrderRep,
//            IRepository<WmsOrderDetails, MasterDbContextLocator> wmsOrderDetailsRep,
//            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
//            IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRep,
//            IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
//            IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
//            IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep,
//            IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
//            ISysExcelTemplateService sysExcelTemplateService
//        )
//        {
//            _sysDictTypeRep = sysDictTypeRep;
//            _sysDictDataRep = sysDictDataRep;
//            _wmsTaskRep = wmsTaskRep;
//            _wmsWarehouseEntranceRep = wmsWarehouseEntranceRep;
//            _wmsOrderRep = wmsOrderRep;
//            _wmsOrderDetailsRep = wmsOrderDetailsRep;
//            _wmsPlaceRep = wmsPlaceRep;
//            _wmsContainerPlaceRep = wmsContainerPlaceRep;
//            _wmsMaterialStockRep = wmsMaterialStockRep;
//            _wmsContainerRep = wmsContainerRep;
//            _wmsMaterialContainerRep = wmsMaterialContainerRep;
//            _wmsAreaRep= wmsAreaRep;
//            _sysExcelTemplateService = sysExcelTemplateService;
//        }
        /// <summary>
        /// 分页查询出入库任务管理
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("page")]
        public async Task<PageResult<TaskOutput>> Page([FromQuery] WmsTaskSearch input)
        {
            var wmsTasks = await _wmsTaskRep.DetachedEntities
                .Where(u => u.AreaName.Contains("绝缘立库"))
                .Where(!string.IsNullOrEmpty(input.TaskNo), u => EF.Functions.Like(u.TaskNo, $"%{input.TaskNo.Trim()}%"))
                .Where(input.TaskModel != null, u => u.TaskModel == input.TaskModel)
                .Where(input.TaskType != null, u => u.TaskType == input.TaskType)
                .Where(input.TaskStatus != null, u => u.TaskStatus == input.TaskStatus)
                .Where(!string.IsNullOrEmpty(input.ContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{input.ContainerCode.Trim()}%"))
                .Where(!string.IsNullOrEmpty(input.AreaName), u => u.AreaName == input.AreaName)
                .Where(!string.IsNullOrEmpty(input.OrderNo), u => EF.Functions.Like(u.OrderNo, $"%{input.OrderNo.Trim()}%"))
                .Where(!string.IsNullOrEmpty(input.SourcePlace), u => EF.Functions.Like(u.SourcePlace, $"%{input.SourcePlace.Trim()}%"))
                .Where(!string.IsNullOrEmpty(input.ToPlace), u => EF.Functions.Like(u.ToPlace, $"%{input.ToPlace.Trim()}%"))
                .Where(input.Aisle != null, u => u.Aisle == input.Aisle)
                .OrderBy(PageInputOrder.OrderBuilder(input))
                .ProjectToType<TaskOutput>()
                .ToADPagedListAsync(input.PageNo, input.PageSize);
            return wmsTasks;
        }
//        /// <summary>
//        /// 分页查询出入库任务管理
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("page")]
//        public async Task<PageResult<TaskOutput>> Page([FromQuery] WmsTaskSearch input)
//        {
//            var wmsTasks = await _wmsTaskRep.DetachedEntities
//                .Where(u => u.AreaName.Contains("绝缘立库"))
//                .Where(!string.IsNullOrEmpty(input.TaskNo), u => EF.Functions.Like(u.TaskNo, $"%{input.TaskNo.Trim()}%"))
//                .Where(input.TaskModel != null, u => u.TaskModel == input.TaskModel)
//                .Where(input.TaskType != null, u => u.TaskType == input.TaskType)
//                .Where(input.TaskStatus != null, u => u.TaskStatus == input.TaskStatus)
//                .Where(!string.IsNullOrEmpty(input.ContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{input.ContainerCode.Trim()}%"))
//                .Where(!string.IsNullOrEmpty(input.AreaName), u => u.AreaName == input.AreaName)
//                .Where(!string.IsNullOrEmpty(input.OrderNo), u => EF.Functions.Like(u.OrderNo, $"%{input.OrderNo.Trim()}%"))
//                .Where(!string.IsNullOrEmpty(input.SourcePlace), u => EF.Functions.Like(u.SourcePlace, $"%{input.SourcePlace.Trim()}%"))
//                .Where(!string.IsNullOrEmpty(input.ToPlace), u => EF.Functions.Like(u.ToPlace, $"%{input.ToPlace.Trim()}%"))
//                .Where(input.Aisle != null, u => u.Aisle == input.Aisle)
//                .OrderBy(PageInputOrder.OrderBuilder(input))
//                .ProjectToType<TaskOutput>()
//                .ToADPagedListAsync(input.PageNo, input.PageSize);
//            return wmsTasks;
//        }
        /// <summary>
        /// 不分页查询出入库任务管理列表
        /// </summary>
        /// <param name="input">出入库任务管理查询参数</param>
        /// <returns>(出入库任务管理)实例列表</returns>
        [HttpGet("listNonPage")]
        public async Task<List<TaskOutput>> ListNonPageAsync([FromQuery] WmsTaskSearchNonPage input)
        {
            var pTaskNo = input.TaskNo?.Trim() ?? "";
            var pTaskModel = input.TaskModel;
            var pTaskType = input.TaskType;
            var pTaskLevel = input.TaskLevel;
            var pTaskStatus = input.TaskStatus;
            var pIsRead = input.IsRead;
            var pContainerCode = input.ContainerCode?.Trim() ?? "";
            var pAreaName = input.AreaName?.Trim() ?? "";
            var pOrderNo = input.OrderNo?.Trim() ?? "";
            var pTaskDodeviceStatus = input.TaskDodeviceStatus;
            var wmsTasks = await _wmsTaskRep.DetachedEntities
                .Where(!string.IsNullOrEmpty(pTaskNo), u => EF.Functions.Like(u.TaskNo, $"%{pTaskNo}%"))
                .Where(pTaskModel != null, u => u.TaskModel == pTaskModel)
                .Where(pTaskType != null, u => u.TaskType == pTaskType)
                .Where(pTaskLevel != null, u => u.TaskLevel == pTaskLevel)
                .Where(pTaskStatus != null, u => u.TaskStatus == pTaskStatus)
                .Where(pIsRead != null, u => u.IsRead == pIsRead)
                .Where(!string.IsNullOrEmpty(pContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{pContainerCode}%"))
                .Where(!string.IsNullOrEmpty(pAreaName), u => u.AreaName == pAreaName)
                .Where(!string.IsNullOrEmpty(pOrderNo), u => EF.Functions.Like(u.OrderNo, $"%{pOrderNo}%"))
                .Where(pTaskDodeviceStatus != null, u => u.TaskDodeviceStatus == pTaskDodeviceStatus)
            .OrderBy(PageInputOrder.OrderNonPageBuilder(input))
            .ProjectToType<TaskOutput>()
            .ToListAsync();
            return wmsTasks;
        }
//        /// <summary>
//        /// 不分页查询出入库任务管理列表
//        /// </summary>
//        /// <param name="input">出入库任务管理查询参数</param>
//        /// <returns>(出入库任务管理)实例列表</returns>
//        [HttpGet("listNonPage")]
//        public async Task<List<TaskOutput>> ListNonPageAsync([FromQuery] WmsTaskSearchNonPage input)
//        {
//            var pTaskNo = input.TaskNo?.Trim() ?? "";
//            var pTaskModel = input.TaskModel;
//            var pTaskType = input.TaskType;
//            var pTaskLevel = input.TaskLevel;
//            var pTaskStatus = input.TaskStatus;
//            var pIsRead = input.IsRead;
//            var pContainerCode = input.ContainerCode?.Trim() ?? "";
//            var pAreaName = input.AreaName?.Trim() ?? "";
//            var pOrderNo = input.OrderNo?.Trim() ?? "";
//            var pTaskDodeviceStatus = input.TaskDodeviceStatus;
//            var wmsTasks = await _wmsTaskRep.DetachedEntities
//                .Where(!string.IsNullOrEmpty(pTaskNo), u => EF.Functions.Like(u.TaskNo, $"%{pTaskNo}%"))
//                .Where(pTaskModel != null, u => u.TaskModel == pTaskModel)
//                .Where(pTaskType != null, u => u.TaskType == pTaskType)
//                .Where(pTaskLevel != null, u => u.TaskLevel == pTaskLevel)
//                .Where(pTaskStatus != null, u => u.TaskStatus == pTaskStatus)
//                .Where(pIsRead != null, u => u.IsRead == pIsRead)
//                .Where(!string.IsNullOrEmpty(pContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{pContainerCode}%"))
//                .Where(!string.IsNullOrEmpty(pAreaName), u => u.AreaName == pAreaName)
//                .Where(!string.IsNullOrEmpty(pOrderNo), u => EF.Functions.Like(u.OrderNo, $"%{pOrderNo}%"))
//                .Where(pTaskDodeviceStatus != null, u => u.TaskDodeviceStatus == pTaskDodeviceStatus)
//            .OrderBy(PageInputOrder.OrderNonPageBuilder(input))
//            .ProjectToType<TaskOutput>()
//            .ToListAsync();
//            return wmsTasks;
//        }
        /// <summary>
        /// 增加出入库任务管理
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("add")]
        [NonAction]
        public async Task Add(AddWmsTaskInput input)
        {
            var wmsTask = input.Adapt<WmsTask>();
            await _wmsTaskRep.InsertAsync(wmsTask);
        }
//        /// <summary>
//        /// 增加出入库任务管理
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("add")]
//        [NonAction]
//        public async Task Add(AddWmsTaskInput input)
//        {
//            var wmsTask = input.Adapt<WmsTask>();
//            await _wmsTaskRep.InsertAsync(wmsTask);
//        }
        /// <summary>
        /// 删除出入库任务管理
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("delete")]
        public async Task Delete(DeleteWmsTaskInput input)
        {
            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            await _wmsTaskRep.DeleteAsync(wmsTask);
        }
//        /// <summary>
//        /// 删除出入库任务管理
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("delete")]
//        public async Task Delete(DeleteWmsTaskInput input)
//        {
//            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
//            await _wmsTaskRep.DeleteAsync(wmsTask);
//        }
        /// <summary>
        /// 更新出入库任务管理
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("edit")]
        public async Task Update(UpdateWmsTaskInput input)
        {
            var isExist = await _wmsTaskRep.AnyAsync(u => u.Id == input.Id, false);
            if (!isExist) throw Oops.Oh(ErrorCode.D3000);
//        /// <summary>
//        /// 更新出入库任务管理
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("edit")]
//        public async Task Update(UpdateWmsTaskInput input)
//        {
//            var isExist = await _wmsTaskRep.AnyAsync(u => u.Id == input.Id, false);
//            if (!isExist) throw Oops.Oh(ErrorCode.D3000);
            var wmsTask = input.Adapt<WmsTask>();
            await _wmsTaskRep.UpdateAsync(wmsTask, ignoreNullValues: true);
        }
//            var wmsTask = input.Adapt<WmsTask>();
//            await _wmsTaskRep.UpdateAsync(wmsTask, ignoreNullValues: true);
//        }
        /// <summary>
        /// 强制完成
        /// </summary>
        /// <returns></returns>
        [HttpPost("finish")]
        [UnitOfWork]
        public async Task Finish([FromBody] WmsTaskFinishInput input)
        {
            //查询任务
            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            if (wmsTask == null) throw Oops.Oh("任务不存在!");
//        /// <summary>
//        /// 强制完成
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("finish")]
//        [UnitOfWork]
//        public async Task Finish([FromBody] WmsTaskFinishInput input)
//        {
//            //查询任务
//            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
//            if (wmsTask == null) throw Oops.Oh("任务不存在!");
            // 查询混合料库区信息
            var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库"));
            if (wmsArea == null) throw Oops.Oh("库区不存在!");
//            // 查询混合料库区信息
//            var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库"));
//            if (wmsArea == null) throw Oops.Oh("库区不存在!");
            // 查询托盘信息,呼救AGV时会进行组盘操作
            var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
            if (wmsContainer == null) throw Oops.Oh("托盘不存在!");
//            // 查询托盘信息,呼救AGV时会进行组盘操作
//            var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
//            if (wmsContainer == null) throw Oops.Oh("托盘不存在!");
            var statusList = new List<TaskStatusEnum> { TaskStatusEnum.WEIZHIXING, TaskStatusEnum.ZHIXINGZHONG , TaskStatusEnum .DAIZHIXING};
            if (!statusList.Contains(wmsTask.TaskStatus)) throw Oops.Oh("只有未执行和执行中的任务才能强制完成!");
//            var statusList = new List<TaskStatusEnum> { TaskStatusEnum.WEIZHIXING, TaskStatusEnum.ZHIXINGZHONG , TaskStatusEnum .DAIZHIXING};
//            if (!statusList.Contains(wmsTask.TaskStatus)) throw Oops.Oh("只有未执行和执行中的任务才能强制完成!");
            if (wmsTask.TaskType == TaskType.RUKU) // 入库任务
            {
                // 查询库位信息 随机分配库位
                var wmsPlace = new WmsPlace();
                if (string.IsNullOrEmpty(wmsTask.ToPlace))
                    wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.AreaId == wmsArea.Id && u.Islock == YesOrNot.N && u.PlaceStatus == PlaceStatus.KONGXIAN);
                else
                    wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.AreaId == wmsArea.Id && u.PlaceCode == wmsTask.ToPlace);
                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
                if (wmsPlace.PlaceStatus != PlaceStatus.KONGXIAN) throw Oops.Oh("库位已存货!");
                // 更新库位状态为“存货”
                wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
                if (wmsTask.Description == "空托") wmsPlace.EmptyContainer = YesOrNot.Y;  //是否空托
                else wmsPlace.EmptyContainer = YesOrNot.N;
//            if (wmsTask.TaskType == TaskType.RUKU) // 入库任务
//            {
//                // 查询库位信息 随机分配库位
//                var wmsPlace = new WmsPlace();
//                if (string.IsNullOrEmpty(wmsTask.ToPlace))
//                    wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.AreaId == wmsArea.Id && u.Islock == YesOrNot.N && u.PlaceStatus == PlaceStatus.KONGXIAN);
//                else
//                    wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.AreaId == wmsArea.Id && u.PlaceCode == wmsTask.ToPlace);
//                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
//                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
//                if (wmsPlace.PlaceStatus != PlaceStatus.KONGXIAN) throw Oops.Oh("库位已存货!");
//                // 更新库位状态为“存货”
//                wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
//                if (wmsTask.Description == "空托") wmsPlace.EmptyContainer = YesOrNot.Y;  //是否空托
//                else wmsPlace.EmptyContainer = YesOrNot.N;
                // 创建托盘号库位关系表
                var wmsContainerPlaceModel = new WmsContainerPlace()
                {
                    PlaceId = wmsPlace.Id,
                    PlaceCode = wmsPlace.PlaceCode,
                    ContainerId = wmsContainer.Id,
                    ContainerCode = wmsContainer.ContainerCode,
                    ContainerPlaceStatus = CommonStatus.ENABLE
                };
                await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlaceModel);
//                // 创建托盘号库位关系表
//                var wmsContainerPlaceModel = new WmsContainerPlace()
//                {
//                    PlaceId = wmsPlace.Id,
//                    PlaceCode = wmsPlace.PlaceCode,
//                    ContainerId = wmsContainer.Id,
//                    ContainerCode = wmsContainer.ContainerCode,
//                    ContainerPlaceStatus = CommonStatus.ENABLE
//                };
//                await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlaceModel);
                // 更新库存
                var wmsMaterialContainerList = await _wmsMaterialContainerRep.DetachedEntities
                    .Where(p => p.OrderNo ==wmsTask.OrderNo && p.BindStatus == CommonStatus.ENABLE).ProjectToType<WmsMaterialContainer>().ToListAsync();
//                // 更新库存
//                var wmsMaterialContainerList = await _wmsMaterialContainerRep.DetachedEntities
//                    .Where(p => p.OrderNo ==wmsTask.OrderNo && p.BindStatus == CommonStatus.ENABLE).ProjectToType<WmsMaterialContainer>().ToListAsync();
                foreach (var item in wmsMaterialContainerList)
                {
                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode
                    && p.MaterialBatch == item.MaterialBatch);
                    if (wmsMaterialStock != null)
                    {
                        wmsMaterialStock.Source = RuKuSourceEnum.KONGTUO;
                        wmsMaterialStock.AreaId = wmsPlace.AreaId;
                        wmsMaterialStock.PlaceCode = wmsPlace.PlaceCode;
                        wmsMaterialStock.StockNumber += item.BindQuantity;
                        await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
                    }
                    else
                    {
                        wmsMaterialStock = new WmsMaterialStock()
                        {
                            InspectionMethod = MaterialInspection.MIANJIAN,
                            UnitType = UnitType.ZHONGLIANG,
                            UnitNo = UnitNoType.T,
                            MaterialNo = item.MaterialNo,
                            MaterialType = MaterialType.CHENGPING,
                            MaterialName = item.MaterialName,
                            MaterialSpec = item.MaterialSpec,
                            MaterialBatch = item.MaterialBatch,
                            MaterialDensity = item.MaterialDensity,
                            StockNumber = 1,
                            PlaceCode = wmsPlace.PlaceCode,
                            ContainerId = wmsContainer.Id,
                            ContainerCode = wmsContainer.ContainerCode,
                            AreaId = wmsPlace.AreaId,
                            Source = RuKuSourceEnum.KONGTUO,
                        };
                        await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock);
                    }
                }
                // 空料箱入库
                if (wmsTask.OrderNo == "N/A")
                {
                    var wmsMaterialStock = new WmsMaterialStock()
                    {
                        InspectionMethod = MaterialInspection.MIANJIAN,
                        UnitType = UnitType.ZHONGLIANG,
                        UnitNo = UnitNoType.T,
                        MaterialNo = "N/A",
                        MaterialType = MaterialType.KONGTUO,
                        MaterialName = "N/A",
                        MaterialSpec = "N/A",
                        MaterialBatch = "N/A",
                        MaterialDensity = "N/A",
                        StockNumber = 0,
                        PlaceCode = wmsPlace.PlaceCode,
                        ContainerId = wmsContainer.Id,
                        ContainerCode = wmsContainer.ContainerCode,
                        AreaId = wmsPlace.AreaId,
                        Source = RuKuSourceEnum.KONGTUO,
                    };
                    await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock);
                }
                // 更新任务状态、设备任务状态、托盘编号、目标位置、库区名称
                wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
                wmsTask.ContainerCode = wmsContainer.ContainerCode;
                wmsTask.ToPlace = wmsPlace.PlaceCode;
                wmsTask.AreaName = wmsPlace.WmsArea.AreaName;
                wmsTask.IsRead = true;
//                foreach (var item in wmsMaterialContainerList)
//                {
//                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode
//                    && p.MaterialBatch == item.MaterialBatch);
//                    if (wmsMaterialStock != null)
//                    {
//                        wmsMaterialStock.Source = RuKuSourceEnum.KONGTUO;
//                        wmsMaterialStock.AreaId = wmsPlace.AreaId;
//                        wmsMaterialStock.PlaceCode = wmsPlace.PlaceCode;
//                        wmsMaterialStock.StockNumber += item.BindQuantity;
//                        await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
//                    }
//                    else
//                    {
//                        wmsMaterialStock = new WmsMaterialStock()
//                        {
//                            InspectionMethod = MaterialInspection.MIANJIAN,
//                            UnitType = UnitType.ZHONGLIANG,
//                            UnitNo = UnitNoType.T,
//                            MaterialNo = item.MaterialNo,
//                            MaterialType = MaterialType.CHENGPING,
//                            MaterialName = item.MaterialName,
//                            MaterialSpec = item.MaterialSpec,
//                            MaterialBatch = item.MaterialBatch,
//                            MaterialDensity = item.MaterialDensity,
//                            StockNumber = 1,
//                            PlaceCode = wmsPlace.PlaceCode,
//                            ContainerId = wmsContainer.Id,
//                            ContainerCode = wmsContainer.ContainerCode,
//                            AreaId = wmsPlace.AreaId,
//                            Source = RuKuSourceEnum.KONGTUO,
//                        };
//                        await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock);
//                    }
//                }
//                // 空料箱入库
//                if (wmsTask.OrderNo == "N/A")
//                {
//                    var wmsMaterialStock = new WmsMaterialStock()
//                    {
//                        InspectionMethod = MaterialInspection.MIANJIAN,
//                        UnitType = UnitType.ZHONGLIANG,
//                        UnitNo = UnitNoType.T,
//                        MaterialNo = "N/A",
//                        MaterialType = MaterialType.KONGTUO,
//                        MaterialName = "N/A",
//                        MaterialSpec = "N/A",
//                        MaterialBatch = "N/A",
//                        MaterialDensity = "N/A",
//                        StockNumber = 0,
//                        PlaceCode = wmsPlace.PlaceCode,
//                        ContainerId = wmsContainer.Id,
//                        ContainerCode = wmsContainer.ContainerCode,
//                        AreaId = wmsPlace.AreaId,
//                        Source = RuKuSourceEnum.KONGTUO,
//                    };
//                    await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock);
//                }
//                // 更新任务状态、设备任务状态、托盘编号、目标位置、库区名称
//                wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
//                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
//                wmsTask.ContainerCode = wmsContainer.ContainerCode;
//                wmsTask.ToPlace = wmsPlace.PlaceCode;
//                wmsTask.AreaName = wmsPlace.WmsArea.AreaName;
//                wmsTask.IsRead = true;
                // 更新库位状态为存货
                wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
                await _wmsPlaceRep.UpdateAsync(wmsPlace);
//                // 更新库位状态为存货
//                wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
//                await _wmsPlaceRep.UpdateAsync(wmsPlace);
                // 更新托盘状态为“库位”
                wmsContainer.ContainerStatus = ContainerStatus.KUWEI;
                await _wmsContainerRep.UpdateAsync(wmsContainer);
            }
            else if (wmsTask.TaskType == TaskType.CHUKU) //出库任务
            {
                var wmsMaterialContainerList = new List<WmsMaterialContainer>();
                // 查询库位信息
                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.PlaceCode == wmsTask.SourcePlace);
                if (wmsPlace == null) throw Oops.Oh("库位信息不存在!");
                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
                //if (wmsPlace != null && wmsPlace.PlaceStatus != PlaceStatus.DAICHU) throw Oops.Oh("库位异常货!");
//                // 更新托盘状态为“库位”
//                wmsContainer.ContainerStatus = ContainerStatus.KUWEI;
//                await _wmsContainerRep.UpdateAsync(wmsContainer);
//            }
//            else if (wmsTask.TaskType == TaskType.CHUKU) //出库任务
//            {
//                var wmsMaterialContainerList = new List<WmsMaterialContainer>();
//                // 查询库位信息
//                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.PlaceCode == wmsTask.SourcePlace);
//                if (wmsPlace == null) throw Oops.Oh("库位信息不存在!");
//                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
//                //if (wmsPlace != null && wmsPlace.PlaceStatus != PlaceStatus.DAICHU) throw Oops.Oh("库位异常货!");
                // 查询是否已存在托盘与库位的关系
                var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == wmsPlace.Id && z.PlaceCode == wmsPlace.PlaceCode
                && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE);
                if (wmsContainerPlace == null) throw Oops.Oh("库位容器关系不存在!");
//                // 查询是否已存在托盘与库位的关系
//                var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == wmsPlace.Id && z.PlaceCode == wmsPlace.PlaceCode
//                && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE);
//                if (wmsContainerPlace == null) throw Oops.Oh("库位容器关系不存在!");
                // 不是空托才会有组盘关系
                if (wmsPlace.EmptyContainer == YesOrNot.N)
                {
                    // 检查物料与空托号关系
                    wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync();
                    if (wmsMaterialContainerList.Count <= 0) throw Oops.Oh("托盘号与物料关系不存在!");
//                // 不是空托才会有组盘关系
//                if (wmsPlace.EmptyContainer == YesOrNot.N)
//                {
//                    // 检查物料与空托号关系
//                    wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync();
//                    if (wmsMaterialContainerList.Count <= 0) throw Oops.Oh("托盘号与物料关系不存在!");
                }
                else
                {
                    // 更新空料箱库存
                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsContainer.ContainerCode);
                    if (wmsMaterialStock.Source == RuKuSourceEnum.KONGTUO)
                    {
                        await _wmsMaterialStockRep.DeleteAsync(wmsMaterialStock);
                    }
                }
//                }
//                else
//                {
//                    // 更新空料箱库存
//                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsContainer.ContainerCode);
//                    if (wmsMaterialStock.Source == RuKuSourceEnum.KONGTUO)
//                    {
//                        await _wmsMaterialStockRep.DeleteAsync(wmsMaterialStock);
//                    }
//                }
                //构建出库物料和周转箱号关系
                var orderNo = "N/A";
                if (wmsMaterialContainerList.Count > 0) orderNo = YitIdHelper.NextId().ToString();
//                //构建出库物料和周转箱号关系
//                var orderNo = "N/A";
//                if (wmsMaterialContainerList.Count > 0) orderNo = YitIdHelper.NextId().ToString();
                foreach (var wmsMaterialContaine in wmsMaterialContainerList)
                {
                    //更新状态为”删除“
                    wmsMaterialContaine.BindStatus = CommonStatus.DELETED;
                    await _wmsMaterialContainerRep.UpdateNowAsync(wmsMaterialContaine);
//                foreach (var wmsMaterialContaine in wmsMaterialContainerList)
//                {
//                    //更新状态为”删除“
//                    wmsMaterialContaine.BindStatus = CommonStatus.DELETED;
//                    await _wmsMaterialContainerRep.UpdateNowAsync(wmsMaterialContaine);
                    //新增组盘绑定记录 正常
                    var addWmsMaterialContainer = wmsMaterialContaine;
                    addWmsMaterialContainer.Id = YitIdHelper.NextId();
                    addWmsMaterialContainer.OrderNo = orderNo;
                    addWmsMaterialContainer.BindStatus = CommonStatus.ENABLE;
                    await _wmsMaterialContainerRep.InsertNowAsync(addWmsMaterialContainer);
                    // 这里没有分拣操作直接更新库存信息
                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsMaterialContaine.ContainerCode);
                    wmsMaterialStock.PlaceCode = "N/A";
                    wmsMaterialStock.StockNumber -= wmsMaterialContaine.BindQuantity;
                    await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
                }
//                    //新增组盘绑定记录 正常
//                    var addWmsMaterialContainer = wmsMaterialContaine;
//                    addWmsMaterialContainer.Id = YitIdHelper.NextId();
//                    addWmsMaterialContainer.OrderNo = orderNo;
//                    addWmsMaterialContainer.BindStatus = CommonStatus.ENABLE;
//                    await _wmsMaterialContainerRep.InsertNowAsync(addWmsMaterialContainer);
//                    // 这里没有分拣操作直接更新库存信息
//                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsMaterialContaine.ContainerCode);
//                    wmsMaterialStock.PlaceCode = "N/A";
//                    wmsMaterialStock.StockNumber -= wmsMaterialContaine.BindQuantity;
//                    await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
//                }
                //更新任务状态
                wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
                wmsTask.IsRead = true;
//                //更新任务状态
//                wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
//                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
//                wmsTask.IsRead = true;
                // 禁用托盘库位关系
                wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
                await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
//                // 禁用托盘库位关系
//                wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
//                await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
                // 更新库位状态为“空闲”
                wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
                await _wmsPlaceRep.UpdateAsync(wmsPlace);
//                // 更新库位状态为“空闲”
//                wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
//                await _wmsPlaceRep.UpdateAsync(wmsPlace);
                // 更新托盘状态为“空闲”
                wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
                await _wmsContainerRep.UpdateAsync(wmsContainer);
            }
            else //移库任务
            {
//                // 更新托盘状态为“空闲”
//                wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
//                await _wmsContainerRep.UpdateAsync(wmsContainer);
//            }
//            else //移库任务
//            {
            }
            await _wmsTaskRep.UpdateAsync(wmsTask);
        }
//            }
//            await _wmsTaskRep.UpdateAsync(wmsTask);
//        }
        /// <summary>
        /// 更新优先级(向上)
        /// </summary>
        /// <returns></returns>
        [HttpPost("upwardTaskLevel")]
        public async Task UpwardTaskLevel([FromBody] UpdateTaskLevelInput input)
        {
            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            if (wmsTask == null) throw Oops.Oh("任务不存在!");
            if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能更新任务优先级!");
            if(wmsTask.TaskLevel==5) throw Oops.Oh("任务已为最高级别!");
            wmsTask.TaskLevel += 1;
            await _wmsTaskRep.UpdateAsync(wmsTask);
        }
//        /// <summary>
//        /// 更新优先级(向上)
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("upwardTaskLevel")]
//        public async Task UpwardTaskLevel([FromBody] UpdateTaskLevelInput input)
//        {
//            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
//            if (wmsTask == null) throw Oops.Oh("任务不存在!");
//            if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能更新任务优先级!");
//            if(wmsTask.TaskLevel==5) throw Oops.Oh("任务已为最高级别!");
//            wmsTask.TaskLevel += 1;
//            await _wmsTaskRep.UpdateAsync(wmsTask);
//        }
        /// <summary>
        /// 更新优先级(向下)
        /// </summary>
        /// <returns></returns>
        [HttpPost("downTaskLevel")]
        public async Task DownTaskLevel([FromBody] UpdateTaskLevelInput input)
        {
            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            if (wmsTask == null) throw Oops.Oh("任务不存在!");
            if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能更新任务优先级!");
            if (wmsTask.TaskLevel == 1) throw Oops.Oh("任务已为最低级别!");
            wmsTask.TaskLevel -= 1;
            await _wmsTaskRep.UpdateAsync(wmsTask);
        }
//        /// <summary>
//        /// 更新优先级(向下)
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("downTaskLevel")]
//        public async Task DownTaskLevel([FromBody] UpdateTaskLevelInput input)
//        {
//            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
//            if (wmsTask == null) throw Oops.Oh("任务不存在!");
//            if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能更新任务优先级!");
//            if (wmsTask.TaskLevel == 1) throw Oops.Oh("任务已为最低级别!");
//            wmsTask.TaskLevel -= 1;
//            await _wmsTaskRep.UpdateAsync(wmsTask);
//        }
        /// <summary>
        /// 取消
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("CancelTask")]
        public async Task CancelTask([FromBody] CancelInput input)
        {
            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            if (wmsTask == null) throw Oops.Oh("任务不存在!");
//        /// <summary>
//        /// 取消
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("CancelTask")]
//        public async Task CancelTask([FromBody] CancelInput input)
//        {
//            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id);
//            if (wmsTask == null) throw Oops.Oh("任务不存在!");
            if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能取消任务!");
//            if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能取消任务!");
            wmsTask.TaskStatus = TaskStatusEnum.QUXIAO;
            wmsTask.IsRead=true;
            await _wmsTaskRep.UpdateAsync(wmsTask);
        }
//            wmsTask.TaskStatus = TaskStatusEnum.QUXIAO;
//            wmsTask.IsRead=true;
//            await _wmsTaskRep.UpdateAsync(wmsTask);
//        }
        /// <summary>
        /// 批量取消
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("batchCancel")]
        public async Task BatchCancel([FromBody] BatchCancelInput input)
        {
            int length = input.Id.Count;
            for (int i = 0; i < length; i++)
            {
                long Id = input.Id[i];
                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == Id);
                if (wmsTask == null) throw Oops.Oh("任务不存在!");
//        /// <summary>
//        /// 批量取消
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("batchCancel")]
//        public async Task BatchCancel([FromBody] BatchCancelInput input)
//        {
//            int length = input.Id.Count;
//            for (int i = 0; i < length; i++)
//            {
//                long Id = input.Id[i];
//                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == Id);
//                if (wmsTask == null) throw Oops.Oh("任务不存在!");
                if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能取消任务!");
//                if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能取消任务!");
                wmsTask.TaskStatus = TaskStatusEnum.QUXIAO;
                await _wmsTaskRep.UpdateAsync(wmsTask);
            }
        }
//                wmsTask.TaskStatus = TaskStatusEnum.QUXIAO;
//                await _wmsTaskRep.UpdateAsync(wmsTask);
//            }
//        }
        /// <summary>
        /// 批量暂停
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("batchBreak")]
        public async Task BatchBreak([FromBody] BatchBreakInput input)
        {
            int length = input.Id.Count;
            for (int i = 0; i < length; i++)
            {
                long Id = input.Id[i];
                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == Id);
                if (wmsTask == null) throw Oops.Oh("任务不存在!");
//        /// <summary>
//        /// 批量暂停
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("batchBreak")]
//        public async Task BatchBreak([FromBody] BatchBreakInput input)
//        {
//            int length = input.Id.Count;
//            for (int i = 0; i < length; i++)
//            {
//                long Id = input.Id[i];
//                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == Id);
//                if (wmsTask == null) throw Oops.Oh("任务不存在!");
                if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能暂停任务!");
//                if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能暂停任务!");
                wmsTask.TaskStatus = TaskStatusEnum.ZANTING;
                await _wmsTaskRep.UpdateAsync(wmsTask);
            }
        }
//                wmsTask.TaskStatus = TaskStatusEnum.ZANTING;
//                await _wmsTaskRep.UpdateAsync(wmsTask);
//            }
//        }
        /// <summary>
        /// 批量继续
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("batchContinue")]
        public async Task BatchContinue([FromBody] BatchContinueInput input)
        {
            int length = input.Id.Count;
            for (int i = 0; i < length; i++)
            {
                long Id = input.Id[i];
                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == Id);
                if (wmsTask == null) throw Oops.Oh("任务不存在!");
//        /// <summary>
//        /// 批量继续
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("batchContinue")]
//        public async Task BatchContinue([FromBody] BatchContinueInput input)
//        {
//            int length = input.Id.Count;
//            for (int i = 0; i < length; i++)
//            {
//                long Id = input.Id[i];
//                var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == Id);
//                if (wmsTask == null) throw Oops.Oh("任务不存在!");
                if (wmsTask.TaskStatus != TaskStatusEnum.ZANTING) throw Oops.Oh("只有暂停的任务才能继续任务!");
//                if (wmsTask.TaskStatus != TaskStatusEnum.ZANTING) throw Oops.Oh("只有暂停的任务才能继续任务!");
                wmsTask.TaskStatus = TaskStatusEnum.WEIZHIXING;
                await _wmsTaskRep.UpdateAsync(wmsTask);
            }
        }
//                wmsTask.TaskStatus = TaskStatusEnum.WEIZHIXING;
//                await _wmsTaskRep.UpdateAsync(wmsTask);
//            }
//        }
        /// <summary>
        /// 获取出入库任务管理
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("detail")]
        public async Task<TaskOutput> Get([FromQuery] QueryeWmsTaskInput input)
        {
            return (await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<TaskOutput>();
        }
//        /// <summary>
//        /// 获取出入库任务管理
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("detail")]
//        public async Task<TaskOutput> Get([FromQuery] QueryeWmsTaskInput input)
//        {
//            return (await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<TaskOutput>();
//        }
        /// <summary>
        /// 获取出入库任务管理列表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("list")]
        public async Task<List<TaskOutput>> List([FromQuery] TaskInput input)
        {
            return await _wmsTaskRep.DetachedEntities.ProjectToType<TaskOutput>().ToListAsync();
        }
//        /// <summary>
//        /// 获取出入库任务管理列表
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("list")]
//        public async Task<List<TaskOutput>> List([FromQuery] TaskInput input)
//        {
//            return await _wmsTaskRep.DetachedEntities.ProjectToType<TaskOutput>().ToListAsync();
//        }
        /// <summary>
        /// Excel模板导入出入库任务管理功能
        /// </summary>
        /// <param name="file">Excel模板文件</param>
        /// <param name="importExcelType">Excel导入方式</param>
        /// <returns>导入的记录数</returns>
        [HttpPost("fromExcel")]
        public async Task<int> FromExcelAsync(IFormFile file, [FromQuery] ImportExcelType importExcelType)
        {
            int size = 200;
            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTask", "v2");
            if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002);
            var keys = excelTemplate.UnionUniqueFields.Split(",") ?? Array.Empty<string>();
            for (var i = 0; i < keys.Length; i++)
            {
                keys[i] = keys[i]?.Trim() ?? string.Empty;
            }
            ExcelUtil.FromExcel(file, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, out List<string> headers, out List<List<object?>> data, out string sheetName);
            List<TaskOutput> wmsTaskList = DataConvertUtil.ToObjectList(headers, data, sheetName, keys, excelTemplate?.DataStartLine ?? 2, out Dictionary<string, TaskOutput> dict);
            List<Dictionary<string, object>> uniqueKeyValueDictList = wmsTaskList.ParseUniqueKeyValueDictList(keys.ToList(), excelTemplate?.DataStartLine ?? 2, sheetName);
            var filters = DataConvertUtil.GetExpressionListByUniqueDict<WmsTask>(keys.ToList(), uniqueKeyValueDictList, size);
            var selectKeys = keys.ToList();
            if (!selectKeys.Contains("Id")) selectKeys.Add("Id");
            var selector = DataConvertUtil.GetSelectExpressionListByUniqueDict<WmsTask, TaskOutput>(selectKeys);
            List<WmsTask> updates = new();
            List<WmsTask> adds = new();
//        /// <summary>
//        /// Excel模板导入出入库任务管理功能
//        /// </summary>
//        /// <param name="file">Excel模板文件</param>
//        /// <param name="importExcelType">Excel导入方式</param>
//        /// <returns>导入的记录数</returns>
//        [HttpPost("fromExcel")]
//        public async Task<int> FromExcelAsync(IFormFile file, [FromQuery] ImportExcelType importExcelType)
//        {
//            int size = 200;
//            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTask", "v2");
//            if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002);
//            var keys = excelTemplate.UnionUniqueFields.Split(",") ?? Array.Empty<string>();
//            for (var i = 0; i < keys.Length; i++)
//            {
//                keys[i] = keys[i]?.Trim() ?? string.Empty;
//            }
//            ExcelUtil.FromExcel(file, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, out List<string> headers, out List<List<object?>> data, out string sheetName);
//            List<TaskOutput> wmsTaskList = DataConvertUtil.ToObjectList(headers, data, sheetName, keys, excelTemplate?.DataStartLine ?? 2, out Dictionary<string, TaskOutput> dict);
//            List<Dictionary<string, object>> uniqueKeyValueDictList = wmsTaskList.ParseUniqueKeyValueDictList(keys.ToList(), excelTemplate?.DataStartLine ?? 2, sheetName);
//            var filters = DataConvertUtil.GetExpressionListByUniqueDict<WmsTask>(keys.ToList(), uniqueKeyValueDictList, size);
//            var selectKeys = keys.ToList();
//            if (!selectKeys.Contains("Id")) selectKeys.Add("Id");
//            var selector = DataConvertUtil.GetSelectExpressionListByUniqueDict<WmsTask, TaskOutput>(selectKeys);
//            List<WmsTask> updates = new();
//            List<WmsTask> adds = new();
            lock (_lock)
            {
                foreach (var filter in filters)
                {
                    var wmsTaskExistSubList = _wmsTaskRep.Where(filter).Select(selector).ToList();
                    wmsTaskExistSubList.ForEach(x =>
                    {
                        var k = DataConvertUtil.GetKey(x, keys);
                        if (dict.ContainsKey(k)) dict[k].Id = x.Id;
                    });
                }
//            lock (_lock)
//            {
//                foreach (var filter in filters)
//                {
//                    var wmsTaskExistSubList = _wmsTaskRep.Where(filter).Select(selector).ToList();
//                    wmsTaskExistSubList.ForEach(x =>
//                    {
//                        var k = DataConvertUtil.GetKey(x, keys);
//                        if (dict.ContainsKey(k)) dict[k].Id = x.Id;
//                    });
//                }
                foreach (var wmsTask in wmsTaskList)
                {
                    if (wmsTask.Id > 0)
                    {
                        if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.Add(wmsTask.Adapt<WmsTask>());
                    }
                    else
                    {
                        adds.Add(wmsTask.Adapt<WmsTask>());
                    }
                }
//                foreach (var wmsTask in wmsTaskList)
//                {
//                    if (wmsTask.Id > 0)
//                    {
//                        if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.Add(wmsTask.Adapt<WmsTask>());
//                    }
//                    else
//                    {
//                        adds.Add(wmsTask.Adapt<WmsTask>());
//                    }
//                }
                if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.ForEach(x => _wmsTaskRep.Update(x));
//                if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.ForEach(x => _wmsTaskRep.Update(x));
                var maxId = _wmsTaskRep.DetachedEntities.OrderByDescending(x => x.Id).Select(x => x.Id).FirstOrDefault();
                adds.ForEach(x => x.Id = ++maxId);
                Db.GetDbContext().Set<WmsTask>().AddRange(adds);
                Db.GetDbContext().SaveChanges();
            }
//                var maxId = _wmsTaskRep.DetachedEntities.OrderByDescending(x => x.Id).Select(x => x.Id).FirstOrDefault();
//                adds.ForEach(x => x.Id = ++maxId);
//                Db.GetDbContext().Set<WmsTask>().AddRange(adds);
//                Db.GetDbContext().SaveChanges();
//            }
            await Task.CompletedTask;
            return adds.Count;
        }
//            await Task.CompletedTask;
//            return adds.Count;
//        }
        /// <summary>
        /// 根据版本下载出入库任务管理的Excel导入模板
        /// </summary>
        /// <param name="version">模板版本</param>
        /// <returns>下载的模板文件</returns>
        [HttpGet("downloadExcelTemplate")]
        public async Task<IActionResult> DownloadExcelTemplate([FromQuery] string version)
        {
            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTask", version);
            if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002);
            var path = Path.Combine(@"\", excelTemplate.TemplateFileName);
            Stream ms = FileUtil.Download(path, excelTemplate.TemplateFileName);
            var fileName = HttpUtility.UrlEncode($"{excelTemplate.Name}导入模板.xlsx", Encoding.GetEncoding("UTF-8"));
            return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName };
        }
//        /// <summary>
//        /// 根据版本下载出入库任务管理的Excel导入模板
//        /// </summary>
//        /// <param name="version">模板版本</param>
//        /// <returns>下载的模板文件</returns>
//        [HttpGet("downloadExcelTemplate")]
//        public async Task<IActionResult> DownloadExcelTemplate([FromQuery] string version)
//        {
//            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTask", version);
//            if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002);
//            var path = Path.Combine(@"\", excelTemplate.TemplateFileName);
//            Stream ms = FileUtil.Download(path, excelTemplate.TemplateFileName);
//            var fileName = HttpUtility.UrlEncode($"{excelTemplate.Name}导入模板.xlsx", Encoding.GetEncoding("UTF-8"));
//            return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName };
//        }
        /// <summary>
        /// 根据出入库任务管理查询参数导出Excel
        /// </summary>
        /// <param name="input">出入库任务管理(熟化库)查询参数</param>
        /// <returns>导出的Excel文件</returns>
        [HttpGet("toExcel")]
        public async Task<IActionResult> ToExcelAsync([FromQuery] WmsTaskSearchNonPage input)
        {
            var wmsTaskList = await ListNonPageAsync(input);
            MemoryStream ms = new();
            DataConvertUtil.ToExcelData(wmsTaskList, _sysDictTypeRep, _sysDictDataRep, out List<string> headers,
                out List<List<object>> data, out string sheetName);
            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTask", "v1");
            if (excelTemplate != null)
            {
                ExcelUtil.ToExcel(excelTemplate.TemplateFileName, headers, data, sheetName, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, ms);
            }
            else
            {
                ExcelUtil.ToExcel(headers, data, sheetName, ms);
            }
            ms.Position = 0;
            var fileName = HttpUtility.UrlEncode($"{sheetName}[{DateTimeOffset.Now:yyyy-MM-dd}].xlsx", Encoding.GetEncoding("UTF-8"));
            return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName };
        }
    }
}
//        /// <summary>
//        /// 根据出入库任务管理查询参数导出Excel
//        /// </summary>
//        /// <param name="input">出入库任务管理(熟化库)查询参数</param>
//        /// <returns>导出的Excel文件</returns>
//        [HttpGet("toExcel")]
//        public async Task<IActionResult> ToExcelAsync([FromQuery] WmsTaskSearchNonPage input)
//        {
//            var wmsTaskList = await ListNonPageAsync(input);
//            MemoryStream ms = new();
//            DataConvertUtil.ToExcelData(wmsTaskList, _sysDictTypeRep, _sysDictDataRep, out List<string> headers,
//                out List<List<object>> data, out string sheetName);
//            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTask", "v1");
//            if (excelTemplate != null)
//            {
//                ExcelUtil.ToExcel(excelTemplate.TemplateFileName, headers, data, sheetName, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, ms);
//            }
//            else
//            {
//                ExcelUtil.ToExcel(headers, data, sheetName, ms);
//            }
//            ms.Position = 0;
//            var fileName = HttpUtility.UrlEncode($"{sheetName}[{DateTimeOffset.Now:yyyy-MM-dd}].xlsx", Encoding.GetEncoding("UTF-8"));
//            return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName };
//        }
//    }
//}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsOrder/WmsTakeMaterialOrder/WmsTakeMaterialOrderService.cs
@@ -1,613 +1,613 @@
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Admin.NET.Core;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
using Microsoft.AspNetCore.Http;
using System.Text;
using System.Web;
using SixLabors.ImageSharp;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
using Furion;
using Serilog;
using Furion.RemoteRequest.Extensions;
using HttpMethod = System.Net.Http.HttpMethod;
//using Furion.DatabaseAccessor;
//using Furion.DatabaseAccessor.Extensions;
//using Furion.DependencyInjection;
//using Furion.DynamicApiController;
//using Furion.FriendlyException;
//using Admin.NET.Core;
//using Mapster;
//using Microsoft.AspNetCore.Mvc;
//using Microsoft.EntityFrameworkCore;
//using System.Linq.Dynamic.Core;
//using Microsoft.AspNetCore.Http;
//using System.Text;
//using System.Web;
//using SixLabors.ImageSharp;
//using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
//using Furion;
//using Serilog;
//using Furion.RemoteRequest.Extensions;
//using HttpMethod = System.Net.Http.HttpMethod;
namespace Admin.NET.Application
{
    /// <summary>
    /// 领料单服务
    /// </summary>
    [ApiDescriptionSettings("单据管理", Name = "WmsTakeMaterialOrder", Order = 100)]
    [Route("api/[Controller]")]
    public class WmsTakeMaterialOrderService : IWmsTakeMaterialOrderService, IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsTakeMaterialOrder,MasterDbContextLocator> _wmsTakeMaterialOrderRep;
        private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
        private readonly ISysExcelTemplateService _sysExcelTemplateService;
        private readonly static object _lock = new();
        private readonly IRepository<WmsTakeMaterialOrderDetail, MasterDbContextLocator> _wmsTakeMaterialOrderDetailRep;
        private readonly IRepository<WmsOrderType, MasterDbContextLocator> _wmsOrderTypeRep;
        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
        private readonly IRepository<WmsSortOrder, MasterDbContextLocator> _wmsSortOrderRep;
        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
//namespace Admin.NET.Application
//{
//    /// <summary>
//    /// 领料单服务
//    /// </summary>
//    [ApiDescriptionSettings("单据管理", Name = "WmsTakeMaterialOrder", Order = 100)]
//    [Route("api/[Controller]")]
//    public class WmsTakeMaterialOrderService : IWmsTakeMaterialOrderService, IDynamicApiController, ITransient
//    {
//        private readonly IRepository<WmsTakeMaterialOrder,MasterDbContextLocator> _wmsTakeMaterialOrderRep;
//        private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
//        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
//        private readonly ISysExcelTemplateService _sysExcelTemplateService;
//        private readonly static object _lock = new();
//        private readonly IRepository<WmsTakeMaterialOrderDetail, MasterDbContextLocator> _wmsTakeMaterialOrderDetailRep;
//        private readonly IRepository<WmsOrderType, MasterDbContextLocator> _wmsOrderTypeRep;
//        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
//        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
//        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
//        private readonly IRepository<WmsSortOrder, MasterDbContextLocator> _wmsSortOrderRep;
//        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
        public WmsTakeMaterialOrderService(
            IRepository<WmsTakeMaterialOrder,MasterDbContextLocator> wmsTakeMaterialOrderRep
            ,IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep
            ,IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep
            ,ISysExcelTemplateService sysExcelTemplateService
            ,IRepository<WmsTakeMaterialOrderDetail, MasterDbContextLocator> wmsTakeMaterialOrderDetailRep
            , IRepository<WmsOrderType, MasterDbContextLocator> wmsOrderTypeRep
            , IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep
            , IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep
            , IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep
            , IRepository<WmsSortOrder, MasterDbContextLocator> wmsSortOrderRep
            , IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep
        )
        {
            _wmsTakeMaterialOrderRep = wmsTakeMaterialOrderRep;
         _sysDictTypeRep = sysDictTypeRep;
         _sysDictDataRep = sysDictDataRep;
         _sysExcelTemplateService = sysExcelTemplateService;
            _wmsTakeMaterialOrderDetailRep = wmsTakeMaterialOrderDetailRep;
            _wmsOrderTypeRep = wmsOrderTypeRep;
            _wmsPlaceRep = wmsPlaceRep;
            _wmsMaterialStockRep = wmsMaterialStockRep;
            _wmsMaterialContainerRep = wmsMaterialContainerRep;
            _wmsSortOrderRep =  wmsSortOrderRep;
            _wmsTaskRep = wmsTaskRep;
        }
//        public WmsTakeMaterialOrderService(
//            IRepository<WmsTakeMaterialOrder,MasterDbContextLocator> wmsTakeMaterialOrderRep
//            ,IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep
//            ,IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep
//            ,ISysExcelTemplateService sysExcelTemplateService
//            ,IRepository<WmsTakeMaterialOrderDetail, MasterDbContextLocator> wmsTakeMaterialOrderDetailRep
//            , IRepository<WmsOrderType, MasterDbContextLocator> wmsOrderTypeRep
//            , IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep
//            , IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep
//            , IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep
//            , IRepository<WmsSortOrder, MasterDbContextLocator> wmsSortOrderRep
//            , IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep
//        )
//        {
//            _wmsTakeMaterialOrderRep = wmsTakeMaterialOrderRep;
//         _sysDictTypeRep = sysDictTypeRep;
//         _sysDictDataRep = sysDictDataRep;
//         _sysExcelTemplateService = sysExcelTemplateService;
//            _wmsTakeMaterialOrderDetailRep = wmsTakeMaterialOrderDetailRep;
//            _wmsOrderTypeRep = wmsOrderTypeRep;
//            _wmsPlaceRep = wmsPlaceRep;
//            _wmsMaterialStockRep = wmsMaterialStockRep;
//            _wmsMaterialContainerRep = wmsMaterialContainerRep;
//            _wmsSortOrderRep =  wmsSortOrderRep;
//            _wmsTaskRep = wmsTaskRep;
//        }
        /// <summary>
        /// 分页查询领料单
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("page")]
        public async Task<PageResult<WmsTakeMaterialOrderOutput>> Page([FromQuery] WmsTakeMaterialOrderSearch input)
        {
            var wmsTakeMaterialOrders = await _wmsTakeMaterialOrderRep.DetachedEntities
                                     .Where(!string.IsNullOrEmpty(input.MoveType), u => EF.Functions.Like(u.MoveType, $"%{input.MoveType.Trim()}%"))
                                     .Where(!string.IsNullOrEmpty(input.NO), u => EF.Functions.Like(u.NO, $"%{input.NO.Trim()}%"))
                                     .Where(!string.IsNullOrEmpty(input.WBSElementcode), u => EF.Functions.Like(u.WBSElementcode, $"%{input.WBSElementcode.Trim()}%"))
                                     .Where(!string.IsNullOrEmpty(input.BenefitingDepartcode), u => EF.Functions.Like(u.BenefitingDepartcode, $"%{input.BenefitingDepartcode.Trim()}%"))
                                     .Where(!string.IsNullOrEmpty(input.CostCenterID), u => EF.Functions.Like(u.CostCenterID, $"%{input.CostCenterID.Trim()}%"))
                                     .Where(!string.IsNullOrEmpty(input.FI_Client_Analysis_H), u => EF.Functions.Like(u.FI_Client_Analysis_H, $"%{input.FI_Client_Analysis_H.Trim()}%"))
                                     .Where(input.IsInnerCompany != null, u => u.IsInnerCompany == input.IsInnerCompany)
                                     .Where(!string.IsNullOrEmpty(input.PickerID), u => EF.Functions.Like(u.PickerID, $"%{input.PickerID.Trim()}%"))
                                     .Where(!string.IsNullOrEmpty(input.WarehouseCentername), u => EF.Functions.Like(u.WarehouseCentername, $"%{input.WarehouseCentername.Trim()}%"))
                                     .Where(!string.IsNullOrEmpty(input.Companyname), u => EF.Functions.Like(u.Companyname, $"%{input.Companyname.Trim()}%"))
                                     .Where(input.OrderStatus != null, u => u.OrderStatus == input.OrderStatus)
                                     .OrderBy(PageInputOrder.OrderBuilder<WmsTakeMaterialOrderSearch>(input))
                                     .ProjectToType<WmsTakeMaterialOrderOutput>()
                                     .ToADPagedListAsync(input.PageNo, input.PageSize);
            return wmsTakeMaterialOrders;
        }
//        /// <summary>
//        /// 分页查询领料单
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("page")]
//        public async Task<PageResult<WmsTakeMaterialOrderOutput>> Page([FromQuery] WmsTakeMaterialOrderSearch input)
//        {
//            var wmsTakeMaterialOrders = await _wmsTakeMaterialOrderRep.DetachedEntities
//                                     .Where(!string.IsNullOrEmpty(input.MoveType), u => EF.Functions.Like(u.MoveType, $"%{input.MoveType.Trim()}%"))
//                                     .Where(!string.IsNullOrEmpty(input.NO), u => EF.Functions.Like(u.NO, $"%{input.NO.Trim()}%"))
//                                     .Where(!string.IsNullOrEmpty(input.WBSElementcode), u => EF.Functions.Like(u.WBSElementcode, $"%{input.WBSElementcode.Trim()}%"))
//                                     .Where(!string.IsNullOrEmpty(input.BenefitingDepartcode), u => EF.Functions.Like(u.BenefitingDepartcode, $"%{input.BenefitingDepartcode.Trim()}%"))
//                                     .Where(!string.IsNullOrEmpty(input.CostCenterID), u => EF.Functions.Like(u.CostCenterID, $"%{input.CostCenterID.Trim()}%"))
//                                     .Where(!string.IsNullOrEmpty(input.FI_Client_Analysis_H), u => EF.Functions.Like(u.FI_Client_Analysis_H, $"%{input.FI_Client_Analysis_H.Trim()}%"))
//                                     .Where(input.IsInnerCompany != null, u => u.IsInnerCompany == input.IsInnerCompany)
//                                     .Where(!string.IsNullOrEmpty(input.PickerID), u => EF.Functions.Like(u.PickerID, $"%{input.PickerID.Trim()}%"))
//                                     .Where(!string.IsNullOrEmpty(input.WarehouseCentername), u => EF.Functions.Like(u.WarehouseCentername, $"%{input.WarehouseCentername.Trim()}%"))
//                                     .Where(!string.IsNullOrEmpty(input.Companyname), u => EF.Functions.Like(u.Companyname, $"%{input.Companyname.Trim()}%"))
//                                     .Where(input.OrderStatus != null, u => u.OrderStatus == input.OrderStatus)
//                                     .OrderBy(PageInputOrder.OrderBuilder<WmsTakeMaterialOrderSearch>(input))
//                                     .ProjectToType<WmsTakeMaterialOrderOutput>()
//                                     .ToADPagedListAsync(input.PageNo, input.PageSize);
//            return wmsTakeMaterialOrders;
//        }
        /// <summary>
        /// 不分页查询领料单列表
        /// </summary>
        /// <param name="input">领料单查询参数</param>
        /// <returns>(领料单)实例列表</returns>
        [HttpGet("listNonPage")]
        public async Task<List<WmsTakeMaterialOrderOutput>> ListNonPageAsync([FromQuery] WmsTakeMaterialOrderSearchNonPage input)
        {
            var pMoveType = input.MoveType?.Trim() ?? "";
            var pNO = input.NO?.Trim() ?? "";
            var pWBSElementcode = input.WBSElementcode?.Trim() ?? "";
            var pBenefitingDepartcode = input.BenefitingDepartcode?.Trim() ?? "";
            var pCostCenterID = input.CostCenterID?.Trim() ?? "";
            var pFI_Client_Analysis_H = input.FI_Client_Analysis_H?.Trim() ?? "";
            var pIsInnerCompany = input.IsInnerCompany;
            var pPickerID = input.PickerID?.Trim() ?? "";
            var pWarehouseCentername = input.WarehouseCentername?.Trim() ?? "";
            var pCompanyname = input.Companyname?.Trim() ?? "";
            var pOrderStatus = input.OrderStatus;
            var wmsTakeMaterialOrders = await _wmsTakeMaterialOrderRep.DetachedEntities
                .Where(!string.IsNullOrEmpty(pMoveType), u => EF.Functions.Like(u.MoveType, $"%{pMoveType}%"))
                .Where(!string.IsNullOrEmpty(pNO), u => EF.Functions.Like(u.NO, $"%{pNO}%"))
                .Where(!string.IsNullOrEmpty(pWBSElementcode), u => EF.Functions.Like(u.WBSElementcode, $"%{pWBSElementcode}%"))
                .Where(!string.IsNullOrEmpty(pBenefitingDepartcode), u => EF.Functions.Like(u.BenefitingDepartcode, $"%{pBenefitingDepartcode}%"))
                .Where(!string.IsNullOrEmpty(pCostCenterID), u => EF.Functions.Like(u.CostCenterID, $"%{pCostCenterID}%"))
                .Where(!string.IsNullOrEmpty(pFI_Client_Analysis_H), u => EF.Functions.Like(u.FI_Client_Analysis_H, $"%{pFI_Client_Analysis_H}%"))
                .Where(pIsInnerCompany != null, u => u.IsInnerCompany == pIsInnerCompany)
                .Where(!string.IsNullOrEmpty(pPickerID), u => EF.Functions.Like(u.PickerID, $"%{pPickerID}%"))
                .Where(!string.IsNullOrEmpty(pWarehouseCentername), u => EF.Functions.Like(u.WarehouseCentername, $"%{pWarehouseCentername}%"))
                .Where(!string.IsNullOrEmpty(pCompanyname), u => EF.Functions.Like(u.Companyname, $"%{pCompanyname}%"))
                .Where(pOrderStatus != null, u => u.OrderStatus == pOrderStatus)
            .OrderBy(PageInputOrder.OrderNonPageBuilder(input))
            .ProjectToType<WmsTakeMaterialOrderOutput>()
            .ToListAsync();
            return wmsTakeMaterialOrders;
        }
//        /// <summary>
//        /// 不分页查询领料单列表
//        /// </summary>
//        /// <param name="input">领料单查询参数</param>
//        /// <returns>(领料单)实例列表</returns>
//        [HttpGet("listNonPage")]
//        public async Task<List<WmsTakeMaterialOrderOutput>> ListNonPageAsync([FromQuery] WmsTakeMaterialOrderSearchNonPage input)
//        {
//            var pMoveType = input.MoveType?.Trim() ?? "";
//            var pNO = input.NO?.Trim() ?? "";
//            var pWBSElementcode = input.WBSElementcode?.Trim() ?? "";
//            var pBenefitingDepartcode = input.BenefitingDepartcode?.Trim() ?? "";
//            var pCostCenterID = input.CostCenterID?.Trim() ?? "";
//            var pFI_Client_Analysis_H = input.FI_Client_Analysis_H?.Trim() ?? "";
//            var pIsInnerCompany = input.IsInnerCompany;
//            var pPickerID = input.PickerID?.Trim() ?? "";
//            var pWarehouseCentername = input.WarehouseCentername?.Trim() ?? "";
//            var pCompanyname = input.Companyname?.Trim() ?? "";
//            var pOrderStatus = input.OrderStatus;
//            var wmsTakeMaterialOrders = await _wmsTakeMaterialOrderRep.DetachedEntities
//                .Where(!string.IsNullOrEmpty(pMoveType), u => EF.Functions.Like(u.MoveType, $"%{pMoveType}%"))
//                .Where(!string.IsNullOrEmpty(pNO), u => EF.Functions.Like(u.NO, $"%{pNO}%"))
//                .Where(!string.IsNullOrEmpty(pWBSElementcode), u => EF.Functions.Like(u.WBSElementcode, $"%{pWBSElementcode}%"))
//                .Where(!string.IsNullOrEmpty(pBenefitingDepartcode), u => EF.Functions.Like(u.BenefitingDepartcode, $"%{pBenefitingDepartcode}%"))
//                .Where(!string.IsNullOrEmpty(pCostCenterID), u => EF.Functions.Like(u.CostCenterID, $"%{pCostCenterID}%"))
//                .Where(!string.IsNullOrEmpty(pFI_Client_Analysis_H), u => EF.Functions.Like(u.FI_Client_Analysis_H, $"%{pFI_Client_Analysis_H}%"))
//                .Where(pIsInnerCompany != null, u => u.IsInnerCompany == pIsInnerCompany)
//                .Where(!string.IsNullOrEmpty(pPickerID), u => EF.Functions.Like(u.PickerID, $"%{pPickerID}%"))
//                .Where(!string.IsNullOrEmpty(pWarehouseCentername), u => EF.Functions.Like(u.WarehouseCentername, $"%{pWarehouseCentername}%"))
//                .Where(!string.IsNullOrEmpty(pCompanyname), u => EF.Functions.Like(u.Companyname, $"%{pCompanyname}%"))
//                .Where(pOrderStatus != null, u => u.OrderStatus == pOrderStatus)
//            .OrderBy(PageInputOrder.OrderNonPageBuilder(input))
//            .ProjectToType<WmsTakeMaterialOrderOutput>()
//            .ToListAsync();
//            return wmsTakeMaterialOrders;
//        }
        /// <summary>
        /// 获取单据明细
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("PageDetail")]
        public async Task<PageResult<WmsTakeMaterialOrderDetailOutput>> PageDetail([FromQuery] TakePageDetailInput input)
        {
            var wmsOrders = await _wmsTakeMaterialOrderDetailRep.DetachedEntities
                                     .Where(input.Id != null, u => u.OrderId == input.Id)
                                     .ProjectToType<WmsTakeMaterialOrderDetailOutput>()
                                     .ToADPagedListAsync(input.PageNo, input.PageSize);
            return wmsOrders;
        }
//        /// <summary>
//        /// 获取单据明细
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("PageDetail")]
//        public async Task<PageResult<WmsTakeMaterialOrderDetailOutput>> PageDetail([FromQuery] TakePageDetailInput input)
//        {
//            var wmsOrders = await _wmsTakeMaterialOrderDetailRep.DetachedEntities
//                                     .Where(input.Id != null, u => u.OrderId == input.Id)
//                                     .ProjectToType<WmsTakeMaterialOrderDetailOutput>()
//                                     .ToADPagedListAsync(input.PageNo, input.PageSize);
//            return wmsOrders;
//        }
        /// <summary>
        /// 分页查询物料库存
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("stockPage")]
        public async Task<PageResult<TakeMaterialStockOutput>> StockPage([FromQuery] TakeMaterialStockSearch input)
        {
            //从未执行和执行中的任务中获取库位进行筛选(未写)
//        /// <summary>
//        /// 分页查询物料库存
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("stockPage")]
//        public async Task<PageResult<TakeMaterialStockOutput>> StockPage([FromQuery] TakeMaterialStockSearch input)
//        {
//            //从未执行和执行中的任务中获取库位进行筛选(未写)
            //查询所有被锁定库位和待出的库存
            var lockPlace = await _wmsPlaceRep.DetachedEntities.Where(x => x.Islock == YesOrNot.Y || x.PlaceStatus == PlaceStatus.DAICHU).Select(x => x.PlaceCode).ToListAsync();
//            //查询所有被锁定库位和待出的库存
//            var lockPlace = await _wmsPlaceRep.DetachedEntities.Where(x => x.Islock == YesOrNot.Y || x.PlaceStatus == PlaceStatus.DAICHU).Select(x => x.PlaceCode).ToListAsync();
            var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
                .Where(u => u.StockNumber != 0)
                .Where(!string.IsNullOrEmpty(input.MaterialNo), u => EF.Functions.Like(u.MaterialNo, $"%{input.MaterialNo.Trim()}%"))
                .Where(!string.IsNullOrEmpty(input.MaterialName), u => EF.Functions.Like(u.MaterialName, $"%{input.MaterialName.Trim()}%"))
                .Where(!string.IsNullOrEmpty(input.ProjectCode), u => EF.Functions.Like(u.ProjectCode, $"%{input.ProjectCode.Trim()}%"))
                .Where(!string.IsNullOrEmpty(input.ContractCode), u => EF.Functions.Like(u.ContractCode, $"%{input.ContractCode.Trim()}%"))
                .Where(!string.IsNullOrEmpty(input.TACode), u => EF.Functions.Like(u.TACode, $"%{input.TACode.Trim()}%"))
                .Where(input.SearchBeginTime != null && input.SearchEndTime != null, u => u.CreatedTime >= DateTime.Parse(input.SearchBeginTime.Trim()) &&
                                                                   u.CreatedTime <= DateTime.Parse(input.SearchEndTime.Trim()))
                .Where(u => u.AreaId == 472817877401669)
                .Where(u => !lockPlace.Contains(u.PlaceCode))
                .ProjectToType<TakeMaterialStockOutput>()
                .ToADPagedListAsync(input.PageNo, input.PageSize);
            return wmsMaterialStocks;
        }
//            var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
//                .Where(u => u.StockNumber != 0)
//                .Where(!string.IsNullOrEmpty(input.MaterialNo), u => EF.Functions.Like(u.MaterialNo, $"%{input.MaterialNo.Trim()}%"))
//                .Where(!string.IsNullOrEmpty(input.MaterialName), u => EF.Functions.Like(u.MaterialName, $"%{input.MaterialName.Trim()}%"))
//                .Where(!string.IsNullOrEmpty(input.ProjectCode), u => EF.Functions.Like(u.ProjectCode, $"%{input.ProjectCode.Trim()}%"))
//                .Where(!string.IsNullOrEmpty(input.ContractCode), u => EF.Functions.Like(u.ContractCode, $"%{input.ContractCode.Trim()}%"))
//                .Where(!string.IsNullOrEmpty(input.TACode), u => EF.Functions.Like(u.TACode, $"%{input.TACode.Trim()}%"))
//                .Where(input.SearchBeginTime != null && input.SearchEndTime != null, u => u.CreatedTime >= DateTime.Parse(input.SearchBeginTime.Trim()) &&
//                                                                   u.CreatedTime <= DateTime.Parse(input.SearchEndTime.Trim()))
//                .Where(u => u.AreaId == 472817877401669)
//                .Where(u => !lockPlace.Contains(u.PlaceCode))
//                .ProjectToType<TakeMaterialStockOutput>()
//                .ToADPagedListAsync(input.PageNo, input.PageSize);
//            return wmsMaterialStocks;
//        }
        /// <summary>
        /// 物料编码下拉框
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetMaterialNoList")]
        public async Task<List<MaterialNoListOutput>> GetMaterialNoList()
        {
            // 查询库位表状态为存货的库位作为查询库存的条件 固定库区
            List<string> wmsPlaceCodes = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.CUNHUO && u.AreaId == 472817877401669)
                .Select(t => t.PlaceCode).ToListAsync();
            //从未执行和执行中的任务中获取库位进行筛选(未写)
            //查询所有被锁定库位和待出的库存
            var lockPlace = await _wmsPlaceRep.DetachedEntities.Where(x => x.Islock == YesOrNot.Y || x.PlaceStatus == PlaceStatus.DAICHU).Select(x => x.PlaceCode).ToListAsync();
            //查询库存
            var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
                .ToListAsync();
            //未执行或执行中的明细托盘相关库存不继续显示
            wmsMaterialStocks = wmsMaterialStocks
                .Where(u => !lockPlace.Contains(u.PlaceCode))
                .GroupBy(x => x.MaterialNo).Select(x => x.First()).ToList();
            List<MaterialNoListOutput> MaterialNoListOutputLists = new List<MaterialNoListOutput>();
            foreach (var item in wmsMaterialStocks)
            {
                MaterialNoListOutput MaterialNoListOutput = new MaterialNoListOutput();
                MaterialNoListOutput.Code = item.MaterialNo;
                MaterialNoListOutput.MaterialNo = item.MaterialNo;
                MaterialNoListOutputLists.Add(MaterialNoListOutput);
            }
            return MaterialNoListOutputLists;
        }
//        /// <summary>
//        /// 物料编码下拉框
//        /// </summary>
//        /// <returns></returns>
//        [HttpGet("GetMaterialNoList")]
//        public async Task<List<MaterialNoListOutput>> GetMaterialNoList()
//        {
//            // 查询库位表状态为存货的库位作为查询库存的条件 固定库区
//            List<string> wmsPlaceCodes = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.CUNHUO && u.AreaId == 472817877401669)
//                .Select(t => t.PlaceCode).ToListAsync();
//            //从未执行和执行中的任务中获取库位进行筛选(未写)
//            //查询所有被锁定库位和待出的库存
//            var lockPlace = await _wmsPlaceRep.DetachedEntities.Where(x => x.Islock == YesOrNot.Y || x.PlaceStatus == PlaceStatus.DAICHU).Select(x => x.PlaceCode).ToListAsync();
//            //查询库存
//            var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
//                .ToListAsync();
//            //未执行或执行中的明细托盘相关库存不继续显示
//            wmsMaterialStocks = wmsMaterialStocks
//                .Where(u => !lockPlace.Contains(u.PlaceCode))
//                .GroupBy(x => x.MaterialNo).Select(x => x.First()).ToList();
//            List<MaterialNoListOutput> MaterialNoListOutputLists = new List<MaterialNoListOutput>();
//            foreach (var item in wmsMaterialStocks)
//            {
//                MaterialNoListOutput MaterialNoListOutput = new MaterialNoListOutput();
//                MaterialNoListOutput.Code = item.MaterialNo;
//                MaterialNoListOutput.MaterialNo = item.MaterialNo;
//                MaterialNoListOutputLists.Add(MaterialNoListOutput);
//            }
//            return MaterialNoListOutputLists;
//        }
        /// <summary>
        /// 项目编码下拉框
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetProjectCodeList")]
        public async Task<List<ProjectCodeListOutput>> GetProjectCodeList()
        {
            // 查询库位表状态为存货的库位作为查询库存的条件 固定库区
            List<string> wmsPlaceCodes = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.CUNHUO && u.AreaId == 472817877401669)
                .Select(t => t.PlaceCode).ToListAsync();
            //从未执行和执行中的任务中获取库位进行筛选(未写)
            //查询所有被锁定库位和待出的库存
            var lockPlace = await _wmsPlaceRep.DetachedEntities.Where(x => x.Islock == YesOrNot.Y || x.PlaceStatus == PlaceStatus.DAICHU).Select(x => x.PlaceCode).ToListAsync();
            //查询库存
            var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
                .ToListAsync();
            //未执行或执行中的明细托盘相关库存不继续显示
            wmsMaterialStocks = wmsMaterialStocks
                .Where(u => !lockPlace.Contains(u.PlaceCode))
                .GroupBy(x => x.ProjectCode).Select(x => x.First()).ToList();
            List<ProjectCodeListOutput> ProjectCodeListOutputLists = new List<ProjectCodeListOutput>();
            foreach (var item in wmsMaterialStocks)
            {
                ProjectCodeListOutput ProjectCodeListOutput = new ProjectCodeListOutput();
                ProjectCodeListOutput.Code = item.ProjectCode;
                ProjectCodeListOutput.ProjectCode = item.ProjectCode;
                ProjectCodeListOutputLists.Add(ProjectCodeListOutput);
            }
            return ProjectCodeListOutputLists;
        }
//        /// <summary>
//        /// 项目编码下拉框
//        /// </summary>
//        /// <returns></returns>
//        [HttpGet("GetProjectCodeList")]
//        public async Task<List<ProjectCodeListOutput>> GetProjectCodeList()
//        {
//            // 查询库位表状态为存货的库位作为查询库存的条件 固定库区
//            List<string> wmsPlaceCodes = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.CUNHUO && u.AreaId == 472817877401669)
//                .Select(t => t.PlaceCode).ToListAsync();
//            //从未执行和执行中的任务中获取库位进行筛选(未写)
//            //查询所有被锁定库位和待出的库存
//            var lockPlace = await _wmsPlaceRep.DetachedEntities.Where(x => x.Islock == YesOrNot.Y || x.PlaceStatus == PlaceStatus.DAICHU).Select(x => x.PlaceCode).ToListAsync();
//            //查询库存
//            var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
//                .ToListAsync();
//            //未执行或执行中的明细托盘相关库存不继续显示
//            wmsMaterialStocks = wmsMaterialStocks
//                .Where(u => !lockPlace.Contains(u.PlaceCode))
//                .GroupBy(x => x.ProjectCode).Select(x => x.First()).ToList();
//            List<ProjectCodeListOutput> ProjectCodeListOutputLists = new List<ProjectCodeListOutput>();
//            foreach (var item in wmsMaterialStocks)
//            {
//                ProjectCodeListOutput ProjectCodeListOutput = new ProjectCodeListOutput();
//                ProjectCodeListOutput.Code = item.ProjectCode;
//                ProjectCodeListOutput.ProjectCode = item.ProjectCode;
//                ProjectCodeListOutputLists.Add(ProjectCodeListOutput);
//            }
//            return ProjectCodeListOutputLists;
//        }
        /// <summary>
        /// 增加领料单
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("add")]
        public async Task Add(AddWmsTakeMaterialOrderInput input)
        {
            // 查询单据小类是“生产入库”的Id
            var wmsOrderType = await _wmsOrderTypeRep.FirstOrDefaultAsync(z => z.Name.Contains("领料出库"));
            var wmsTakeMaterialOrder = input.Adapt<WmsTakeMaterialOrder>();
            wmsTakeMaterialOrder.SOID = 66666;
            wmsTakeMaterialOrder.OrderLargeCategory = wmsOrderType != null ? wmsOrderType.Pid : 0;
            wmsTakeMaterialOrder.OrderSubclass = wmsOrderType != null ? wmsOrderType.Id : 0;
            wmsTakeMaterialOrder.OrderStatus = OrderStatusEnum.WEIXIAFA;
            await _wmsTakeMaterialOrderRep.InsertAsync(wmsTakeMaterialOrder);
        }
//        /// <summary>
//        /// 增加领料单
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("add")]
//        public async Task Add(AddWmsTakeMaterialOrderInput input)
//        {
//            // 查询单据小类是“生产入库”的Id
//            var wmsOrderType = await _wmsOrderTypeRep.FirstOrDefaultAsync(z => z.Name.Contains("领料出库"));
//            var wmsTakeMaterialOrder = input.Adapt<WmsTakeMaterialOrder>();
//            wmsTakeMaterialOrder.SOID = 66666;
//            wmsTakeMaterialOrder.OrderLargeCategory = wmsOrderType != null ? wmsOrderType.Pid : 0;
//            wmsTakeMaterialOrder.OrderSubclass = wmsOrderType != null ? wmsOrderType.Id : 0;
//            wmsTakeMaterialOrder.OrderStatus = OrderStatusEnum.WEIXIAFA;
//            await _wmsTakeMaterialOrderRep.InsertAsync(wmsTakeMaterialOrder);
//        }
        /// <summary>
        /// 增加领料单(yigo系统获取)
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("TakeOrderAdd")]
        [UnitOfWork]
        public async Task TakeOrderAdd()
        {
            //获取领料申请单
            string url = App.Configuration["YiGoWebApi:QueryOutBoundNotice"];
            var Billdate_S = DateTime.Now.AddDays(-15).ToString("yyyy-MM-dd");
            var Billdate_E = DateTime.Now.AddDays(15).ToString("yyyy-MM-dd");
            //写日志文件
            //Log.Error($"[TransferContainerCode][ContainerCode:{input.ContainerCode}][url:{url}]");
            var response = await url.SetHttpMethod(System.Net.Http.HttpMethod.Post)
                                    .SetBody(new Dictionary<string, object> {
                                            { "Billdate_S", Billdate_S },
                                            { "Billdate_E", Billdate_E},
                                    }, "application/json").PostAsStringAsync();
            var Data = response.FromJson<WmsTakeMaterialOrderOutputByYiGO>();
            var wmsOrderType = await _wmsOrderTypeRep.FirstOrDefaultAsync(z => z.Name.Contains("领料出库"));
            foreach (var item in Data.Data)
            {
                item.Id = Yitter.IdGenerator.YitIdHelper.NextId();
                var wmsTakeMaterialOrder = item.Adapt<WmsTakeMaterialOrder>();
                var isExcit = await _wmsTakeMaterialOrderRep.AnyAsync(x => x.NO == item.NO);
                if (!isExcit)
                {
                    wmsTakeMaterialOrder.OrderLargeCategory = wmsOrderType != null ? wmsOrderType.Pid : 0;
                    wmsTakeMaterialOrder.OrderSubclass = wmsOrderType != null ? wmsOrderType.Id : 0;
                    await _wmsTakeMaterialOrderRep.InsertNowAsync(wmsTakeMaterialOrder);
                    foreach (var item1 in item.Dtls)
                    {
                        var wmsTakeMaterialDeatail = item1.Adapt<WmsTakeMaterialOrderDetail>();
                        wmsTakeMaterialDeatail.OrderId = item.Id;
                        await _wmsTakeMaterialOrderDetailRep.InsertNowAsync(wmsTakeMaterialDeatail);
                    }
                }
            }
        }
        /// <summary>
        /// 领料下架接口(yigo系统)
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("ReturnTakeOrder")]
        [UnifyResult(typeof(object))]
        [UnitOfWork]
        public async Task<object> ReturnTakeOrder([FromBody] ReturnTakeOrderInput input)
        {
            try
            {
                //创建指定名称的订单操作
                string url = App.Configuration["YiGoWebApi:CreateTX211"];
                //获取主单据
                var wmsTakeMaterialOrderModal = await _wmsTakeMaterialOrderRep.FirstOrDefaultAsync(x => x.Id == input.Id);
                if (wmsTakeMaterialOrderModal == null) throw Oops.Oh("单据信息不存在!");
                // 写日志文件
                Log.Error($"[领料下架][单据号:{wmsTakeMaterialOrderModal.NO}][url:{url}]");
//        /// <summary>
//        /// 增加领料单(yigo系统获取)
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("TakeOrderAdd")]
//        [UnitOfWork]
//        public async Task TakeOrderAdd()
//        {
//            //获取领料申请单
//            string url = App.Configuration["YiGoWebApi:QueryOutBoundNotice"];
//            var Billdate_S = DateTime.Now.AddDays(-15).ToString("yyyy-MM-dd");
//            var Billdate_E = DateTime.Now.AddDays(15).ToString("yyyy-MM-dd");
//            //写日志文件
//            //Log.Error($"[TransferContainerCode][ContainerCode:{input.ContainerCode}][url:{url}]");
//            var response = await url.SetHttpMethod(System.Net.Http.HttpMethod.Post)
//                                    .SetBody(new Dictionary<string, object> {
//                                            { "Billdate_S", Billdate_S },
//                                            { "Billdate_E", Billdate_E},
//                                    }, "application/json").PostAsStringAsync();
//            var Data = response.FromJson<WmsTakeMaterialOrderOutputByYiGO>();
//            var wmsOrderType = await _wmsOrderTypeRep.FirstOrDefaultAsync(z => z.Name.Contains("领料出库"));
//            foreach (var item in Data.Data)
//            {
//                item.Id = Yitter.IdGenerator.YitIdHelper.NextId();
//                var wmsTakeMaterialOrder = item.Adapt<WmsTakeMaterialOrder>();
//                var isExcit = await _wmsTakeMaterialOrderRep.AnyAsync(x => x.NO == item.NO);
//                if (!isExcit)
//                {
//                    wmsTakeMaterialOrder.OrderLargeCategory = wmsOrderType != null ? wmsOrderType.Pid : 0;
//                    wmsTakeMaterialOrder.OrderSubclass = wmsOrderType != null ? wmsOrderType.Id : 0;
//                    await _wmsTakeMaterialOrderRep.InsertNowAsync(wmsTakeMaterialOrder);
//                    foreach (var item1 in item.Dtls)
//                    {
//                        var wmsTakeMaterialDeatail = item1.Adapt<WmsTakeMaterialOrderDetail>();
//                        wmsTakeMaterialDeatail.OrderId = item.Id;
//                        await _wmsTakeMaterialOrderDetailRep.InsertNowAsync(wmsTakeMaterialDeatail);
//                    }
//                }
//            }
//        }
//        /// <summary>
//        /// 领料下架接口(yigo系统)
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("ReturnTakeOrder")]
//        [UnifyResult(typeof(object))]
//        [UnitOfWork]
//        public async Task<object> ReturnTakeOrder([FromBody] ReturnTakeOrderInput input)
//        {
//            try
//            {
//                //创建指定名称的订单操作
//                string url = App.Configuration["YiGoWebApi:CreateTX211"];
//                //获取主单据
//                var wmsTakeMaterialOrderModal = await _wmsTakeMaterialOrderRep.FirstOrDefaultAsync(x => x.Id == input.Id);
//                if (wmsTakeMaterialOrderModal == null) throw Oops.Oh("单据信息不存在!");
//                // 写日志文件
//                Log.Error($"[领料下架][单据号:{wmsTakeMaterialOrderModal.NO}][url:{url}]");
                var response = await url.SetHttpMethod(HttpMethod.Post)
                                        .SetBody(input, "application/json")
                                        .PostAsAsync<ReturnTakeOrderOutput>();
                // 写日志文件
                Log.Error($"[领料下架][单据号:{wmsTakeMaterialOrderModal.NO}][response:{response.ToJson()}]");
//                var response = await url.SetHttpMethod(HttpMethod.Post)
//                                        .SetBody(input, "application/json")
//                                        .PostAsAsync<ReturnTakeOrderOutput>();
//                // 写日志文件
//                Log.Error($"[领料下架][单据号:{wmsTakeMaterialOrderModal.NO}][response:{response.ToJson()}]");
                return XnRestfulResultProvider.RESTfulResult(response);
            }
            catch (Exception ex)
            {
                throw Oops.Oh(ex.Message);
            }
        }
//                return XnRestfulResultProvider.RESTfulResult(response);
//            }
//            catch (Exception ex)
//            {
//                throw Oops.Oh(ex.Message);
//            }
//        }
        /// <summary>
        /// 下发领料单
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("DistributeOrder")]
        [UnitOfWork]
        public async Task DistributeOrder(DistributeOrderInput input)
        {
            // 查询单据小类是“生产入库”的Id
            var wmsOrderType = await _wmsOrderTypeRep.FirstOrDefaultAsync(z => z.Name.Contains("领料出库"));
            //获取领料单据
            var wmsTakeMaterialOrder = await _wmsTakeMaterialOrderRep
                .Where(x=>x.Id == input.Id && x.OrderLargeCategory == wmsOrderType.Pid && x.OrderSubclass == wmsOrderType.Id)
                .ProjectToType<WmsTakeMaterialOrder>()
                .FirstOrDefaultAsync();
            if (wmsTakeMaterialOrder == null) throw Oops.Oh("单据不存在!");
            wmsTakeMaterialOrder.OrderStatus = OrderStatusEnum.YIXIAFA;
            //更改单据状态为已下发
            await _wmsTakeMaterialOrderRep.UpdateAsync(wmsTakeMaterialOrder);
            //根据领料单明细生成分拣单
            foreach (var item in wmsTakeMaterialOrder.WmsTakeMaterialOrderDetail)
            {
                //获取所有为该明细物料编码的库存(不为完成状态的出库任务的库位要排除,待开发)
                var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities.Where(x => x.MaterialNo == item.Materialcode)
                    .OrderBy(n=>n.CreatedTime)
                    .OrderByDescending(n => n.StockNumber)
                    .ToListAsync();
                List<FjStock> FjStockList = new List<FjStock>();
                //优先从库位为空的库存进行分拣
                var fjstockModel = wmsMaterialStocks.Where(p => p.PlaceCode == "N/A").ToList();
                if (fjstockModel != null)
                {
                    foreach (var a in fjstockModel)
                    {
                        var FjStockModal = a.Adapt<FjStock>();
                        FjStockModal.FjQty = a.StockNumber;
                        if (item.DistributeQty + a.StockNumber > item.Qty)
                        {
                            FjStockModal.FjQty = item.Qty - item.DistributeQty;
                            item.DistributeQty = item.Qty;
                            FjStockList.Add(FjStockModal);
                            break;
                        }
                        else
                        {
                            item.DistributeQty += a.StockNumber;
                        };
                        FjStockList.Add(FjStockModal);
                    }
                }
                if (item.DistributeQty < item.Qty)
                {
                    foreach (var b in wmsMaterialStocks.Where(x=>x.PlaceCode!="N/A"))
                    {
                        var FjStockModal = b.Adapt<FjStock>();
                        FjStockModal.FjQty = b.StockNumber;
                        if (item.DistributeQty + b.StockNumber > item.Qty)
                        {
                            FjStockModal.FjQty = item.Qty - item.DistributeQty;
                            item.DistributeQty = item.Qty;
                            FjStockList.Add(FjStockModal);
                            break;
                        }
                        else
                        {
                            item.DistributeQty += b.StockNumber;
                        };
                        FjStockList.Add(FjStockModal);
                    }
                }
//        /// <summary>
//        /// 下发领料单
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("DistributeOrder")]
//        [UnitOfWork]
//        public async Task DistributeOrder(DistributeOrderInput input)
//        {
//            // 查询单据小类是“生产入库”的Id
//            var wmsOrderType = await _wmsOrderTypeRep.FirstOrDefaultAsync(z => z.Name.Contains("领料出库"));
//            //获取领料单据
//            var wmsTakeMaterialOrder = await _wmsTakeMaterialOrderRep
//                .Where(x=>x.Id == input.Id && x.OrderLargeCategory == wmsOrderType.Pid && x.OrderSubclass == wmsOrderType.Id)
//                .ProjectToType<WmsTakeMaterialOrder>()
//                .FirstOrDefaultAsync();
//            if (wmsTakeMaterialOrder == null) throw Oops.Oh("单据不存在!");
//            wmsTakeMaterialOrder.OrderStatus = OrderStatusEnum.YIXIAFA;
//            //更改单据状态为已下发
//            await _wmsTakeMaterialOrderRep.UpdateAsync(wmsTakeMaterialOrder);
//            //根据领料单明细生成分拣单
//            foreach (var item in wmsTakeMaterialOrder.WmsTakeMaterialOrderDetail)
//            {
//                //获取所有为该明细物料编码的库存(不为完成状态的出库任务的库位要排除,待开发)
//                var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities.Where(x => x.MaterialNo == item.Materialcode)
//                    .OrderBy(n=>n.CreatedTime)
//                    .OrderByDescending(n => n.StockNumber)
//                    .ToListAsync();
//                List<FjStock> FjStockList = new List<FjStock>();
//                //优先从库位为空的库存进行分拣
//                var fjstockModel = wmsMaterialStocks.Where(p => p.PlaceCode == "N/A").ToList();
//                if (fjstockModel != null)
//                {
//                    foreach (var a in fjstockModel)
//                    {
//                        var FjStockModal = a.Adapt<FjStock>();
//                        FjStockModal.FjQty = a.StockNumber;
//                        if (item.DistributeQty + a.StockNumber > item.Qty)
//                        {
//                            FjStockModal.FjQty = item.Qty - item.DistributeQty;
//                            item.DistributeQty = item.Qty;
//                            FjStockList.Add(FjStockModal);
//                            break;
//                        }
//                        else
//                        {
//                            item.DistributeQty += a.StockNumber;
//                        };
//                        FjStockList.Add(FjStockModal);
//                    }
//                }
//                if (item.DistributeQty < item.Qty)
//                {
//                    foreach (var b in wmsMaterialStocks.Where(x=>x.PlaceCode!="N/A"))
//                    {
//                        var FjStockModal = b.Adapt<FjStock>();
//                        FjStockModal.FjQty = b.StockNumber;
//                        if (item.DistributeQty + b.StockNumber > item.Qty)
//                        {
//                            FjStockModal.FjQty = item.Qty - item.DistributeQty;
//                            item.DistributeQty = item.Qty;
//                            FjStockList.Add(FjStockModal);
//                            break;
//                        }
//                        else
//                        {
//                            item.DistributeQty += b.StockNumber;
//                        };
//                        FjStockList.Add(FjStockModal);
//                    }
//                }
                
                if (item.DistributeQty< item.Qty) throw Oops.Oh(item.Materialname+"库存数量不足!");
                //循环需要出库的库存生成任务和分拣单
                foreach (var stock in FjStockList)
                {
                    //获取库位信息
                    var wmsPlacModal = await _wmsPlaceRep.FirstOrDefaultAsync(x => x.PlaceCode == stock.PlaceCode);
                    //物料和容器的关系
                    var fjcvmModelList = await _wmsMaterialContainerRep.Where(z =>
                      z.ContainerCode == stock.ContainerCode && z.BindStatus == CommonStatus.ENABLE).ToListAsync();
                    if (wmsPlacModal!=null)
                    {
                        //任务
                        var takmodel = new WmsTask()
                        {
                            TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(),
                            TaskModel = TaskModel.QUANZIDONG,
                            TaskType = TaskType.CHUKU,
                            TaskLevel = 1,
                            TaskStatus = TaskStatusEnum.WEIZHIXING,
                            OrderNo = fjcvmModelList.FirstOrDefault().OrderNo,
                            OrderDetailsId = item.Id,
                            ContainerCode = stock.ContainerCode,
                            SourcePlace = stock.PlaceCode,
                            ToPlace = wmsPlacModal.Aisle.ToString(), //目标位
                            AreaName = "绝缘立库",
                            IsRead = true, //WCS是否可以读取
                            SendTimes = 1, //发送次数
                            Aisle = wmsPlacModal.Aisle,
                            TaskDodeviceStatus = TaskDodeviceStatusEnum.W,
                            Description = "物料"
                        };
                        await _wmsTaskRep.InsertAsync(takmodel);
                    }
                    // 新增分拣
                    var wmsSortOrder = new WmsSortOrder()
                    {
                        OrderNo = wmsTakeMaterialOrder.NO,
                        Materialcode = stock.MaterialNo,
                        Materialname = stock.MaterialName,
                        OrderDetailID = item.Id,
                        ContainerOrderNo = fjcvmModelList.FirstOrDefault().OrderNo,
                        ProjectCode = item.ProjectCode,
                        TACode = item.TACode,
                        PartCode = item.PartCode,
                        PlaceCode = item.PlaceCode,
                        ContainerCode = stock.ContainerCode,
                        SortQuantity = stock.FjQty,
                        ActualQuantity = new decimal(0.00),
                        SortStatus = SortStatusEnum.WEIFENJIAN
                    };
                    await _wmsSortOrderRep.InsertNowAsync(wmsSortOrder);
                }
            }
//                if (item.DistributeQty< item.Qty) throw Oops.Oh(item.Materialname+"库存数量不足!");
//                //循环需要出库的库存生成任务和分拣单
//                foreach (var stock in FjStockList)
//                {
//                    //获取库位信息
//                    var wmsPlacModal = await _wmsPlaceRep.FirstOrDefaultAsync(x => x.PlaceCode == stock.PlaceCode);
//                    //物料和容器的关系
//                    var fjcvmModelList = await _wmsMaterialContainerRep.Where(z =>
//                      z.ContainerCode == stock.ContainerCode && z.BindStatus == CommonStatus.ENABLE).ToListAsync();
//                    if (wmsPlacModal!=null)
//                    {
//                        //任务
//                        var takmodel = new WmsTask()
//                        {
//                            TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(),
//                            TaskModel = TaskModel.QUANZIDONG,
//                            TaskType = TaskType.CHUKU,
//                            TaskLevel = 1,
//                            TaskStatus = TaskStatusEnum.WEIZHIXING,
//                            OrderNo = fjcvmModelList.FirstOrDefault().OrderNo,
//                            OrderDetailsId = item.Id,
//                            ContainerCode = stock.ContainerCode,
//                            SourcePlace = stock.PlaceCode,
//                            ToPlace = wmsPlacModal.Aisle.ToString(), //目标位
//                            AreaName = "绝缘立库",
//                            IsRead = true, //WCS是否可以读取
//                            SendTimes = 1, //发送次数
//                            Aisle = wmsPlacModal.Aisle,
//                            TaskDodeviceStatus = TaskDodeviceStatusEnum.W,
//                            Description = "物料"
//                        };
//                        await _wmsTaskRep.InsertAsync(takmodel);
//                    }
//                    // 新增分拣
//                    var wmsSortOrder = new WmsSortOrder()
//                    {
//                        OrderNo = wmsTakeMaterialOrder.NO,
//                        Materialcode = stock.MaterialNo,
//                        Materialname = stock.MaterialName,
//                        OrderDetailID = item.Id,
//                        ContainerOrderNo = fjcvmModelList.FirstOrDefault().OrderNo,
//                        ProjectCode = item.ProjectCode,
//                        TACode = item.TACode,
//                        PartCode = item.PartCode,
//                        PlaceCode = item.PlaceCode,
//                        ContainerCode = stock.ContainerCode,
//                        SortQuantity = stock.FjQty,
//                        ActualQuantity = new decimal(0.00),
//                        SortStatus = SortStatusEnum.WEIFENJIAN
//                    };
//                    await _wmsSortOrderRep.InsertNowAsync(wmsSortOrder);
//                }
//            }
            
        }
//        }
        /// <summary>
        /// 删除领料单
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("delete")]
        public async Task Delete(DeleteWmsTakeMaterialOrderInput input)
        {
            var wmsTakeMaterialOrder = await _wmsTakeMaterialOrderRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            await _wmsTakeMaterialOrderRep.DeleteAsync(wmsTakeMaterialOrder);
        }
//        /// <summary>
//        /// 删除领料单
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("delete")]
//        public async Task Delete(DeleteWmsTakeMaterialOrderInput input)
//        {
//            var wmsTakeMaterialOrder = await _wmsTakeMaterialOrderRep.FirstOrDefaultAsync(u => u.Id == input.Id);
//            await _wmsTakeMaterialOrderRep.DeleteAsync(wmsTakeMaterialOrder);
//        }
        /// <summary>
        /// 更新领料单
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("edit")]
        public async Task Update(UpdateWmsTakeMaterialOrderInput input)
        {
            var isExist = await _wmsTakeMaterialOrderRep.AnyAsync(u => u.Id == input.Id, false);
            if (!isExist) throw Oops.Oh(ErrorCode.D3000);
//        /// <summary>
//        /// 更新领料单
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("edit")]
//        public async Task Update(UpdateWmsTakeMaterialOrderInput input)
//        {
//            var isExist = await _wmsTakeMaterialOrderRep.AnyAsync(u => u.Id == input.Id, false);
//            if (!isExist) throw Oops.Oh(ErrorCode.D3000);
            var wmsTakeMaterialOrder = input.Adapt<WmsTakeMaterialOrder>();
            await _wmsTakeMaterialOrderRep.UpdateAsync(wmsTakeMaterialOrder,ignoreNullValues:true);
        }
//            var wmsTakeMaterialOrder = input.Adapt<WmsTakeMaterialOrder>();
//            await _wmsTakeMaterialOrderRep.UpdateAsync(wmsTakeMaterialOrder,ignoreNullValues:true);
//        }
        /// <summary>
        /// 获取领料单
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("detail")]
        public async Task<WmsTakeMaterialOrderOutput> Get([FromQuery] QueryeWmsTakeMaterialOrderInput input)
        {
            return (await _wmsTakeMaterialOrderRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsTakeMaterialOrderOutput>();
        }
//        /// <summary>
//        /// 获取领料单
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("detail")]
//        public async Task<WmsTakeMaterialOrderOutput> Get([FromQuery] QueryeWmsTakeMaterialOrderInput input)
//        {
//            return (await _wmsTakeMaterialOrderRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsTakeMaterialOrderOutput>();
//        }
        /// <summary>
        /// 获取领料单列表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("list")]
        public async Task<List<WmsTakeMaterialOrderOutput>> List([FromQuery] WmsTakeMaterialOrderInput input)
        {
            return await _wmsTakeMaterialOrderRep.DetachedEntities.ProjectToType<WmsTakeMaterialOrderOutput>().ToListAsync();
        }
         /// <summary>
        /// Excel模板导入领料单功能
        /// </summary>
        /// <param name="file">Excel模板文件</param>
        /// <param name="importExcelType">Excel导入方式</param>
        /// <returns>导入的记录数</returns>
        [HttpPost("fromExcel")]
        public async Task<int> FromExcelAsync(IFormFile file, [FromQuery] ImportExcelType importExcelType)
        {
            int size = 200;
            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTakeMaterialOrder", "v2");
            if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002);
            var keys = excelTemplate.UnionUniqueFields.Split(",") ?? Array.Empty<string>();
            for (var i = 0; i < keys.Length; i++)
            {
                keys[i] = keys[i]?.Trim() ?? string.Empty;
            }
            ExcelUtil.FromExcel(file, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, out List<string> headers, out List<List<object?>> data, out string sheetName);
            List<WmsTakeMaterialOrderOutput> wmsTakeMaterialOrderList = DataConvertUtil.ToObjectList(headers, data, sheetName, keys, excelTemplate?.DataStartLine ?? 2, out Dictionary<string, WmsTakeMaterialOrderOutput> dict);
            List<Dictionary<string, object>> uniqueKeyValueDictList = wmsTakeMaterialOrderList.ParseUniqueKeyValueDictList(keys.ToList(), excelTemplate?.DataStartLine ?? 2, sheetName);
            var filters = DataConvertUtil.GetExpressionListByUniqueDict<WmsTakeMaterialOrder>(keys.ToList(), uniqueKeyValueDictList, size);
            var selectKeys = keys.ToList();
            if(!selectKeys.Contains("Id")) selectKeys.Add("Id");
            var selector = DataConvertUtil.GetSelectExpressionListByUniqueDict<WmsTakeMaterialOrder, WmsTakeMaterialOrderOutput>(selectKeys);
            List<WmsTakeMaterialOrder> updates = new();
            List<WmsTakeMaterialOrder> adds = new();
//        /// <summary>
//        /// 获取领料单列表
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("list")]
//        public async Task<List<WmsTakeMaterialOrderOutput>> List([FromQuery] WmsTakeMaterialOrderInput input)
//        {
//            return await _wmsTakeMaterialOrderRep.DetachedEntities.ProjectToType<WmsTakeMaterialOrderOutput>().ToListAsync();
//        }
//         /// <summary>
//        /// Excel模板导入领料单功能
//        /// </summary>
//        /// <param name="file">Excel模板文件</param>
//        /// <param name="importExcelType">Excel导入方式</param>
//        /// <returns>导入的记录数</returns>
//        [HttpPost("fromExcel")]
//        public async Task<int> FromExcelAsync(IFormFile file, [FromQuery] ImportExcelType importExcelType)
//        {
//            int size = 200;
//            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTakeMaterialOrder", "v2");
//            if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002);
//            var keys = excelTemplate.UnionUniqueFields.Split(",") ?? Array.Empty<string>();
//            for (var i = 0; i < keys.Length; i++)
//            {
//                keys[i] = keys[i]?.Trim() ?? string.Empty;
//            }
//            ExcelUtil.FromExcel(file, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, out List<string> headers, out List<List<object?>> data, out string sheetName);
//            List<WmsTakeMaterialOrderOutput> wmsTakeMaterialOrderList = DataConvertUtil.ToObjectList(headers, data, sheetName, keys, excelTemplate?.DataStartLine ?? 2, out Dictionary<string, WmsTakeMaterialOrderOutput> dict);
//            List<Dictionary<string, object>> uniqueKeyValueDictList = wmsTakeMaterialOrderList.ParseUniqueKeyValueDictList(keys.ToList(), excelTemplate?.DataStartLine ?? 2, sheetName);
//            var filters = DataConvertUtil.GetExpressionListByUniqueDict<WmsTakeMaterialOrder>(keys.ToList(), uniqueKeyValueDictList, size);
//            var selectKeys = keys.ToList();
//            if(!selectKeys.Contains("Id")) selectKeys.Add("Id");
//            var selector = DataConvertUtil.GetSelectExpressionListByUniqueDict<WmsTakeMaterialOrder, WmsTakeMaterialOrderOutput>(selectKeys);
//            List<WmsTakeMaterialOrder> updates = new();
//            List<WmsTakeMaterialOrder> adds = new();
            lock (_lock)
            {
                foreach (var filter in filters)
                {
                    var wmsTakeMaterialOrderExistSubList = _wmsTakeMaterialOrderRep.Where(filter).Select(selector).ToList();
                    wmsTakeMaterialOrderExistSubList.ForEach(x =>
                    {
                        var k = DataConvertUtil.GetKey(x, keys);
                        if (dict.ContainsKey(k)) dict[k].Id = x.Id;
                    });
                }
                foreach (var wmsTakeMaterialOrder in wmsTakeMaterialOrderList)
                {
                    if (wmsTakeMaterialOrder.Id > 0)
                    {
                        if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.Add(wmsTakeMaterialOrder.Adapt<WmsTakeMaterialOrder>());
                    }
                    else
                    {
                        adds.Add(wmsTakeMaterialOrder.Adapt<WmsTakeMaterialOrder>());
                    }
                }
//            lock (_lock)
//            {
//                foreach (var filter in filters)
//                {
//                    var wmsTakeMaterialOrderExistSubList = _wmsTakeMaterialOrderRep.Where(filter).Select(selector).ToList();
//                    wmsTakeMaterialOrderExistSubList.ForEach(x =>
//                    {
//                        var k = DataConvertUtil.GetKey(x, keys);
//                        if (dict.ContainsKey(k)) dict[k].Id = x.Id;
//                    });
//                }
//                foreach (var wmsTakeMaterialOrder in wmsTakeMaterialOrderList)
//                {
//                    if (wmsTakeMaterialOrder.Id > 0)
//                    {
//                        if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.Add(wmsTakeMaterialOrder.Adapt<WmsTakeMaterialOrder>());
//                    }
//                    else
//                    {
//                        adds.Add(wmsTakeMaterialOrder.Adapt<WmsTakeMaterialOrder>());
//                    }
//                }
                if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.ForEach(x => _wmsTakeMaterialOrderRep.Update(x));
//                if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.ForEach(x => _wmsTakeMaterialOrderRep.Update(x));
                
                var maxId = _wmsTakeMaterialOrderRep.DetachedEntities.OrderByDescending(x => x.Id).Select(x => x.Id).FirstOrDefault();
                adds.ForEach(x => x.Id = ++maxId);
                Db.GetDbContext().Set<WmsTakeMaterialOrder>().AddRange(adds);
                Db.GetDbContext().SaveChanges();
//                var maxId = _wmsTakeMaterialOrderRep.DetachedEntities.OrderByDescending(x => x.Id).Select(x => x.Id).FirstOrDefault();
//                adds.ForEach(x => x.Id = ++maxId);
//                Db.GetDbContext().Set<WmsTakeMaterialOrder>().AddRange(adds);
//                Db.GetDbContext().SaveChanges();
               
            }
            await Task.CompletedTask;
            return adds.Count;
        }
//            }
//            await Task.CompletedTask;
//            return adds.Count;
//        }
        /// <summary>
        /// 根据版本下载领料单的Excel导入模板
        /// </summary>
        /// <param name="version">模板版本</param>
        /// <returns>下载的模板文件</returns>
        [HttpGet("downloadExcelTemplate")]
        public async Task<IActionResult> DownloadExcelTemplate([FromQuery] string version)
        {
            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTakeMaterialOrder", version);
            if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002);
            var path = Path.Combine(@"\", excelTemplate.TemplateFileName);
            Stream ms = FileUtil.Download(path, excelTemplate.TemplateFileName);
            var fileName = HttpUtility.UrlEncode($"{excelTemplate.Name}导入模板.xlsx", Encoding.GetEncoding("UTF-8"));
            return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName };
        }
        /// <summary>
        /// 根据领料单查询参数导出Excel
        /// </summary>
        /// <param name="input">领料单查询参数</param>
        /// <returns>导出的Excel文件</returns>
        [HttpGet("toExcel")]
        public async Task<IActionResult> ToExcelAsync([FromQuery] WmsTakeMaterialOrderSearchNonPage input)
        {
            var wmsTakeMaterialOrderList = await ListNonPageAsync(input);
            MemoryStream ms = new();
            DataConvertUtil.ToExcelData(wmsTakeMaterialOrderList, _sysDictTypeRep, _sysDictDataRep, out List<string> headers,
                out List<List<object>> data, out string sheetName);
            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTakeMaterialOrder", "v1");
            if (excelTemplate != null)
            {
                ExcelUtil.ToExcel(excelTemplate.TemplateFileName, headers, data, sheetName, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, ms);
            }
            else
            {
                ExcelUtil.ToExcel(headers, data, sheetName, ms);
            }
            ms.Position = 0;
            var fileName = HttpUtility.UrlEncode($"{sheetName}[{DateTimeOffset.Now:yyyy-MM-dd}].xlsx", Encoding.GetEncoding("UTF-8"));
            return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName };
        }
    }
}
//        /// <summary>
//        /// 根据版本下载领料单的Excel导入模板
//        /// </summary>
//        /// <param name="version">模板版本</param>
//        /// <returns>下载的模板文件</returns>
//        [HttpGet("downloadExcelTemplate")]
//        public async Task<IActionResult> DownloadExcelTemplate([FromQuery] string version)
//        {
//            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTakeMaterialOrder", version);
//            if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002);
//            var path = Path.Combine(@"\", excelTemplate.TemplateFileName);
//            Stream ms = FileUtil.Download(path, excelTemplate.TemplateFileName);
//            var fileName = HttpUtility.UrlEncode($"{excelTemplate.Name}导入模板.xlsx", Encoding.GetEncoding("UTF-8"));
//            return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName };
//        }
//        /// <summary>
//        /// 根据领料单查询参数导出Excel
//        /// </summary>
//        /// <param name="input">领料单查询参数</param>
//        /// <returns>导出的Excel文件</returns>
//        [HttpGet("toExcel")]
//        public async Task<IActionResult> ToExcelAsync([FromQuery] WmsTakeMaterialOrderSearchNonPage input)
//        {
//            var wmsTakeMaterialOrderList = await ListNonPageAsync(input);
//            MemoryStream ms = new();
//            DataConvertUtil.ToExcelData(wmsTakeMaterialOrderList, _sysDictTypeRep, _sysDictDataRep, out List<string> headers,
//                out List<List<object>> data, out string sheetName);
//            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTakeMaterialOrder", "v1");
//            if (excelTemplate != null)
//            {
//                ExcelUtil.ToExcel(excelTemplate.TemplateFileName, headers, data, sheetName, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, ms);
//            }
//            else
//            {
//                ExcelUtil.ToExcel(headers, data, sheetName, ms);
//            }
//            ms.Position = 0;
//            var fileName = HttpUtility.UrlEncode($"{sheetName}[{DateTimeOffset.Now:yyyy-MM-dd}].xlsx", Encoding.GetEncoding("UTF-8"));
//            return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName };
//        }
//    }
//}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsPda/CallEmpty/CallEmptyService.cs
@@ -1,107 +1,107 @@
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
using Admin.NET.Core;
using Yitter.IdGenerator;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Mvc.RazorPages;
using StackExchange.Redis;
//using Furion.DatabaseAccessor;
//using Furion.DependencyInjection;
//using Furion.DynamicApiController;
//using Furion.FriendlyException;
//using Mapster;
//using Microsoft.AspNetCore.Authorization;
//using Microsoft.AspNetCore.Mvc;
//using Microsoft.EntityFrameworkCore;
//using System.Linq.Dynamic.Core;
//using Admin.NET.Core;
//using Yitter.IdGenerator;
//using Microsoft.Extensions.Logging;
//using Microsoft.AspNetCore.Mvc.RazorPages;
//using StackExchange.Redis;
namespace Admin.NET.Application
{
    /// <summary>
    /// Pda空托出库
    /// </summary>
    [ApiDescriptionSettings("Pda空托出库", Name = "CallEmpty", Order = 100)]
    [Route("api/[Controller]")]
    public class CallEmptyService : IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsOrder, MasterDbContextLocator> _wmsOrderRep;
        private readonly IRepository<WmsOrderDetails, MasterDbContextLocator> _wmsOrderDetailsRep;
        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
        private readonly IRepository<WmsWarehouseEntrance, MasterDbContextLocator> _wmsWarehouseEntranceRep;
        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
        private readonly IRepository<WmsOrderType, MasterDbContextLocator> _wmsOrderTypeRep;
//namespace Admin.NET.Application
//{
//    /// <summary>
//    /// Pda空托出库
//    /// </summary>
//    [ApiDescriptionSettings("Pda空托出库", Name = "CallEmpty", Order = 100)]
//    [Route("api/[Controller]")]
//    public class CallEmptyService : IDynamicApiController, ITransient
//    {
//        private readonly IRepository<WmsOrder, MasterDbContextLocator> _wmsOrderRep;
//        private readonly IRepository<WmsOrderDetails, MasterDbContextLocator> _wmsOrderDetailsRep;
//        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
//        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
//        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
//        private readonly IRepository<WmsWarehouseEntrance, MasterDbContextLocator> _wmsWarehouseEntranceRep;
//        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
//        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
//        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
//        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
//        private readonly IRepository<WmsOrderType, MasterDbContextLocator> _wmsOrderTypeRep;
        /// <summary>
        /// 构造函数
        /// </summary>
        public CallEmptyService(
            IRepository<WmsOrder, MasterDbContextLocator> wmsOrderRep,
            IRepository<WmsOrderDetails, MasterDbContextLocator> wmsOrderDetailsRep,
            IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep,
            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
            IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
            IRepository<WmsWarehouseEntrance, MasterDbContextLocator> wmsWarehouseEntranceRep,
            IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep,
            IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
            IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRep,
            IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
            IRepository<WmsOrderType, MasterDbContextLocator> wmsOrderTypeRep
        )
        {
            _wmsOrderRep = wmsOrderRep;
            _wmsOrderDetailsRep = wmsOrderDetailsRep;
            _wmsTaskRep = wmsTaskRep;
            _wmsPlaceRep = wmsPlaceRep;
            _wmsAreaRep = wmsAreaRep;
            _wmsWarehouseEntranceRep = wmsWarehouseEntranceRep;
            _wmsMaterialContainerRep = wmsMaterialContainerRep;
            _wmsContainerRep = wmsContainerRep;
            _wmsContainerPlaceRep = wmsContainerPlaceRep;
            _wmsMaterialStockRep = wmsMaterialStockRep;
            _wmsOrderTypeRep = wmsOrderTypeRep;
        }
//        /// <summary>
//        /// 构造函数
//        /// </summary>
//        public CallEmptyService(
//            IRepository<WmsOrder, MasterDbContextLocator> wmsOrderRep,
//            IRepository<WmsOrderDetails, MasterDbContextLocator> wmsOrderDetailsRep,
//            IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep,
//            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
//            IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
//            IRepository<WmsWarehouseEntrance, MasterDbContextLocator> wmsWarehouseEntranceRep,
//            IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep,
//            IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
//            IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRep,
//            IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
//            IRepository<WmsOrderType, MasterDbContextLocator> wmsOrderTypeRep
//        )
//        {
//            _wmsOrderRep = wmsOrderRep;
//            _wmsOrderDetailsRep = wmsOrderDetailsRep;
//            _wmsTaskRep = wmsTaskRep;
//            _wmsPlaceRep = wmsPlaceRep;
//            _wmsAreaRep = wmsAreaRep;
//            _wmsWarehouseEntranceRep = wmsWarehouseEntranceRep;
//            _wmsMaterialContainerRep = wmsMaterialContainerRep;
//            _wmsContainerRep = wmsContainerRep;
//            _wmsContainerPlaceRep = wmsContainerPlaceRep;
//            _wmsMaterialStockRep = wmsMaterialStockRep;
//            _wmsOrderTypeRep = wmsOrderTypeRep;
//        }
      
        /// <summary>
        /// 提交出库
        /// </summary>
        /// <returns></returns>
        [HttpPost("PdaContainerOut")]
        [UnitOfWork]
        public async Task PdaContainerOut([FromBody] PdaContainerOutInput input)
        {
            //根据输入数量循环出库的托盘数量
            for (int i = 1; i < input.Qty+1; i++)
            {
                //获取库存中的空托盘
                var wmsMaterialStockModal = await _wmsMaterialStockRep.FirstOrDefaultAsync(x => x.Source == RuKuSourceEnum.KONGTUO);
                //获取库位信息
                var wmsPlacModal = await _wmsPlaceRep.FirstOrDefaultAsync(x => x.PlaceCode == wmsMaterialStockModal.PlaceCode);
                //任务
                var takmodel = new WmsTask()
                {
                    TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(),
                    TaskModel = TaskModel.QUANZIDONG,
                    TaskType = TaskType.CHUKU,
                    TaskLevel = 1,
                    TaskStatus = TaskStatusEnum.WEIZHIXING,
                    OrderNo = "N/A",
                    OrderDetailsId = 0,
                    ContainerCode = wmsMaterialStockModal.ContainerCode,
                    SourcePlace = wmsMaterialStockModal.PlaceCode,
                    ToPlace = wmsPlacModal.Aisle.ToString(), //目标位
                    AreaName = "绝缘立库",
                    IsRead = true, //WCS是否可以读取
                    SendTimes = 1, //发送次数
                    Aisle = wmsPlacModal.Aisle,
                    TaskDodeviceStatus = TaskDodeviceStatusEnum.W,
                    Description = "空托"
                 };
                await _wmsTaskRep.InsertAsync(takmodel);
            }
        }
    }
}
//        /// <summary>
//        /// 提交出库
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("PdaContainerOut")]
//        [UnitOfWork]
//        public async Task PdaContainerOut([FromBody] PdaContainerOutInput input)
//        {
//            //根据输入数量循环出库的托盘数量
//            for (int i = 1; i < input.Qty+1; i++)
//            {
//                //获取库存中的空托盘
//                var wmsMaterialStockModal = await _wmsMaterialStockRep.FirstOrDefaultAsync(x => x.Source == RuKuSourceEnum.KONGTUO);
//                //获取库位信息
//                var wmsPlacModal = await _wmsPlaceRep.FirstOrDefaultAsync(x => x.PlaceCode == wmsMaterialStockModal.PlaceCode);
//                //任务
//                var takmodel = new WmsTask()
//                {
//                    TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(),
//                    TaskModel = TaskModel.QUANZIDONG,
//                    TaskType = TaskType.CHUKU,
//                    TaskLevel = 1,
//                    TaskStatus = TaskStatusEnum.WEIZHIXING,
//                    OrderNo = "N/A",
//                    OrderDetailsId = 0,
//                    ContainerCode = wmsMaterialStockModal.ContainerCode,
//                    SourcePlace = wmsMaterialStockModal.PlaceCode,
//                    ToPlace = wmsPlacModal.Aisle.ToString(), //目标位
//                    AreaName = "绝缘立库",
//                    IsRead = true, //WCS是否可以读取
//                    SendTimes = 1, //发送次数
//                    Aisle = wmsPlacModal.Aisle,
//                    TaskDodeviceStatus = TaskDodeviceStatusEnum.W,
//                    Description = "空托"
//                 };
//                await _wmsTaskRep.InsertAsync(takmodel);
//            }
//        }
//    }
//}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Core/Entity/WmsBase/WmsArea.cs
@@ -4,7 +4,7 @@
/*
 * @author : 刘文奇
 * @date : 2024/4/23下午5:20:46
 * @date : 2024/4/23下午5:33:52
 * @desc : 库区表
 */
namespace Admin.NET.Core
@@ -98,6 +98,15 @@
        public bool IsVirtually { get; set; }
        /// <summary>
        /// 是否禁用
        /// </summary>
        [Comment("是否禁用")]
        [Required]
        public bool IsDisabled { get; set; }
iWare_RawMaterialWarehouse_Wms/Admin.NET.Core/Entity/WmsBase/WmsPlace.cs
@@ -2,6 +2,11 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
/*
 * @author : 刘文奇
 * @date : 2024/4/23下午5:35:14
 * @desc : 库位表
 */
namespace Admin.NET.Core
{
    /// <summary>
@@ -11,6 +16,8 @@
    [Comment("库位表")]
    public class WmsPlace : DEntityBase
    {
        /// <summary>
        /// 库位编码
        /// </summary>
@@ -19,88 +26,101 @@
        [MaxLength(50)]
        public string PlaceCode { get; set; }
        /// <summary>
        /// 库位对应AGV编码
        /// </summary>
        [Comment("库位对应AGV编码")]
        [MaxLength(50)]
        public string AgvCode { get; set; }
        /// <summary>
        /// 库位状态;数据字典
        /// 库位名称
        /// </summary>
        [Comment("库位名称")]
        [Required]
        [MaxLength(255)]
        public string PlaceName { get; set; }
        /// <summary>
        /// 库位别名
        /// </summary>
        [Comment("库位别名")]
        [MaxLength(255)]
        public string PlaceNickName { get; set; }
        /// <summary>
        /// 库位状态
        /// </summary>
        [Comment("库位状态")]
        [Required]
        public PlaceStatus PlaceStatus { get; set; }
        public int PlaceStatus { get; set; }
        /// <summary>
        /// 所在库区
        /// </summary>
        [Comment("所在库区")]
        [Required]
        public long AreaId { get; set; }
        /// <summary>
        /// 库区名称
        /// </summary>
        [Comment("库区名称")]
        [MaxLength(255)]
        public string WarehouseName { get; set; }
        /// <summary>
        /// 检验码
        /// </summary>
        [Comment("检验码")]
        [MaxLength(255)]
        public string VerificationCode { get; set; }
        /// <summary>
        /// 排
        /// </summary>
        [Comment("排")]
        [Required]
        public int RowNo { get; set; }
        /// <summary>
        /// 列
        /// </summary>
        [Comment("列")]
        [Required]
        public int ColumnNo { get; set; }
        /// <summary>
        /// 层
        /// </summary>
        [Comment("层")]
        [Required]
        public int LayerNo { get; set; }
        /// <summary>
        /// 进深号
        /// </summary>
        [Comment("进深号")]
        [Required]
        public int DeepcellNo { get; set; }
        /// <summary>
        /// 巷道
        /// </summary>
        [Comment("巷道")]
        [Required]
        public int Aisle { get; set; }
        public int LaneNo { get; set; }
        /// <summary>
        /// 线号
        /// 堆垛机库位号
        /// </summary>
        [Comment("线号")]
        [Required]
        public int Line { get; set; }
        /// <summary>
        /// 是否锁定;数据字典
        /// </summary>
        [Comment("是否锁定")]
        [Required]
        public YesOrNot Islock { get; set; }
        /// <summary>
        /// 是否空托;数据字典
        /// </summary>
        [Comment("是否空托")]
        public YesOrNot EmptyContainer { get; set; }
        /// <summary>
        /// 堆垛机内部的位置
        /// </summary>
        [Comment("堆垛机内部的位置")]
        [Comment("堆垛机库位号")]
        [MaxLength(50)]
        public string PositionnoForSrm { get; set; }
        public string SrmNo { get; set; }
        /// <summary>
        /// 库位X坐标
@@ -109,12 +129,14 @@
        [MaxLength(50)]
        public string Xzb { get; set; }
        /// <summary>
        /// 库位Y坐标
        /// </summary>
        [Comment("库位Y坐标")]
        [MaxLength(50)]
        public string Yzb { get; set; }
        /// <summary>
        /// 库位Z坐标
@@ -123,51 +145,76 @@
        [MaxLength(50)]
        public string Zzb { get; set; }
        /// <summary>
        /// 库位长度
        /// </summary>
        [Comment("库位长度")]
        [Required]
        [Column("Length", TypeName = "decimal(18,2)")]
        public decimal Length { get; set; }
        /// <summary>
        /// 库位宽度
        /// </summary>
        [Comment("库位宽度")]
        [Required]
        [Column("Width", TypeName = "decimal(18,2)")]
        public decimal Width { get; set; }
        /// <summary>
        /// 库位高度
        /// </summary>
        [Comment("库位高度")]
        [Required]
        [Column("Height", TypeName = "decimal(18,2)")]
        public decimal Height { get; set; }
        /// <summary>
        /// 最大承重
        /// </summary>
        [Comment("最大承重")]
        [Required]
        [Column("MaxWeight", TypeName = "decimal(18,2)")]
        public decimal MaxWeight { get; set; }
        /// <summary>
        /// 库位高度属性;数据字典
        /// 库位高度属性
        /// </summary>
        [Comment("库位高度属性")]
        public Heightlevel HeightLevel { get; set; }
        [Required]
        public int HeightLevel { get; set; }
        /// <summary>
        /// 优先级
        /// </summary>
        [Comment("优先级")]
        [Required]
        public int Priority { get; set; }
        /// <summary>
        /// 逻辑区域
        /// </summary>
        [Comment("逻辑区域")]
        [Required]
        public int LogicalName { get; set; }
        /// <summary>
        /// 库区表
        /// </summary>
        public WmsArea WmsArea { get; set; }
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Core/Entity/WmsBase/WmsWarehouse.cs
@@ -4,7 +4,7 @@
/*
 * @author : 刘文奇
 * @date : 2024/4/23下午4:40:38
 * @date : 2024/4/23下午5:30:19
 * @desc : 仓库表
 */
namespace Admin.NET.Core
@@ -96,6 +96,15 @@
        /// <summary>
        /// 是否禁用
        /// </summary>
        [Comment("是否禁用")]
        [Required]
        public bool IsDisabled { get; set; }
        /// <summary>
        /// 备注
        /// </summary>
        [Comment("备注")]