//using Furion.DatabaseAccessor;
//using Furion.DependencyInjection;
//using Furion.DynamicApiController;
//using Furion.FriendlyException;
//using Mapster;
//using Microsoft.AspNetCore.Mvc;
//using Microsoft.EntityFrameworkCore;
//using Yitter.IdGenerator;
//using Admin.NET.Core;
//namespace Admin.NET.Application
//{
// ///
// /// 出库管理服务
// ///
// [ApiDescriptionSettings("自己的业务", Name = "ExWarehouse", Order = 100)]
// [Route("api/[Controller]")]
// public class ExWarehouseService : IDynamicApiController, ITransient
// {
// private readonly IRepository _wmsAreaRep;
// private readonly IRepository _wmsPlaceRep;
// private readonly IRepository _wmsTaskRep;
// private readonly IRepository _wmsContainerRep;
// private readonly IRepository _wmsContainerPlaceRep;
// private readonly IRepository _wmsMaterialRep;
// private readonly IRepository _wmsMaterialStockRep;
// private readonly IRepository _wmsMaterialContainerRep;
// ///
// /// 构造函数
// ///
// public ExWarehouseService(
// IRepository wmsAreaRep,
// IRepository wmsPlaceRep,
// IRepository wmsTaskRep,
// IRepository wmsContainerRep,
// IRepository wmsContainerPlaceRep,
// IRepository wmsMaterialRep,
// IRepository wmsMaterialStockRep,
// IRepository wmsMaterialContainerRep
// )
// {
// this._wmsAreaRep = wmsAreaRep;
// this._wmsPlaceRep = wmsPlaceRep;
// this._wmsTaskRep = wmsTaskRep;
// this._wmsContainerRep = wmsContainerRep;
// this._wmsContainerPlaceRep = wmsContainerPlaceRep;
// this._wmsMaterialRep = wmsMaterialRep;
// this._wmsMaterialStockRep = wmsMaterialStockRep;
// this._wmsMaterialContainerRep = wmsMaterialContainerRep;
// }
// ///
// /// 分页查询物料出库管理信息
// ///
// ///
// ///
// [HttpGet("page")]
// public async Task> Page([FromQuery] ExWarehouseSearch input)
// {
// var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
// .Where (!string.IsNullOrEmpty(input.MaterialName), u => EF.Functions.Like(u.MaterialName, $"%{input.MaterialName.Trim()}%"))
// .ProjectToType()
// .ToListAsync();
// return wmsMaterialStocks.ToADPagedList(input.PageNo, input.PageSize);
// }
// ///
// /// 自动出库
// ///
// ///
// ///
// [HttpPost("AutoExWarehouse")]
// [UnitOfWork]
// public async Task AutoExWarehouse(List inputs)
// {
// // 根据托盘号、库位编号去重
// var containerCodeDistinct = inputs.Select(u => new { u.ContainerCode, u.PlaceCode }).Distinct().ToList();
// if (containerCodeDistinct.Count <= 0) throw Oops.Oh("暂无库存出库");
// // 查询库区名称
// var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库"));
// if (wmsArea != null) throw Oops.Oh("库区不存在");
// foreach (var item in containerCodeDistinct)
// {
// var wmsMaterialContainerList = new List();
// // 判断任务
// var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(p => p.ContainerCode == item.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG);
// if (wmsTask != null) throw Oops.Oh("周转箱号存在未完成的任务!");
// // 检查周转箱号信息
// var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == item.ContainerCode);
// if (wmsContainer == null) throw Oops.Oh("库存中没有该:" + wmsContainer.ContainerCode + "托盘!");
// // 检查库位信息
// var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == item.PlaceCode);
// if (wmsPlace == null) throw Oops.Oh("库位不存在!");
// if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
// // 更新状态为“待出”
// wmsPlace.PlaceStatus = PlaceStatus.DAICHU;
// await _wmsPlaceRep.UpdateAsync(wmsPlace);
// // 检查库存
// var wmsMaterialStockList = inputs.Where(u => u.ContainerCode == wmsContainer.ContainerCode && u.PlaceCode == wmsPlace.PlaceCode).ToList();
// if (wmsMaterialStockList.Count <= 0) throw Oops.Oh("库存数据异常!");
// // 检查库位与周转箱号关系
// var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.ContainerId == wmsContainer.Id
// && p.PlaceCode == wmsPlace.PlaceCode && p.PlaceId == wmsPlace.Id && p.ContainerPlaceStatus == CommonStatus.ENABLE);
// if (wmsContainerPlace == null) throw Oops.Oh("托盘号与库位关系不存在!");
// // 不是空料箱才会有组盘关系
// if (wmsPlace.EmptyContainer == YesOrNot.N)
// {
// // 检查物料与周转箱号关系
// wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync();
// if (wmsMaterialContainerList.Count <= 0) throw Oops.Oh("周转箱号与物料关系不存在!");
// }
// else
// {
// // 更新空料箱库存
// var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsContainer.ContainerCode);
// if (wmsMaterialStock.Source == RuKuSourceEnum.KONGTUO)
// {
// wmsMaterialStock.PlaceCode = "N/A";
// await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
// }
// }
// if (wmsTask == null)
// {
// string taskNo = "CHUKU" + DateTime.Today.ToString("yyyyMMdd");
// var wmsTaskModel = await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => EF.Functions.Like(u.TaskNo, $"%{taskNo}%"));
// if (wmsTaskModel == null)
// {
// taskNo = taskNo + "0001";
// }
// else
// {
// //获取流水号最大的数据
// var maxSerialNumber = await _wmsTaskRep.MaxAsync(t => t.TaskNo);
// taskNo = Comm.GenerateNewInvoiceNumber(maxSerialNumber, 1);
// }
// // 新增任务
// var takmodel = new WmsTask()
// {
// TaskNo = taskNo,//YitIdHelper.NextId().ToString(),
// TaskModel = TaskModel.QUANZIDONG,
// TaskType = TaskType.CHUKU,
// TaskLevel = 1,
// TaskStatus = TaskStatusEnum.WEIZHIXING,
// ContainerCode = wmsContainer.ContainerCode,
// SourcePlace = wmsPlace.PlaceCode,
// Aisle = wmsPlace.Aisle,
// ToPlace = "出库口",
// AreaName = wmsArea.AreaName,
// Description = wmsPlace.EmptyContainer == YesOrNot.Y ? "空托" : "物料",
// OrderNo = wmsMaterialContainerList.Count <= 0 ? "N/A" : wmsMaterialContainerList.FirstOrDefault().OrderNo,
// TaskDodeviceStatus = TaskDodeviceStatusEnum.W,
// IsRead = true
// };
// await _wmsTaskRep.InsertAsync(takmodel);
// }
// }
// }
// ///
// /// 人工出库
// ///
// ///
// ///
// [HttpPost("manualExWarehouse")]
// [UnitOfWork]
// public async Task ManualExWarehouse(List inputs)
// {
// // 根据托盘号、库位编号去重
// var containerCodeDistinct = inputs.Select(u => new { u.ContainerCode, u.PlaceCode }).Distinct().ToList();
// if (containerCodeDistinct.Count <= 0) throw Oops.Oh("暂无库存出库");
// // 查询库区名称
// var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库"));
// if (wmsArea != null) throw Oops.Oh("库区不存在");
// foreach (var item in containerCodeDistinct)
// {
// var wmsMaterialContainerList = new List();
// // 判断任务
// var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(p => p.ContainerCode == item.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG);
// if (wmsTask != null) throw Oops.Oh("托盘号存在未完成的任务!");
// // 检查托盘号信息
// var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == item.ContainerCode);
// if (wmsContainer == null) throw Oops.Oh("周转箱号不存在!");
// // 检查库位信息
// var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == item.PlaceCode);
// if (wmsPlace == null) throw Oops.Oh("库位不存在!");
// if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!");
// // 检查库存
// var wmsMaterialStockList = inputs.Where(u => u.ContainerCode == wmsContainer.ContainerCode && u.PlaceCode == wmsPlace.PlaceCode).ToList();
// if (wmsMaterialStockList.Count <= 0) throw Oops.Oh("库存数据异常!");
// // 检查库位与托盘号关系
// var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.ContainerId == wmsContainer.Id
// && p.PlaceCode == wmsPlace.PlaceCode && p.PlaceId == wmsPlace.Id && p.ContainerPlaceStatus == CommonStatus.ENABLE);
// if (wmsContainerPlace == null) throw Oops.Oh("托盘号与库位关系不存在!");
// // 不是空托才会有组盘关系
// if (wmsPlace.EmptyContainer == YesOrNot.N)
// {
// // 检查物料与空托号关系
// wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync();
// if (wmsMaterialContainerList.Count <= 0) throw Oops.Oh("托盘号与物料关系不存在!");
// }
// else
// {
// // 更新空料箱库存
// var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsContainer.ContainerCode);
// if (wmsMaterialStock.Source == RuKuSourceEnum.KONGTUO)
// {
// await _wmsMaterialStockRep.DeleteAsync(wmsMaterialStock);
// }
// }
// if (wmsTask == null)
// {
// //构建出库物料和周转箱号关系
// var orderNo = "N/A";
// if (wmsMaterialContainerList.Count > 0) orderNo = YitIdHelper.NextId().ToString();
// foreach (var wmsMaterialContaine in wmsMaterialContainerList)
// {
// //更新状态为”删除“
// wmsMaterialContaine.BindStatus = CommonStatus.DELETED;
// await _wmsMaterialContainerRep.UpdateNowAsync(wmsMaterialContaine);
// //新增组盘绑定记录 正常
// var addWmsMaterialContainer = wmsMaterialContaine;
// addWmsMaterialContainer.Id = YitIdHelper.NextId();
// addWmsMaterialContainer.OrderNo = orderNo;
// addWmsMaterialContainer.BindStatus = CommonStatus.ENABLE;
// await _wmsMaterialContainerRep.InsertNowAsync(addWmsMaterialContainer);
// // 这里没有分拣操作直接更新库存信息
// var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsMaterialContaine.ContainerCode);
// wmsMaterialStock.PlaceCode = "N/A";
// wmsMaterialStock.StockNumber -= wmsMaterialContaine.BindQuantity;
// await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock);
// }
// string taskNo = "CHUKU" + DateTime.Today.ToString("yyyyMMdd");
// var wmsTaskModel = await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => EF.Functions.Like(u.TaskNo, $"%{taskNo}%"));
// if (wmsTaskModel == null)
// {
// taskNo = taskNo + "0001";
// }
// else
// {
// //获取流水号最大的数据
// var maxSerialNumber = await _wmsTaskRep.MaxAsync(t => t.TaskNo);
// taskNo = Comm.GenerateNewInvoiceNumber(maxSerialNumber, 1);
// }
// // 新增任务
// var addWmsTask = new WmsTask()
// {
// TaskNo = taskNo,//YitIdHelper.NextId().ToString(),
// TaskModel = TaskModel.SHOUDONG,
// TaskType = TaskType.CHUKU,
// TaskLevel = 1,
// TaskStatus = TaskStatusEnum.WANCHENG,
// ContainerCode = wmsContainer.ContainerCode,
// SourcePlace = wmsPlace.PlaceCode,
// Aisle = wmsPlace.Aisle,
// ToPlace = "出库口",
// AreaName = wmsArea.AreaName,
// Description = wmsPlace.EmptyContainer == YesOrNot.Y ? "空托" : "物料",
// OrderNo = orderNo,
// TaskDodeviceStatus=TaskDodeviceStatusEnum.W,
// UpdatedTime = DateTime.Now,
// };
// await _wmsTaskRep.InsertAsync(addWmsTask);
// // 更新库位与周转箱号关系表状态为“删除”
// wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED;
// await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace);
// // 更新库位为“空闲”
// wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN;
// wmsPlace.Islock = YesOrNot.N;
// wmsPlace.EmptyContainer = YesOrNot.N;
// await _wmsPlaceRep.UpdateAsync(wmsPlace);
// // 更新周转箱号状态为“空闲”
// wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN;
// await _wmsContainerRep.UpdateAsync(wmsContainer);
// }
// }
// }
// ///
// /// 呼叫空托
// ///
// ///
// [HttpPost("callairflare")]
// [UnitOfWork]
// public async Task CallAirflare(CallAirflareInput input)
// {
// //获取库位中存货是空托的库位
// var wmsPlace = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.CUNHUO && u.EmptyContainer== YesOrNot.Y).ToListAsync();
// if (wmsPlace.Count > 0)
// {
// }
// }
// }
//}