payne
2024-04-23 174f05a6e0f2312f3bdcafcf837f2534ecdaea15
增加库区
已修改6个文件
3813 ■■■■ 文件已修改
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/Common/WmsArea/WmsAreaService.cs 588 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/Common/WmsPlace/WmsPlaceService.cs 518 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WcsToWms/WareWcsToWmsService.cs 1936 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsCount/WmsLocationView/LocationViewService.cs 526 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Core/Entity/WmsBase/WmsArea.cs 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
使用文档/PDManer文件/原材料库标准化.pdma.json 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/Common/WmsArea/WmsAreaService.cs
@@ -1,313 +1,313 @@
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 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;
namespace Admin.NET.Application
{
    /// <summary>
    /// åº“区信息服务
    /// </summary>
    [ApiDescriptionSettings("自己的业务", Name = "WmsArea", Order = 100)]
    [Route("api/[Controller]")]
    public class WmsAreaService : IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
        private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
        private readonly ISysExcelTemplateService _sysExcelTemplateService;
        private readonly static object _lock = new();
        /// <summary>
        /// æž„造函数
        /// </summary>
        /// <param name="wmsAreaRep"></param>
        /// <param name="sysDictTypeRep"></param>
        /// <param name="sysDictDataRep"></param>
        /// <param name="sysExcelTemplateService"></param>
        public WmsAreaService(
            IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
            IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep,
            IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep,
            ISysExcelTemplateService sysExcelTemplateService
        )
        {
            _wmsAreaRep = wmsAreaRep;
            _sysDictTypeRep = sysDictTypeRep;
            _sysDictDataRep = sysDictDataRep;
            _sysExcelTemplateService = sysExcelTemplateService;
        }
        /// <summary>
        /// åˆ†é¡µæŸ¥è¯¢åº“区信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("page")]
        public async Task<PageResult<WmsAreaOutput>> Page([FromQuery] WmsAreaSearch input)
        {
            var wmsAreas = await _wmsAreaRep.DetachedEntities
                .Where(!string.IsNullOrEmpty(input.AreaName), u => EF.Functions.Like(u.AreaName, $"%{input.AreaName.Trim()}%"))
                .Where(input.AreaStatus != null, u => u.AreaStatus == input.AreaStatus)
                .Where(input.AreaType != null, u => u.AreaType == input.AreaType)
                .Where(input.IsSteel != null, u => u.IsSteel == input.IsSteel)
                .Where(input.WorkShopType != null, u => u.WorkShopType == input.WorkShopType)
                .OrderBy(PageInputOrder.OrderBuilder<WmsAreaSearch>(input))
                .ProjectToType<WmsAreaOutput>()
                .ToADPagedListAsync(input.PageNo, input.PageSize);
            return wmsAreas;
        }
        /// <summary>
        /// ä¸åˆ†é¡µæŸ¥è¯¢åº“区信息列表
        /// </summary>
        /// <param name="input">库区信息查询参数</param>
        /// <returns>(库区信息)实例列表</returns>
        [HttpGet("listNonPage")]
        public async Task<List<WmsAreaOutput>> ListNonPageAsync([FromQuery] WmsAreaSearchNonPage input)
        {
            var pAreaName = input.AreaName?.Trim() ?? "";
            var pAreaStatus = input.AreaStatus;
            var pAreaType = input.AreaType;
            var pIsSteel = input.IsSteel;
            var pWorkShopType = input.WorkShopType;
            var pIssueState = input.IssueState;
            var wmsAreas = await _wmsAreaRep.DetachedEntities
                .Where(!string.IsNullOrEmpty(pAreaName), u => EF.Functions.Like(u.AreaName, $"%{pAreaName}%"))
                .Where(pAreaStatus != null, u => u.AreaStatus == pAreaStatus)
                .Where(pAreaType != null, u => u.AreaType == pAreaType)
                .Where(pIsSteel != null, u => u.IsSteel == pIsSteel)
                .Where(pWorkShopType != null, u => u.WorkShopType == pWorkShopType)
            .OrderBy(PageInputOrder.OrderNonPageBuilder(input))
            .ProjectToType<WmsAreaOutput>()
            .ToListAsync();
            return wmsAreas;
        }
        /// <summary>
        /// å¢žåŠ åº“åŒºä¿¡æ¯
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("add")]
        public async Task Add(AddWmsAreaInput input)
        {
            var wmsArea = input.Adapt<WmsArea>();
            await _wmsAreaRep.InsertAsync(wmsArea);
        }
        /// <summary>
        /// åˆ é™¤åº“区信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("delete")]
        public async Task Delete(DeleteWmsAreaInput input)
        {
            var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            await _wmsAreaRep.DeleteAsync(wmsArea);
        }
        /// <summary>
        /// æ›´æ–°åº“区信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("edit")]
        public async Task Update(UpdateWmsAreaInput input)
        {
            var isExist = await _wmsAreaRep.AnyAsync(u => u.Id == input.Id, false);
            if (!isExist) throw Oops.Oh(ErrorCode.D3000);
            var wmsArea = input.Adapt<WmsArea>();
            await _wmsAreaRep.UpdateAsync(wmsArea, ignoreNullValues: true);
        }
        /// <summary>
        /// èŽ·å–åº“åŒºä¿¡æ¯
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("detail")]
        public async Task<WmsAreaOutput> Get([FromQuery] QueryeWmsAreaInput input)
        {
            return (await _wmsAreaRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsAreaOutput>();
        }
        /// <summary>
        /// èŽ·å–åº“åŒºä¿¡æ¯åˆ—è¡¨
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("list")]
        public async Task<List<WmsAreaOutput>> List([FromQuery] WmsAreaInput input)
        {
            return await _wmsAreaRep.DetachedEntities.ProjectToType<WmsAreaOutput>().ToListAsync();
        }
        /// <summary>
        /// ç»„装车间获取库区
        /// </summary>
        /// <returns></returns>
        [HttpGet("TaskWmsArea")]
        public async Task<dynamic> TaskWmsArea()
        {
            var list = await _wmsAreaRep.DetachedEntities.Where(x => x.WorkShopType == LesWorkShopType.JIAOHEBANCHEJIAN).ToListAsync();
            return list.Select(e => new { Code = e.Id, AreaName = e.AreaName });
        }
        /// <summary>
        /// èŽ·å–ä»“åº“ä¸‹æ‹‰æ¡†
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetAreaEntranceList")]
        public async Task<List<AreaEntranceListOutput>> GetAreaEntranceList()
        {
            var data = await _wmsAreaRep.DetachedEntities.ProjectToType<WmsAreaOutput>().ToListAsync();
            List<AreaEntranceListOutput> areaEntranceListOutputLists = new List<AreaEntranceListOutput>();
            foreach (var item in data)
            {
                AreaEntranceListOutput areaEntranceListOutputList = new AreaEntranceListOutput();
                areaEntranceListOutputList.AreaId = item.Id;
                areaEntranceListOutputList.AreaName = item.AreaName;
                areaEntranceListOutputLists.Add(areaEntranceListOutputList);
            }
            return areaEntranceListOutputLists;
        }
//namespace Admin.NET.Application
//{
//    /// <summary>
//    /// åº“区信息服务
//    /// </summary>
//    [ApiDescriptionSettings("自己的业务", Name = "WmsArea", Order = 100)]
//    [Route("api/[Controller]")]
//    public class WmsAreaService : IDynamicApiController, ITransient
//    {
//        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
//        private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
//        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
//        private readonly ISysExcelTemplateService _sysExcelTemplateService;
//        private readonly static object _lock = new();
        ///// <summary>
        ///// å‡ºåº“口下拉框
//        /// æž„造函数
//        /// </summary>
//        /// <param name="wmsAreaRep"></param>
//        /// <param name="sysDictTypeRep"></param>
//        /// <param name="sysDictDataRep"></param>
//        /// <param name="sysExcelTemplateService"></param>
//        public WmsAreaService(
//            IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
//            IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep,
//            IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep,
//            ISysExcelTemplateService sysExcelTemplateService
//        )
//        {
//            _wmsAreaRep = wmsAreaRep;
//            _sysDictTypeRep = sysDictTypeRep;
//            _sysDictDataRep = sysDictDataRep;
//            _sysExcelTemplateService = sysExcelTemplateService;
//        }
//        /// <summary>
//        /// åˆ†é¡µæŸ¥è¯¢åº“区信息
        ///// </summary>
        ///// <param name="input"></param>
        ///// <returns></returns>
        //[HttpGet("GetEntranceOutList")]
        //public async Task<List<EntranceListOutput>> GetEntranceOutList([FromQuery] EntranceOutInput input)
//        [HttpGet("page")]
//        public async Task<PageResult<WmsAreaOutput>> Page([FromQuery] WmsAreaSearch input)
        //{
        //    var data = await _lesEntranceRep.DetachedEntities.Where(u => u.AreaId == input.Id && u.EntranceType == Core.LesEntranceType.CHUKU).ProjectToType<LesStationOutput>().ToListAsync();
        //    List<EntranceListOutput> entranceLists = new List<EntranceListOutput>();
//            var wmsAreas = await _wmsAreaRep.DetachedEntities
//                .Where(!string.IsNullOrEmpty(input.AreaName), u => EF.Functions.Like(u.AreaName, $"%{input.AreaName.Trim()}%"))
//                .Where(input.AreaStatus != null, u => u.AreaStatus == input.AreaStatus)
//                .Where(input.AreaType != null, u => u.AreaType == input.AreaType)
//                .Where(input.IsSteel != null, u => u.IsSteel == input.IsSteel)
//                .Where(input.WorkShopType != null, u => u.WorkShopType == input.WorkShopType)
//                .OrderBy(PageInputOrder.OrderBuilder<WmsAreaSearch>(input))
//                .ProjectToType<WmsAreaOutput>()
//                .ToADPagedListAsync(input.PageNo, input.PageSize);
//            return wmsAreas;
//        }
//        /// <summary>
//        /// ä¸åˆ†é¡µæŸ¥è¯¢åº“区信息列表
//        /// </summary>
//        /// <param name="input">库区信息查询参数</param>
//        /// <returns>(库区信息)实例列表</returns>
//        [HttpGet("listNonPage")]
//        public async Task<List<WmsAreaOutput>> ListNonPageAsync([FromQuery] WmsAreaSearchNonPage input)
//        {
//            var pAreaName = input.AreaName?.Trim() ?? "";
//            var pAreaStatus = input.AreaStatus;
//            var pAreaType = input.AreaType;
//            var pIsSteel = input.IsSteel;
//            var pWorkShopType = input.WorkShopType;
//            var pIssueState = input.IssueState;
//            var wmsAreas = await _wmsAreaRep.DetachedEntities
//                .Where(!string.IsNullOrEmpty(pAreaName), u => EF.Functions.Like(u.AreaName, $"%{pAreaName}%"))
//                .Where(pAreaStatus != null, u => u.AreaStatus == pAreaStatus)
//                .Where(pAreaType != null, u => u.AreaType == pAreaType)
//                .Where(pIsSteel != null, u => u.IsSteel == pIsSteel)
//                .Where(pWorkShopType != null, u => u.WorkShopType == pWorkShopType)
//            .OrderBy(PageInputOrder.OrderNonPageBuilder(input))
//            .ProjectToType<WmsAreaOutput>()
//            .ToListAsync();
//            return wmsAreas;
//        }
//        /// <summary>
//        /// å¢žåŠ åº“åŒºä¿¡æ¯
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("add")]
//        public async Task Add(AddWmsAreaInput input)
//        {
//            var wmsArea = input.Adapt<WmsArea>();
//            await _wmsAreaRep.InsertAsync(wmsArea);
//        }
//        /// <summary>
//        /// åˆ é™¤åº“区信息
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("delete")]
//        public async Task Delete(DeleteWmsAreaInput input)
//        {
//            var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.Id == input.Id);
//            await _wmsAreaRep.DeleteAsync(wmsArea);
//        }
//        /// <summary>
//        /// æ›´æ–°åº“区信息
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("edit")]
//        public async Task Update(UpdateWmsAreaInput input)
//        {
//            var isExist = await _wmsAreaRep.AnyAsync(u => u.Id == input.Id, false);
//            if (!isExist) throw Oops.Oh(ErrorCode.D3000);
//            var wmsArea = input.Adapt<WmsArea>();
//            await _wmsAreaRep.UpdateAsync(wmsArea, ignoreNullValues: true);
//        }
//        /// <summary>
//        /// èŽ·å–åº“åŒºä¿¡æ¯
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("detail")]
//        public async Task<WmsAreaOutput> Get([FromQuery] QueryeWmsAreaInput input)
//        {
//            return (await _wmsAreaRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsAreaOutput>();
//        }
//        /// <summary>
//        /// èŽ·å–åº“åŒºä¿¡æ¯åˆ—è¡¨
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("list")]
//        public async Task<List<WmsAreaOutput>> List([FromQuery] WmsAreaInput input)
//        {
//            return await _wmsAreaRep.DetachedEntities.ProjectToType<WmsAreaOutput>().ToListAsync();
//        }
//        /// <summary>
//        /// ç»„装车间获取库区
//        /// </summary>
//        /// <returns></returns>
//        [HttpGet("TaskWmsArea")]
//        public async Task<dynamic> TaskWmsArea()
//        {
//            var list = await _wmsAreaRep.DetachedEntities.Where(x => x.WorkShopType == LesWorkShopType.JIAOHEBANCHEJIAN).ToListAsync();
//            return list.Select(e => new { Code = e.Id, AreaName = e.AreaName });
//        }
//        /// <summary>
//        /// èŽ·å–ä»“åº“ä¸‹æ‹‰æ¡†
//        /// </summary>
//        /// <returns></returns>
//        [HttpGet("GetAreaEntranceList")]
//        public async Task<List<AreaEntranceListOutput>> GetAreaEntranceList()
//        {
//            var data = await _wmsAreaRep.DetachedEntities.ProjectToType<WmsAreaOutput>().ToListAsync();
//            List<AreaEntranceListOutput> areaEntranceListOutputLists = new List<AreaEntranceListOutput>();
        //    foreach (var item in data)
        //    {
        //        EntranceListOutput entranceList = new EntranceListOutput();
        //        entranceList.EntranceId = item.Id;
        //        entranceList.EntranceName = item.Name;
        //        entranceLists.Add(entranceList);
//                AreaEntranceListOutput areaEntranceListOutputList = new AreaEntranceListOutput();
//                areaEntranceListOutputList.AreaId = item.Id;
//                areaEntranceListOutputList.AreaName = item.AreaName;
//                areaEntranceListOutputLists.Add(areaEntranceListOutputList);
        //    }
        //    return entranceLists;
//            return areaEntranceListOutputLists;
        //}
        /// <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("WmsArea", "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<WmsAreaOutput> wmsAreaList = DataConvertUtil.ToObjectList(headers, data, sheetName, keys, excelTemplate?.DataStartLine ?? 2, out Dictionary<string, WmsAreaOutput> dict);
            List<Dictionary<string, object>> uniqueKeyValueDictList = wmsAreaList.ParseUniqueKeyValueDictList(keys.ToList(), excelTemplate?.DataStartLine ?? 2, sheetName);
            var filters = DataConvertUtil.GetExpressionListByUniqueDict<WmsArea>(keys.ToList(), uniqueKeyValueDictList, size);
            var selectKeys = keys.ToList();
            if (!selectKeys.Contains("Id")) selectKeys.Add("Id");
            var selector = DataConvertUtil.GetSelectExpressionListByUniqueDict<WmsArea, WmsAreaOutput>(selectKeys);
            List<WmsArea> updates = new();
            List<WmsArea> adds = new();
//        ///// <summary>
//        ///// å‡ºåº“口下拉框
//        ///// </summary>
//        ///// <param name="input"></param>
//        ///// <returns></returns>
//        //[HttpGet("GetEntranceOutList")]
//        //public async Task<List<EntranceListOutput>> GetEntranceOutList([FromQuery] EntranceOutInput input)
//        //{
//        //    var data = await _lesEntranceRep.DetachedEntities.Where(u => u.AreaId == input.Id && u.EntranceType == Core.LesEntranceType.CHUKU).ProjectToType<LesStationOutput>().ToListAsync();
//        //    List<EntranceListOutput> entranceLists = new List<EntranceListOutput>();
//        //    foreach (var item in data)
//        //    {
//        //        EntranceListOutput entranceList = new EntranceListOutput();
//        //        entranceList.EntranceId = item.Id;
//        //        entranceList.EntranceName = item.Name;
//        //        entranceLists.Add(entranceList);
//        //    }
//        //    return entranceLists;
//        //}
            lock (_lock)
            {
                foreach (var filter in filters)
                {
                    var wmsAreaExistSubList = _wmsAreaRep.Where(filter).Select(selector).ToList();
                    wmsAreaExistSubList.ForEach(x =>
                    {
                        var k = DataConvertUtil.GetKey(x, keys);
                        if (dict.ContainsKey(k)) dict[k].Id = x.Id;
                    });
                }
//        /// <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("WmsArea", "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<WmsAreaOutput> wmsAreaList = DataConvertUtil.ToObjectList(headers, data, sheetName, keys, excelTemplate?.DataStartLine ?? 2, out Dictionary<string, WmsAreaOutput> dict);
//            List<Dictionary<string, object>> uniqueKeyValueDictList = wmsAreaList.ParseUniqueKeyValueDictList(keys.ToList(), excelTemplate?.DataStartLine ?? 2, sheetName);
//            var filters = DataConvertUtil.GetExpressionListByUniqueDict<WmsArea>(keys.ToList(), uniqueKeyValueDictList, size);
//            var selectKeys = keys.ToList();
//            if (!selectKeys.Contains("Id")) selectKeys.Add("Id");
//            var selector = DataConvertUtil.GetSelectExpressionListByUniqueDict<WmsArea, WmsAreaOutput>(selectKeys);
//            List<WmsArea> updates = new();
//            List<WmsArea> adds = new();
                foreach (var wmsArea in wmsAreaList)
                {
                    if (wmsArea.Id > 0)
                    {
                        if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.Add(wmsArea.Adapt<WmsArea>());
                    }
                    else
                    {
                        adds.Add(wmsArea.Adapt<WmsArea>());
                    }
                }
//            lock (_lock)
//            {
//                foreach (var filter in filters)
//                {
//                    var wmsAreaExistSubList = _wmsAreaRep.Where(filter).Select(selector).ToList();
//                    wmsAreaExistSubList.ForEach(x =>
//                    {
//                        var k = DataConvertUtil.GetKey(x, keys);
//                        if (dict.ContainsKey(k)) dict[k].Id = x.Id;
//                    });
//                }
                if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.ForEach(x => _wmsAreaRep.Update(x));
//                foreach (var wmsArea in wmsAreaList)
//                {
//                    if (wmsArea.Id > 0)
//                    {
//                        if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.Add(wmsArea.Adapt<WmsArea>());
//                    }
//                    else
//                    {
//                        adds.Add(wmsArea.Adapt<WmsArea>());
//                    }
//                }
                var maxId = _wmsAreaRep.DetachedEntities.OrderByDescending(x => x.Id).Select(x => x.Id).FirstOrDefault();
                adds.ForEach(x => x.Id = ++maxId);
                Db.GetDbContext().Set<WmsArea>().AddRange(adds);
                Db.GetDbContext().SaveChanges();
            }
//                if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.ForEach(x => _wmsAreaRep.Update(x));
            await Task.CompletedTask;
            return adds.Count;
        }
//                var maxId = _wmsAreaRep.DetachedEntities.OrderByDescending(x => x.Id).Select(x => x.Id).FirstOrDefault();
//                adds.ForEach(x => x.Id = ++maxId);
//                Db.GetDbContext().Set<WmsArea>().AddRange(adds);
//                Db.GetDbContext().SaveChanges();
//            }
        /// <summary>
        /// æ ¹æ®ç‰ˆæœ¬ä¸‹è½½åº“区信息的Excel导入模板
        /// </summary>
        /// <param name="version">模板版本</param>
        /// <returns>下载的模板文件</returns>
        [HttpGet("downloadExcelTemplate")]
        public async Task<IActionResult> DownloadExcelTemplate([FromQuery] string version)
        {
            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsArea", 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 };
        }
//            await Task.CompletedTask;
//            return adds.Count;
//        }
        /// <summary>
        /// æ ¹æ®åº“区信息查询参数导出Excel
        /// </summary>
        /// <param name="input">库区信息查询参数</param>
        /// <returns>导出的Excel文件</returns>
        [HttpGet("toExcel")]
        public async Task<IActionResult> ToExcelAsync([FromQuery] WmsAreaSearchNonPage input)
        {
            var wmsAreaList = await ListNonPageAsync(input);
            MemoryStream ms = new();
            DataConvertUtil.ToExcelData(wmsAreaList, _sysDictTypeRep, _sysDictDataRep, out List<string> headers,
                out List<List<object>> data, out string sheetName);
            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsArea", "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("WmsArea", 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] WmsAreaSearchNonPage input)
//        {
//            var wmsAreaList = await ListNonPageAsync(input);
//            MemoryStream ms = new();
//            DataConvertUtil.ToExcelData(wmsAreaList, _sysDictTypeRep, _sysDictDataRep, out List<string> headers,
//                out List<List<object>> data, out string sheetName);
//            var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsArea", "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/Common/WmsPlace/WmsPlaceService.cs
@@ -1,282 +1,282 @@
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 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;
namespace Admin.NET.Application
{
    /// <summary>
    /// åº“位信息服务
    /// </summary>
    [ApiDescriptionSettings("自己的业务", Name = "WmsPlace", Order = 100)]
    [Route("api/[Controller]")]
    public class WmsPlaceService : IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
        private readonly IRepository<WmsArea> _wmsAreaRep;
//namespace Admin.NET.Application
//{
//    /// <summary>
//    /// åº“位信息服务
//    /// </summary>
//    [ApiDescriptionSettings("自己的业务", Name = "WmsPlace", Order = 100)]
//    [Route("api/[Controller]")]
//    public class WmsPlaceService : IDynamicApiController, ITransient
//    {
//        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
//        private readonly IRepository<WmsArea> _wmsAreaRep;
        /// <summary>
        /// æž„造函数
        /// </summary>
        public WmsPlaceService(
            IRepository<WmsArea> wmsAreaRep,
            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep
        )
        {
            _wmsAreaRep = wmsAreaRep;
            _wmsPlaceRep = wmsPlaceRep;
        }
//        /// <summary>
//        /// æž„造函数
//        /// </summary>
//        public WmsPlaceService(
//            IRepository<WmsArea> wmsAreaRep,
//            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep
//        )
//        {
//            _wmsAreaRep = wmsAreaRep;
//            _wmsPlaceRep = wmsPlaceRep;
//        }
        /// <summary>
        /// åˆ†é¡µæŸ¥è¯¢åº“位信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("page")]
        public async Task<PageResult<WmsPlaceOutput>> Page([FromQuery] WmsPlaceSearch input)
        {
            var wmsPlaces = await _wmsPlaceRep.DetachedEntities
                .Where(!string.IsNullOrEmpty(input.Placecode), u => EF.Functions.Like(u.PlaceCode, $"%{input.Placecode.Trim()}%"))
                .Where(input.Placestatus != null, u => u.PlaceStatus == input.Placestatus)
                .Where(input.Areaid > 0, u => u.AreaId == input.Areaid)
                .Where(input.Rowno != null, u => u.RowNo == input.Rowno)
                .Where(input.Columnno != null, u => u.ColumnNo == input.Columnno)
                .Where(input.Layerno != null, u => u.LayerNo == input.Layerno)
                .Where(input.Aisle != null, u => u.Aisle == input.Aisle)
                .Where(input.Islock != null, u => u.Islock == input.Islock)
                .OrderBy(PageInputOrder.OrderBuilder<WmsPlaceSearch>(input))
                .ProjectToType<WmsPlaceOutput>()
                .ToADPagedListAsync(input.PageNo, input.PageSize);
            return wmsPlaces;
        }
//        /// <summary>
//        /// åˆ†é¡µæŸ¥è¯¢åº“位信息
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("page")]
//        public async Task<PageResult<WmsPlaceOutput>> Page([FromQuery] WmsPlaceSearch input)
//        {
//            var wmsPlaces = await _wmsPlaceRep.DetachedEntities
//                .Where(!string.IsNullOrEmpty(input.Placecode), u => EF.Functions.Like(u.PlaceCode, $"%{input.Placecode.Trim()}%"))
//                .Where(input.Placestatus != null, u => u.PlaceStatus == input.Placestatus)
//                .Where(input.Areaid > 0, u => u.AreaId == input.Areaid)
//                .Where(input.Rowno != null, u => u.RowNo == input.Rowno)
//                .Where(input.Columnno != null, u => u.ColumnNo == input.Columnno)
//                .Where(input.Layerno != null, u => u.LayerNo == input.Layerno)
//                .Where(input.Aisle != null, u => u.Aisle == input.Aisle)
//                .Where(input.Islock != null, u => u.Islock == input.Islock)
//                .OrderBy(PageInputOrder.OrderBuilder<WmsPlaceSearch>(input))
//                .ProjectToType<WmsPlaceOutput>()
//                .ToADPagedListAsync(input.PageNo, input.PageSize);
//            return wmsPlaces;
//        }
        /// <summary>
        /// å¢žåŠ åº“ä½ä¿¡æ¯
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
//        /// <summary>
//        /// å¢žåŠ åº“ä½ä¿¡æ¯
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        //[HttpPost("add")]
//        //public async Task Add(AddWmsPlaceInput input)
//        //{
//        //    //获取库区信息
//        //    var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.Id == input.Areaid);
//        //    if (wmsArea.AreaType == AreaType.LITIKU)
//        //    {
//        //        var wmsPlace = input.Adapt<WmsPlace>();
//        //        for (int a = 1; a == 1; a++)
//        //        {
//        //            for (int t = 1; t <= wmsPlace.RowNo; t++)   //循环排
//        //            {
//        //                for (int i = 1; i <= wmsPlace.ColumnNo; i++)   //循环列
//        //                {
//        //                    for (int j = 1; j <= wmsPlace.LayerNo; j++)  //循环层
//        //                    {
//        //                        var model = new WmsPlace();
//        //                        model.PlaceStatus = PlaceStatus.KONGXIAN;
//        //                        model.AreaId = wmsPlace.AreaId;
//        //                        model.RowNo = t;
//        //                        model.ColumnNo = i;
//        //                        model.LayerNo = j;
//        //                        model.DeepcellNo = 1;
//        //                        model.Aisle = a;
//        //                        model.Islock = YesOrNot.N;
//        //                        model.Length = new decimal(1.2);
//        //                        model.Width = new decimal(1.5);
//        //                        model.Height = new decimal(1.8);
//        //                        model.MaxWeight = new decimal(2.8);
//        //                        model.HeightLevel = Heightlevel.DI;
//        //                        model.Priority = 0;
//        //                        model.AgvCode = "";
//        //                        model.PlaceCode = String.Format("{0}{1}{2}{3}{4}", wmsArea.AreaDesc, a.ToString("00"), t.ToString("00"), i.ToString("00"), j.ToString("00"));
//        //                        var isExit = await _wmsPlaceRep.AnyAsync(n => n.PlaceCode == model.PlaceCode);
//        //                        if (!isExit) await _wmsPlaceRep.InsertAsync(model);
//        //                    }
//        //                }
//        //            }
//        //        }
//        //    }
//        //    else
//        //    {
//        //        var wmsPlace = input.Adapt<WmsPlace>();
//        //        for (int t = 1; t <= wmsPlace.RowNo; t++)   //循环排
//        //        {
//        //            for (int i = 1; i <= wmsPlace.ColumnNo; i++)   //循环列
//        //            {
//        //                for (int j = 1; j <= wmsPlace.LayerNo; j++)  //循环层
//        //                {
//        //                    var model = new WmsPlace();
//        //                    model.PlaceStatus = PlaceStatus.KONGXIAN;
//        //                    model.AreaId = wmsPlace.AreaId;
//        //                    model.RowNo = t;
//        //                    model.ColumnNo = i;
//        //                    model.LayerNo = j;
//        //                    model.DeepcellNo = 1;
//        //                    model.Aisle = wmsPlace.Aisle;
//        //                    model.Islock = YesOrNot.N;
//        //                    model.Length = new decimal(1.2);
//        //                    model.Width = new decimal(1.5);
//        //                    model.Height = new decimal(1.8);
//        //                    model.MaxWeight = new decimal(2.8);
//        //                    model.HeightLevel = Heightlevel.DI;
//        //                    model.Priority = 0;
//        //                    model.AgvCode = "";
//        //                    model.PlaceCode = String.Format("{0}{1}{2}{3}", wmsArea.AreaDesc, t.ToString("00"), i.ToString("00"), j.ToString("00"));
//        //                    var isExit = await _wmsPlaceRep.AnyAsync(n => n.PlaceCode == model.PlaceCode);
//        //                    if (!isExit) await _wmsPlaceRep.InsertAsync(model);
//        //                }
//        //            }
//        //        }
//        //    }
//        //}
//        /// <summary>
//        /// å¢žåŠ åº“ä½ä¿¡æ¯
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
        //[HttpPost("add")]
        //public async Task Add(AddWmsPlaceInput input)
//        public async Task AddNew(AddWmsPlaceInput input)
        //{
        //    //获取库区信息
        //    var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.Id == input.Areaid);
        //    if (wmsArea.AreaType == AreaType.LITIKU)
        //    {
//            var isExit = await _wmsPlaceRep.AnyAsync(n => n.PlaceCode == input.Placecode);
//            if (isExit) throw Oops.Oh("存在的相同的库位编码!");
        //        var wmsPlace = input.Adapt<WmsPlace>();
        //        for (int a = 1; a == 1; a++)
//            wmsPlace.AgvCode = "Y/N";
//            wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
//            wmsPlace.Islock = YesOrNot.N;
//            wmsPlace.EmptyContainer = YesOrNot.N;
//            if (input.Heightlevel==0) {
//                wmsPlace.HeightLevel = Heightlevel.DI;
//            }
//            await _wmsPlaceRep.InsertAsync(wmsPlace);
//        }
//        /// <summary>
//        /// åˆ é™¤åº“位信息
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("delete")]
//        public async Task Delete(DeleteWmsPlaceInput input)
        //        {
        //            for (int t = 1; t <= wmsPlace.RowNo; t++)   //循环排
//            var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.Id == input.Id);
//            await _wmsPlaceRep.DeleteAsync(wmsPlace);
//        }
//        /// <summary>
//        /// æ‰¹é‡é”å®š
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("MoreLock")]
//        public async Task MoreLock(MoreLockInput input)
        //            {
        //                for (int i = 1; i <= wmsPlace.ColumnNo; i++)   //循环列
//            if (input.Id.Count <= 0) throw Oops.Oh("id不能为空!");
//            foreach (var item in input.Id)
        //                {
        //                    for (int j = 1; j <= wmsPlace.LayerNo; j++)  //循环层
        //                    {
        //                        var model = new WmsPlace();
        //                        model.PlaceStatus = PlaceStatus.KONGXIAN;
        //                        model.AreaId = wmsPlace.AreaId;
        //                        model.RowNo = t;
        //                        model.ColumnNo = i;
        //                        model.LayerNo = j;
        //                        model.DeepcellNo = 1;
        //                        model.Aisle = a;
        //                        model.Islock = YesOrNot.N;
        //                        model.Length = new decimal(1.2);
        //                        model.Width = new decimal(1.5);
        //                        model.Height = new decimal(1.8);
        //                        model.MaxWeight = new decimal(2.8);
        //                        model.HeightLevel = Heightlevel.DI;
        //                        model.Priority = 0;
        //                        model.AgvCode = "";
        //                        model.PlaceCode = String.Format("{0}{1}{2}{3}{4}", wmsArea.AreaDesc, a.ToString("00"), t.ToString("00"), i.ToString("00"), j.ToString("00"));
        //                        var isExit = await _wmsPlaceRep.AnyAsync(n => n.PlaceCode == model.PlaceCode);
        //                        if (!isExit) await _wmsPlaceRep.InsertAsync(model);
//                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.Id == item);
//                if (wmsPlace == null) throw Oops.Oh("库位信息不存在!");
//                wmsPlace.Islock = YesOrNot.Y;
//                await _wmsPlaceRep.UpdateAsync(wmsPlace, ignoreNullValues: true);
        //                    }
        //                }
        //            }
        //        }
        //    }
        //    else
//        /// <summary>
//        /// æ‰¹é‡è§£é”
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("MoreUnlock")]
//        public async Task MoreUnlock(MoreLockInput input)
        //    {
//            if (input.Id.Count <= 0) throw Oops.Oh("id不能为空!");
//            foreach (var item in input.Id)
//            {
//                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.Id == item);
//                if (wmsPlace == null) throw Oops.Oh("库位信息不存在!");
//                wmsPlace.Islock = YesOrNot.N;
//                await _wmsPlaceRep.UpdateAsync(wmsPlace, ignoreNullValues: true);
//            }
//        }
//        /// <summary>
//        /// æ›´æ–°åº“位信息
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpPost("edit")]
//        public async Task Update(UpdateWmsPlaceInput input)
//        {
//            var isExist = await _wmsPlaceRep.AnyAsync(u => u.Id == input.Id, false);
//            if (!isExist) throw Oops.Oh(ErrorCode.D3000);
        //        var wmsPlace = input.Adapt<WmsPlace>();
        //        for (int t = 1; t <= wmsPlace.RowNo; t++)   //循环排
//            await _wmsPlaceRep.UpdateAsync(wmsPlace, ignoreNullValues: true);
//        }
//        /// <summary>
//        /// èŽ·å–åº“ä½ä¿¡æ¯
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("detail")]
//        public async Task<WmsPlaceOutput> Get([FromQuery] QueryeWmsPlaceInput input)
        //        {
        //            for (int i = 1; i <= wmsPlace.ColumnNo; i++)   //循环列
//            return (await _wmsPlaceRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsPlaceOutput>();
//        }
//        /// <summary>
//        /// èŽ·å–åº“ä½ä¿¡æ¯åˆ—è¡¨
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("list")]
//        public async Task<List<WmsPlaceOutput>> List([FromQuery] WmsPlaceInput input)
        //            {
        //                for (int j = 1; j <= wmsPlace.LayerNo; j++)  //循环层
//            return await _wmsPlaceRep.DetachedEntities.ProjectToType<WmsPlaceOutput>().ToListAsync();
//        }
//        /// <summary>
//        /// èŽ·å–WmsArea列表
//        /// </summary>
//        /// <returns></returns>
//        [HttpGet("fkWmsArea")]
//        public async Task<dynamic> FkWmsAreaList()
        //                {
        //                    var model = new WmsPlace();
        //                    model.PlaceStatus = PlaceStatus.KONGXIAN;
        //                    model.AreaId = wmsPlace.AreaId;
        //                    model.RowNo = t;
        //                    model.ColumnNo = i;
        //                    model.LayerNo = j;
        //                    model.DeepcellNo = 1;
        //                    model.Aisle = wmsPlace.Aisle;
        //                    model.Islock = YesOrNot.N;
        //                    model.Length = new decimal(1.2);
        //                    model.Width = new decimal(1.5);
        //                    model.Height = new decimal(1.8);
        //                    model.MaxWeight = new decimal(2.8);
        //                    model.HeightLevel = Heightlevel.DI;
        //                    model.Priority = 0;
        //                    model.AgvCode = "";
        //                    model.PlaceCode = String.Format("{0}{1}{2}{3}", wmsArea.AreaDesc, t.ToString("00"), i.ToString("00"), j.ToString("00"));
        //                    var isExit = await _wmsPlaceRep.AnyAsync(n => n.PlaceCode == model.PlaceCode);
        //                    if (!isExit) await _wmsPlaceRep.InsertAsync(model);
//            var list = await _wmsAreaRep.DetachedEntities.ToListAsync();
//            return list.Select(e => new { Code = e.Id, Name = e.AreaName });
//        }
//        /// <summary>
//        /// èŽ·å–ç†ŸåŒ–åº“å··é“
//        /// </summary>
//        /// <returns></returns>
//        [HttpGet("GetFAisle")]
//        public async Task<object> GetFAisle()
//        {
//            var area = await _wmsAreaRep.FirstOrDefaultAsync(n => n.AreaStatus == CommonStatus.ENABLE && n.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && n.AreaType == AreaType.LITIKU);
//            var objList = await _wmsPlaceRep.Where(n => n.AreaId == area.Id).OrderBy(n => n.Aisle).Select(n => n.Aisle).Distinct().ToArrayAsync();
//            for (int i = 0; i < objList.Length - 1; i++)
//            {
//                for (int j = 0; j < objList.Length - 1; j++)
//                {
//                    int k = j + 1;
//                    if (objList[j] > objList[k])
//                    {
//                        var temp = objList[k];
//                        objList[k] = objList[j];
//                        objList[j] = temp;
        //                }
        //            }
//            }
//            return objList;
        //        }
        //    }
        //}
        /// <summary>
        /// å¢žåŠ åº“ä½ä¿¡æ¯
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("add")]
        public async Task AddNew(AddWmsPlaceInput input)
        {
            var isExit = await _wmsPlaceRep.AnyAsync(n => n.PlaceCode == input.Placecode);
            if (isExit) throw Oops.Oh("存在的相同的库位编码!");
            var wmsPlace = input.Adapt<WmsPlace>();
            wmsPlace.AgvCode = "Y/N";
            wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
            wmsPlace.Islock = YesOrNot.N;
            wmsPlace.EmptyContainer = YesOrNot.N;
            if (input.Heightlevel==0) {
                wmsPlace.HeightLevel = Heightlevel.DI;
            }
            await _wmsPlaceRep.InsertAsync(wmsPlace);
        }
        /// <summary>
        /// åˆ é™¤åº“位信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("delete")]
        public async Task Delete(DeleteWmsPlaceInput input)
        {
            var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            await _wmsPlaceRep.DeleteAsync(wmsPlace);
        }
        /// <summary>
        /// æ‰¹é‡é”å®š
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("MoreLock")]
        public async Task MoreLock(MoreLockInput input)
        {
            if (input.Id.Count <= 0) throw Oops.Oh("id不能为空!");
            foreach (var item in input.Id)
            {
                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.Id == item);
                if (wmsPlace == null) throw Oops.Oh("库位信息不存在!");
                wmsPlace.Islock = YesOrNot.Y;
                await _wmsPlaceRep.UpdateAsync(wmsPlace, ignoreNullValues: true);
            }
        }
        /// <summary>
        /// æ‰¹é‡è§£é”
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("MoreUnlock")]
        public async Task MoreUnlock(MoreLockInput input)
        {
            if (input.Id.Count <= 0) throw Oops.Oh("id不能为空!");
            foreach (var item in input.Id)
            {
                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.Id == item);
                if (wmsPlace == null) throw Oops.Oh("库位信息不存在!");
                wmsPlace.Islock = YesOrNot.N;
                await _wmsPlaceRep.UpdateAsync(wmsPlace, ignoreNullValues: true);
            }
        }
        /// <summary>
        /// æ›´æ–°åº“位信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("edit")]
        public async Task Update(UpdateWmsPlaceInput input)
        {
            var isExist = await _wmsPlaceRep.AnyAsync(u => u.Id == input.Id, false);
            if (!isExist) throw Oops.Oh(ErrorCode.D3000);
            var wmsPlace = input.Adapt<WmsPlace>();
            await _wmsPlaceRep.UpdateAsync(wmsPlace, ignoreNullValues: true);
        }
        /// <summary>
        /// èŽ·å–åº“ä½ä¿¡æ¯
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("detail")]
        public async Task<WmsPlaceOutput> Get([FromQuery] QueryeWmsPlaceInput input)
        {
            return (await _wmsPlaceRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsPlaceOutput>();
        }
        /// <summary>
        /// èŽ·å–åº“ä½ä¿¡æ¯åˆ—è¡¨
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("list")]
        public async Task<List<WmsPlaceOutput>> List([FromQuery] WmsPlaceInput input)
        {
            return await _wmsPlaceRep.DetachedEntities.ProjectToType<WmsPlaceOutput>().ToListAsync();
        }
        /// <summary>
        /// èŽ·å–WmsArea列表
        /// </summary>
        /// <returns></returns>
        [HttpGet("fkWmsArea")]
        public async Task<dynamic> FkWmsAreaList()
        {
            var list = await _wmsAreaRep.DetachedEntities.ToListAsync();
            return list.Select(e => new { Code = e.Id, Name = e.AreaName });
        }
        /// <summary>
        /// èŽ·å–ç†ŸåŒ–åº“å··é“
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetFAisle")]
        public async Task<object> GetFAisle()
        {
            var area = await _wmsAreaRep.FirstOrDefaultAsync(n => n.AreaStatus == CommonStatus.ENABLE && n.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && n.AreaType == AreaType.LITIKU);
            var objList = await _wmsPlaceRep.Where(n => n.AreaId == area.Id).OrderBy(n => n.Aisle).Select(n => n.Aisle).Distinct().ToArrayAsync();
            for (int i = 0; i < objList.Length - 1; i++)
            {
                for (int j = 0; j < objList.Length - 1; j++)
                {
                    int k = j + 1;
                    if (objList[j] > objList[k])
                    {
                        var temp = objList[k];
                        objList[k] = objList[j];
                        objList[j] = temp;
                    }
                }
            }
            return objList;
        }
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WcsToWms/WareWcsToWmsService.cs
@@ -1,715 +1,186 @@
using Furion;
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 Admin.NET.Core;
using Yitter.IdGenerator;
using StackExchange.Redis;
//using Furion;
//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 Admin.NET.Core;
//using Yitter.IdGenerator;
//using StackExchange.Redis;
namespace Admin.NET.Application
{
    /// <summary>
    /// WCS调用服务
    /// </summary>
    [ApiDescriptionSettings("WCS调用服务", Name = "WareWcsToWmsService", Order = 100)]
    [Route("api/[Controller]")]
    public class WareWcsToWmsService : IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsOrder, MasterDbContextLocator> _wmsOrderRep;
        private readonly IRepository<WmsOrderDetails, MasterDbContextLocator> _wmsOrderDetailsRep;
        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
        private readonly IRepository<LesPackWarehouse, MasterDbContextLocator> _lesPackWarehouseRep;
        private readonly IRepository<LesDeviceWaring, MasterDbContextLocator> _lesDeviceWaringRep;
        /// <summary>
        /// æž„造函数
        /// </summary>
        public WareWcsToWmsService(
            IRepository<WmsOrder, MasterDbContextLocator> wmsOrderRep,
            IRepository<WmsOrderDetails, MasterDbContextLocator> wmsOrderDetailsRep,
            IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep,
            IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep,
            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
            IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRep,
            IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
            IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
            IRepository<LesPackWarehouse, MasterDbContextLocator> lesPackWarehouseRep,
            IRepository<LesDeviceWaring, MasterDbContextLocator> lesDeviceWaringRep
        )
        {
            _wmsOrderRep = wmsOrderRep;
            _wmsOrderDetailsRep = wmsOrderDetailsRep;
            _wmsTaskRep = wmsTaskRep;
            _wmsMaterialContainerRep = wmsMaterialContainerRep;
            _wmsPlaceRep = wmsPlaceRep;
            _wmsContainerPlaceRep = wmsContainerPlaceRep;
            _wmsMaterialStockRep = wmsMaterialStockRep;
            _wmsContainerRep = wmsContainerRep;
            _lesPackWarehouseRep = lesPackWarehouseRep;
            _lesDeviceWaringRep = lesDeviceWaringRep;
        }
        /// <summary>
        /// å®šæ—¶æŸ¥è¯¢WCS可以下发的出入库任务(10条)
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetSendTask")]
        [AllowAnonymous]
        public async Task<List<SendTaskDetailOutput>> GetSendTask()
        {
            var outputList = new List<SendTaskDetailOutput>();
            var alllist = await _wmsTaskRep.DetachedEntities
                .Where(z => z.IsRead == true)
                .Take(10)
                .OrderByDescending(n => n.TaskLevel)
                .OrderBy(p => p.CreatedTime).ToListAsync();
            foreach (var item in alllist)
            {
                var sendTaskDetail = new SendTaskDetailOutput(); //任务详情
                sendTaskDetail.TaskNo = item.TaskNo;
                if (item.TaskType == TaskType.RUKU) sendTaskDetail.SourcePlace = item.ToPlace;
                else sendTaskDetail.SourcePlace = item.SourcePlace;
                sendTaskDetail.Aisle = item.Aisle;
                sendTaskDetail.TaskType = item.TaskType;
                sendTaskDetail.TaskLevel = item.TaskLevel;
                sendTaskDetail.ContainerCode = item.ContainerCode;
                sendTaskDetail.TaskStatus = item.TaskStatus;
                outputList.Add(sendTaskDetail);
                //item.IsRead=false;
                //item.TaskStatus = TaskStatusEnum.DAIZHIXING;
                //await _wmsTaskRep.UpdateAsync(item);
            }
            return outputList;
        }
        /// <summary>
        /// æ›´æ–°ä»»åŠ¡ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpPost("UpdateTask")]
        [UnitOfWork]
        [AllowAnonymous]
        public async Task UpdateTask([FromBody] UpdateTaskInput input)
        {
            //根据任务号查询任务信息
            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(z => z.TaskNo == input.TaskNo);
            if (wmsTask == null) throw Oops.Oh(errorMessage: "任务不存在!");
            wmsTask.TaskDodeviceStatus = input.TaskDodeviceStatus;
            wmsTask.TaskStatus = TaskStatusEnum.ZHIXINGZHONG;
            wmsTask.IsRead = false;
            WmsPlace wmsPlace = new WmsPlace();
            //判断入库还是出库
            if (wmsTask.TaskType == TaskType.RUKU)
            {
                //库位信息
                wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(z => z.PlaceCode == wmsTask.ToPlace);
            }
            else if (wmsTask.TaskType == TaskType.CHUKU)
            {
                //库位信息
                wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(z => z.PlaceCode == wmsTask.SourcePlace);
            }
            if (wmsPlace == null) throw Oops.Oh(errorMessage: "库位不存在!");
            // æŸ¥è¯¢æ‰˜ç›˜ä¿¡æ¯
            var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
            if (wmsContainer == null) throw Oops.Oh("托盘不存在!");
            //入库称重
            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_RKCZ)
//namespace Admin.NET.Application
            //{
            //}
            //入库输送线开始
            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_RSSX)
//    /// <summary>
//    /// WCS调用服务
//    /// </summary>
//    [ApiDescriptionSettings("WCS调用服务", Name = "WareWcsToWmsService", Order = 100)]
//    [Route("api/[Controller]")]
//    public class WareWcsToWmsService : IDynamicApiController, ITransient
            //{
            //}
            //入库输送线结束
            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_RSSX)
            //{
            //}
            //入库RGV开始
            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_RGV)
            //{
            //}
            //入库RGV结束
            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_RGV)
            //{
            //}
            //入库开始
            if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_DDJ)
            {
                // æ›´æ–°åº“位状态
                wmsPlace.PlaceStatus = PlaceStatus.DAIRU;
                await _wmsPlaceRep.UpdateAsync(wmsPlace);
            }
            //入库完成
            if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_DDJ)
            {
                //首先更新任务状态完成
                wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
                //更新设备状态
                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
                // æ›´æ–°æ‰˜ç›˜çŠ¶æ€ä¸ºâ€œåº“ä½â€
                wmsContainer.ContainerStatus = ContainerStatus.KUWEI;
                await _wmsContainerRep.UpdateAsync(wmsContainer);
                //库位信息
                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
                // æ›´æ–°åº“位状态为“存货”
                wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
                if (wmsTask.Description == "空托") wmsPlace.EmptyContainer = YesOrNot.Y;
                else wmsPlace.EmptyContainer = YesOrNot.N;
                await _wmsPlaceRep.UpdateAsync(wmsPlace);
                // åˆ›å»ºæ‰˜ç›˜å·åº“位关系表
                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();
                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.WULIAO;
                        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 = item.BindQuantity,
                            PlaceCode = wmsPlace.PlaceCode,
                            ContainerId = wmsContainer.Id,
                            ContainerCode = wmsContainer.ContainerCode,
                            AreaId = wmsPlace.AreaId,
                            Source = RuKuSourceEnum.WULIAO
                        };
                        await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock);
                    }
                }
                // ç©ºæ–™ç®±å…¥åº“
                if (wmsTask.Description == "空托")
                {
                    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);
                }
            }
            //出库堆垛机完成,执行库存,库位,托盘对应关系进行更新
            else if (wmsTask.TaskType == TaskType.CHUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_DDJ)
            {
                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
                if (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 wmsMaterialStockList = await _wmsMaterialStockRep.DetachedEntities.Where(u => u.ContainerCode == wmsTask.ContainerCode).ToListAsync();
                if (wmsMaterialStockList.Count <= 0) throw Oops.Oh("库存数据异常!");
                ////查询物料与托盘组盘关系(状态:正常)
                var wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsTask.ContainerCode
                    && p.BindStatus == CommonStatus.ENABLE && p.OrderNo == wmsTask.OrderNo).ToListAsync();
                //判断物料是否是空托,如果是空托直接删除,不是空托查询物料
                if (wmsMaterialContainerList.Count == 0)
                {
                    //删除库存
                    foreach (var item in wmsMaterialStockList)
                    {
                        await _wmsMaterialStockRep.DeleteAsync(item);
                    }
                    // æ›´æ–°æ‰˜ç›˜çŠ¶æ€ä¸ºâ€œç©ºé—²â€
                    wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
                }
                else
                {
                    //构建出库物料和周转箱号关系
                    var orderNo = "N/A";
                    if (wmsMaterialContainerList.Count > 0) orderNo = YitIdHelper.NextId().ToString();
                    foreach (var item in wmsMaterialContainerList)
                    {
                        //更新状态为”删除“
                        item.BindStatus = CommonStatus.DELETED;
                        await _wmsMaterialContainerRep.UpdateNowAsync(item);
                        //新增组盘绑定记录 æ­£å¸¸
                        var wmsMaterialContainer = item;
                        wmsMaterialContainer.Id = YitIdHelper.NextId();
                        wmsMaterialContainer.OrderNo = orderNo;
                        wmsMaterialContainer.BindStatus = CommonStatus.ENABLE;
                        await _wmsMaterialContainerRep.InsertNowAsync(wmsMaterialContainer);
                        //更改库存的库位号为N/A
                        foreach (var stock in wmsMaterialStockList)
                        {
                            stock.PlaceCode = "N/A";
                            await _wmsMaterialStockRep.UpdateAsync(stock);
                        }
                    }
                    wmsContainer.ContainerStatus = ContainerStatus.FENJIAN;
                }
                await _wmsContainerRep.UpdateAsync(wmsContainer);
                //更新库位状态为“空闲”
                wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
                wmsPlace.Islock = YesOrNot.N;
                wmsPlace.EmptyContainer = YesOrNot.N;
                await _wmsPlaceRep.UpdateAsync(wmsPlace);
                //更新周转箱号与库位关系为“删除”
                wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
                await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
            }
            if (wmsTask.TaskType == TaskType.CHUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_CSSX)
            {
                wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
            }
            else //移库
            {
                if (wmsTask.TaskType == TaskType.YIKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_DDJ)
                {
                    wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
                    wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
                    // èµ·ç‚¹åº“位信息
                    var SourcePlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.SourcePlace).FirstOrDefaultAsync();
                    SourcePlace.PlaceStatus = PlaceStatus.KONGXIAN;
                    await _wmsPlaceRep.UpdateAsync(SourcePlace);
                    //目标库位信息
                    var ToPlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.ToPlace).FirstOrDefaultAsync();
                    ToPlace.PlaceStatus = PlaceStatus.CUNHUO;
                    await _wmsPlaceRep.UpdateAsync(ToPlace);
                    //托盘库位关系表
                    var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == SourcePlace.Id && z.PlaceCode == SourcePlace.PlaceCode
                    && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE);
                    wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
                    await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
                    await _wmsContainerPlaceRep.InsertAsync(new WmsContainerPlace()
                    {
                        PlaceId = ToPlace.Id,
                        PlaceCode = ToPlace.PlaceCode,
                        ContainerId = wmsContainer.Id,
                        ContainerCode = wmsContainer.ContainerCode,
                        ContainerPlaceStatus = CommonStatus.ENABLE
                    });
                    //库存库位更新
                    var stockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.PlaceCode == SourcePlace.PlaceCode).FirstOrDefaultAsync();
                    if (stockModel != null)
                    {
                        stockModel.PlaceCode = ToPlace.PlaceCode;
                    }
                }
            }
            await _wmsTaskRep.UpdateAsync(wmsTask);
        }
        /// <summary>
        /// èŽ·å–åº“ä½ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpPost("GetPlace")]
        [AllowAnonymous]
        public async Task<GetPlaceOutput> GetPlace([FromBody] GetPlaceInput input)
        {
            //1.列 ä¼˜å…ˆ1排和4排 å±‚优先从下到上
            //2.保留10个内侧移库库位
            var taskModel = await _wmsTaskRep.Where(p => p.TaskNo == input.TaskNo).FirstOrDefaultAsync();
            if (taskModel == null) return new GetPlaceOutput() { TaskIsExist = false };
            if (taskModel.TaskStatus == TaskStatusEnum.CHEHUI || taskModel.TaskStatus == TaskStatusEnum.QUXIAO || taskModel.TaskStatus == TaskStatusEnum.WANCHENG || taskModel.TaskStatus == TaskStatusEnum.ZANTING)
            {
                throw Oops.Oh("任务状态未满足获取的库位条件");
            }
            taskModel.TaskStatus = TaskStatusEnum.ZHIXINGZHONG;
            //定义入库对象,移库对象
            var ToPlace = new WmsPlace();
            var SourcePlace = new WmsPlace();
            var rowNumber = 0;
            //入库流程
            if (taskModel.TaskType == TaskType.RUKU)
            {
                //防重操作
                if (taskModel != null && !string.IsNullOrEmpty(taskModel.ToPlace))
                {
                    ToPlace = await _wmsPlaceRep.Where(p => p.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && p.PlaceCode == taskModel.ToPlace).FirstOrDefaultAsync();
                    if (ToPlace.RowNo == GetOneRowByAisle(taskModel.Aisle) || ToPlace.RowNo == GetFourRowByAisle(taskModel.Aisle))
                    {
                        if (ToPlace.RowNo == GetOneRowByAisle(taskModel.Aisle))
                            rowNumber = GetTwoRowByAisle(taskModel.Aisle);
                        else
                            rowNumber = GetThreeRowByAisle(taskModel.Aisle);
                        SourcePlace = await _wmsPlaceRep.Where(p => p.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && p.Aisle == taskModel.Aisle && p.RowNo == rowNumber && p.ColumnNo == ToPlace.ColumnNo && p.LayerNo == ToPlace.LayerNo).FirstOrDefaultAsync();
                        if (SourcePlace != null && SourcePlace.PlaceStatus == PlaceStatus.CUNHUO)
                            return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode };
                    }
                    return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode };
                }
                //获取立体库可用库位
                var placeList = await _wmsPlaceRep.DetachedEntities.Where(z => z.PlaceStatus == PlaceStatus.KONGXIAN
                && z.Islock == YesOrNot.N && z.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN
                && z.WmsArea.AreaType == AreaType.LITIKU && z.Aisle == taskModel.Aisle).ProjectToType<WmsPlace>().ToListAsync();
                //获取当前立体库需要出库库位集合
                var placeCodeList = await _wmsTaskRep.DetachedEntities.Where(p => p.IsRead == true
                && p.TaskType == TaskType.CHUKU && p.Aisle == taskModel.Aisle).Select(n => n.SourcePlace).ToListAsync();
                var ckPlaceModelList = await _wmsPlaceRep.DetachedEntities.Where(z => placeCodeList.Contains(z.PlaceCode)
                && z.Islock == YesOrNot.N && z.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN
                && z.WmsArea.AreaType == AreaType.LITIKU && z.Aisle == taskModel.Aisle).ToListAsync();
                //配置文件中设置是否开启指定库位入库和移库操作
                //if (Convert.ToBoolean(App.Configuration["YiKuTestPalce:IsStart"]))
                //{
                //    var rukuPoint = App.Configuration["YiKuTestPalce:rukuPoint"].Split('.');  //入库起点
                //    var yikuPoint = App.Configuration["YiKuTestPalce:yikuPoint"].Split('.');  //移库起点
                //    ToPlace = placeList.Where(p => p.RowNo == Convert.ToInt32(rukuPoint[0])
                //    && p.ColumnNo == Convert.ToInt32(rukuPoint[1]) && p.LayerNo == Convert.ToInt32(rukuPoint[2])).FirstOrDefault();
                //    if (ToPlace != null)
                //    {
                //        ToPlace.PlaceStatus = PlaceStatus.DAIRU;
                //        await _wmsPlaceRep.UpdateAsync(ToPlace);
                //        taskModel.ToPlace = ToPlace.PlaceCode;
                //        taskModel.AreaName = ToPlace.WmsArea.AreaName;
                //        await _wmsTaskRep.UpdateAsync(taskModel);
                //        if (yikuPoint.Length > 1)
                //        {
                //            SourcePlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.RowNo == Convert.ToInt32(yikuPoint[0])
                //            && p.ColumnNo == Convert.ToInt32(yikuPoint[1]) && p.LayerNo == Convert.ToInt32(yikuPoint[2])
                //            && p.Aisle == taskModel.Aisle && p.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN
                //            && p.WmsArea.AreaType == AreaType.LITIKU
                //            );
                //        }
                //        return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode };
                //    }
                //}
                var maxColumn = placeList.Max(selector: n => n.ColumnNo);
                var maxLayerNo = 0;
                //先以列为进行循环判断
                for (int j = 1; j <= maxColumn; j++)
                {
                    //获取该列的最大层
                    if (placeList.Where(p => p.ColumnNo == j).Count() <= 1) continue;
                    maxLayerNo = placeList.Where(p => p.ColumnNo == j).Max(selector: n => n.LayerNo);
                    //循环每列每层的中列
                    //分配库位需要考虑外侧是否有出库任务,有的话就没有执行
                    for (int f = 1; f <= maxLayerNo; f++)
                    {
                        var model = placeList.FirstOrDefault(p => p.RowNo == GetOneRowByAisle(taskModel.Aisle) && p.ColumnNo == j && p.LayerNo == f);
                        var ckmodel = ckPlaceModelList.FirstOrDefault(p => p.RowNo == GetTwoRowByAisle(taskModel.Aisle) && p.ColumnNo == j && p.LayerNo == f);
                        if (model != null && ckmodel == null)
                        {
                            ToPlace = model;
                            break;
                        }
                    }
                    if (!string.IsNullOrEmpty(ToPlace.PlaceCode)) break;
                }
                if (string.IsNullOrEmpty(ToPlace.PlaceCode)) throw Oops.Oh("暂无可以库位!");
                //进行库位和任务的更新
                ToPlace.PlaceStatus = PlaceStatus.DAIRU;
                await _wmsPlaceRep.UpdateAsync(ToPlace);
                taskModel.ToPlace = ToPlace.PlaceCode;
                taskModel.AreaName = ToPlace.WmsArea.AreaName;
                await _wmsTaskRep.UpdateAsync(taskModel);
                if (SourcePlace == null || string.IsNullOrEmpty(SourcePlace.PlaceCode)) return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode };
                else return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode };
            }
            //出库流程
            if (taskModel.TaskType == TaskType.CHUKU)
            {
                //需要判断下库位是否已经进行移库操作,需要通过托盘编号进行重新查找
                var containerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == taskModel.ContainerCode
                && p.ContainerPlaceStatus == CommonStatus.ENABLE);
                if (containerPlace != null && containerPlace.PlaceCode != taskModel.SourcePlace)
                {
                    ToPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == containerPlace.PlaceCode);
                    taskModel.SourcePlace = containerPlace.PlaceCode;
                }
                else
                {
                    ToPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == taskModel.SourcePlace);
                }
                //进行库位和任务的更新
                ToPlace.PlaceStatus = PlaceStatus.DAICHU;
                await _wmsPlaceRep.UpdateAsync(ToPlace);
                taskModel.ToPlace = taskModel.Aisle.ToString();
                await _wmsTaskRep.UpdateAsync(taskModel);
                if (SourcePlace == null || string.IsNullOrEmpty(SourcePlace.PlaceCode)) return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode };
                else return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode };
            }
            else
            {
                throw Oops.Oh("任务异常" + taskModel.TaskNo);
            }
        }
        /// <summary>
        /// åˆ›å»ºç§»åº“任务
        /// </summary>
        /// <returns></returns>
        [HttpPost("CreateYKTask")]
        [UnitOfWork]
        [AllowAnonymous]
        public async Task<GetYiKuPlaceOutput> CreateRelocation(CreateRelocationInput input)
        {
            var placeModel = await _wmsPlaceRep.Where(p => p.PlaceCode == input.SourcePlace).ProjectToType<WmsPlace>().FirstOrDefaultAsync();
            if (placeModel == null) throw Oops.Oh("库位数据异常!");
            placeModel.PlaceStatus = PlaceStatus.DAICHU;
            await _wmsPlaceRep.UpdateAsync(placeModel);
            //查询组盘单据
            var containerPlaceModel = await _wmsContainerPlaceRep.Where(p => p.PlaceCode == input.SourcePlace && p.ContainerPlaceStatus == CommonStatus.ENABLE).FirstOrDefaultAsync();
            if (containerPlaceModel == null) throw Oops.Oh("移库库位托盘数据异常!");
            var materialContainer = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == containerPlaceModel.ContainerCode && p.BindStatus == CommonStatus.ENABLE).FirstOrDefaultAsync();
            if (materialContainer == null) throw Oops.Oh("组盘数据异常!");
            //获取空闲库位集合
            var placeList = await _wmsPlaceRep.DetachedEntities.Where(z => z.PlaceStatus == PlaceStatus.KONGXIAN
            && z.Islock == YesOrNot.N && z.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN
            && z.WmsArea.AreaType == AreaType.LITIKU && z.Aisle == input.Aisle).ToListAsync();
            if (placeList.Count == 0) throw Oops.Oh("无可移库库位!");
            //定义目标点
            var ToPlaceModel = new WmsPlace();
            var rowNumber = 0;
            //1.推荐外侧库位
            var wcPlaceList = placeList.Where(p => (p.RowNo == GetOneRowByAisle(placeModel.Aisle) || p.RowNo == GetFourRowByAisle(placeModel.Aisle))).ToList();
            if (placeModel.Aisle == 11)
            {
                wcPlaceList = placeList.Where(p => (p.RowNo == GetOneRowByAisle(placeModel.Aisle) || p.RowNo == GetThreeRowByAisle(placeModel.Aisle))).ToList();
            }
            //定义最优库位集合
            var zyPlaceList = new List<WmsPlace>();
            //循环判断对应的2,3是有货
            foreach (var item in wcPlaceList)
            {
                if (placeModel.Aisle == 11)
                {
                    if (item.RowNo == GetOneRowByAisle(placeModel.Aisle))
                    {
                        zyPlaceList.Add(item);
                    }
                    if (item.RowNo == GetThreeRowByAisle(placeModel.Aisle))
                    {
                        rowNumber = GetTwoRowByAisle(placeModel.Aisle);
                        var dypalceModel = placeList.Where(p => p.RowNo == rowNumber && p.ColumnNo == item.ColumnNo && p.LayerNo == item.LayerNo).FirstOrDefault();
                        if (dypalceModel != null)
                            zyPlaceList.Add(item);
                    }
                }
                else
                {
                    if (item.RowNo == GetOneRowByAisle(placeModel.Aisle) || item.RowNo == GetFourRowByAisle(placeModel.Aisle))
                    {
                        if (item.RowNo == GetOneRowByAisle(placeModel.Aisle))
                            rowNumber = GetTwoRowByAisle(placeModel.Aisle);
                        else
                            rowNumber = GetThreeRowByAisle(placeModel.Aisle);
                        var dypalceModel = placeList.Where(p => p.RowNo == rowNumber && p.ColumnNo == item.ColumnNo && p.LayerNo == item.LayerNo).FirstOrDefault();
                        if (dypalceModel != null)
                            zyPlaceList.Add(item);
                    }
                }
            }
            if (zyPlaceList.Count != 0)
            {
                //获取路径最短的库位 ä½¿ç”¨äºŒåˆ†æ³•
                var mindModel = zyPlaceList.Where(p => p.ColumnNo == placeModel.ColumnNo).FirstOrDefault();
                var leftModel = zyPlaceList.Where(p => p.ColumnNo < placeModel.ColumnNo).OrderByDescending(p => p.ColumnNo).FirstOrDefault();
                var rightModel = zyPlaceList.Where(p => p.ColumnNo > placeModel.ColumnNo).OrderBy(p => p.ColumnNo).FirstOrDefault();
                if (mindModel != null) ToPlaceModel = mindModel;
                else if (leftModel == null) ToPlaceModel = rightModel;
                else if (rightModel == null) ToPlaceModel = leftModel;
                else if ((placeModel.ColumnNo - leftModel.ColumnNo) > (rightModel.ColumnNo - placeModel.ColumnNo)) ToPlaceModel = rightModel;
                else ToPlaceModel = leftModel;
            }
            if (string.IsNullOrEmpty(ToPlaceModel.PlaceCode))
            {
                //2.次优库位集合
                //次优2,3排库位
                var cyPlace = placeList.Where(p => (p.RowNo == GetTwoRowByAisle(placeModel.Aisle) || p.RowNo == GetThreeRowByAisle(placeModel.Aisle))).OrderByDescending(p => p.ColumnNo).OrderBy(p => p.LayerNo).ToList();
                if (placeModel.Aisle == 11)
                {
                    cyPlace = placeList.Where(p => p.RowNo == GetTwoRowByAisle(placeModel.Aisle)).OrderByDescending(p => p.ColumnNo).OrderBy(p => p.LayerNo).ToList();
                }
                if (cyPlace.Count > 0)
                {
                    //获取路径最短的库位 ä½¿ç”¨äºŒåˆ†æ³•
                    var mindModel = cyPlace.Where(p => p.ColumnNo == placeModel.ColumnNo).OrderByDescending(p => p.ColumnNo).FirstOrDefault();
                    var leftModel = cyPlace.Where(p => p.ColumnNo < placeModel.ColumnNo).OrderByDescending(p => p.ColumnNo).FirstOrDefault();
                    var rightModel = cyPlace.Where(p => p.ColumnNo > placeModel.ColumnNo).OrderBy(p => p.ColumnNo).FirstOrDefault();
                    if (mindModel != null) ToPlaceModel = mindModel;
                    else if (leftModel == null) ToPlaceModel = rightModel;
                    else if (rightModel == null) ToPlaceModel = leftModel;
                    else if ((placeModel.ColumnNo - leftModel.ColumnNo) > (rightModel.ColumnNo - placeModel.ColumnNo)) ToPlaceModel = rightModel;
                    else ToPlaceModel = leftModel;
                }
            }
            ToPlaceModel.PlaceStatus = PlaceStatus.DAIRU;
            await _wmsPlaceRep.UpdateAsync(ToPlaceModel);
            //创建移库任务
            var newWmsTask = new WmsTask()
            {
                //TaskNo = _commonOrderServiceRep.GetFYKOrderNo(),
                TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(),
                TaskModel = TaskModel.QUANZIDONG,
                TaskType = TaskType.YIKU,
                TaskLevel = 5,
                TaskStatus = TaskStatusEnum.WEIZHIXING,
                OrderNo = materialContainer.OrderNo,
                OrderDetailsId = materialContainer.OrderDetailsId,
                ContainerCode = materialContainer.ContainerCode,
                SourcePlace = placeModel.PlaceCode,
                ToPlace = ToPlaceModel.PlaceCode,
                AreaName = placeModel.WmsArea.AreaName,
                IsRead = true, //WCS是否可以读取
                SendTimes = 1, //发送次数
                Aisle = placeModel.Aisle,
                Dodevicetype = DodeviceType.AGV,
                TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX,
            };
            await _wmsTaskRep.InsertAsync(newWmsTask);
            return new GetYiKuPlaceOutput()
            {
                ToPlace = ToPlaceModel.PlaceCode,
                TaskNo = newWmsTask.TaskNo,
            };
        }
//        private readonly IRepository<WmsOrder, MasterDbContextLocator> _wmsOrderRep;
//        private readonly IRepository<WmsOrderDetails, MasterDbContextLocator> _wmsOrderDetailsRep;
//        private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
//        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
//        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
//        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
//        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
//        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
//        private readonly IRepository<LesPackWarehouse, MasterDbContextLocator> _lesPackWarehouseRep;
//        private readonly IRepository<LesDeviceWaring, MasterDbContextLocator> _lesDeviceWaringRep;
        ///// <summary>
        ///// å¼ºåˆ¶å®Œæˆ
//        /// æž„造函数
//        /// </summary>
//        public WareWcsToWmsService(
//            IRepository<WmsOrder, MasterDbContextLocator> wmsOrderRep,
//            IRepository<WmsOrderDetails, MasterDbContextLocator> wmsOrderDetailsRep,
//            IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep,
//            IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep,
//            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
//            IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRep,
//            IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
//            IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
//            IRepository<LesPackWarehouse, MasterDbContextLocator> lesPackWarehouseRep,
//            IRepository<LesDeviceWaring, MasterDbContextLocator> lesDeviceWaringRep
//        )
//        {
//            _wmsOrderRep = wmsOrderRep;
//            _wmsOrderDetailsRep = wmsOrderDetailsRep;
//            _wmsTaskRep = wmsTaskRep;
//            _wmsMaterialContainerRep = wmsMaterialContainerRep;
//            _wmsPlaceRep = wmsPlaceRep;
//            _wmsContainerPlaceRep = wmsContainerPlaceRep;
//            _wmsMaterialStockRep = wmsMaterialStockRep;
//            _wmsContainerRep = wmsContainerRep;
//            _lesPackWarehouseRep = lesPackWarehouseRep;
//            _lesDeviceWaringRep = lesDeviceWaringRep;
//        }
//        /// <summary>
//        /// å®šæ—¶æŸ¥è¯¢WCS可以下发的出入库任务(10条)
        ///// </summary>
        ///// <returns></returns>
        //[HttpPost("Finish")]
//        [HttpGet("GetSendTask")]
//        [AllowAnonymous]
//        public async Task<List<SendTaskDetailOutput>> GetSendTask()
//        {
//            var outputList = new List<SendTaskDetailOutput>();
//            var alllist = await _wmsTaskRep.DetachedEntities
//                .Where(z => z.IsRead == true)
//                .Take(10)
//                .OrderByDescending(n => n.TaskLevel)
//                .OrderBy(p => p.CreatedTime).ToListAsync();
//            foreach (var item in alllist)
//            {
//                var sendTaskDetail = new SendTaskDetailOutput(); //任务详情
//                sendTaskDetail.TaskNo = item.TaskNo;
//                if (item.TaskType == TaskType.RUKU) sendTaskDetail.SourcePlace = item.ToPlace;
//                else sendTaskDetail.SourcePlace = item.SourcePlace;
//                sendTaskDetail.Aisle = item.Aisle;
//                sendTaskDetail.TaskType = item.TaskType;
//                sendTaskDetail.TaskLevel = item.TaskLevel;
//                sendTaskDetail.ContainerCode = item.ContainerCode;
//                sendTaskDetail.TaskStatus = item.TaskStatus;
//                outputList.Add(sendTaskDetail);
//                //item.IsRead=false;
//                //item.TaskStatus = TaskStatusEnum.DAIZHIXING;
//                //await _wmsTaskRep.UpdateAsync(item);
//            }
//            return outputList;
//        }
//        /// <summary>
//        /// æ›´æ–°ä»»åŠ¡ä¿¡æ¯
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("UpdateTask")]
        //[UnitOfWork]
        //[AllowAnonymous]
        //public async Task Finish([FromBody] FinishTaskInput input)
//        public async Task UpdateTask([FromBody] UpdateTaskInput input)
        //{
        //    var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.TaskNo == input.TaskNo);
        //    if (wmsTask == null) throw Oops.Oh("任务不存在!");
        //    if (wmsTask.TaskStatus == TaskStatusEnum.WANCHENG) throw Oops.Oh("任务已完成,强制完成失败!");
        //    var statusList = new List<TaskStatusEnum> { TaskStatusEnum.WEIZHIXING, TaskStatusEnum.ZHIXINGZHONG };
        //    if (!statusList.Contains(wmsTask.TaskStatus)) throw Oops.Oh("只有未执行和执行中的任务才能强制完成!");
        //    if (wmsTask.TaskType == TaskType.RUKU) // å…¥åº“任务
        //    {
        //        var taskStatusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.ZX_DDJ, TaskDodeviceStatusEnum.WC_DDJ };
        //        if (!taskStatusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行,堆垛机完成才能强制完成!");
        //        //查询库位
        //        var wmsPlace = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == wmsTask.ToPlace
        //                && u.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).ProjectToType<WmsPlace>().FirstOrDefaultAsync();
        //        // æŸ¥è¯¢æ‰˜ç›˜
        //        var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
        //        if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!");
        //        // æ›´æ–°ä»»åŠ¡çŠ¶æ€
        //        wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
        //        wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
//            //根据任务号查询任务信息
//            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(z => z.TaskNo == input.TaskNo);
//            if (wmsTask == null) throw Oops.Oh(errorMessage: "任务不存在!");
//            wmsTask.TaskDodeviceStatus = input.TaskDodeviceStatus;
//            wmsTask.TaskStatus = TaskStatusEnum.ZHIXINGZHONG;
        //        wmsTask.IsRead = false;
        //        await _wmsTaskRep.UpdateAsync(wmsTask);
        //        // æ›´æ–°å•据明细状态为完成、更新托盘编号、更新库位编号
        //        var wmsOrderDetails = await _wmsOrderDetailsRep.Where(z => z.Id == wmsTask.OrderDetailsId).ProjectToType<WmsOrderDetails>().FirstOrDefaultAsync();
        //        if (wmsOrderDetails != null)
//            WmsPlace wmsPlace = new WmsPlace();
//            //判断入库还是出库
//            if (wmsTask.TaskType == TaskType.RUKU)
        //        {
        //            wmsOrderDetails.ContainerCode = wmsTask.ContainerCode;
        //            wmsOrderDetails.PlaceCode = wmsPlace.PlaceCode;
        //            wmsOrderDetails.OrderStatus = OrderDetailsStatusEnum.WANCHENG;
        //            await _wmsOrderDetailsRep.UpdateNowAsync(wmsOrderDetails);
//                //库位信息
//                wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(z => z.PlaceCode == wmsTask.ToPlace);
        //        }
        //        // å•据明细完成总数
        //        var orderDetailsCount = (await _wmsOrderDetailsRep.DetachedEntities
        //            .Where(z => z.OrderId == wmsOrderDetails.WareOrder.Id && z.OrderStatus == OrderDetailsStatusEnum.WANCHENG).ToListAsync()).Count;
        //        if (orderDetailsCount == wmsOrderDetails.WareOrder.OrderQuantityTotal)
//            else if (wmsTask.TaskType == TaskType.CHUKU)
        //        {
        //            wmsOrderDetails.WareOrder.OrderStatus = OrderStatusEnum.WANCHENG;
        //            await _wmsOrderRep.UpdateAsync(wmsOrderDetails.WareOrder);
//                //库位信息
//                wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(z => z.PlaceCode == wmsTask.SourcePlace);
        //        }
//            if (wmsPlace == null) throw Oops.Oh(errorMessage: "库位不存在!");
        //        // æ›´æ–°åº“位状态为存货
        //        wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
//            // æŸ¥è¯¢æ‰˜ç›˜ä¿¡æ¯
//            var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
//            if (wmsContainer == null) throw Oops.Oh("托盘不存在!");
//            //入库称重
//            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_RKCZ)
//            //{
//            //}
//            //入库输送线开始
//            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_RSSX)
//            //{
//            //}
//            //入库输送线结束
//            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_RSSX)
//            //{
//            //}
//            //入库RGV开始
//            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_RGV)
//            //{
//            //}
//            //入库RGV结束
//            //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_RGV)
//            //{
//            //}
//            //入库开始
//            if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_DDJ)
//            {
//                // æ›´æ–°åº“位状态
//                wmsPlace.PlaceStatus = PlaceStatus.DAIRU;
        //        await _wmsPlaceRep.UpdateAsync(wmsPlace);
//            }
//            //入库完成
//            if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_DDJ)
//            {
//                //首先更新任务状态完成
//                wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
//                //更新设备状态
//                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
        //        // æ›´æ–°æ‰˜ç›˜çŠ¶æ€ä¸ºâ€œåº“ä½â€
        //        wmsContainer.ContainerStatus = ContainerStatus.KUWEI;
        //        await _wmsContainerRep.UpdateAsync(wmsContainer);
        //        // ç‰©æ–™ä¸Žæ‰˜ç›˜å…³ç³»
        //        var wmsMaterialContainer = await _wmsMaterialContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode
        //        && z.MaterialNo == wmsOrderDetails.MaterialNo && z.BindStatus == CommonStatus.ENABLE);
//                //库位信息
//                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
//                if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
        //        // æ‰˜ç›˜ä¸Žåº“位关系
        //        var wmsContainerPlace = new WmsContainerPlace()
//                // æ›´æ–°åº“位状态为“存货”
//                wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
//                if (wmsTask.Description == "空托") wmsPlace.EmptyContainer = YesOrNot.Y;
//                else wmsPlace.EmptyContainer = YesOrNot.N;
//                await _wmsPlaceRep.UpdateAsync(wmsPlace);
//                // åˆ›å»ºæ‰˜ç›˜å·åº“位关系表
//                var wmsContainerPlaceModel = new WmsContainerPlace()
        //        {
        //            PlaceId = wmsPlace.Id,
        //            PlaceCode = wmsPlace.PlaceCode,
@@ -717,125 +188,151 @@
        //            ContainerCode = wmsContainer.ContainerCode,
        //            ContainerPlaceStatus = CommonStatus.ENABLE
        //        };
        //        await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlace);
//                await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlaceModel);
        //        // æ·»åŠ åº“å­˜
        //        var StockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode
        //        && p.MaterialNo == wmsOrderDetails.MaterialNo && p.MaterialBatch == wmsOrderDetails.Batch).FirstOrDefaultAsync();
        //        if (StockModel != null)
//                // æ›´æ–°åº“å­˜
//                var wmsMaterialContainerList = await _wmsMaterialContainerRep.DetachedEntities
//                    .Where(p => p.OrderNo == wmsTask.OrderNo && p.BindStatus == CommonStatus.ENABLE).ProjectToType<WmsMaterialContainer>().ToListAsync();
//                foreach (var item in wmsMaterialContainerList)
        //        {
        //            StockModel.MaterialDensity = wmsOrderDetails.MaterialDensity;
        //            StockModel.PlaceCode = wmsTask.ToPlace;
        //            StockModel.AreaId = wmsPlace.AreaId;
        //            StockModel.StockNumber = wmsOrderDetails.OrderQuantity;
        //            await _wmsMaterialStockRep.UpdateAsync(StockModel);
//                    var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode
//                    && p.MaterialBatch == item.MaterialBatch);
//                    if (wmsMaterialStock != null)
//                    {
//                        wmsMaterialStock.Source = RuKuSourceEnum.WULIAO;
//                        wmsMaterialStock.AreaId = wmsPlace.AreaId;
//                        wmsMaterialStock.PlaceCode = wmsPlace.PlaceCode;
//                        wmsMaterialStock.StockNumber = item.BindQuantity;
//                        await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
        //        }
        //        else
        //        {
        //            StockModel = new WmsMaterialStock()
//                        wmsMaterialStock = new WmsMaterialStock()
        //            {
        //                MaterialNo = wmsOrderDetails.MaterialNo,
        //                MaterialType = wmsOrderDetails.MaterialType,
        //                MaterialName = "N/A",
        //                Long = wmsOrderDetails.Long,
        //                Wide = wmsOrderDetails.Wide,
        //                High = wmsOrderDetails.High,
        //                MaterialSpec = wmsOrderDetails.Long + "*" + wmsOrderDetails.Wide + "*" + wmsOrderDetails.High,
        //                MaterialBatch = wmsOrderDetails.Batch,
        //                MaterialDensity = wmsOrderDetails.MaterialDensity,
        //                //InspectionMethod = item.WmsMaterial.InspectionMethod,
        //                //UnitType = item.WmsMaterial.UnitType,
        //                //UnitNo = item.WmsMaterial.UnitNo,
        //                StockNumber = wmsOrderDetails.OrderQuantity,
        //                PlaceCode = wmsTask.ToPlace,
//                            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 = item.BindQuantity,
//                            PlaceCode = wmsPlace.PlaceCode,
        //                ContainerId = wmsContainer.Id,
        //                ContainerCode = wmsContainer.ContainerCode,
        //                AreaId = wmsPlace.AreaId,
//                            Source = RuKuSourceEnum.WULIAO
        //            };
        //            await _wmsMaterialStockRep.InsertAsync(StockModel);
//                        await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock);
        //        }
        //    }
        //    else if (wmsTask.TaskType == TaskType.CHUKU) //出库任务
//                // ç©ºæ–™ç®±å…¥åº“
//                if (wmsTask.Description == "空托")
        //    {
        //        var taskStatusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.ZX_DDJ, TaskDodeviceStatusEnum.WC_DDJ };
        //        if (!taskStatusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行,堆垛机完成才能强制完成!");
        //        // æŸ¥è¯¢æ‰˜ç›˜ä¿¡æ¯
        //        var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
        //        if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!");
//                    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);
//                }
//            }
//            //出库堆垛机完成,执行库存,库位,托盘对应关系进行更新
//            else if (wmsTask.TaskType == TaskType.CHUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_DDJ)
//            {
        //        // æŸ¥è¯¢åº“位信息
        //        var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.PlaceCode == wmsTask.SourcePlace);
        //        if (wmsPlace == null) throw Oops.Oh("库位信息不存在!");
//                if (wmsPlace == null) throw Oops.Oh("库位不存在!");
//                if (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)
//                if (wmsContainerPlace == null) throw Oops.Oh("库位容器关系不存在!");
//                // æŸ¥è¯¢åº“存信息
//                var wmsMaterialStockList = await _wmsMaterialStockRep.DetachedEntities.Where(u => u.ContainerCode == wmsTask.ContainerCode).ToListAsync();
//                if (wmsMaterialStockList.Count <= 0) throw Oops.Oh("库存数据异常!");
//                ////查询物料与托盘组盘关系(状态:正常)
//                var wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsTask.ContainerCode
//                    && p.BindStatus == CommonStatus.ENABLE && p.OrderNo == wmsTask.OrderNo).ToListAsync();
//                //判断物料是否是空托,如果是空托直接删除,不是空托查询物料
//                if (wmsMaterialContainerList.Count == 0)
        //        {
        //            // ç¦ç”¨æ‰˜ç›˜åº“位关系
//                    //删除库存
//                    foreach (var item in wmsMaterialStockList)
//                    {
//                        await _wmsMaterialStockRep.DeleteAsync(item);
//                    }
//                    // æ›´æ–°æ‰˜ç›˜çŠ¶æ€ä¸ºâ€œç©ºé—²â€
//                    wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
//                }
//                else
//                {
//                    //构建出库物料和周转箱号关系
//                    var orderNo = "N/A";
//                    if (wmsMaterialContainerList.Count > 0) orderNo = YitIdHelper.NextId().ToString();
//                    foreach (var item in wmsMaterialContainerList)
//                    {
//                        //更新状态为”删除“
//                        item.BindStatus = CommonStatus.DELETED;
//                        await _wmsMaterialContainerRep.UpdateNowAsync(item);
//                        //新增组盘绑定记录 æ­£å¸¸
//                        var wmsMaterialContainer = item;
//                        wmsMaterialContainer.Id = YitIdHelper.NextId();
//                        wmsMaterialContainer.OrderNo = orderNo;
//                        wmsMaterialContainer.BindStatus = CommonStatus.ENABLE;
//                        await _wmsMaterialContainerRep.InsertNowAsync(wmsMaterialContainer);
//                        //更改库存的库位号为N/A
//                        foreach (var stock in wmsMaterialStockList)
//                        {
//                            stock.PlaceCode = "N/A";
//                            await _wmsMaterialStockRep.UpdateAsync(stock);
//                        }
//                    }
//                    wmsContainer.ContainerStatus = ContainerStatus.FENJIAN;
//                }
//                await _wmsContainerRep.UpdateAsync(wmsContainer);
//                //更新库位状态为“空闲”
//                wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
//                wmsPlace.Islock = YesOrNot.N;
//                wmsPlace.EmptyContainer = YesOrNot.N;
//                await _wmsPlaceRep.UpdateAsync(wmsPlace);
//                //更新周转箱号与库位关系为“删除”
        //            wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
        //            await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
        //        }
        //        // æ ¹æ®ä»»åŠ¡è¡¨ä¸­çš„å•æ®æ˜Žç»†Id查询单据明细信息
        //        var wmsOrderDetails = await _wmsOrderDetailsRep.FirstOrDefaultAsync(z => z.Id == wmsTask.OrderDetailsId);
        //        wmsTask.TaskStatus = TaskStatusEnum.ZHIXINGZHONG;
        //        wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.ZX_RGV;
        //        wmsTask.IsRead = false;
        //        await _wmsTaskRep.UpdateAsync(wmsTask);
        //        // æŸ¥è¯¢æ˜¯å¦å·²å­˜åœ¨ç‰©æ–™ä¸Žæ‰˜ç›˜å…³ç³»
        //        var wmsMaterialContainer = await _wmsMaterialContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode
        //        && z.MaterialNo == wmsOrderDetails.MaterialNo && z.BindStatus == CommonStatus.ENABLE);
        //        //入库时组盘信息逻辑删除
        //        if (wmsMaterialContainer != null)
//            if (wmsTask.TaskType == TaskType.CHUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_CSSX)
        //        {
        //            wmsMaterialContainer.BindStatus = CommonStatus.DELETED;
        //            await _wmsMaterialContainerRep.UpdateAsync(wmsMaterialContainer);
        //            //新增出库绑定记录 æ­£å¸¸
        //            var enable = new WmsMaterialContainer()
        //            {
        //                ContainerId = wmsContainer.Id,
        //                ContainerCode = wmsContainer.ContainerCode,
        //                MaterialId = YitIdHelper.NextId(), //系统生成的Id
        //                MaterialName = "N/A",
        //                MaterialNo = wmsMaterialContainer.MaterialNo,
        //                MaterialBatch = wmsMaterialContainer.MaterialBatch,
        //                MaterialDensity = wmsMaterialContainer.MaterialDensity,
        //                MaterialSpec = wmsOrderDetails.Long + "*" + wmsOrderDetails.Wide + "*" + wmsOrderDetails.High,
        //                BindQuantity = 1, //一个库位只有一个物料
        //                OrderNo = wmsMaterialContainer.OrderNo,
        //                OrderDetailsId = wmsMaterialContainer.OrderDetailsId,
        //                BindStatus = CommonStatus.ENABLE
        //            };
        //            await _wmsMaterialContainerRep.InsertAsync(enable);
        //        }
        //        //更新库存
        //        var stockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.PlaceCode == wmsTask.SourcePlace
        //        && p.MaterialNo == wmsOrderDetails.MaterialNo && p.MaterialBatch == wmsOrderDetails.Batch).FirstOrDefaultAsync();
        //        if (stockModel != null)
        //        {
        //            await _wmsMaterialStockRep.DeleteAsync(stockModel);
        //        }
        //        // æ›´æ–°åº“位状态为“空闲”
        //        wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
        //        await _wmsPlaceRep.UpdateAsync(wmsPlace);
        //        //更新托盘状态为“空闲”
        //        wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
        //        await _wmsContainerRep.UpdateAsync(wmsContainer);
        //    }
        //    else //移库任务
        //    {
        //        var taskStatusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.ZX_DDJ, TaskDodeviceStatusEnum.WC_DDJ };
        //        if (!taskStatusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行,堆垛机完成才能强制完成!");
        //        // æŸ¥è¯¢æ‰˜ç›˜
        //        var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
        //        if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!");
        //        wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
        //        wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
        //        wmsTask.IsRead = false;
//            }
//            else //移库
//            {
//                if (wmsTask.TaskType == TaskType.YIKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_DDJ)
//                {
//                    wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
//                    wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
        //        // èµ·ç‚¹åº“位信息
        //        var SourcePlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.SourcePlace).FirstOrDefaultAsync();
        //        SourcePlace.PlaceStatus = PlaceStatus.KONGXIAN;
@@ -865,195 +362,698 @@
        //        }
        //    }
        //}
//            await _wmsTaskRep.UpdateAsync(wmsTask);
//        }
//        /// <summary>
//        /// èŽ·å–åº“ä½ä¿¡æ¯
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("GetPlace")]
//        [AllowAnonymous]
//        public async Task<GetPlaceOutput> GetPlace([FromBody] GetPlaceInput input)
//        {
//            //1.列 ä¼˜å…ˆ1排和4排 å±‚优先从下到上
//            //2.保留10个内侧移库库位
//            var taskModel = await _wmsTaskRep.Where(p => p.TaskNo == input.TaskNo).FirstOrDefaultAsync();
//            if (taskModel == null) return new GetPlaceOutput() { TaskIsExist = false };
//            if (taskModel.TaskStatus == TaskStatusEnum.CHEHUI || taskModel.TaskStatus == TaskStatusEnum.QUXIAO || taskModel.TaskStatus == TaskStatusEnum.WANCHENG || taskModel.TaskStatus == TaskStatusEnum.ZANTING)
//            {
//                throw Oops.Oh("任务状态未满足获取的库位条件");
//            }
//            taskModel.TaskStatus = TaskStatusEnum.ZHIXINGZHONG;
//            //定义入库对象,移库对象
//            var ToPlace = new WmsPlace();
//            var SourcePlace = new WmsPlace();
//            var rowNumber = 0;
//            //入库流程
//            if (taskModel.TaskType == TaskType.RUKU)
//            {
//                //防重操作
//                if (taskModel != null && !string.IsNullOrEmpty(taskModel.ToPlace))
//                {
//                    ToPlace = await _wmsPlaceRep.Where(p => p.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && p.PlaceCode == taskModel.ToPlace).FirstOrDefaultAsync();
//                    if (ToPlace.RowNo == GetOneRowByAisle(taskModel.Aisle) || ToPlace.RowNo == GetFourRowByAisle(taskModel.Aisle))
//                    {
//                        if (ToPlace.RowNo == GetOneRowByAisle(taskModel.Aisle))
//                            rowNumber = GetTwoRowByAisle(taskModel.Aisle);
//                        else
//                            rowNumber = GetThreeRowByAisle(taskModel.Aisle);
//                        SourcePlace = await _wmsPlaceRep.Where(p => p.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && p.Aisle == taskModel.Aisle && p.RowNo == rowNumber && p.ColumnNo == ToPlace.ColumnNo && p.LayerNo == ToPlace.LayerNo).FirstOrDefaultAsync();
//                        if (SourcePlace != null && SourcePlace.PlaceStatus == PlaceStatus.CUNHUO)
//                            return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode };
//                    }
//                    return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode };
//                }
//                //获取立体库可用库位
//                var placeList = await _wmsPlaceRep.DetachedEntities.Where(z => z.PlaceStatus == PlaceStatus.KONGXIAN
//                && z.Islock == YesOrNot.N && z.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN
//                && z.WmsArea.AreaType == AreaType.LITIKU && z.Aisle == taskModel.Aisle).ProjectToType<WmsPlace>().ToListAsync();
//                //获取当前立体库需要出库库位集合
//                var placeCodeList = await _wmsTaskRep.DetachedEntities.Where(p => p.IsRead == true
//                && p.TaskType == TaskType.CHUKU && p.Aisle == taskModel.Aisle).Select(n => n.SourcePlace).ToListAsync();
//                var ckPlaceModelList = await _wmsPlaceRep.DetachedEntities.Where(z => placeCodeList.Contains(z.PlaceCode)
//                && z.Islock == YesOrNot.N && z.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN
//                && z.WmsArea.AreaType == AreaType.LITIKU && z.Aisle == taskModel.Aisle).ToListAsync();
//                //配置文件中设置是否开启指定库位入库和移库操作
//                //if (Convert.ToBoolean(App.Configuration["YiKuTestPalce:IsStart"]))
//                //{
//                //    var rukuPoint = App.Configuration["YiKuTestPalce:rukuPoint"].Split('.');  //入库起点
//                //    var yikuPoint = App.Configuration["YiKuTestPalce:yikuPoint"].Split('.');  //移库起点
//                //    ToPlace = placeList.Where(p => p.RowNo == Convert.ToInt32(rukuPoint[0])
//                //    && p.ColumnNo == Convert.ToInt32(rukuPoint[1]) && p.LayerNo == Convert.ToInt32(rukuPoint[2])).FirstOrDefault();
//                //    if (ToPlace != null)
//                //    {
//                //        ToPlace.PlaceStatus = PlaceStatus.DAIRU;
//                //        await _wmsPlaceRep.UpdateAsync(ToPlace);
//                //        taskModel.ToPlace = ToPlace.PlaceCode;
//                //        taskModel.AreaName = ToPlace.WmsArea.AreaName;
//                //        await _wmsTaskRep.UpdateAsync(taskModel);
//                //        if (yikuPoint.Length > 1)
//                //        {
//                //            SourcePlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.RowNo == Convert.ToInt32(yikuPoint[0])
//                //            && p.ColumnNo == Convert.ToInt32(yikuPoint[1]) && p.LayerNo == Convert.ToInt32(yikuPoint[2])
//                //            && p.Aisle == taskModel.Aisle && p.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN
//                //            && p.WmsArea.AreaType == AreaType.LITIKU
//                //            );
//                //        }
//                //        return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode };
//                //    }
//                //}
//                var maxColumn = placeList.Max(selector: n => n.ColumnNo);
//                var maxLayerNo = 0;
//                //先以列为进行循环判断
//                for (int j = 1; j <= maxColumn; j++)
//                {
//                    //获取该列的最大层
//                    if (placeList.Where(p => p.ColumnNo == j).Count() <= 1) continue;
//                    maxLayerNo = placeList.Where(p => p.ColumnNo == j).Max(selector: n => n.LayerNo);
//                    //循环每列每层的中列
//                    //分配库位需要考虑外侧是否有出库任务,有的话就没有执行
//                    for (int f = 1; f <= maxLayerNo; f++)
//                    {
//                        var model = placeList.FirstOrDefault(p => p.RowNo == GetOneRowByAisle(taskModel.Aisle) && p.ColumnNo == j && p.LayerNo == f);
//                        var ckmodel = ckPlaceModelList.FirstOrDefault(p => p.RowNo == GetTwoRowByAisle(taskModel.Aisle) && p.ColumnNo == j && p.LayerNo == f);
//                        if (model != null && ckmodel == null)
//                        {
//                            ToPlace = model;
//                            break;
//                        }
//                    }
//                    if (!string.IsNullOrEmpty(ToPlace.PlaceCode)) break;
//                }
//                if (string.IsNullOrEmpty(ToPlace.PlaceCode)) throw Oops.Oh("暂无可以库位!");
//                //进行库位和任务的更新
//                ToPlace.PlaceStatus = PlaceStatus.DAIRU;
//                await _wmsPlaceRep.UpdateAsync(ToPlace);
//                taskModel.ToPlace = ToPlace.PlaceCode;
//                taskModel.AreaName = ToPlace.WmsArea.AreaName;
//                await _wmsTaskRep.UpdateAsync(taskModel);
//                if (SourcePlace == null || string.IsNullOrEmpty(SourcePlace.PlaceCode)) return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode };
//                else return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode };
//            }
//            //出库流程
//            if (taskModel.TaskType == TaskType.CHUKU)
//            {
//                //需要判断下库位是否已经进行移库操作,需要通过托盘编号进行重新查找
//                var containerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == taskModel.ContainerCode
//                && p.ContainerPlaceStatus == CommonStatus.ENABLE);
//                if (containerPlace != null && containerPlace.PlaceCode != taskModel.SourcePlace)
//                {
//                    ToPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == containerPlace.PlaceCode);
//                    taskModel.SourcePlace = containerPlace.PlaceCode;
//                }
//                else
//                {
//                    ToPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == taskModel.SourcePlace);
//                }
//                //进行库位和任务的更新
//                ToPlace.PlaceStatus = PlaceStatus.DAICHU;
//                await _wmsPlaceRep.UpdateAsync(ToPlace);
//                taskModel.ToPlace = taskModel.Aisle.ToString();
//                await _wmsTaskRep.UpdateAsync(taskModel);
//                if (SourcePlace == null || string.IsNullOrEmpty(SourcePlace.PlaceCode)) return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode };
//                else return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode };
//            }
//            else
//            {
//                throw Oops.Oh("任务异常" + taskModel.TaskNo);
//            }
//        }
        /// <summary>
        /// å–消任务
        /// </summary>
        /// <returns></returns>
        [HttpPost("CancelTask")]
        [UnitOfWork]
        [AllowAnonymous]
        public async Task CancelTask([FromBody] FinishTaskInput input)
        {
            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.TaskNo == input.TaskNo);
            if (wmsTask == null) throw Oops.Oh("任务不存在!");
            if (wmsTask.TaskStatus == TaskStatusEnum.WANCHENG) throw Oops.Oh("任务已完成,取消失败!");
            if (wmsTask.TaskType == TaskType.RUKU) // å…¥åº“任务
            {
                //var statusList = new List<TaskDodeviceStatusEnum> {TaskDodeviceStatusEnum.ZX_RSSX, TaskDodeviceStatusEnum.WC_RSSX,TaskDodeviceStatusEnum.WZX };
                //if (!statusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有入库输送线执行,入库输送线完成或者设备未执行才能强制取消!");
                //更新单据明细状态为未执行、更新托盘编号、更新库位编号
                var wmsOrderDetails = await _wmsOrderDetailsRep.Where(z => z.Id == wmsTask.OrderDetailsId).ProjectToType<WmsOrderDetails>().FirstOrDefaultAsync();
                if (wmsOrderDetails != null)
                {
                    wmsOrderDetails.OrderStatus = OrderDetailsStatusEnum.WEIZHIXING;
                    await _wmsOrderDetailsRep.UpdateNowAsync(wmsOrderDetails);
                }
                //查询库位
                var wmsPlace = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == wmsTask.ToPlace && u.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).ProjectToType<WmsPlace>().FirstOrDefaultAsync();
                if (wmsPlace != null)
                {
                    // æ›´æ–°åº“位状态为空闲
                    wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
                    await _wmsPlaceRep.UpdateAsync(wmsPlace);
                }
                var materialContainer = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.BindStatus == CommonStatus.ENABLE).FirstOrDefaultAsync();
                if (materialContainer != null)
                {
                    await _wmsMaterialContainerRep.DeleteNowAsync(materialContainer);
                }
                // æŸ¥è¯¢æ‰˜ç›˜
                var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
                if (wmsContainer != null)
                {
                    wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
                    await _wmsContainerRep.UpdateAsync(wmsContainer);
                }
                // æ›´æ–°ä»»åŠ¡çŠ¶æ€
                wmsTask.TaskStatus = TaskStatusEnum.WEIZHIXING;
                wmsTask.IsRead = false;
                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX;
                wmsTask.ToPlace = "";
                await _wmsTaskRep.UpdateAsync(wmsTask);
            }
            else if (wmsTask.TaskType == TaskType.CHUKU) //出库任务
            {
                var statusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.WZX, TaskDodeviceStatusEnum.ZX_DDJ };
                if (!statusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行中或设备未执行才能强制取消!");
                // æŸ¥è¯¢åº“位信息
                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.PlaceCode == wmsTask.SourcePlace);
                if (wmsPlace == 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("库位容器关系不存在!");
                // æ ¹æ®ä»»åŠ¡è¡¨ä¸­çš„å•æ®æ˜Žç»†Id查询单据明细信息
                var wmsOrderDetails = await _wmsOrderDetailsRep.FirstOrDefaultAsync(z => z.Id == wmsTask.OrderDetailsId);
                //修改单据明细,任务状态,设备任务状态为未执行
                wmsOrderDetails.OrderStatus = OrderDetailsStatusEnum.WEIZHIXING;
                await _wmsOrderDetailsRep.UpdateNowAsync(wmsOrderDetails);
                wmsTask.TaskStatus = TaskStatusEnum.WEIZHIXING;
                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX;
                await _wmsTaskRep.UpdateAsync(wmsTask);
                // æ›´æ–°åº“位状态为存货
                wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
                await _wmsPlaceRep.UpdateAsync(wmsPlace);
            }
            else //移库任务
            {
                var statusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.WZX, TaskDodeviceStatusEnum.ZX_DDJ };
                if (!statusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行中,设备未执行才能强制取消!");
                // æŸ¥è¯¢æ‰˜ç›˜
                var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
                if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!");
                //删除任务
                await _wmsTaskRep.DeleteAsync(wmsTask);
                // èµ·ç‚¹åº“位信息
                var SourcePlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.SourcePlace).FirstOrDefaultAsync();
                SourcePlace.PlaceStatus = PlaceStatus.CUNHUO;
                await _wmsPlaceRep.UpdateAsync(SourcePlace);
                //目标库位信息
                var ToPlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.ToPlace).FirstOrDefaultAsync();
                ToPlace.PlaceStatus = PlaceStatus.KONGXIAN;
                await _wmsPlaceRep.UpdateAsync(ToPlace);
            }
        }
//        /// <summary>
//        /// åˆ›å»ºç§»åº“任务
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("CreateYKTask")]
//        [UnitOfWork]
//        [AllowAnonymous]
//        public async Task<GetYiKuPlaceOutput> CreateRelocation(CreateRelocationInput input)
//        {
//            var placeModel = await _wmsPlaceRep.Where(p => p.PlaceCode == input.SourcePlace).ProjectToType<WmsPlace>().FirstOrDefaultAsync();
//            if (placeModel == null) throw Oops.Oh("库位数据异常!");
//            placeModel.PlaceStatus = PlaceStatus.DAICHU;
//            await _wmsPlaceRep.UpdateAsync(placeModel);
//            //查询组盘单据
//            var containerPlaceModel = await _wmsContainerPlaceRep.Where(p => p.PlaceCode == input.SourcePlace && p.ContainerPlaceStatus == CommonStatus.ENABLE).FirstOrDefaultAsync();
//            if (containerPlaceModel == null) throw Oops.Oh("移库库位托盘数据异常!");
//            var materialContainer = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == containerPlaceModel.ContainerCode && p.BindStatus == CommonStatus.ENABLE).FirstOrDefaultAsync();
//            if (materialContainer == null) throw Oops.Oh("组盘数据异常!");
//            //获取空闲库位集合
//            var placeList = await _wmsPlaceRep.DetachedEntities.Where(z => z.PlaceStatus == PlaceStatus.KONGXIAN
//            && z.Islock == YesOrNot.N && z.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN
//            && z.WmsArea.AreaType == AreaType.LITIKU && z.Aisle == input.Aisle).ToListAsync();
//            if (placeList.Count == 0) throw Oops.Oh("无可移库库位!");
//            //定义目标点
//            var ToPlaceModel = new WmsPlace();
//            var rowNumber = 0;
//            //1.推荐外侧库位
//            var wcPlaceList = placeList.Where(p => (p.RowNo == GetOneRowByAisle(placeModel.Aisle) || p.RowNo == GetFourRowByAisle(placeModel.Aisle))).ToList();
//            if (placeModel.Aisle == 11)
//            {
//                wcPlaceList = placeList.Where(p => (p.RowNo == GetOneRowByAisle(placeModel.Aisle) || p.RowNo == GetThreeRowByAisle(placeModel.Aisle))).ToList();
//            }
//            //定义最优库位集合
//            var zyPlaceList = new List<WmsPlace>();
//            //循环判断对应的2,3是有货
//            foreach (var item in wcPlaceList)
//            {
//                if (placeModel.Aisle == 11)
//                {
//                    if (item.RowNo == GetOneRowByAisle(placeModel.Aisle))
//                    {
//                        zyPlaceList.Add(item);
//                    }
//                    if (item.RowNo == GetThreeRowByAisle(placeModel.Aisle))
//                    {
//                        rowNumber = GetTwoRowByAisle(placeModel.Aisle);
//                        var dypalceModel = placeList.Where(p => p.RowNo == rowNumber && p.ColumnNo == item.ColumnNo && p.LayerNo == item.LayerNo).FirstOrDefault();
//                        if (dypalceModel != null)
//                            zyPlaceList.Add(item);
//                    }
//                }
//                else
//                {
//                    if (item.RowNo == GetOneRowByAisle(placeModel.Aisle) || item.RowNo == GetFourRowByAisle(placeModel.Aisle))
//                    {
//                        if (item.RowNo == GetOneRowByAisle(placeModel.Aisle))
//                            rowNumber = GetTwoRowByAisle(placeModel.Aisle);
//                        else
//                            rowNumber = GetThreeRowByAisle(placeModel.Aisle);
//                        var dypalceModel = placeList.Where(p => p.RowNo == rowNumber && p.ColumnNo == item.ColumnNo && p.LayerNo == item.LayerNo).FirstOrDefault();
//                        if (dypalceModel != null)
//                            zyPlaceList.Add(item);
//                    }
//                }
//            }
//            if (zyPlaceList.Count != 0)
//            {
//                //获取路径最短的库位 ä½¿ç”¨äºŒåˆ†æ³•
//                var mindModel = zyPlaceList.Where(p => p.ColumnNo == placeModel.ColumnNo).FirstOrDefault();
//                var leftModel = zyPlaceList.Where(p => p.ColumnNo < placeModel.ColumnNo).OrderByDescending(p => p.ColumnNo).FirstOrDefault();
//                var rightModel = zyPlaceList.Where(p => p.ColumnNo > placeModel.ColumnNo).OrderBy(p => p.ColumnNo).FirstOrDefault();
//                if (mindModel != null) ToPlaceModel = mindModel;
//                else if (leftModel == null) ToPlaceModel = rightModel;
//                else if (rightModel == null) ToPlaceModel = leftModel;
//                else if ((placeModel.ColumnNo - leftModel.ColumnNo) > (rightModel.ColumnNo - placeModel.ColumnNo)) ToPlaceModel = rightModel;
//                else ToPlaceModel = leftModel;
//            }
//            if (string.IsNullOrEmpty(ToPlaceModel.PlaceCode))
//            {
//                //2.次优库位集合
//                //次优2,3排库位
//                var cyPlace = placeList.Where(p => (p.RowNo == GetTwoRowByAisle(placeModel.Aisle) || p.RowNo == GetThreeRowByAisle(placeModel.Aisle))).OrderByDescending(p => p.ColumnNo).OrderBy(p => p.LayerNo).ToList();
//                if (placeModel.Aisle == 11)
//                {
//                    cyPlace = placeList.Where(p => p.RowNo == GetTwoRowByAisle(placeModel.Aisle)).OrderByDescending(p => p.ColumnNo).OrderBy(p => p.LayerNo).ToList();
//                }
//                if (cyPlace.Count > 0)
//                {
//                    //获取路径最短的库位 ä½¿ç”¨äºŒåˆ†æ³•
//                    var mindModel = cyPlace.Where(p => p.ColumnNo == placeModel.ColumnNo).OrderByDescending(p => p.ColumnNo).FirstOrDefault();
//                    var leftModel = cyPlace.Where(p => p.ColumnNo < placeModel.ColumnNo).OrderByDescending(p => p.ColumnNo).FirstOrDefault();
//                    var rightModel = cyPlace.Where(p => p.ColumnNo > placeModel.ColumnNo).OrderBy(p => p.ColumnNo).FirstOrDefault();
//                    if (mindModel != null) ToPlaceModel = mindModel;
//                    else if (leftModel == null) ToPlaceModel = rightModel;
//                    else if (rightModel == null) ToPlaceModel = leftModel;
//                    else if ((placeModel.ColumnNo - leftModel.ColumnNo) > (rightModel.ColumnNo - placeModel.ColumnNo)) ToPlaceModel = rightModel;
//                    else ToPlaceModel = leftModel;
//                }
//            }
//            ToPlaceModel.PlaceStatus = PlaceStatus.DAIRU;
//            await _wmsPlaceRep.UpdateAsync(ToPlaceModel);
//            //创建移库任务
//            var newWmsTask = new WmsTask()
//            {
//                //TaskNo = _commonOrderServiceRep.GetFYKOrderNo(),
//                TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(),
//                TaskModel = TaskModel.QUANZIDONG,
//                TaskType = TaskType.YIKU,
//                TaskLevel = 5,
//                TaskStatus = TaskStatusEnum.WEIZHIXING,
//                OrderNo = materialContainer.OrderNo,
//                OrderDetailsId = materialContainer.OrderDetailsId,
//                ContainerCode = materialContainer.ContainerCode,
//                SourcePlace = placeModel.PlaceCode,
//                ToPlace = ToPlaceModel.PlaceCode,
//                AreaName = placeModel.WmsArea.AreaName,
//                IsRead = true, //WCS是否可以读取
//                SendTimes = 1, //发送次数
//                Aisle = placeModel.Aisle,
//                Dodevicetype = DodeviceType.AGV,
//                TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX,
//            };
//            await _wmsTaskRep.InsertAsync(newWmsTask);
//            return new GetYiKuPlaceOutput()
//            {
//                ToPlace = ToPlaceModel.PlaceCode,
//                TaskNo = newWmsTask.TaskNo,
//            };
//        }
        /// <summary>
        /// wcs读取接口判断物料是否组盘出库 true代表已经组盘出库
        /// </summary>
        /// <returns></returns>
        [HttpGet("CheckPack")]
        [AllowAnonymous]
        [NonAction]
        public async Task<bool> CheckPack()
        {
            var packList = await _lesPackWarehouseRep.Where(p => p.LesPackState == LesPackState.WEICHUKU).Select(n => n.OrderNo).Distinct().ToListAsync();
            if (packList.Count >= 2) return false;
            else return true;
        }
//        ///// <summary>
//        ///// å¼ºåˆ¶å®Œæˆ
//        ///// </summary>
//        ///// <returns></returns>
//        //[HttpPost("Finish")]
//        //[UnitOfWork]
//        //[AllowAnonymous]
//        //public async Task Finish([FromBody] FinishTaskInput input)
//        //{
//        //    var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.TaskNo == input.TaskNo);
//        //    if (wmsTask == null) throw Oops.Oh("任务不存在!");
//        //    if (wmsTask.TaskStatus == TaskStatusEnum.WANCHENG) throw Oops.Oh("任务已完成,强制完成失败!");
//        //    var statusList = new List<TaskStatusEnum> { TaskStatusEnum.WEIZHIXING, TaskStatusEnum.ZHIXINGZHONG };
//        //    if (!statusList.Contains(wmsTask.TaskStatus)) throw Oops.Oh("只有未执行和执行中的任务才能强制完成!");
        /// <summary>
        /// è®¾å¤‡æŠ¥è­¦ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpPost("AddDeviceWaring")]
        [AllowAnonymous]
        [NonAction]
        public async Task AddDeviceWaring(AddDeviceWaringInput input)
        {
            //判断wcsid是否存在
            var lesDeviceWaring = await _lesDeviceWaringRep.FirstOrDefaultAsync(u => u.WcsId == input.WcsId);
            if (lesDeviceWaring != null)
            {
                await _lesDeviceWaringRep.UpdateAsync(lesDeviceWaring);
            }
            else
            {
                lesDeviceWaring = input.Adapt<LesDeviceWaring>();
                await _lesDeviceWaringRep.InsertAsync(lesDeviceWaring);
            }
        }
//        //    if (wmsTask.TaskType == TaskType.RUKU) // å…¥åº“任务
//        //    {
//        //        var taskStatusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.ZX_DDJ, TaskDodeviceStatusEnum.WC_DDJ };
//        //        if (!taskStatusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行,堆垛机完成才能强制完成!");
//        //        //查询库位
//        //        var wmsPlace = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == wmsTask.ToPlace
//        //                && u.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).ProjectToType<WmsPlace>().FirstOrDefaultAsync();
//        //        // æŸ¥è¯¢æ‰˜ç›˜
//        //        var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
//        //        if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!");
//        //        // æ›´æ–°ä»»åŠ¡çŠ¶æ€
//        //        wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
//        //        wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
//        //        wmsTask.IsRead = false;
//        //        await _wmsTaskRep.UpdateAsync(wmsTask);
        #region  å…¬ç”¨æ–¹æ³•
        /// <summary>
        /// æ ¹æ®å··é“获取外侧第一排
        /// </summary>
        /// <param name="Aisle"></param>
        /// <returns></returns>
        [NonAction]
        public int GetOneRowByAisle(int Aisle)
        {
            if (Aisle >= 7)
            {
                return 1;
            }
            return (Aisle - 1) * 4 + 1;
        }
        /// <summary>
        /// æ ¹æ®å··é“获取内侧第二排
        /// </summary>
        /// <param name="Aisle"></param>
        /// <returns></returns>
        [NonAction]
        public int GetTwoRowByAisle(int Aisle)
        {
            if (Aisle >= 7)
            {
                return 2;
            }
            return (Aisle - 1) * 4 + 2;
        }
        /// <summary>
        /// æ ¹æ®å··é“获取外侧第二排
        /// </summary>
        /// <param name="Aisle"></param>
        /// <returns></returns>
        [NonAction]
        public int GetThreeRowByAisle(int Aisle)
        {
            if (Aisle >= 7)
            {
                return 3;
            }
            return (Aisle - 1) * 4 + 3;
        }
        /// <summary>
        /// æ ¹æ®å··é“获取外侧第一排
        /// </summary>
        /// <param name="Aisle"></param>
        /// <returns></returns>
        [NonAction]
        public int GetFourRowByAisle(int Aisle)
        {
            if (Aisle >= 7)
            {
                return 4;
            }
            return (Aisle - 1) * 4 + 4;
        }
        #endregion
    }
}
//        //        // æ›´æ–°å•据明细状态为完成、更新托盘编号、更新库位编号
//        //        var wmsOrderDetails = await _wmsOrderDetailsRep.Where(z => z.Id == wmsTask.OrderDetailsId).ProjectToType<WmsOrderDetails>().FirstOrDefaultAsync();
//        //        if (wmsOrderDetails != null)
//        //        {
//        //            wmsOrderDetails.ContainerCode = wmsTask.ContainerCode;
//        //            wmsOrderDetails.PlaceCode = wmsPlace.PlaceCode;
//        //            wmsOrderDetails.OrderStatus = OrderDetailsStatusEnum.WANCHENG;
//        //            await _wmsOrderDetailsRep.UpdateNowAsync(wmsOrderDetails);
//        //        }
//        //        // å•据明细完成总数
//        //        var orderDetailsCount = (await _wmsOrderDetailsRep.DetachedEntities
//        //            .Where(z => z.OrderId == wmsOrderDetails.WareOrder.Id && z.OrderStatus == OrderDetailsStatusEnum.WANCHENG).ToListAsync()).Count;
//        //        if (orderDetailsCount == wmsOrderDetails.WareOrder.OrderQuantityTotal)
//        //        {
//        //            wmsOrderDetails.WareOrder.OrderStatus = OrderStatusEnum.WANCHENG;
//        //            await _wmsOrderRep.UpdateAsync(wmsOrderDetails.WareOrder);
//        //        }
//        //        // æ›´æ–°åº“位状态为存货
//        //        wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
//        //        await _wmsPlaceRep.UpdateAsync(wmsPlace);
//        //        // æ›´æ–°æ‰˜ç›˜çŠ¶æ€ä¸ºâ€œåº“ä½â€
//        //        wmsContainer.ContainerStatus = ContainerStatus.KUWEI;
//        //        await _wmsContainerRep.UpdateAsync(wmsContainer);
//        //        // ç‰©æ–™ä¸Žæ‰˜ç›˜å…³ç³»
//        //        var wmsMaterialContainer = await _wmsMaterialContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode
//        //        && z.MaterialNo == wmsOrderDetails.MaterialNo && z.BindStatus == CommonStatus.ENABLE);
//        //        // æ‰˜ç›˜ä¸Žåº“位关系
//        //        var wmsContainerPlace = new WmsContainerPlace()
//        //        {
//        //            PlaceId = wmsPlace.Id,
//        //            PlaceCode = wmsPlace.PlaceCode,
//        //            ContainerId = wmsContainer.Id,
//        //            ContainerCode = wmsContainer.ContainerCode,
//        //            ContainerPlaceStatus = CommonStatus.ENABLE
//        //        };
//        //        await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlace);
//        //        // æ·»åŠ åº“å­˜
//        //        var StockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode
//        //        && p.MaterialNo == wmsOrderDetails.MaterialNo && p.MaterialBatch == wmsOrderDetails.Batch).FirstOrDefaultAsync();
//        //        if (StockModel != null)
//        //        {
//        //            StockModel.MaterialDensity = wmsOrderDetails.MaterialDensity;
//        //            StockModel.PlaceCode = wmsTask.ToPlace;
//        //            StockModel.AreaId = wmsPlace.AreaId;
//        //            StockModel.StockNumber = wmsOrderDetails.OrderQuantity;
//        //            await _wmsMaterialStockRep.UpdateAsync(StockModel);
//        //        }
//        //        else
//        //        {
//        //            StockModel = new WmsMaterialStock()
//        //            {
//        //                MaterialNo = wmsOrderDetails.MaterialNo,
//        //                MaterialType = wmsOrderDetails.MaterialType,
//        //                MaterialName = "N/A",
//        //                Long = wmsOrderDetails.Long,
//        //                Wide = wmsOrderDetails.Wide,
//        //                High = wmsOrderDetails.High,
//        //                MaterialSpec = wmsOrderDetails.Long + "*" + wmsOrderDetails.Wide + "*" + wmsOrderDetails.High,
//        //                MaterialBatch = wmsOrderDetails.Batch,
//        //                MaterialDensity = wmsOrderDetails.MaterialDensity,
//        //                //InspectionMethod = item.WmsMaterial.InspectionMethod,
//        //                //UnitType = item.WmsMaterial.UnitType,
//        //                //UnitNo = item.WmsMaterial.UnitNo,
//        //                StockNumber = wmsOrderDetails.OrderQuantity,
//        //                PlaceCode = wmsTask.ToPlace,
//        //                ContainerId = wmsContainer.Id,
//        //                ContainerCode = wmsContainer.ContainerCode,
//        //                AreaId = wmsPlace.AreaId,
//        //            };
//        //            await _wmsMaterialStockRep.InsertAsync(StockModel);
//        //        }
//        //    }
//        //    else if (wmsTask.TaskType == TaskType.CHUKU) //出库任务
//        //    {
//        //        var taskStatusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.ZX_DDJ, TaskDodeviceStatusEnum.WC_DDJ };
//        //        if (!taskStatusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行,堆垛机完成才能强制完成!");
//        //        // æŸ¥è¯¢æ‰˜ç›˜ä¿¡æ¯
//        //        var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
//        //        if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!");
//        //        // æŸ¥è¯¢åº“位信息
//        //        var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.PlaceCode == wmsTask.SourcePlace);
//        //        if (wmsPlace == 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)
//        //        {
//        //            // ç¦ç”¨æ‰˜ç›˜åº“位关系
//        //            wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
//        //            await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
//        //        }
//        //        // æ ¹æ®ä»»åŠ¡è¡¨ä¸­çš„å•æ®æ˜Žç»†Id查询单据明细信息
//        //        var wmsOrderDetails = await _wmsOrderDetailsRep.FirstOrDefaultAsync(z => z.Id == wmsTask.OrderDetailsId);
//        //        wmsTask.TaskStatus = TaskStatusEnum.ZHIXINGZHONG;
//        //        wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.ZX_RGV;
//        //        wmsTask.IsRead = false;
//        //        await _wmsTaskRep.UpdateAsync(wmsTask);
//        //        // æŸ¥è¯¢æ˜¯å¦å·²å­˜åœ¨ç‰©æ–™ä¸Žæ‰˜ç›˜å…³ç³»
//        //        var wmsMaterialContainer = await _wmsMaterialContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode
//        //        && z.MaterialNo == wmsOrderDetails.MaterialNo && z.BindStatus == CommonStatus.ENABLE);
//        //        //入库时组盘信息逻辑删除
//        //        if (wmsMaterialContainer != null)
//        //        {
//        //            wmsMaterialContainer.BindStatus = CommonStatus.DELETED;
//        //            await _wmsMaterialContainerRep.UpdateAsync(wmsMaterialContainer);
//        //            //新增出库绑定记录 æ­£å¸¸
//        //            var enable = new WmsMaterialContainer()
//        //            {
//        //                ContainerId = wmsContainer.Id,
//        //                ContainerCode = wmsContainer.ContainerCode,
//        //                MaterialId = YitIdHelper.NextId(), //系统生成的Id
//        //                MaterialName = "N/A",
//        //                MaterialNo = wmsMaterialContainer.MaterialNo,
//        //                MaterialBatch = wmsMaterialContainer.MaterialBatch,
//        //                MaterialDensity = wmsMaterialContainer.MaterialDensity,
//        //                MaterialSpec = wmsOrderDetails.Long + "*" + wmsOrderDetails.Wide + "*" + wmsOrderDetails.High,
//        //                BindQuantity = 1, //一个库位只有一个物料
//        //                OrderNo = wmsMaterialContainer.OrderNo,
//        //                OrderDetailsId = wmsMaterialContainer.OrderDetailsId,
//        //                BindStatus = CommonStatus.ENABLE
//        //            };
//        //            await _wmsMaterialContainerRep.InsertAsync(enable);
//        //        }
//        //        //更新库存
//        //        var stockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.PlaceCode == wmsTask.SourcePlace
//        //        && p.MaterialNo == wmsOrderDetails.MaterialNo && p.MaterialBatch == wmsOrderDetails.Batch).FirstOrDefaultAsync();
//        //        if (stockModel != null)
//        //        {
//        //            await _wmsMaterialStockRep.DeleteAsync(stockModel);
//        //        }
//        //        // æ›´æ–°åº“位状态为“空闲”
//        //        wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
//        //        await _wmsPlaceRep.UpdateAsync(wmsPlace);
//        //        //更新托盘状态为“空闲”
//        //        wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
//        //        await _wmsContainerRep.UpdateAsync(wmsContainer);
//        //    }
//        //    else //移库任务
//        //    {
//        //        var taskStatusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.ZX_DDJ, TaskDodeviceStatusEnum.WC_DDJ };
//        //        if (!taskStatusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行,堆垛机完成才能强制完成!");
//        //        // æŸ¥è¯¢æ‰˜ç›˜
//        //        var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
//        //        if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!");
//        //        wmsTask.TaskStatus = TaskStatusEnum.WANCHENG;
//        //        wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W;
//        //        wmsTask.IsRead = false;
//        //        // èµ·ç‚¹åº“位信息
//        //        var SourcePlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.SourcePlace).FirstOrDefaultAsync();
//        //        SourcePlace.PlaceStatus = PlaceStatus.KONGXIAN;
//        //        await _wmsPlaceRep.UpdateAsync(SourcePlace);
//        //        //目标库位信息
//        //        var ToPlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.ToPlace).FirstOrDefaultAsync();
//        //        ToPlace.PlaceStatus = PlaceStatus.CUNHUO;
//        //        await _wmsPlaceRep.UpdateAsync(ToPlace);
//        //        //托盘库位关系表
//        //        var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == SourcePlace.Id && z.PlaceCode == SourcePlace.PlaceCode
//        //        && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE);
//        //        wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
//        //        await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
//        //        await _wmsContainerPlaceRep.InsertAsync(new WmsContainerPlace()
//        //        {
//        //            PlaceId = ToPlace.Id,
//        //            PlaceCode = ToPlace.PlaceCode,
//        //            ContainerId = wmsContainer.Id,
//        //            ContainerCode = wmsContainer.ContainerCode,
//        //            ContainerPlaceStatus = CommonStatus.ENABLE
//        //        });
//        //        //库存库位更新
//        //        var stockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.PlaceCode == SourcePlace.PlaceCode).FirstOrDefaultAsync();
//        //        if (stockModel != null)
//        //        {
//        //            stockModel.PlaceCode = ToPlace.PlaceCode;
//        //        }
//        //    }
//        //}
//        /// <summary>
//        /// å–消任务
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("CancelTask")]
//        [UnitOfWork]
//        [AllowAnonymous]
//        public async Task CancelTask([FromBody] FinishTaskInput input)
//        {
//            var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.TaskNo == input.TaskNo);
//            if (wmsTask == null) throw Oops.Oh("任务不存在!");
//            if (wmsTask.TaskStatus == TaskStatusEnum.WANCHENG) throw Oops.Oh("任务已完成,取消失败!");
//            if (wmsTask.TaskType == TaskType.RUKU) // å…¥åº“任务
//            {
//                //var statusList = new List<TaskDodeviceStatusEnum> {TaskDodeviceStatusEnum.ZX_RSSX, TaskDodeviceStatusEnum.WC_RSSX,TaskDodeviceStatusEnum.WZX };
//                //if (!statusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有入库输送线执行,入库输送线完成或者设备未执行才能强制取消!");
//                //更新单据明细状态为未执行、更新托盘编号、更新库位编号
//                var wmsOrderDetails = await _wmsOrderDetailsRep.Where(z => z.Id == wmsTask.OrderDetailsId).ProjectToType<WmsOrderDetails>().FirstOrDefaultAsync();
//                if (wmsOrderDetails != null)
//                {
//                    wmsOrderDetails.OrderStatus = OrderDetailsStatusEnum.WEIZHIXING;
//                    await _wmsOrderDetailsRep.UpdateNowAsync(wmsOrderDetails);
//                }
//                //查询库位
//                var wmsPlace = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == wmsTask.ToPlace && u.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).ProjectToType<WmsPlace>().FirstOrDefaultAsync();
//                if (wmsPlace != null)
//                {
//                    // æ›´æ–°åº“位状态为空闲
//                    wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
//                    await _wmsPlaceRep.UpdateAsync(wmsPlace);
//                }
//                var materialContainer = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.BindStatus == CommonStatus.ENABLE).FirstOrDefaultAsync();
//                if (materialContainer != null)
//                {
//                    await _wmsMaterialContainerRep.DeleteNowAsync(materialContainer);
//                }
//                // æŸ¥è¯¢æ‰˜ç›˜
//                var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
//                if (wmsContainer != null)
//                {
//                    wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
//                    await _wmsContainerRep.UpdateAsync(wmsContainer);
//                }
//                // æ›´æ–°ä»»åŠ¡çŠ¶æ€
//                wmsTask.TaskStatus = TaskStatusEnum.WEIZHIXING;
//                wmsTask.IsRead = false;
//                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX;
//                wmsTask.ToPlace = "";
//                await _wmsTaskRep.UpdateAsync(wmsTask);
//            }
//            else if (wmsTask.TaskType == TaskType.CHUKU) //出库任务
//            {
//                var statusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.WZX, TaskDodeviceStatusEnum.ZX_DDJ };
//                if (!statusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行中或设备未执行才能强制取消!");
//                // æŸ¥è¯¢åº“位信息
//                var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.PlaceCode == wmsTask.SourcePlace);
//                if (wmsPlace == 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("库位容器关系不存在!");
//                // æ ¹æ®ä»»åŠ¡è¡¨ä¸­çš„å•æ®æ˜Žç»†Id查询单据明细信息
//                var wmsOrderDetails = await _wmsOrderDetailsRep.FirstOrDefaultAsync(z => z.Id == wmsTask.OrderDetailsId);
//                //修改单据明细,任务状态,设备任务状态为未执行
//                wmsOrderDetails.OrderStatus = OrderDetailsStatusEnum.WEIZHIXING;
//                await _wmsOrderDetailsRep.UpdateNowAsync(wmsOrderDetails);
//                wmsTask.TaskStatus = TaskStatusEnum.WEIZHIXING;
//                wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX;
//                await _wmsTaskRep.UpdateAsync(wmsTask);
//                // æ›´æ–°åº“位状态为存货
//                wmsPlace.PlaceStatus = PlaceStatus.CUNHUO;
//                await _wmsPlaceRep.UpdateAsync(wmsPlace);
//            }
//            else //移库任务
//            {
//                var statusList = new List<TaskDodeviceStatusEnum> { TaskDodeviceStatusEnum.WZX, TaskDodeviceStatusEnum.ZX_DDJ };
//                if (!statusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行中,设备未执行才能强制取消!");
//                // æŸ¥è¯¢æ‰˜ç›˜
//                var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode);
//                if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!");
//                //删除任务
//                await _wmsTaskRep.DeleteAsync(wmsTask);
//                // èµ·ç‚¹åº“位信息
//                var SourcePlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.SourcePlace).FirstOrDefaultAsync();
//                SourcePlace.PlaceStatus = PlaceStatus.CUNHUO;
//                await _wmsPlaceRep.UpdateAsync(SourcePlace);
//                //目标库位信息
//                var ToPlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.ToPlace).FirstOrDefaultAsync();
//                ToPlace.PlaceStatus = PlaceStatus.KONGXIAN;
//                await _wmsPlaceRep.UpdateAsync(ToPlace);
//            }
//        }
//        /// <summary>
//        /// wcs读取接口判断物料是否组盘出库 true代表已经组盘出库
//        /// </summary>
//        /// <returns></returns>
//        [HttpGet("CheckPack")]
//        [AllowAnonymous]
//        [NonAction]
//        public async Task<bool> CheckPack()
//        {
//            var packList = await _lesPackWarehouseRep.Where(p => p.LesPackState == LesPackState.WEICHUKU).Select(n => n.OrderNo).Distinct().ToListAsync();
//            if (packList.Count >= 2) return false;
//            else return true;
//        }
//        /// <summary>
//        /// è®¾å¤‡æŠ¥è­¦ä¿¡æ¯
//        /// </summary>
//        /// <returns></returns>
//        [HttpPost("AddDeviceWaring")]
//        [AllowAnonymous]
//        [NonAction]
//        public async Task AddDeviceWaring(AddDeviceWaringInput input)
//        {
//            //判断wcsid是否存在
//            var lesDeviceWaring = await _lesDeviceWaringRep.FirstOrDefaultAsync(u => u.WcsId == input.WcsId);
//            if (lesDeviceWaring != null)
//            {
//                await _lesDeviceWaringRep.UpdateAsync(lesDeviceWaring);
//            }
//            else
//            {
//                lesDeviceWaring = input.Adapt<LesDeviceWaring>();
//                await _lesDeviceWaringRep.InsertAsync(lesDeviceWaring);
//            }
//        }
//        #region  å…¬ç”¨æ–¹æ³•
//        /// <summary>
//        /// æ ¹æ®å··é“获取外侧第一排
//        /// </summary>
//        /// <param name="Aisle"></param>
//        /// <returns></returns>
//        [NonAction]
//        public int GetOneRowByAisle(int Aisle)
//        {
//            if (Aisle >= 7)
//            {
//                return 1;
//            }
//            return (Aisle - 1) * 4 + 1;
//        }
//        /// <summary>
//        /// æ ¹æ®å··é“获取内侧第二排
//        /// </summary>
//        /// <param name="Aisle"></param>
//        /// <returns></returns>
//        [NonAction]
//        public int GetTwoRowByAisle(int Aisle)
//        {
//            if (Aisle >= 7)
//            {
//                return 2;
//            }
//            return (Aisle - 1) * 4 + 2;
//        }
//        /// <summary>
//        /// æ ¹æ®å··é“获取外侧第二排
//        /// </summary>
//        /// <param name="Aisle"></param>
//        /// <returns></returns>
//        [NonAction]
//        public int GetThreeRowByAisle(int Aisle)
//        {
//            if (Aisle >= 7)
//            {
//                return 3;
//            }
//            return (Aisle - 1) * 4 + 3;
//        }
//        /// <summary>
//        /// æ ¹æ®å··é“获取外侧第一排
//        /// </summary>
//        /// <param name="Aisle"></param>
//        /// <returns></returns>
//        [NonAction]
//        public int GetFourRowByAisle(int Aisle)
//        {
//            if (Aisle >= 7)
//            {
//                return 4;
//            }
//            return (Aisle - 1) * 4 + 4;
//        }
//        #endregion
//    }
//}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsCount/WmsLocationView/LocationViewService.cs
@@ -1,280 +1,280 @@
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Admin.NET.Core;
//using Furion.DatabaseAccessor;
//using Furion.DependencyInjection;
//using Furion.DynamicApiController;
//using Mapster;
//using Microsoft.AspNetCore.Mvc;
//using Microsoft.EntityFrameworkCore;
//using Admin.NET.Core;
namespace Admin.NET.Application
{
    /// <summary>
    /// åº“位试图服务
    /// </summary>
    [ApiDescriptionSettings("仓库作业", Name = "LocationView", Order = 104)]
    [Route("api/[Controller]")]
    public class LocationViewService : IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
//namespace Admin.NET.Application
//{
//    /// <summary>
//    /// åº“位试图服务
//    /// </summary>
//    [ApiDescriptionSettings("仓库作业", Name = "LocationView", Order = 104)]
//    [Route("api/[Controller]")]
//    public class LocationViewService : IDynamicApiController, ITransient
//    {
//        private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
//        private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
//        private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
//        private readonly IRepository<WmsContainerPlace, MasterDbContextLocator> _wmsContainerPlaceRep;
//        private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
//        private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
        /// <summary>
        /// æž„造函数
        /// </summary>
        public LocationViewService(
            IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
            IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
            IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRe,
            IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
            IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainer
        )
        {
            _wmsAreaRep = wmsAreaRep;
            _wmsPlaceRep = wmsPlaceRep;
            _wmsMaterialStockRep = wmsMaterialStockRep;
            _wmsContainerPlaceRep = wmsContainerPlaceRe;
            _wmsContainerRep = wmsContainerRep;
            _wmsMaterialContainerRep = wmsMaterialContainer;
        }
//        /// <summary>
//        /// æž„造函数
//        /// </summary>
//        public LocationViewService(
//            IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
//            IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
//            IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
//            IRepository<WmsContainerPlace, MasterDbContextLocator> wmsContainerPlaceRe,
//            IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
//            IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainer
//        )
//        {
//            _wmsAreaRep = wmsAreaRep;
//            _wmsPlaceRep = wmsPlaceRep;
//            _wmsMaterialStockRep = wmsMaterialStockRep;
//            _wmsContainerPlaceRep = wmsContainerPlaceRe;
//            _wmsContainerRep = wmsContainerRep;
//            _wmsMaterialContainerRep = wmsMaterialContainer;
//        }
        /// <summary>
        /// èŽ·å–åº“åŒºä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetArea")]
        public async Task<List<WmsArea>> GetArea()
        {
            var areaList = await _wmsAreaRep.Where(n => n.AreaStatus == CommonStatus.ENABLE && n.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).ToListAsync();
            return areaList;
        }
//        /// <summary>
//        /// èŽ·å–åº“åŒºä¿¡æ¯
//        /// </summary>
//        /// <returns></returns>
//        [HttpGet("GetArea")]
//        public async Task<List<WmsArea>> GetArea()
//        {
//            var areaList = await _wmsAreaRep.Where(n => n.AreaStatus == CommonStatus.ENABLE && n.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).ToListAsync();
//            return areaList;
//        }
        /// <summary>
        /// æ ¹æ®åº“区获取巷道
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("GetAisle")]
        public async Task<object> GetPalceAisle([FromQuery] GetPalceAisleInput input)
        {
//        /// <summary>
//        /// æ ¹æ®åº“区获取巷道
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("GetAisle")]
//        public async Task<object> GetPalceAisle([FromQuery] GetPalceAisleInput input)
//        {
            
            var objList=await _wmsPlaceRep.Where(n => n.AreaId == input.Areaid).OrderBy(n=>n.Aisle).Select(n => n.Aisle).Distinct().ToArrayAsync();
            for (int i = 0; i < objList.Length-1; i++)
            {
                for (int j = 0; j < objList.Length-1; j++)
                {
                    int k = j + 1;
                    if (objList[j] >objList[k])
                    {
                        var temp = objList[k];
                        objList[k] = objList[j];
                        objList[j] = temp;
                    }
                }
            }
            return objList;
        }
//            var objList=await _wmsPlaceRep.Where(n => n.AreaId == input.Areaid).OrderBy(n=>n.Aisle).Select(n => n.Aisle).Distinct().ToArrayAsync();
//            for (int i = 0; i < objList.Length-1; i++)
//            {
//                for (int j = 0; j < objList.Length-1; j++)
//                {
//                    int k = j + 1;
//                    if (objList[j] >objList[k])
//                    {
//                        var temp = objList[k];
//                        objList[k] = objList[j];
//                        objList[j] = temp;
//                    }
//                }
//            }
//            return objList;
//        }
        /// <summary>
        /// æ ¹æ®åº“区和巷道获取排
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("GetPalceRowno")]
        public async Task<object> GetPalceRowno([FromQuery] GetPalceAisleRownoInput input)
        {
            var objList=await _wmsPlaceRep.Where(n => n.AreaId == input.Areaid && n.Aisle==input.Aisleid && n.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).OrderBy(n => n.RowNo).Select(n => n.RowNo).Distinct().ToArrayAsync();
//        /// <summary>
//        /// æ ¹æ®åº“区和巷道获取排
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("GetPalceRowno")]
//        public async Task<object> GetPalceRowno([FromQuery] GetPalceAisleRownoInput input)
//        {
//            var objList=await _wmsPlaceRep.Where(n => n.AreaId == input.Areaid && n.Aisle==input.Aisleid && n.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).OrderBy(n => n.RowNo).Select(n => n.RowNo).Distinct().ToArrayAsync();
            for (int i = 0; i < objList.Length - 1; i++)
            {
                for (int j = 0; j < objList.Length - 1; j++)
                {
                    int k = j + 1;
                    if (objList[j] > objList[k])
                    {
                        var temp = objList[k];
                        objList[k] = objList[j];
                        objList[j] = temp;
                    }
                }
            }
            return objList;
        }
//            for (int i = 0; i < objList.Length - 1; i++)
//            {
//                for (int j = 0; j < objList.Length - 1; j++)
//                {
//                    int k = j + 1;
//                    if (objList[j] > objList[k])
//                    {
//                        var temp = objList[k];
//                        objList[k] = objList[j];
//                        objList[j] = temp;
//                    }
//                }
//            }
//            return objList;
//        }
        /// <summary>
        /// æ ¹æ®åº“区 æŽ’获取库位信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("GetPalceList")]
        public async Task<PalceInfoOtput> GetPalceList([FromQuery] GetPalceListInput input)
        {
            var palceList = await _wmsPlaceRep.DetachedEntities
                .Where(p => p.AreaId == input.Areaid)
                .Where(input.Aisleid != 0, p => p.Aisle == input.Aisleid)
                .Where(input.Rowno != 0, p => p.RowNo == input.Rowno)
                .ToListAsync();
//        /// <summary>
//        /// æ ¹æ®åº“区 æŽ’获取库位信息
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("GetPalceList")]
//        public async Task<PalceInfoOtput> GetPalceList([FromQuery] GetPalceListInput input)
//        {
//            var palceList = await _wmsPlaceRep.DetachedEntities
//                .Where(p => p.AreaId == input.Areaid)
//                .Where(input.Aisleid != 0, p => p.Aisle == input.Aisleid)
//                .Where(input.Rowno != 0, p => p.RowNo == input.Rowno)
//                .ToListAsync();
            //获取有多少巷,排,列,层
            var Aisles = palceList.OrderBy(n => n.Aisle).Select(n => n.Aisle).Distinct().ToList();
//            //获取有多少巷,排,列,层
//            var Aisles = palceList.OrderBy(n => n.Aisle).Select(n => n.Aisle).Distinct().ToList();
        
            var locationDataList = new List<WareLocationAisleData>();
            //巷道
            foreach (var aisle in Aisles)
            {
                var aisleData = new WareLocationAisleData();
                aisleData.Aisle = aisle;
                aisleData.wareLocationRownoData = new List<WareLocationRownoData>();
                //排
                var RowNos = palceList.Where(p=>p.Aisle==aisle).OrderBy(n => n.RowNo).Select(n => n.RowNo).Distinct().ToList();
                foreach (var row in RowNos)
                {
                    var rownoData = new WareLocationRownoData();
                    rownoData.Rowno = row;
                    rownoData.wareLocationLayerData = new List<WareLocationLayerData>();
                    //层
                    var LayerNo = palceList.Where(p=>p.Aisle==aisle && p.RowNo==row).OrderByDescending(n => n.LayerNo).Select(n => n.LayerNo).Distinct();
                    foreach (var lay in LayerNo)
                    {
                        var layerData = new WareLocationLayerData();
                        layerData.Layer = lay;
                        layerData.wareLocationColumnNoData = new List<PalceDetail>();
                        //列
                        var ColumnNos = palceList.Where(p=>p.Aisle==aisle && p.RowNo==row).OrderByDescending(n => n.ColumnNo).Select(n => n.ColumnNo).Distinct();
                        foreach (var col in ColumnNos)
                        {
                            var wareLocationMdoel = palceList.Where(p =>p.Aisle==aisle && p.RowNo == row && p.LayerNo == lay && p.ColumnNo == col).FirstOrDefault();
                            if (wareLocationMdoel != null)
                            {
                                var locationDetail = new PalceDetail()
                                {
                                    Id = wareLocationMdoel.Id,
                                    RowNo = wareLocationMdoel.RowNo,
                                    ColumnNo = wareLocationMdoel.ColumnNo,
                                    LayerNo = wareLocationMdoel.LayerNo,
                                    PlaceCode = wareLocationMdoel.PlaceCode,
                                    Islock = wareLocationMdoel.Islock,
                                    EmptyContainer = wareLocationMdoel.EmptyContainer,
                                    PlaceStatus = wareLocationMdoel.PlaceStatus,
                                };
                                layerData.wareLocationColumnNoData.Add(locationDetail);
                            }
                            else
                            {
                                layerData.wareLocationColumnNoData.Add(null);
                            }
                        }
                        rownoData.wareLocationLayerData.Add(layerData);
                    }
                    aisleData.wareLocationRownoData.Add(rownoData);
                }
                locationDataList.Add(aisleData);
            }
//            var locationDataList = new List<WareLocationAisleData>();
//            //巷道
//            foreach (var aisle in Aisles)
//            {
//                var aisleData = new WareLocationAisleData();
//                aisleData.Aisle = aisle;
//                aisleData.wareLocationRownoData = new List<WareLocationRownoData>();
//                //排
//                var RowNos = palceList.Where(p=>p.Aisle==aisle).OrderBy(n => n.RowNo).Select(n => n.RowNo).Distinct().ToList();
//                foreach (var row in RowNos)
//                {
//                    var rownoData = new WareLocationRownoData();
//                    rownoData.Rowno = row;
//                    rownoData.wareLocationLayerData = new List<WareLocationLayerData>();
//                    //层
//                    var LayerNo = palceList.Where(p=>p.Aisle==aisle && p.RowNo==row).OrderByDescending(n => n.LayerNo).Select(n => n.LayerNo).Distinct();
//                    foreach (var lay in LayerNo)
//                    {
//                        var layerData = new WareLocationLayerData();
//                        layerData.Layer = lay;
//                        layerData.wareLocationColumnNoData = new List<PalceDetail>();
//                        //列
//                        var ColumnNos = palceList.Where(p=>p.Aisle==aisle && p.RowNo==row).OrderByDescending(n => n.ColumnNo).Select(n => n.ColumnNo).Distinct();
//                        foreach (var col in ColumnNos)
//                        {
//                            var wareLocationMdoel = palceList.Where(p =>p.Aisle==aisle && p.RowNo == row && p.LayerNo == lay && p.ColumnNo == col).FirstOrDefault();
//                            if (wareLocationMdoel != null)
//                            {
//                                var locationDetail = new PalceDetail()
//                                {
//                                    Id = wareLocationMdoel.Id,
//                                    RowNo = wareLocationMdoel.RowNo,
//                                    ColumnNo = wareLocationMdoel.ColumnNo,
//                                    LayerNo = wareLocationMdoel.LayerNo,
//                                    PlaceCode = wareLocationMdoel.PlaceCode,
//                                    Islock = wareLocationMdoel.Islock,
//                                    EmptyContainer = wareLocationMdoel.EmptyContainer,
//                                    PlaceStatus = wareLocationMdoel.PlaceStatus,
//                                };
//                                layerData.wareLocationColumnNoData.Add(locationDetail);
//                            }
//                            else
//                            {
//                                layerData.wareLocationColumnNoData.Add(null);
//                            }
//                        }
//                        rownoData.wareLocationLayerData.Add(layerData);
//                    }
//                    aisleData.wareLocationRownoData.Add(rownoData);
//                }
//                locationDataList.Add(aisleData);
//            }
            return new PalceInfoOtput()
            {
                countNum = palceList.Count,
                cunhuoNum = palceList.Where(n => n.PlaceStatus == PlaceStatus.CUNHUO).Count(),
                emptyNum = palceList.Where(n => n.PlaceStatus == PlaceStatus.KONGXIAN).Count(),
                DaiRuNum = palceList.Where(n => n.PlaceStatus == PlaceStatus.DAIRU).Count(),
                DaichuNum = palceList.Where(n => n.PlaceStatus == PlaceStatus.DAICHU).Count(),
                emptyContainerNum = palceList.Where(p => p.EmptyContainer == YesOrNot.Y && p.PlaceStatus == PlaceStatus.CUNHUO).Count(),
                materialNum = palceList.Where(p => p.EmptyContainer == YesOrNot.N && p.PlaceStatus == PlaceStatus.CUNHUO).Count(),
                lockNum = palceList.Where(p => p.Islock == YesOrNot.Y).Count(),
                PalceDetails = locationDataList,
            };
        }
//            return new PalceInfoOtput()
//            {
//                countNum = palceList.Count,
//                cunhuoNum = palceList.Where(n => n.PlaceStatus == PlaceStatus.CUNHUO).Count(),
//                emptyNum = palceList.Where(n => n.PlaceStatus == PlaceStatus.KONGXIAN).Count(),
//                DaiRuNum = palceList.Where(n => n.PlaceStatus == PlaceStatus.DAIRU).Count(),
//                DaichuNum = palceList.Where(n => n.PlaceStatus == PlaceStatus.DAICHU).Count(),
//                emptyContainerNum = palceList.Where(p => p.EmptyContainer == YesOrNot.Y && p.PlaceStatus == PlaceStatus.CUNHUO).Count(),
//                materialNum = palceList.Where(p => p.EmptyContainer == YesOrNot.N && p.PlaceStatus == PlaceStatus.CUNHUO).Count(),
//                lockNum = palceList.Where(p => p.Islock == YesOrNot.Y).Count(),
//                PalceDetails = locationDataList,
//            };
//        }
        /// <summary>
        /// æ ¹æ®åº“位获取对应信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("GetMaterialDetail")]
        [UnifyResult(typeof(MaterialDetailsOutput))]
        public async Task<object> GetMaterialDetail([FromQuery] GetMaterialDetailInput input)
        {
            var palceModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.Id == input.Id);
            if (palceModel == null) return XnRestfulResultProvider.RESTfulMesaage("库位信息不存在!");
            var MaterialStockList = await _wmsMaterialStockRep.Where(p => p.PlaceCode == palceModel.PlaceCode).ToListAsync();
            var model = new MaterialDetailsOutput()
            {
                PalceDetails = palceModel.Adapt<PalceDetail>()
            };
            if (MaterialStockList.Count > 0)
            {
                model.Containercode = MaterialStockList.FirstOrDefault().ContainerCode;
                model.WmsMaterialStocks = MaterialStockList;
            }
            return XnRestfulResultProvider.RESTfulResult(model);
        }
//        /// <summary>
//        /// æ ¹æ®åº“位获取对应信息
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("GetMaterialDetail")]
//        [UnifyResult(typeof(MaterialDetailsOutput))]
//        public async Task<object> GetMaterialDetail([FromQuery] GetMaterialDetailInput input)
//        {
//            var palceModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.Id == input.Id);
//            if (palceModel == null) return XnRestfulResultProvider.RESTfulMesaage("库位信息不存在!");
//            var MaterialStockList = await _wmsMaterialStockRep.Where(p => p.PlaceCode == palceModel.PlaceCode).ToListAsync();
//            var model = new MaterialDetailsOutput()
//            {
//                PalceDetails = palceModel.Adapt<PalceDetail>()
//            };
//            if (MaterialStockList.Count > 0)
//            {
//                model.Containercode = MaterialStockList.FirstOrDefault().ContainerCode;
//                model.WmsMaterialStocks = MaterialStockList;
//            }
//            return XnRestfulResultProvider.RESTfulResult(model);
//        }
        /// <summary>
        /// ä¿®æ”¹åº“位锁定信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("UpdatePalceIslock")]
        [UnifyResult(typeof(object))]
        public async Task<object> UpdatePalceIslock([FromQuery] GetMaterialDetailInput input)
        {
            var palceModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.Id == input.Id);
            if (palceModel == null) return XnRestfulResultProvider.RESTfulMesaage("库位信息不存在!");
            if (palceModel.Islock == YesOrNot.Y)
            {
                palceModel.Islock = YesOrNot.N;
            }
            else
            {
                palceModel.Islock = YesOrNot.Y;
            }
            await _wmsPlaceRep.UpdateAsync(palceModel);
            return XnRestfulResultProvider.RESTfulResult();
        }
//        /// <summary>
//        /// ä¿®æ”¹åº“位锁定信息
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("UpdatePalceIslock")]
//        [UnifyResult(typeof(object))]
//        public async Task<object> UpdatePalceIslock([FromQuery] GetMaterialDetailInput input)
//        {
//            var palceModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.Id == input.Id);
//            if (palceModel == null) return XnRestfulResultProvider.RESTfulMesaage("库位信息不存在!");
//            if (palceModel.Islock == YesOrNot.Y)
//            {
//                palceModel.Islock = YesOrNot.N;
//            }
//            else
//            {
//                palceModel.Islock = YesOrNot.Y;
//            }
//            await _wmsPlaceRep.UpdateAsync(palceModel);
//            return XnRestfulResultProvider.RESTfulResult();
//        }
        /// <summary>
        /// å°†åº“位置为空闲
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("UpdatePalceKongXian")]
        [UnifyResult(typeof(object))]
        [UnitOfWork]
        public async Task<object> UpdatePalceKongXian([FromQuery] GetMaterialDetailInput input)
        {
            var palceModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.Id == input.Id);
            if (palceModel == null) return XnRestfulResultProvider.RESTfulMesaage("库位信息不存在!");
            palceModel.PlaceStatus = PlaceStatus.KONGXIAN;
            await _wmsPlaceRep.UpdateAsync(palceModel);
//        /// <summary>
//        /// å°†åº“位置为空闲
//        /// </summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        [HttpGet("UpdatePalceKongXian")]
//        [UnifyResult(typeof(object))]
//        [UnitOfWork]
//        public async Task<object> UpdatePalceKongXian([FromQuery] GetMaterialDetailInput input)
//        {
//            var palceModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.Id == input.Id);
//            if (palceModel == null) return XnRestfulResultProvider.RESTfulMesaage("库位信息不存在!");
//            palceModel.PlaceStatus = PlaceStatus.KONGXIAN;
//            await _wmsPlaceRep.UpdateAsync(palceModel);
            var materialStockModel = await _wmsMaterialStockRep.Where(p => p.PlaceCode == palceModel.PlaceCode).FirstOrDefaultAsync();
            if (materialStockModel != null)
            {
                await _wmsMaterialStockRep.DeleteAsync(materialStockModel);
            }
            var containerPlaceModel = await _wmsContainerPlaceRep.Where(p => p.PlaceCode == palceModel.PlaceCode && p.ContainerPlaceStatus == CommonStatus.ENABLE).FirstOrDefaultAsync();
            if (containerPlaceModel != null)
            {
                containerPlaceModel.ContainerPlaceStatus = CommonStatus.DISABLE;
                await _wmsContainerPlaceRep.UpdateAsync(containerPlaceModel);
//            var materialStockModel = await _wmsMaterialStockRep.Where(p => p.PlaceCode == palceModel.PlaceCode).FirstOrDefaultAsync();
//            if (materialStockModel != null)
//            {
//                await _wmsMaterialStockRep.DeleteAsync(materialStockModel);
//            }
//            var containerPlaceModel = await _wmsContainerPlaceRep.Where(p => p.PlaceCode == palceModel.PlaceCode && p.ContainerPlaceStatus == CommonStatus.ENABLE).FirstOrDefaultAsync();
//            if (containerPlaceModel != null)
//            {
//                containerPlaceModel.ContainerPlaceStatus = CommonStatus.DISABLE;
//                await _wmsContainerPlaceRep.UpdateAsync(containerPlaceModel);
                var wmsMaterialContainerModal = await _wmsMaterialContainerRep.FirstOrDefaultAsync(p => p.ContainerCode == containerPlaceModel.ContainerCode && p.BindStatus == CommonStatus.ENABLE);
                if (containerPlaceModel != null) return XnRestfulResultProvider.RESTfulMesaage("物料托盘信息不存在!");
                containerPlaceModel.ContainerPlaceStatus = CommonStatus.DISABLE;
                await _wmsMaterialContainerRep.UpdateAsync(wmsMaterialContainerModal);
//                var wmsMaterialContainerModal = await _wmsMaterialContainerRep.FirstOrDefaultAsync(p => p.ContainerCode == containerPlaceModel.ContainerCode && p.BindStatus == CommonStatus.ENABLE);
//                if (containerPlaceModel != null) return XnRestfulResultProvider.RESTfulMesaage("物料托盘信息不存在!");
//                containerPlaceModel.ContainerPlaceStatus = CommonStatus.DISABLE;
//                await _wmsMaterialContainerRep.UpdateAsync(wmsMaterialContainerModal);
                var containerModel = await _wmsContainerRep.FirstOrDefaultAsync(p => p.ContainerCode == containerPlaceModel.ContainerCode);
                if (containerModel != null)
                {
                    containerModel.ContainerStatus = ContainerStatus.KOUXIAN;
                    await _wmsContainerRep.UpdateAsync(containerModel);
                }
            }
            return XnRestfulResultProvider.RESTfulResult();
        }
    }
}
//                var containerModel = await _wmsContainerRep.FirstOrDefaultAsync(p => p.ContainerCode == containerPlaceModel.ContainerCode);
//                if (containerModel != null)
//                {
//                    containerModel.ContainerStatus = ContainerStatus.KOUXIAN;
//                    await _wmsContainerRep.UpdateAsync(containerModel);
//                }
//            }
//            return XnRestfulResultProvider.RESTfulResult();
//        }
//    }
//}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Core/Entity/WmsBase/WmsArea.cs
@@ -1,9 +1,12 @@
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
/*
 * @author : åˆ˜æ–‡å¥‡
 * @date : 2024/4/23下午5:20:46
 * @desc : åº“区表
 */
namespace Admin.NET.Core
{
    /// <summary>
@@ -11,73 +14,96 @@
    /// </summary>
    [Table("wms_area")]
    [Comment("库区表")]
    public class WmsArea : DEntityBase, IEntityTypeBuilder<WmsArea>
    public class WmsArea : DEntityBase
    {
        /// <summary>
        /// åç§°
        /// åº“区编码
        /// </summary>
        [Comment("名称")]
        [Comment("库区编码")]
        [Required]
        [MaxLength(50)]
        public string AreaCode { get; set; }
        /// <summary>
        /// ä»“库编号
        /// </summary>
        [Comment("仓库编号")]
        [Required]
        [MaxLength(50)]
        public string WarehouseCode { get; set; }
        /// <summary>
        /// ä»“库名称
        /// </summary>
        [Comment("仓库名称")]
        [Required]
        [MaxLength(255)]
        public string WarehouseName { get; set; }
        /// <summary>
        /// åº“区名称
        /// </summary>
        [Comment("库区名称")]
        [Required]
        [MaxLength(50)]
        public string AreaName { get; set; }
        /// <summary>
        /// æè¿°
        /// åº“区描述
        /// </summary>
        [Comment("描述")]
        [MaxLength(250)]
        [Comment("库区描述")]
        [MaxLength(50)]
        public string AreaDesc { get; set; }
        /// <summary>
        /// çŠ¶æ€;数据字典
        /// åº“区状态
        /// </summary>
        [Comment("状态")]
        [Comment("库区状态")]
        [Required]
        public CommonStatus AreaStatus { get; set; }
        public int AreaStatus { get; set; }
        /// <summary>
        /// åˆ†ç±»;数据字典
        /// ERP代码
        /// </summary>
        [Comment("分类")]
        [Comment("ERP代码")]
        [Required]
        public AreaType AreaType { get; set; }
        [MaxLength(50)]
        public string ErpCode { get; set; }
        /// <summary>
        /// æ˜¯å¦ä¸ºé’¢å¹³å°
        /// æ‰€å±žä»“库
        /// </summary>
        [Comment("是否为钢平台")]
        public bool IsSteel { get; set; }
        [Comment("所属仓库")]
        [Required]
        public long WarehouseId { get; set; }
        /// <summary>
        /// æ‰€å±žè½¦é—´
        /// æ˜¯å¦è™šæ‹Ÿ
        /// </summary>
        [Comment("所属车间")]
        public LesWorkShopType WorkShopType { get; set; }
        [Comment("是否虚拟")]
        [Required]
        /// <summary>
        /// åº“位表
        /// </summary>
        public ICollection<WmsPlace> WmsPlaces { get; set; }
        public bool IsVirtually { get; set; }
        /// <summary>
        /// åº“口表
        /// </summary>
        public ICollection<LesEntrance> LesEntrance { get; set; }
        /// <summary>
        /// æž„建一对多的关系
        /// </summary>
        /// <param name="entityBuilder"></param>
        /// <param name="dbContext"></param>
        /// <param name="dbContextLocator"></param>
        public void Configure(EntityTypeBuilder<WmsArea> entityBuilder, DbContext dbContext, Type dbContextLocator)
        {
            entityBuilder.HasMany(x => x.WmsPlaces)
                .WithOne(x => x.WmsArea)
                .HasForeignKey(x => x.AreaId).IsRequired(true);
            entityBuilder.HasMany(x => x.LesEntrance)
                .WithOne(x => x.WmsArea)
                .HasForeignKey(x => x.AreaId).IsRequired(true);
        }
    }
}
ʹÓÃÎĵµ/PDManerÎļþ/Ô­²ÄÁÏ¿â±ê×¼»¯.pdma.json
@@ -4,7 +4,7 @@
  "avatar": "",
  "version": "4.1.3",
  "createdTime": "2024-4-12 12:56:29",
  "updatedTime": "2024-4-23 16:59:43",
  "updatedTime": "2024-4-23 17:20:35",
  "dbConns": [],
  "profile": {
    "default": {
@@ -669,7 +669,7 @@
      "#DDE5FF"
    ],
    "DDLToggleCase": "L",
    "menuWidth": "283px",
    "menuWidth": "411px",
    "extAttrProps": {
      "attr1": {
        "editType": "",
@@ -21572,8 +21572,8 @@
          "defKey": "Id",
          "defName": "Id主键",
          "comment": "",
          "domain": "",
          "type": "bigint",
          "domain": "16120F75-6AA7-4483-868D-F07F511BB081",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": true,
@@ -21598,7 +21598,7 @@
        },
        {
          "defKey": "AreaCode",
          "defName": "编码",
          "defName": "库区编码",
          "comment": "",
          "type": "",
          "len": "",
@@ -21615,8 +21615,42 @@
          "baseType": "F8A4AFB0-F3B7-4E32-A5F2-D4D8D3F4BACD"
        },
        {
          "defKey": "WarehouseCode",
          "defName": "仓库编号",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": true,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "extProps": {},
          "domain": "94107640-E002-4AB3-A2DC-B66F98D9645F",
          "id": "9ABF4E63-1F5A-4069-A5A7-8D1CD91FCB17"
        },
        {
          "defKey": "WarehouseName",
          "defName": "仓库名称",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": true,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "extProps": {},
          "domain": "B19256E6-87E6-4A43-AD65-67095F06819F",
          "id": "D5A9D295-99F8-422C-AF0E-B5F0D2BB833A"
        },
        {
          "defKey": "AreaName",
          "defName": "名称",
          "defName": "库区名称",
          "comment": "",
          "domain": "94107640-E002-4AB3-A2DC-B66F98D9645F",
          "type": "",
@@ -21644,7 +21678,7 @@
        },
        {
          "defKey": "AreaDesc",
          "defName": "描述",
          "defName": "库区描述",
          "comment": "",
          "domain": "94107640-E002-4AB3-A2DC-B66F98D9645F",
          "type": "",
@@ -21672,7 +21706,7 @@
        },
        {
          "defKey": "AreaStatus",
          "defName": "状态",
          "defName": "库区状态",
          "comment": "",
          "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E",
          "type": "",
@@ -21694,34 +21728,6 @@
          "attr8": "",
          "attr9": "",
          "id": "583C7441-7624-4325-995A-F27AA673073F",
          "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811",
          "extProps": {},
          "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE"
        },
        {
          "defKey": "AreaType",
          "defName": "分类",
          "comment": "",
          "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": true,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "attr1": "",
          "attr2": "",
          "attr3": "",
          "attr4": "",
          "attr5": "",
          "attr6": "",
          "attr7": "",
          "attr8": "",
          "attr9": "",
          "id": "3147E4D9-AA01-4F8A-A036-A16F0160E38B",
          "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811",
          "extProps": {},
          "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE"
@@ -21783,11 +21789,28 @@
          "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE"
        },
        {
          "defKey": "IsVirtually",
          "defName": "是否虚拟",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": true,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "extProps": {},
          "domain": "6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF",
          "id": "36E61A74-8758-49EC-B486-D1383B37EA03"
        },
        {
          "defKey": "CreatedTime",
          "defName": "创建时间",
          "comment": "",
          "domain": "",
          "type": "datetimeoffset",
          "domain": "E9456E44-8231-4BC0-B2CD-5FF4AEC6DE97",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
@@ -21814,8 +21837,8 @@
          "defKey": "UpdatedTime",
          "defName": "更新时间",
          "comment": "",
          "domain": "",
          "type": "datetimeoffset",
          "domain": "E9456E44-8231-4BC0-B2CD-5FF4AEC6DE97",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
@@ -21842,8 +21865,8 @@
          "defKey": "CreatedUserId",
          "defName": "创建者Id",
          "comment": "",
          "domain": "",
          "type": "bigint",
          "domain": "717941D9-8B3F-435A-9F8E-8D13B7404D5B",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
@@ -21870,9 +21893,9 @@
          "defKey": "CreatedUserName",
          "defName": "创建者名称",
          "comment": "",
          "domain": "",
          "type": "nvarchar",
          "len": 50,
          "domain": "94107640-E002-4AB3-A2DC-B66F98D9645F",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
@@ -21898,8 +21921,8 @@
          "defKey": "UpdatedUserId",
          "defName": "修改者Id",
          "comment": "",
          "domain": "",
          "type": "bigint",
          "domain": "717941D9-8B3F-435A-9F8E-8D13B7404D5B",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
@@ -21926,9 +21949,9 @@
          "defKey": "UpdatedUserName",
          "defName": "修改者名称",
          "comment": "",
          "domain": "",
          "type": "nvarchar",
          "len": 50,
          "domain": "94107640-E002-4AB3-A2DC-B66F98D9645F",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
@@ -21954,9 +21977,9 @@
          "defKey": "IsDeleted",
          "defName": "软删除标记",
          "comment": "",
          "domain": "",
          "type": "bit",
          "len": 1,
          "domain": "6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": true,
@@ -45817,7 +45840,7 @@
        }
      },
      "defKey": "wms_container_type",
      "defName": "托盘类型",
      "defName": "容器类型",
      "comment": "",
      "properties": {
        "partitioned by": "(date string)",