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 = "WmsMaterial", Order = 100)]
[Route("api")]
public class WmsMaterialService : IWmsMaterialService, IDynamicApiController, ITransient
{
private readonly IRepository _wmsMaterialRep;
private readonly IRepository _sysDictTypeRep;
private readonly IRepository _sysDictDataRep;
private readonly ISysExcelTemplateService _sysExcelTemplateService;
private readonly static object _lock = new();
private readonly IRepository _wmsMaterialCustomerRep;
private readonly IRepository _baseCustomerRep;
private readonly IRepository _wmsSubstituteGoodRep;
private readonly IRepository _wmsControlRuleDetailRep;
public WmsMaterialService(
IRepository wmsMaterialRep
,IRepository sysDictTypeRep
,IRepository sysDictDataRep
,ISysExcelTemplateService sysExcelTemplateService
, IRepository wmsMaterialCustomerRep
, IRepository baseCustomerRep
, IRepository wmsSubstituteGoodRep
, IRepository wmsControlRuleDetailRep
)
{
_wmsMaterialRep = wmsMaterialRep;
_sysDictTypeRep = sysDictTypeRep;
_sysDictDataRep = sysDictDataRep;
_sysExcelTemplateService = sysExcelTemplateService;
_wmsMaterialCustomerRep = wmsMaterialCustomerRep;
_baseCustomerRep = baseCustomerRep;
_wmsSubstituteGoodRep = wmsSubstituteGoodRep;
_wmsControlRuleDetailRep = wmsControlRuleDetailRep;
}
///
/// 分页查询物料信息
///
///
///
[HttpGet("WmsMaterial/page")]
public async Task> Page([FromQuery] WmsMaterialSearch input)
{
var wmsMaterials = await _wmsMaterialRep.DetachedEntities
.Where(!string.IsNullOrEmpty(input.MaterialName), u => u.MaterialName == input.MaterialName)
.Where(!string.IsNullOrEmpty(input.MaterialCode), u => u.MaterialCode == input.MaterialCode)
.Where(!string.IsNullOrEmpty(input.ErpCode), u => u.ErpCode == input.ErpCode)
.Where(!string.IsNullOrEmpty(input.MaterialTypeName), u => u.MaterialTypeName == input.MaterialTypeName)
.Where(!string.IsNullOrEmpty(input.MaterialTypeDescr), u => u.MaterialTypeDescr == input.MaterialTypeDescr)
.Where(input.MaterialType != null, u => u.MaterialType == input.MaterialType)
.Where(!string.IsNullOrEmpty(input.MaterialGroup), u => u.MaterialGroup == input.MaterialGroup)
.Where(!string.IsNullOrEmpty(input.ABCClassName), u => u.ABCClassName == input.ABCClassName)
.Where(input.ABCClass != null, u => u.ABCClass == input.ABCClass)
.Where(!string.IsNullOrEmpty(input.MaterialSpec), u => u.MaterialSpec == input.MaterialSpec)
.Where(!string.IsNullOrEmpty(input.InPlaceCode), u => u.InPlaceCode == input.InPlaceCode)
.Where(!string.IsNullOrEmpty(input.MaterialUnit), u => u.MaterialUnit == input.MaterialUnit)
.Where(!string.IsNullOrEmpty(input.POUnit), u => u.POUnit == input.POUnit)
.Where(!string.IsNullOrEmpty(input.Color), u => u.Color == input.Color)
.Where(!string.IsNullOrEmpty(input.Weight), u => u.Weight == input.Weight)
.Where(input.SNP != null, u => u.SNP == input.SNP)
.Where(input.TranslateRate != null, u => u.TranslateRate == input.TranslateRate)
.Where(input.BatchRuleId != null, u => u.BatchRuleId == input.BatchRuleId)
.Where(input.ControlRuleId != null, u => u.ControlRuleId == input.ControlRuleId)
.Where(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled)
.Where(!string.IsNullOrEmpty(input.MaterialDesc), u => u.MaterialDesc == input.MaterialDesc)
.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 wmsMaterials;
}
///
/// 不分页查询物料信息列表
///
/// 物料信息查询参数
/// (物料信息)实例列表
[HttpGet("WmsMaterial/listNonPage")]
public async Task> ListNonPageAsync([FromQuery] WmsMaterialSearchNonPage input)
{
var pMaterialName = input.MaterialName?.Trim() ?? "";
var pMaterialCode = input.MaterialCode?.Trim() ?? "";
var pErpCode = input.ErpCode?.Trim() ?? "";
var pMaterialTypeName = input.MaterialTypeName?.Trim() ?? "";
var pMaterialTypeDescr = input.MaterialTypeDescr?.Trim() ?? "";
var pMaterialType = input.MaterialType;
var pMaterialGroup = input.MaterialGroup?.Trim() ?? "";
var pABCClassName = input.ABCClassName?.Trim() ?? "";
var pABCClass = input.ABCClass;
var pMaterialSpec = input.MaterialSpec?.Trim() ?? "";
var pInPlaceCode = input.InPlaceCode?.Trim() ?? "";
var pMaterialUnit = input.MaterialUnit?.Trim() ?? "";
var pPOUnit = input.POUnit?.Trim() ?? "";
var pColor = input.Color?.Trim() ?? "";
var pWeight = input.Weight?.Trim() ?? "";
var pSNP = input.SNP;
var pTranslateRate = input.TranslateRate;
var pBatchRuleId = input.BatchRuleId;
var pControlRuleId = input.ControlRuleId;
var pIsDisabled = input.IsDisabled;
var pMaterialDesc = input.MaterialDesc?.Trim() ?? "";
var pCreatedTime = input.CreatedTime;
var pUpdatedTime = input.UpdatedTime;
var pCreatedUserName = input.CreatedUserName?.Trim() ?? "";
var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? "";
var wmsMaterials = await _wmsMaterialRep.DetachedEntities
.Where(!string.IsNullOrEmpty(pMaterialName), u => u.MaterialName == pMaterialName)
.Where(!string.IsNullOrEmpty(pMaterialCode), u => u.MaterialCode == pMaterialCode)
.Where(!string.IsNullOrEmpty(pErpCode), u => u.ErpCode == pErpCode)
.Where(!string.IsNullOrEmpty(pMaterialTypeName), u => u.MaterialTypeName == pMaterialTypeName)
.Where(!string.IsNullOrEmpty(pMaterialTypeDescr), u => u.MaterialTypeDescr == pMaterialTypeDescr)
.Where(pMaterialType != null, u => u.MaterialType == pMaterialType)
.Where(!string.IsNullOrEmpty(pMaterialGroup), u => u.MaterialGroup == pMaterialGroup)
.Where(!string.IsNullOrEmpty(pABCClassName), u => u.ABCClassName == pABCClassName)
.Where(pABCClass != null, u => u.ABCClass == pABCClass)
.Where(!string.IsNullOrEmpty(pMaterialSpec), u => u.MaterialSpec == pMaterialSpec)
.Where(!string.IsNullOrEmpty(pInPlaceCode), u => u.InPlaceCode == pInPlaceCode)
.Where(!string.IsNullOrEmpty(pMaterialUnit), u => u.MaterialUnit == pMaterialUnit)
.Where(!string.IsNullOrEmpty(pPOUnit), u => u.POUnit == pPOUnit)
.Where(!string.IsNullOrEmpty(pColor), u => u.Color == pColor)
.Where(!string.IsNullOrEmpty(pWeight), u => u.Weight == pWeight)
.Where(pSNP != null, u => u.SNP == pSNP)
.Where(pTranslateRate != null, u => u.TranslateRate == pTranslateRate)
.Where(pBatchRuleId != null, u => u.BatchRuleId == pBatchRuleId)
.Where(pControlRuleId != null, u => u.ControlRuleId == pControlRuleId)
.Where(pIsDisabled != null, u => u.IsDisabled == pIsDisabled)
.Where(!string.IsNullOrEmpty(pMaterialDesc), u => u.MaterialDesc == pMaterialDesc)
.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 wmsMaterials;
}
///
/// 获取物料信息
///
///
///
[HttpGet("WmsMaterial/detail")]
public async Task Get([FromQuery] QueryeWmsMaterialInput input)
{
WmsMaterialInfoOutput resultInfo = new WmsMaterialInfoOutput();
//获取物料信息
var wmsMaterialInfo =(await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt();
//获取替换物料信息
var wmsSubstituteGoods = await _wmsSubstituteGoodRep.DetachedEntities
.Where(u => u.MaterialCode == wmsMaterialInfo.MaterialName)
.Where(u => u.IsDeleted == false)
.Where(u => u.IsDisabled == false)
.OrderBy(o => o.CreatedTime)
.ProjectToType()
.ToListAsync();
//获取控制属性规则
var wmsControlRuleDetails = await _wmsControlRuleDetailRep.DetachedEntities
.Where(u => u.Id == wmsMaterialInfo.ControlRuleId)
.Where(u => u.IsDeleted == false)
.Where(u => u.IsDisabled == false)
.OrderBy(o=>o.CreatedTime)
.ProjectToType()
.ToListAsync();
//根据物料客户关联表获取往来信息
var baseCustomers = await _baseCustomerRep.DetachedEntities.Join(_wmsMaterialCustomerRep.DetachedEntities, bc => bc.Id, mc => mc.CustId, (bc, mc) => new { bc, mc })
.Where(p =>p.mc.MaterialId== wmsMaterialInfo.Id)
.OrderBy(o => o.mc.CreatedTime)
.ProjectToType()
.ToListAsync();
resultInfo.MaterialInfo = wmsMaterialInfo;
resultInfo.SubstituteGoodList = wmsSubstituteGoods;
resultInfo.ControlRuleDetailList = wmsControlRuleDetails;
return resultInfo;
}
///
/// 获取物料信息列表
///
///
///
[HttpGet("WmsMaterial/list")]
public async Task> List([FromQuery] WmsMaterialInput input)
{
return await _wmsMaterialRep.DetachedEntities.ProjectToType().ToListAsync();
}
#region 增、删、改
///
/// 增加物料信息表
///
///
///
[HttpPost("WmsMaterial/add")]
[UnitOfWork]
public async Task Add(AddWmsMaterialInfoInput input)
{
//物料信息
var wmsMaterial = input.MaterialInput.Adapt();
//控制规则信息
var controlRuleld = input.ControlRuleld;
wmsMaterial.ControlRuleId = controlRuleld;
//往来关系信息
var baseCustomerList = input.BaseCustomerList.Adapt>();
//物料客户关联关系
var materialCustomerList=new List();
foreach (var baseCustomer in baseCustomerList)
{
materialCustomerList.Add(new WmsMaterialCustomer()
{
CreatedTime = DateTime.Now,
CreatedUserId = CurrentUserInfo.UserId,
CreatedUserName = CurrentUserInfo.Name,
CustChinaName = baseCustomer.CustChinaName,
CustCode = baseCustomer.CustCode,
CustEnglishName = baseCustomer.CustEnglishName,
CustId = baseCustomer.Id,
MaterialCode = wmsMaterial.MaterialCode,
MaterialId = wmsMaterial.Id,
MaterialName = wmsMaterial.MaterialName,
UpdatedTime = DateTime.Now,
UpdatedUserId = CurrentUserInfo.UserId,
UpdatedUserName = CurrentUserInfo.Name
});
}
//验证
await CheckExisit(wmsMaterial);
//替代品信息
var substituteGoodList = input.SubstituteGoodList.Adapt>();
foreach (var item in substituteGoodList)
{
item.SubstituteCode = Yitter.IdGenerator.YitIdHelper.NextId().ToString();//TODO 要调用生成 编号的方法 先用雪花ID
}
wmsMaterial.UpdatedUserId = SysHelper.GetUserId();
wmsMaterial.UpdatedUserName = SysHelper.GetUserName();
wmsMaterial.UpdatedTime = SysHelper.GetNowTime();
await _wmsMaterialRep.InsertAsync(wmsMaterial);
if (materialCustomerList?.Count > 0)
{
await _wmsMaterialCustomerRep.InsertAsync(materialCustomerList);
}
if (substituteGoodList?.Count > 0)
{
await _wmsSubstituteGoodRep.InsertAsync(substituteGoodList);
}
}
///
/// 删除物料信息
///
///
///
[HttpPost("WmsMaterial/delete")]
public async Task Delete(DeleteWmsMaterialInput input)
{
var wmsMaterial = await _wmsMaterialRep.FirstOrDefaultAsync(u => u.Id == input.Id);
await _wmsMaterialRep.DeleteAsync(wmsMaterial);
}
///
/// 更新物料信息
///
///
///
[HttpPost("WmsMaterial/edit")]
[UnitOfWork]
public async Task Update(UpdateWmsMaterialInfoInput input)
{
//物料信息
var wmsMaterial = input.MaterialInput.Adapt();
var isExist = await _wmsMaterialRep.AnyAsync(u => u.Id == wmsMaterial.Id, false);
if (!isExist) throw Oops.Oh(ErrorCode.D1002);
//验证
await CheckExisit(wmsMaterial, true);
//控制规则信息
var controlRuleld = input.ControlRuleld;
wmsMaterial.ControlRuleId = controlRuleld;
//删除物料客户关联关系
var oldaterialCustomerList = await _wmsMaterialCustomerRep.DetachedEntities.Where(w => w.MaterialId == wmsMaterial.Id).ToListAsync();
if (oldaterialCustomerList?.Count > 0)
{
await _wmsMaterialCustomerRep.DeleteAsync(oldaterialCustomerList);
}
//往来关系信息
var baseCustomerList = input.BaseCustomerList.Adapt>();
//物料客户关联关系
var materialCustomerList = new List();
foreach (var baseCustomer in baseCustomerList)
{
materialCustomerList.Add(new WmsMaterialCustomer()
{
CreatedTime = DateTime.Now,
CreatedUserId = CurrentUserInfo.UserId,
CreatedUserName = CurrentUserInfo.Name,
CustChinaName = baseCustomer.CustChinaName,
CustCode = baseCustomer.CustCode,
CustEnglishName = baseCustomer.CustEnglishName,
CustId = baseCustomer.Id,
MaterialCode = wmsMaterial.MaterialCode,
MaterialId = wmsMaterial.Id,
MaterialName = wmsMaterial.MaterialName,
UpdatedTime = DateTime.Now,
UpdatedUserId = CurrentUserInfo.UserId,
UpdatedUserName = CurrentUserInfo.Name
});
}
//删除替代品信息
var oldSubstituteGoodList = await _wmsSubstituteGoodRep.DetachedEntities.Where(w => w.MaterialCode == wmsMaterial.MaterialCode).ToListAsync();
if (oldSubstituteGoodList?.Count > 0)
{
await _wmsSubstituteGoodRep.DeleteAsync(oldSubstituteGoodList);
}
//替代品信息
var substituteGoodList = input.SubstituteGoodList.Adapt>();
foreach (var item in substituteGoodList)
{
item.SubstituteCode = Yitter.IdGenerator.YitIdHelper.NextId().ToString();//TODO 要调用生成 编号的方法 先用雪花ID
}
if (materialCustomerList?.Count > 0)
{
await _wmsMaterialCustomerRep.InsertAsync(materialCustomerList);
}
if (substituteGoodList?.Count > 0)
{
await _wmsSubstituteGoodRep.InsertAsync(substituteGoodList);
}
wmsMaterial.UpdatedUserId = SysHelper.GetUserId();
wmsMaterial.UpdatedUserName = SysHelper.GetUserName();
wmsMaterial.UpdatedTime = SysHelper.GetNowTime();
await _wmsMaterialRep.UpdateAsync(wmsMaterial, ignoreNullValues: true);
}
#endregion
#region 导入
///
/// Excel模板导入物料信息功能
///
/// Excel模板文件
/// 导入的记录数
[HttpPost("WmsMaterial/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)
{
_wmsMaterialRep.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 WmsMaterial()
{
CreatedTime = SysHelper.GetNowTime(),
CreatedUserId = SysHelper.GetUserId(),
CreatedUserName = SysHelper.GetUserName(),
UpdatedTime = SysHelper.GetNowTime(),
UpdatedUserId = SysHelper.GetUserId(),
UpdatedUserName = SysHelper.GetUserName()
};
#region 定义变量
var _MaterialName = "";//物料名称
var _MaterialCode = "";//物料编号
var _ErpCode = "";//ERP编号
var _MaterialTypeName = "";//物料类型名称
var _MaterialTypeDescr = "";//物料类型描述
var _MaterialType = "";//物料类型
var _MaterialGroup = "";//物料组
var _ABCClassName = "";//ABC分类名称
var _ABCClass = "";//ABC分类
var _MaterialSpec = "";//物料规格
var _InPlaceCode = "";//默认入库库位
var _MaterialUnit = "";//库存单位
var _POUnit = "";//采购单位
var _Color = "";//颜色
var _Weight = "";//重量
var _SNP = "";//标包数量
var _TranslateRate = "";//换算率
var _BatchRuleId = "";//批次属性规则
var _ControlRuleId = "";//控制属性规则
var _IsDisabled = "";//是否禁用
var _MaterialDesc = "";//描述
var _Id = "";//Id主键
#endregion
#region 取值
_MaterialName = row["物料名称"]?.ToString();
_MaterialCode = row["物料编号"]?.ToString();
_ErpCode = row["ERP编号"]?.ToString();
_MaterialTypeName = row["物料类型名称"]?.ToString();
_MaterialTypeDescr = row["物料类型描述"]?.ToString();
_MaterialType = row["物料类型"]?.ToString();
_MaterialGroup = row["物料组"]?.ToString();
_ABCClassName = row["ABC分类名称"]?.ToString();
_ABCClass = row["ABC分类"]?.ToString();
_MaterialSpec = row["物料规格"]?.ToString();
_InPlaceCode = row["默认入库库位"]?.ToString();
_MaterialUnit = row["库存单位"]?.ToString();
_POUnit = row["采购单位"]?.ToString();
_Color = row["颜色"]?.ToString();
_Weight = row["重量"]?.ToString();
_SNP = row["标包数量"]?.ToString();
_TranslateRate = row["换算率"]?.ToString();
_BatchRuleId = row["批次属性规则"]?.ToString();
_ControlRuleId = row["控制属性规则"]?.ToString();
_IsDisabled = row["是否禁用"]?.ToString();
_MaterialDesc = row["描述"]?.ToString();
_Id = row["Id主键"]?.ToString();
#endregion
#region 验证
if (string.IsNullOrEmpty(_MaterialName))
{
throw Oops.Oh($"第{index}行[物料名称]{_MaterialName}不能为空!");
}
if (!string.IsNullOrEmpty(_MaterialName))
{
addItem.MaterialName = (string)_MaterialName;
}
if (string.IsNullOrEmpty(_MaterialCode))
{
throw Oops.Oh($"第{index}行[物料编号]{_MaterialCode}不能为空!");
}
if (!string.IsNullOrEmpty(_MaterialCode))
{
addItem.MaterialCode = (string)_MaterialCode;
}
if (!string.IsNullOrEmpty(_ErpCode))
{
addItem.ErpCode = (string)_ErpCode;
}
if (!string.IsNullOrEmpty(_MaterialTypeName))
{
addItem.MaterialTypeName = (string)_MaterialTypeName;
}
if (!string.IsNullOrEmpty(_MaterialTypeDescr))
{
addItem.MaterialTypeDescr = (string)_MaterialTypeDescr;
}
if (string.IsNullOrEmpty(_MaterialType))
{
throw Oops.Oh($"第{index}行[物料类型]{_MaterialType}不能为空!");
}
if (!string.IsNullOrEmpty(_MaterialType))
{
System.Int32 enumMaterialType = default(System.Int32);
if (!Enum.TryParse(_MaterialType, out enumMaterialType) && !string.IsNullOrEmpty(_MaterialType))
{
throw Oops.Oh($"第{index}行[物料类型]{_MaterialType}值不正确!");
}
else
{
addItem.MaterialType = enumMaterialType;
}
}
if (!string.IsNullOrEmpty(_MaterialGroup))
{
addItem.MaterialGroup = (string)_MaterialGroup;
}
if (!string.IsNullOrEmpty(_ABCClassName))
{
addItem.ABCClassName = (string)_ABCClassName;
}
if (!string.IsNullOrEmpty(_ABCClass))
{
Admin.NET.Core.ABCClassEnum enumABCClass = default(Admin.NET.Core.ABCClassEnum);
if (!Enum.TryParse < Admin.NET.Core.ABCClassEnum > (_ABCClass, out enumABCClass)&& !string.IsNullOrEmpty(_ABCClass))
{
throw Oops.Oh($"第{index}行[ABC分类]{_ABCClass}值不正确!");
} else
{
addItem.ABCClass = enumABCClass;
}
}
if (!string.IsNullOrEmpty(_MaterialSpec))
{
addItem.MaterialSpec = (string)_MaterialSpec;
}
if (!string.IsNullOrEmpty(_InPlaceCode))
{
addItem.InPlaceCode = (string)_InPlaceCode;
}
if (!string.IsNullOrEmpty(_MaterialUnit))
{
addItem.MaterialUnit = (string)_MaterialUnit;
}
if (!string.IsNullOrEmpty(_POUnit))
{
addItem.POUnit = (string)_POUnit;
}
if (!string.IsNullOrEmpty(_Color))
{
addItem.Color = (string)_Color;
}
if (!string.IsNullOrEmpty(_Weight))
{
addItem.Weight = (string)_Weight;
}
if (!string.IsNullOrEmpty(_SNP))
{
if (!decimal.TryParse(_SNP, out decimal outSNP) && !string.IsNullOrEmpty(_SNP))
{
throw Oops.Oh($"第{index}行[标包数量]{_SNP}值不正确!");
}
if (outSNP <= 0 && !string.IsNullOrEmpty(_SNP))
{
throw Oops.Oh($"第{index}行[标包数量]{_SNP}值不能小于等于0!");
}
else
{
addItem.SNP = outSNP;
}
}
if (!string.IsNullOrEmpty(_TranslateRate))
{
if (!decimal.TryParse(_TranslateRate, out decimal outTranslateRate) && !string.IsNullOrEmpty(_TranslateRate))
{
throw Oops.Oh($"第{index}行[换算率]{_TranslateRate}值不正确!");
}
if (outTranslateRate <= 0 && !string.IsNullOrEmpty(_TranslateRate))
{
throw Oops.Oh($"第{index}行[换算率]{_TranslateRate}值不能小于等于0!");
}
else
{
addItem.TranslateRate = outTranslateRate;
}
}
if (!string.IsNullOrEmpty(_BatchRuleId))
{
if (!long.TryParse(_BatchRuleId, out long outBatchRuleId) && !string.IsNullOrEmpty(_BatchRuleId))
{
throw Oops.Oh($"第{index}行[批次属性规则]{_BatchRuleId}值不正确!");
}
if (outBatchRuleId <= 0 && !string.IsNullOrEmpty(_BatchRuleId))
{
throw Oops.Oh($"第{index}行[批次属性规则]{_BatchRuleId}值不能小于等于0!");
}
else
{
addItem.BatchRuleId = outBatchRuleId;
}
}
if (!string.IsNullOrEmpty(_ControlRuleId))
{
if (!long.TryParse(_ControlRuleId, out long outControlRuleId) && !string.IsNullOrEmpty(_ControlRuleId))
{
throw Oops.Oh($"第{index}行[控制属性规则]{_ControlRuleId}值不正确!");
}
if (outControlRuleId <= 0 && !string.IsNullOrEmpty(_ControlRuleId))
{
throw Oops.Oh($"第{index}行[控制属性规则]{_ControlRuleId}值不能小于等于0!");
}
else
{
addItem.ControlRuleId = outControlRuleId;
}
}
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(_MaterialDesc))
{
addItem.MaterialDesc = (string)_MaterialDesc;
}
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("WmsMaterial/downloadExcelTemplate")]
public IActionResult DownloadExcelTemplate([FromQuery] string version)
{
string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsMaterial{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(WmsMaterial input, bool isEdit = false)
{
bool isExist = false;
if (!isEdit)//新增
{
//物料编号是否存在重复
isExist = await _wmsMaterialRep.AnyAsync(u =>
u.MaterialCode.Equals(input.MaterialCode)
, false);
//物料名称是否存在重复
isExist = await _wmsMaterialRep.AnyAsync(u =>
u.MaterialName.Equals(input.MaterialName)
, false);
}
else//编辑
{
//当前编辑物料编号以外是否存在重复
isExist = await _wmsMaterialRep.AnyAsync(u =>
u.Id != input.Id
&& u.MaterialCode.Equals(input.MaterialCode)
, false);
//当前编辑物料名称以外是否存在重复
isExist = await _wmsMaterialRep.AnyAsync(u =>
u.Id != input.Id
&& u.MaterialName.Equals(input.MaterialName)
, 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.MaterialCode
})
.Where(g => g.Count() > 1)
.Select(s => new {
s.Key.MaterialCode
}).FirstOrDefault();
if (existExcelItem != null)
{
var wmsMaterial = existExcelItem.Adapt();
var item = existExcelItem.Adapt();
throw Oops.Oh($"导入的表格中,物料编号[{item.MaterialCode}]已存在");
}
var existExcelItem2 = inputs.GroupBy(g => new {
g.MaterialName
})
.Where(g => g.Count() > 1)
.Select(s => new {
s.Key.MaterialName
}).FirstOrDefault();
if (existExcelItem2 != null)
{
var wmsMaterial = existExcelItem2.Adapt();
var item = existExcelItem2.Adapt();
throw Oops.Oh($"导入的表格中,物料名称[{item.MaterialName}]已存在");
}
//根据联合主键验证数据库中是否已存在相同数据
var existDBItem = await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(w =>
inputs.Select(s => ""
+ s.MaterialCode
)
.Contains(""
+ w.MaterialCode
));
if (existDBItem != null)
{
var wmsMaterial = existExcelItem.Adapt();
var item = existExcelItem.Adapt();
throw Oops.Oh($"系统中,物料编号[{item.MaterialCode}]已存在");
}
//根据联合主键验证数据库中是否已存在相同数据
var existDBItem2 = await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(w =>
inputs.Select(s => ""
+ s.MaterialName
)
.Contains(""
+ w.MaterialName
));
if (existDBItem2 != null)
{
var wmsMaterial = existExcelItem2.Adapt();
var item = existExcelItem.Adapt();
throw Oops.Oh($"系统中,物料编号[{item.MaterialName}]已存在");
}
}
#endregion
}
}