using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Admin.NET.Core; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using Microsoft.AspNetCore.Http; using System.Text; using System.Web; using System.ComponentModel; using System.Data; namespace Admin.NET.Application { /// /// 库位信息服务 /// [ApiDescriptionSettings("WmsBase", Name = "WmsPlace", Order = 100)] [Route("api")] public class WmsPlaceService : IWmsPlaceService, IDynamicApiController, ITransient { private readonly IRepository _wmsPlaceRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); public WmsPlaceService( IRepository wmsPlaceRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService ) { _wmsPlaceRep = wmsPlaceRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; } /// /// 分页查询库位信息 /// /// /// [HttpGet("WmsPlace/page")] public async Task> Page([FromQuery] WmsPlaceSearch input) { var wmsPlaces = await _wmsPlaceRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.PlaceCode), u => u.PlaceCode == input.PlaceCode) .Where(!string.IsNullOrEmpty(input.PlaceName), u => u.PlaceName == input.PlaceName) .Where(!string.IsNullOrEmpty(input.PlaceAlias), u => u.PlaceAlias == input.PlaceAlias) .Where(input.PlaceType != null, u => u.PlaceType == input.PlaceType) .Where(!string.IsNullOrEmpty(input.PlaceTypeName), u => u.PlaceTypeName == input.PlaceTypeName) .Where(input.PlaceStatus != null, u => u.PlaceStatus == input.PlaceStatus) .Where(input.IsSrmPlace != null, u => u.IsSrmPlace == input.IsSrmPlace) .Where(!string.IsNullOrEmpty(input.SrmPlaceNo), u => u.SrmPlaceNo == input.SrmPlaceNo) .Where(input.IsRgvPlace != null, u => u.IsRgvPlace == input.IsRgvPlace) .Where(!string.IsNullOrEmpty(input.RgvPlaceNo), u => u.RgvPlaceNo == input.RgvPlaceNo) .Where(input.IsAgvPlace != null, u => u.IsAgvPlace == input.IsAgvPlace) .Where(!string.IsNullOrEmpty(input.AgvPlaceNo), u => u.AgvPlaceNo == input.AgvPlaceNo) .Where(input.IsTransPlace != null, u => u.IsTransPlace == input.IsTransPlace) .Where(!string.IsNullOrEmpty(input.TransPlaceNo), u => u.TransPlaceNo == input.TransPlaceNo) .Where(input.IsActivateWCS != null, u => u.IsActivateWCS == input.IsActivateWCS) .Where(!string.IsNullOrEmpty(input.Environment), u => u.Environment == input.Environment) .Where(!string.IsNullOrEmpty(input.AreaCode), u => u.AreaCode == input.AreaCode) .Where(input.AreaId != null, u => u.AreaId == input.AreaId) .Where(!string.IsNullOrEmpty(input.AreaName), u => u.AreaName == input.AreaName) .Where(!string.IsNullOrEmpty(input.VerificationCode), u => u.VerificationCode == input.VerificationCode) .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.LaneNo != null, u => u.LaneNo == input.LaneNo) .Where(!string.IsNullOrEmpty(input.Xzb), u => u.Xzb == input.Xzb) .Where(!string.IsNullOrEmpty(input.Yzb), u => u.Yzb == input.Yzb) .Where(!string.IsNullOrEmpty(input.Zzb), u => u.Zzb == input.Zzb) .Where(input.Length != null, u => u.Length == input.Length) .Where(input.Width != null, u => u.Width == input.Width) .Where(input.Height != null, u => u.Height == input.Height) .Where(input.MaxWeight != null, u => u.MaxWeight == input.MaxWeight) .Where(input.InSequence != null, u => u.InSequence == input.InSequence) .Where(input.OutSequence != null, u => u.OutSequence == input.OutSequence) .Where(input.IsVirtually != null, u => u.IsVirtually == input.IsVirtually) .Where(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled) .Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(input.CreatedUserName), u => u.CreatedUserName == input.CreatedUserName) .Where(!string.IsNullOrEmpty(input.UpdatedUserName), u => u.UpdatedUserName == input.UpdatedUserName) .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsPlaces; } /// /// 不分页查询库位信息列表 /// /// 库位信息查询参数 /// (库位信息)实例列表 [HttpGet("WmsPlace/listNonPage")] public async Task> ListNonPageAsync([FromQuery] WmsPlaceSearchNonPage input) { var pPlaceCode = input.PlaceCode?.Trim() ?? ""; var pPlaceName = input.PlaceName?.Trim() ?? ""; var pPlaceAlias = input.PlaceAlias?.Trim() ?? ""; var pPlaceType = input.PlaceType; var pPlaceTypeName = input.PlaceTypeName?.Trim() ?? ""; var pPlaceStatus = input.PlaceStatus; var pIsSrmPlace = input.IsSrmPlace; var pSrmPlaceNo = input.SrmPlaceNo?.Trim() ?? ""; var pIsRgvPlace = input.IsRgvPlace; var pRgvPlaceNo = input.RgvPlaceNo?.Trim() ?? ""; var pIsAgvPlace = input.IsAgvPlace; var pAgvPlaceNo = input.AgvPlaceNo?.Trim() ?? ""; var pIsTransPlace = input.IsTransPlace; var pTransPlaceNo = input.TransPlaceNo?.Trim() ?? ""; var pIsActivateWCS = input.IsActivateWCS; var pEnvironment = input.Environment?.Trim() ?? ""; var pAreaCode = input.AreaCode?.Trim() ?? ""; var pAreaId = input.AreaId; var pAreaName = input.AreaName?.Trim() ?? ""; var pVerificationCode = input.VerificationCode?.Trim() ?? ""; var pRowNo = input.RowNo; var pColumnNo = input.ColumnNo; var pLayerNo = input.LayerNo; var pLaneNo = input.LaneNo; var pXzb = input.Xzb?.Trim() ?? ""; var pYzb = input.Yzb?.Trim() ?? ""; var pZzb = input.Zzb?.Trim() ?? ""; var pLength = input.Length; var pWidth = input.Width; var pHeight = input.Height; var pMaxWeight = input.MaxWeight; var pInSequence = input.InSequence; var pOutSequence = input.OutSequence; var pIsVirtually = input.IsVirtually; var pIsDisabled = input.IsDisabled; var pCreatedTime = input.CreatedTime; var pUpdatedTime = input.UpdatedTime; var pCreatedUserName = input.CreatedUserName?.Trim() ?? ""; var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? ""; var wmsPlaces = await _wmsPlaceRep.DetachedEntities .Where(!string.IsNullOrEmpty(pPlaceCode), u => u.PlaceCode == pPlaceCode) .Where(!string.IsNullOrEmpty(pPlaceName), u => u.PlaceName == pPlaceName) .Where(!string.IsNullOrEmpty(pPlaceAlias), u => u.PlaceAlias == pPlaceAlias) .Where(pPlaceType != null, u => u.PlaceType == pPlaceType) .Where(!string.IsNullOrEmpty(pPlaceTypeName), u => u.PlaceTypeName == pPlaceTypeName) .Where(pPlaceStatus != null, u => u.PlaceStatus == pPlaceStatus) .Where(pIsSrmPlace != null, u => u.IsSrmPlace == pIsSrmPlace) .Where(!string.IsNullOrEmpty(pSrmPlaceNo), u => u.SrmPlaceNo == pSrmPlaceNo) .Where(pIsRgvPlace != null, u => u.IsRgvPlace == pIsRgvPlace) .Where(!string.IsNullOrEmpty(pRgvPlaceNo), u => u.RgvPlaceNo == pRgvPlaceNo) .Where(pIsAgvPlace != null, u => u.IsAgvPlace == pIsAgvPlace) .Where(!string.IsNullOrEmpty(pAgvPlaceNo), u => u.AgvPlaceNo == pAgvPlaceNo) .Where(pIsTransPlace != null, u => u.IsTransPlace == pIsTransPlace) .Where(!string.IsNullOrEmpty(pTransPlaceNo), u => u.TransPlaceNo == pTransPlaceNo) .Where(pIsActivateWCS != null, u => u.IsActivateWCS == pIsActivateWCS) .Where(!string.IsNullOrEmpty(pEnvironment), u => u.Environment == pEnvironment) .Where(!string.IsNullOrEmpty(pAreaCode), u => u.AreaCode == pAreaCode) .Where(pAreaId != null, u => u.AreaId == pAreaId) .Where(!string.IsNullOrEmpty(pAreaName), u => u.AreaName == pAreaName) .Where(!string.IsNullOrEmpty(pVerificationCode), u => u.VerificationCode == pVerificationCode) .Where(pRowNo != null, u => u.RowNo == pRowNo) .Where(pColumnNo != null, u => u.ColumnNo == pColumnNo) .Where(pLayerNo != null, u => u.LayerNo == pLayerNo) .Where(pLaneNo != null, u => u.LaneNo == pLaneNo) .Where(!string.IsNullOrEmpty(pXzb), u => u.Xzb == pXzb) .Where(!string.IsNullOrEmpty(pYzb), u => u.Yzb == pYzb) .Where(!string.IsNullOrEmpty(pZzb), u => u.Zzb == pZzb) .Where(pLength != null, u => u.Length == pLength) .Where(pWidth != null, u => u.Width == pWidth) .Where(pHeight != null, u => u.Height == pHeight) .Where(pMaxWeight != null, u => u.MaxWeight == pMaxWeight) .Where(pInSequence != null, u => u.InSequence == pInSequence) .Where(pOutSequence != null, u => u.OutSequence == pOutSequence) .Where(pIsVirtually != null, u => u.IsVirtually == pIsVirtually) .Where(pIsDisabled != null, u => u.IsDisabled == pIsDisabled) .Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(pCreatedUserName), u => u.CreatedUserName == pCreatedUserName) .Where(!string.IsNullOrEmpty(pUpdatedUserName), u => u.UpdatedUserName == pUpdatedUserName) .OrderBy(PageInputOrder.OrderNonPageBuilder(input)) .ProjectToType() .ToListAsync(); return wmsPlaces; } /// /// 获取库位信息 /// /// /// [HttpGet("WmsPlace/detail")] public async Task Get([FromQuery] QueryeWmsPlaceInput input) { return (await _wmsPlaceRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取库位信息列表 /// /// /// [HttpGet("WmsPlace/list")] public async Task> List([FromQuery] WmsPlaceInput input) { return await _wmsPlaceRep.DetachedEntities.ProjectToType().ToListAsync(); } #region 增、删、改 /// /// 增加库位信息 /// /// /// [HttpPost("WmsPlace/add")] public async Task Add(AddWmsPlaceInput input) { var wmsPlace = input.Adapt(); //验证 await CheckExisit(wmsPlace); wmsPlace.CreatedUserId = wmsPlace.UpdatedUserId = SysHelper.GetUserId(); wmsPlace.CreatedUserName = wmsPlace.UpdatedUserName = SysHelper.GetUserName(); wmsPlace.CreatedTime = wmsPlace.UpdatedTime = SysHelper.GetNowTime(); await _wmsPlaceRep.InsertAsync(wmsPlace); } /// /// 删除库位信息 /// /// /// [HttpPost("WmsPlace/delete")] public async Task Delete(DeleteWmsPlaceInput input) { var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _wmsPlaceRep.DeleteAsync(wmsPlace); } /// /// 更新库位信息 /// /// /// [HttpPost("WmsPlace/edit")] public async Task Update(UpdateWmsPlaceInput input) { var isExist = await _wmsPlaceRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var wmsPlace = input.Adapt(); //验证 await CheckExisit(wmsPlace,true); wmsPlace.UpdatedUserId = SysHelper.GetUserId(); wmsPlace.UpdatedUserName = SysHelper.GetUserName(); wmsPlace.UpdatedTime = SysHelper.GetNowTime(); await _wmsPlaceRep.UpdateAsync(wmsPlace,ignoreNullValues:true); } #endregion #region 导入 /// /// Excel模板导入库位信息功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost("WmsPlace/importExcel")] public async Task ImportExcelAsync(IFormFile file) { int _HeadStartLine = 2;//第1行是说明,第2行是列名 int _DataStartLine = 3;//第3行开始是数据 DataTable importDataTable = ExcelUtil.ImportExcelToDataTable(file, _HeadStartLine, _DataStartLine); var addList =await CommonImport(importDataTable, _DataStartLine); lock (_lock) { _wmsPlaceRep.InsertAsync(addList); } await Task.CompletedTask; return addList.Count; } /// /// DataTable转换实体对象列表 /// /// /// 模版列名开始行 /// private async Task> CommonImport(DataTable dataTable, int dataStartLine) { var details = new List(); int index = dataStartLine;//模版列名开始行 foreach (System.Data.DataRow row in dataTable.Rows) { index++; //导入模版定制化代码(替换模版使用) var addItem = new WmsPlace() { CreatedTime = SysHelper.GetNowTime(), CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region 定义变量 var _PlaceCode = "";//库位编码 var _PlaceName = "";//库位名称 var _PlaceAlias = "";//库位别名 var _PlaceType = "";//库位类型 var _PlaceTypeName = "";//库位类型名称 var _PlaceStatus = "";//库位属性 var _IsSrmPlace = "";//是否堆垛机库位 var _SrmPlaceNo = "";//堆垛机库位号 var _IsRgvPlace = "";//是否RGV库位 var _RgvPlaceNo = "";//RGV库位号 var _IsAgvPlace = "";//是否AGV库位 var _AgvPlaceNo = "";//AGV库位号 var _IsTransPlace = "";//是否输送线库位 var _TransPlaceNo = "";//输送线库位号 var _IsActivateWCS = "";//是否激活与任务调度 var _Environment = "";//库存环境 var _AreaCode = "";//库区编号 var _AreaId = "";//所在库区 var _AreaName = "";//库区名称 var _VerificationCode = "";//检验码 var _RowNo = "";//排 var _ColumnNo = "";//列 var _LayerNo = "";//层 var _LaneNo = "";//巷道 var _Xzb = "";//库位X坐标 var _Yzb = "";//库位Y坐标 var _Zzb = "";//库位Z坐标 var _Length = "";//库位长度 var _Width = "";//库位宽度 var _Height = "";//库位高度 var _MaxWeight = "";//最大承重 var _InSequence = "";//入库顺序 var _OutSequence = "";//出库顺序 var _IsVirtually = "";//是否虚拟 var _IsDisabled = "";//是否禁用 var _Id = "";//Id主键 #endregion #region 取值 _PlaceCode = row["库位编码"]?.ToString() ; _PlaceName = row["库位名称"]?.ToString() ; _PlaceAlias = row["库位别名"]?.ToString() ; _PlaceType = row["库位类型"]?.ToString() ; _PlaceTypeName = row["库位类型名称"]?.ToString() ; _PlaceStatus = row["库位属性"]?.ToString() ; _IsSrmPlace = row["是否堆垛机库位"]?.ToString() ; _SrmPlaceNo = row["堆垛机库位号"]?.ToString() ; _IsRgvPlace = row["是否RGV库位"]?.ToString() ; _RgvPlaceNo = row["RGV库位号"]?.ToString() ; _IsAgvPlace = row["是否AGV库位"]?.ToString() ; _AgvPlaceNo = row["AGV库位号"]?.ToString() ; _IsTransPlace = row["是否输送线库位"]?.ToString() ; _TransPlaceNo = row["输送线库位号"]?.ToString() ; _IsActivateWCS = row["是否激活与任务调度"]?.ToString() ; _Environment = row["库存环境"]?.ToString() ; _AreaCode = row["库区编号"]?.ToString() ; _AreaId = row["所在库区"]?.ToString() ; _AreaName = row["库区名称"]?.ToString() ; _VerificationCode = row["检验码"]?.ToString() ; _RowNo = row["排"]?.ToString() ; _ColumnNo = row["列"]?.ToString() ; _LayerNo = row["层"]?.ToString() ; _LaneNo = row["巷道"]?.ToString() ; _Xzb = row["库位X坐标"]?.ToString() ; _Yzb = row["库位Y坐标"]?.ToString() ; _Zzb = row["库位Z坐标"]?.ToString() ; _Length = row["库位长度"]?.ToString() ; _Width = row["库位宽度"]?.ToString() ; _Height = row["库位高度"]?.ToString() ; _MaxWeight = row["最大承重"]?.ToString() ; _InSequence = row["入库顺序"]?.ToString() ; _OutSequence = row["出库顺序"]?.ToString() ; _IsVirtually = row["是否虚拟"]?.ToString() ; _IsDisabled = row["是否禁用"]?.ToString() ; _Id = row["Id主键"]?.ToString() ; #endregion #region 验证 if (string.IsNullOrEmpty(_PlaceCode)) { throw Oops.Oh($"第{index}行[库位编码]{_PlaceCode}不能为空!"); } if(!string.IsNullOrEmpty(_PlaceCode)) { addItem.PlaceCode = (string)_PlaceCode; } if (string.IsNullOrEmpty(_PlaceName)) { throw Oops.Oh($"第{index}行[库位名称]{_PlaceName}不能为空!"); } if(!string.IsNullOrEmpty(_PlaceName)) { addItem.PlaceName = (string)_PlaceName; } if(!string.IsNullOrEmpty(_PlaceAlias)) { addItem.PlaceAlias = (string)_PlaceAlias; } if (string.IsNullOrEmpty(_PlaceType)) { throw Oops.Oh($"第{index}行[库位类型]{_PlaceType}不能为空!"); } if(!string.IsNullOrEmpty(_PlaceType)) { Admin.NET.Core.PlaceTypeEnum enumPlaceType = default(Admin.NET.Core.PlaceTypeEnum); if(!Enum.TryParse(_PlaceType, out enumPlaceType)&&!string.IsNullOrEmpty(_PlaceType)) { throw Oops.Oh($"第{index}行[库位类型]{_PlaceType}值不正确!"); } else { addItem.PlaceType = enumPlaceType; } } if (string.IsNullOrEmpty(_PlaceTypeName)) { throw Oops.Oh($"第{index}行[库位类型名称]{_PlaceTypeName}不能为空!"); } if(!string.IsNullOrEmpty(_PlaceTypeName)) { addItem.PlaceTypeName = (string)_PlaceTypeName; } if (string.IsNullOrEmpty(_PlaceStatus)) { throw Oops.Oh($"第{index}行[库位属性]{_PlaceStatus}不能为空!"); } if(!string.IsNullOrEmpty(_PlaceStatus)) { Admin.NET.Core.PlaceStatusEnum enumPlaceStatus = default(Admin.NET.Core.PlaceStatusEnum); if(!Enum.TryParse(_PlaceStatus, out enumPlaceStatus)&&!string.IsNullOrEmpty(_PlaceStatus)) { throw Oops.Oh($"第{index}行[库位属性]{_PlaceStatus}值不正确!"); } else { addItem.PlaceStatus = enumPlaceStatus; } } if(!string.IsNullOrEmpty(_IsSrmPlace)) { if(!_IsSrmPlace.Equals("是") && !_IsSrmPlace.Equals("否")) { throw Oops.Oh($"第{index}行[是否堆垛机库位]{_IsSrmPlace}值不正确!"); } else { bool outIsSrmPlace = _IsSrmPlace.Equals("是") ? true : false; addItem.IsSrmPlace = outIsSrmPlace; } } if(!string.IsNullOrEmpty(_SrmPlaceNo)) { addItem.SrmPlaceNo = (string)_SrmPlaceNo; } if(!string.IsNullOrEmpty(_IsRgvPlace)) { if(!_IsRgvPlace.Equals("是") && !_IsRgvPlace.Equals("否")) { throw Oops.Oh($"第{index}行[是否RGV库位]{_IsRgvPlace}值不正确!"); } else { bool outIsRgvPlace = _IsRgvPlace.Equals("是") ? true : false; addItem.IsRgvPlace = outIsRgvPlace; } } if(!string.IsNullOrEmpty(_RgvPlaceNo)) { addItem.RgvPlaceNo = (string)_RgvPlaceNo; } if(!string.IsNullOrEmpty(_IsAgvPlace)) { if(!_IsAgvPlace.Equals("是") && !_IsAgvPlace.Equals("否")) { throw Oops.Oh($"第{index}行[是否AGV库位]{_IsAgvPlace}值不正确!"); } else { bool outIsAgvPlace = _IsAgvPlace.Equals("是") ? true : false; addItem.IsAgvPlace = outIsAgvPlace; } } if(!string.IsNullOrEmpty(_AgvPlaceNo)) { addItem.AgvPlaceNo = (string)_AgvPlaceNo; } if(!string.IsNullOrEmpty(_IsTransPlace)) { if(!_IsTransPlace.Equals("是") && !_IsTransPlace.Equals("否")) { throw Oops.Oh($"第{index}行[是否输送线库位]{_IsTransPlace}值不正确!"); } else { bool outIsTransPlace = _IsTransPlace.Equals("是") ? true : false; addItem.IsTransPlace = outIsTransPlace; } } if(!string.IsNullOrEmpty(_TransPlaceNo)) { addItem.TransPlaceNo = (string)_TransPlaceNo; } if(!string.IsNullOrEmpty(_IsActivateWCS)) { if(!_IsActivateWCS.Equals("是") && !_IsActivateWCS.Equals("否")) { throw Oops.Oh($"第{index}行[是否激活与任务调度]{_IsActivateWCS}值不正确!"); } else { bool outIsActivateWCS = _IsActivateWCS.Equals("是") ? true : false; addItem.IsActivateWCS = outIsActivateWCS; } } if(!string.IsNullOrEmpty(_Environment)) { addItem.Environment = (string)_Environment; } if(!string.IsNullOrEmpty(_AreaCode)) { addItem.AreaCode = (string)_AreaCode; } if (string.IsNullOrEmpty(_AreaId)) { throw Oops.Oh($"第{index}行[所在库区]{_AreaId}不能为空!"); } if(!string.IsNullOrEmpty(_AreaId)) { if (!long.TryParse(_AreaId, out long outAreaId)&&!string.IsNullOrEmpty(_AreaId)) { throw Oops.Oh($"第{index}行[所在库区]{_AreaId}值不正确!"); } if (outAreaId <= 0&&!string.IsNullOrEmpty(_AreaId)) { throw Oops.Oh($"第{index}行[所在库区]{_AreaId}值不能小于等于0!"); } else { addItem.AreaId = outAreaId; } } if(!string.IsNullOrEmpty(_AreaName)) { addItem.AreaName = (string)_AreaName; } if(!string.IsNullOrEmpty(_VerificationCode)) { addItem.VerificationCode = (string)_VerificationCode; } if(!string.IsNullOrEmpty(_RowNo)) { if (!int.TryParse(_RowNo, out int outRowNo)&&!string.IsNullOrEmpty(_RowNo)) { throw Oops.Oh($"第{index}行[排]{_RowNo}值不正确!"); } if (outRowNo <= 0&&!string.IsNullOrEmpty(_RowNo)) { throw Oops.Oh($"第{index}行[排]{_RowNo}值不能小于等于0!"); } else { addItem.RowNo = outRowNo; } } if(!string.IsNullOrEmpty(_ColumnNo)) { if (!int.TryParse(_ColumnNo, out int outColumnNo)&&!string.IsNullOrEmpty(_ColumnNo)) { throw Oops.Oh($"第{index}行[列]{_ColumnNo}值不正确!"); } if (outColumnNo <= 0&&!string.IsNullOrEmpty(_ColumnNo)) { throw Oops.Oh($"第{index}行[列]{_ColumnNo}值不能小于等于0!"); } else { addItem.ColumnNo = outColumnNo; } } if(!string.IsNullOrEmpty(_LayerNo)) { if (!int.TryParse(_LayerNo, out int outLayerNo)&&!string.IsNullOrEmpty(_LayerNo)) { throw Oops.Oh($"第{index}行[层]{_LayerNo}值不正确!"); } if (outLayerNo <= 0&&!string.IsNullOrEmpty(_LayerNo)) { throw Oops.Oh($"第{index}行[层]{_LayerNo}值不能小于等于0!"); } else { addItem.LayerNo = outLayerNo; } } if(!string.IsNullOrEmpty(_LaneNo)) { if (!int.TryParse(_LaneNo, out int outLaneNo)&&!string.IsNullOrEmpty(_LaneNo)) { throw Oops.Oh($"第{index}行[巷道]{_LaneNo}值不正确!"); } if (outLaneNo <= 0&&!string.IsNullOrEmpty(_LaneNo)) { throw Oops.Oh($"第{index}行[巷道]{_LaneNo}值不能小于等于0!"); } else { addItem.LaneNo = outLaneNo; } } if(!string.IsNullOrEmpty(_Xzb)) { addItem.Xzb = (string)_Xzb; } if(!string.IsNullOrEmpty(_Yzb)) { addItem.Yzb = (string)_Yzb; } if(!string.IsNullOrEmpty(_Zzb)) { addItem.Zzb = (string)_Zzb; } if(!string.IsNullOrEmpty(_Length)) { if (!decimal.TryParse(_Length, out decimal outLength)&&!string.IsNullOrEmpty(_Length)) { throw Oops.Oh($"第{index}行[库位长度]{_Length}值不正确!"); } if (outLength <= 0&&!string.IsNullOrEmpty(_Length)) { throw Oops.Oh($"第{index}行[库位长度]{_Length}值不能小于等于0!"); } else { addItem.Length = outLength; } } if(!string.IsNullOrEmpty(_Width)) { if (!decimal.TryParse(_Width, out decimal outWidth)&&!string.IsNullOrEmpty(_Width)) { throw Oops.Oh($"第{index}行[库位宽度]{_Width}值不正确!"); } if (outWidth <= 0&&!string.IsNullOrEmpty(_Width)) { throw Oops.Oh($"第{index}行[库位宽度]{_Width}值不能小于等于0!"); } else { addItem.Width = outWidth; } } if(!string.IsNullOrEmpty(_Height)) { if (!decimal.TryParse(_Height, out decimal outHeight)&&!string.IsNullOrEmpty(_Height)) { throw Oops.Oh($"第{index}行[库位高度]{_Height}值不正确!"); } if (outHeight <= 0&&!string.IsNullOrEmpty(_Height)) { throw Oops.Oh($"第{index}行[库位高度]{_Height}值不能小于等于0!"); } else { addItem.Height = outHeight; } } if(!string.IsNullOrEmpty(_MaxWeight)) { if (!decimal.TryParse(_MaxWeight, out decimal outMaxWeight)&&!string.IsNullOrEmpty(_MaxWeight)) { throw Oops.Oh($"第{index}行[最大承重]{_MaxWeight}值不正确!"); } if (outMaxWeight <= 0&&!string.IsNullOrEmpty(_MaxWeight)) { throw Oops.Oh($"第{index}行[最大承重]{_MaxWeight}值不能小于等于0!"); } else { addItem.MaxWeight = outMaxWeight; } } if(!string.IsNullOrEmpty(_InSequence)) { if (!int.TryParse(_InSequence, out int outInSequence)&&!string.IsNullOrEmpty(_InSequence)) { throw Oops.Oh($"第{index}行[入库顺序]{_InSequence}值不正确!"); } if (outInSequence <= 0&&!string.IsNullOrEmpty(_InSequence)) { throw Oops.Oh($"第{index}行[入库顺序]{_InSequence}值不能小于等于0!"); } else { addItem.InSequence = outInSequence; } } if(!string.IsNullOrEmpty(_OutSequence)) { if (!int.TryParse(_OutSequence, out int outOutSequence)&&!string.IsNullOrEmpty(_OutSequence)) { throw Oops.Oh($"第{index}行[出库顺序]{_OutSequence}值不正确!"); } if (outOutSequence <= 0&&!string.IsNullOrEmpty(_OutSequence)) { throw Oops.Oh($"第{index}行[出库顺序]{_OutSequence}值不能小于等于0!"); } else { addItem.OutSequence = outOutSequence; } } if(!string.IsNullOrEmpty(_IsVirtually)) { if(!_IsVirtually.Equals("是") && !_IsVirtually.Equals("否")) { throw Oops.Oh($"第{index}行[是否虚拟]{_IsVirtually}值不正确!"); } else { bool outIsVirtually = _IsVirtually.Equals("是") ? true : false; addItem.IsVirtually = outIsVirtually; } } if(!string.IsNullOrEmpty(_IsDisabled)) { if(!_IsDisabled.Equals("是") && !_IsDisabled.Equals("否")) { throw Oops.Oh($"第{index}行[是否禁用]{_IsDisabled}值不正确!"); } else { bool outIsDisabled = _IsDisabled.Equals("是") ? true : false; addItem.IsDisabled = outIsDisabled; } } if(!string.IsNullOrEmpty(_Id)) { if (!long.TryParse(_Id, out long outId)&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不正确!"); } if (outId <= 0&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不能小于等于0!"); } else { addItem.Id = outId; } } #endregion details.Add(addItem); } //验重 await CheckExisitForImport(details); return details; } /// /// 根据版本下载库位信息的Excel导入模板 /// /// 模板版本 /// 下载的模板文件 [HttpGet("WmsPlace/downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsPlace{TemplateConst.EXCEL_TEMPLATEFILE_导入模版名称后缀}.xlsx"; var fileName = HttpUtility.UrlEncode($"导入模板(库位信息).xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; } #endregion #region 私有方法 /// /// 根据联合主键验证数据是否已存在-数据库 /// /// /// /// private async Task CheckExisit( WmsPlace input,bool isEdit=false) { bool isExist = false; if (!isEdit)//新增 { //数据是否存在重复 isExist = await _wmsPlaceRep.AnyAsync(u => u.PlaceCode.Equals(input.PlaceCode) ,false); } else//编辑 { //当前编辑数据以外是否存在重复 isExist = await _wmsPlaceRep.AnyAsync(u => u.Id != input.Id &&u.PlaceCode.Equals(input.PlaceCode) ,false); } if (isExist) throw Oops.Oh(ErrorCode.E0001); } /// /// 根据联合主键验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { //根据联合主键验证表格中中是否已存在相同数据 if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //数据是否重复 var existExcelItem = inputs.GroupBy(g => new { g.PlaceCode }) .Where(g => g.Count() > 1) .Select(s => new { s.Key.PlaceCode }).FirstOrDefault(); if (existExcelItem != null) { var wmsPlace = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"导入的表格中,库位编码[{item.PlaceCode}]已存在"); } //根据联合主键验证数据库中是否已存在相同数据 var existDBItem = await _wmsPlaceRep.DetachedEntities.FirstOrDefaultAsync(w=> inputs.Select(s=>"" +s.PlaceCode ) .Contains("" +w.PlaceCode )); if (existDBItem != null) { var wmsPlace = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"系统中,库位编码[{item.PlaceCode}]已存在"); } } #endregion } }