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;
|
using Microsoft.CodeAnalysis;
|
namespace Admin.NET.Application
|
{
|
/// <summary>
|
/// 物料信息表服务
|
/// </summary>
|
[ApiDescriptionSettings("WmsBase", Name = "WmsMaterial", Order = 100)]
|
[Route("api")]
|
public class WmsMaterialService : IWmsMaterialService, IDynamicApiController, ITransient
|
{
|
private readonly IRepository<WmsMaterial,MasterDbContextLocator> _wmsMaterialRep;
|
private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
|
private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
|
private readonly ISysExcelTemplateService _sysExcelTemplateService;
|
private readonly static object _lock = new();
|
private readonly IRepository<WmsMaterialCustomer, MasterDbContextLocator> _wmsMaterialCustomerRep;
|
private readonly IRepository<BaseCustomer, MasterDbContextLocator> _baseCustomerRep;
|
private readonly IRepository<WmsSubstituteGood, MasterDbContextLocator> _wmsSubstituteGoodRep;
|
private readonly IRepository<WmsControlRuleDetail, MasterDbContextLocator> _wmsControlRuleDetailRep;
|
private readonly IRepository<WmsMaterialType, MasterDbContextLocator> _wmsMaterialTypeRep;
|
private readonly IRepository<WmsUnit, MasterDbContextLocator> _wmsUnitRep;
|
public WmsMaterialService(
|
IRepository<WmsMaterial,MasterDbContextLocator> wmsMaterialRep
|
,IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep
|
,IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep
|
,ISysExcelTemplateService sysExcelTemplateService
|
, IRepository<WmsMaterialCustomer, MasterDbContextLocator> wmsMaterialCustomerRep
|
, IRepository<BaseCustomer, MasterDbContextLocator> baseCustomerRep
|
, IRepository<WmsSubstituteGood, MasterDbContextLocator> wmsSubstituteGoodRep
|
, IRepository<WmsControlRuleDetail, MasterDbContextLocator> wmsControlRuleDetailRep
|
, IRepository<WmsMaterialType, MasterDbContextLocator> wmsMaterialTypeRep
|
, IRepository<WmsUnit, MasterDbContextLocator> wmsUnitRep
|
)
|
{
|
_wmsMaterialRep = wmsMaterialRep;
|
_sysDictTypeRep = sysDictTypeRep;
|
_sysDictDataRep = sysDictDataRep;
|
_sysExcelTemplateService = sysExcelTemplateService;
|
_wmsMaterialCustomerRep = wmsMaterialCustomerRep;
|
_baseCustomerRep = baseCustomerRep;
|
_wmsSubstituteGoodRep = wmsSubstituteGoodRep;
|
_wmsControlRuleDetailRep = wmsControlRuleDetailRep;
|
_wmsMaterialTypeRep = wmsMaterialTypeRep;
|
_wmsUnitRep = wmsUnitRep;
|
}
|
/// <summary>
|
/// 分页查询物料信息
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("WmsMaterial/page")]
|
public async Task<PageResult<WmsMaterialOutput>> 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<WmsMaterialSearch>(input))
|
.ProjectToType<WmsMaterialOutput>()
|
.ToADPagedListAsync(input.PageNo, input.PageSize);
|
return wmsMaterials;
|
}
|
|
/// <summary>
|
/// 不分页查询物料信息列表
|
/// </summary>
|
/// <param name="input">物料信息查询参数</param>
|
/// <returns>(物料信息)实例列表</returns>
|
[HttpGet("WmsMaterial/listNonPage")]
|
public async Task<List<WmsMaterialOutput>> 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<WmsMaterialOutput>()
|
.ToListAsync();
|
return wmsMaterials;
|
}
|
|
/// <summary>
|
/// 获取物料信息
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("WmsMaterial/detail")]
|
public async Task<WmsMaterialInfoOutput> Get([FromQuery] QueryeWmsMaterialInput input)
|
{
|
WmsMaterialInfoOutput resultInfo = new WmsMaterialInfoOutput();
|
//获取物料信息
|
var wmsMaterialInfo =(await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsMaterialOutput>();
|
//获取替换物料信息
|
var wmsSubstituteGoods = await _wmsSubstituteGoodRep.DetachedEntities
|
.Where(u => u.MaterialCode == wmsMaterialInfo.MaterialCode)
|
.Where(u => u.IsDeleted == false)
|
.Where(u => u.IsDisabled == false)
|
.OrderBy(o => o.CreatedTime)
|
.ProjectToType<WmsSubstituteGoodOutput>()
|
.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<WmsControlRuleDetailOutput>()
|
.ToListAsync();
|
|
//物料客户关联
|
var wmsMaterialCustomerList = await _wmsMaterialCustomerRep.DetachedEntities
|
.Where(u => u.MaterialId == wmsMaterialInfo.Id)
|
.Where(u => u.IsDeleted == false)
|
.OrderBy(o => o.CreatedTime)
|
.ProjectToType<WmsMaterialCustomerOutput>()
|
.ToListAsync();
|
List<long> custIds = wmsMaterialCustomerList.Select(s => s.CustId).ToList();
|
//根据物料客户关联表获取往来信息
|
var baseCustomers = await _baseCustomerRep.DetachedEntities
|
.Where(p => custIds.Contains(p.Id))
|
.OrderBy(o => o.CreatedTime)
|
.ProjectToType<BaseCustomerOutput>()
|
.ToListAsync();
|
|
|
resultInfo.MaterialInfo = wmsMaterialInfo;
|
resultInfo.SubstituteGoodList = wmsSubstituteGoods;
|
resultInfo.ControlRuleDetailList = wmsControlRuleDetails;
|
resultInfo.BaseCustomerList = baseCustomers;
|
return resultInfo;
|
}
|
|
/// <summary>
|
/// 获取物料信息列表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("WmsMaterial/list")]
|
public async Task<List<WmsMaterialOutput>> List([FromQuery] WmsMaterialInput input)
|
{
|
return await _wmsMaterialRep.DetachedEntities.ProjectToType<WmsMaterialOutput>().ToListAsync();
|
}
|
|
#region 增、删、改
|
|
|
/// <summary>
|
/// 增加物料信息表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("WmsMaterial/add")]
|
[UnitOfWork]
|
public async Task Add(AddWmsMaterialInfoInput input)
|
{
|
|
//物料信息
|
var wmsMaterial = input.MaterialInput.Adapt<WmsMaterial>();
|
//控制规则信息
|
var controlRuleld = input.ControlRuleld;
|
wmsMaterial.ControlRuleId = controlRuleld;
|
|
//获取物料类型
|
var wmsMaterialType = (await _wmsMaterialTypeRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == wmsMaterial.MaterialType)).Adapt<WmsMaterialTypeOutput>();
|
if(wmsMaterialType==null) throw Oops.Oh($"ID{wmsMaterial.MaterialType}物料类型不存在");
|
|
wmsMaterial.MaterialTypeName = wmsMaterialType.MaterialTypeName;
|
|
//往来单位
|
var wmsBaseCustomerList = await _baseCustomerRep.DetachedEntities.Where(u => input.BaseCustomerList.Contains(u.Id) && u.IsDeleted == false && u.IsDisabled == false).ProjectToType<BaseCustomerOutput>().ToListAsync();
|
//物料客户关联关系
|
var materialCustomerList=new List<WmsMaterialCustomer>();
|
foreach (var baseCustomer in wmsBaseCustomerList)
|
{
|
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<List<WmsSubstituteGood>>();
|
List<string> materialCodes = substituteGoodList.Select(s => s.SubstituteMaterialCode).ToList();
|
var wmsSubstituteMaterialInfoList = await _wmsMaterialRep.DetachedEntities.Where(u => materialCodes.Contains(u.MaterialCode)&&u.IsDeleted==false&&u.IsDisabled==false).ProjectToType<WmsMaterialOutput>().ToListAsync();
|
foreach (var item in substituteGoodList)
|
{
|
var substituteMaterialInfo = wmsSubstituteMaterialInfoList.FirstOrDefault(f=>f.MaterialCode== item.SubstituteMaterialCode);
|
item.SubstituteCode = await SerialUtil.GetSerial(EnumSerialType.替代品编号);
|
item.SubstituteMaterialName = substituteMaterialInfo.MaterialName;//替代品物料名称
|
}
|
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 删除物料信息
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("WmsMaterial/delete")]
|
public async Task Delete(DeleteWmsMaterialInput input)
|
{
|
var wmsMaterial = await _wmsMaterialRep.FirstOrDefaultAsync(u => u.Id == input.Id);
|
await _wmsMaterialRep.DeleteAsync(wmsMaterial);
|
|
}
|
|
/// <summary>
|
/// 更新物料信息
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("WmsMaterial/edit")]
|
[UnitOfWork]
|
public async Task Update(UpdateWmsMaterialInfoInput input)
|
{
|
//物料信息
|
var wmsMaterial = input.MaterialInput.Adapt<WmsMaterial>();
|
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 wmsMaterialType = (await _wmsMaterialTypeRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == wmsMaterial.MaterialType)).Adapt<WmsMaterialTypeOutput>();
|
if (wmsMaterialType == null) throw Oops.Oh($"ID{wmsMaterial.MaterialType}物料类型不存在");
|
|
wmsMaterial.MaterialTypeName = wmsMaterialType.MaterialTypeName;
|
|
//删除物料客户关联关系
|
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<List<BaseCustomer>>();
|
//物料客户关联关系
|
var materialCustomerList = new List<WmsMaterialCustomer>();
|
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<List<WmsSubstituteGood>>();
|
List<string> materialCodes = substituteGoodList.Select(s => s.SubstituteMaterialCode).ToList();
|
var wmsSubstituteMaterialInfoList = await _wmsMaterialRep.DetachedEntities.Where(u => materialCodes.Contains(u.MaterialCode) && u.IsDeleted == false && u.IsDisabled == false).ProjectToType<WmsMaterialOutput>().ToListAsync();
|
foreach (var item in substituteGoodList)
|
{
|
var substituteMaterialInfo = wmsSubstituteMaterialInfoList.FirstOrDefault(f => f.MaterialCode == item.SubstituteMaterialCode);
|
item.SubstituteCode = await SerialUtil.GetSerial(EnumSerialType.替代品编号);
|
item.SubstituteMaterialName = substituteMaterialInfo.MaterialName;//替代品物料名称
|
}
|
|
|
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 导入
|
|
/// <summary>
|
/// Excel模板导入物料信息功能
|
/// </summary>
|
/// <param name="file">Excel模板文件</param>
|
/// <returns>导入的记录数</returns>
|
[HttpPost("WmsMaterial/importExcel")]
|
public async Task<int> 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;
|
}
|
|
/// <summary>
|
/// DataTable转换实体对象列表
|
/// </summary>
|
/// <param name="dataTable"></param>
|
/// <param name="dataStartLine">模版列名开始行</param>
|
/// <returns></returns>
|
private async Task<List<WmsMaterial>> CommonImport(DataTable dataTable, int dataStartLine)
|
{
|
|
var details = new List<WmsMaterial>();
|
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 _MaterialType = "";//物料类型
|
var _MaterialGroup = "";//物料组
|
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();
|
_MaterialType = row["物料类型"]?.ToString();
|
_MaterialGroup = row["物料组"]?.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(_MaterialType))
|
{
|
throw Oops.Oh($"第{index}行[物料类型]{_MaterialType}不能为空!");
|
}
|
|
if (!string.IsNullOrEmpty(_MaterialType))
|
{
|
//TODO 根据物料类型ID获取物料类型
|
addItem.MaterialType = 0;
|
addItem.MaterialTypeName = "";
|
}
|
if (!string.IsNullOrEmpty(_MaterialGroup))
|
{
|
addItem.MaterialGroup = (string)_MaterialGroup;
|
}
|
|
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(_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;
|
}
|
|
/// <summary>
|
/// 根据版本下载物料信息的Excel导入模板
|
/// </summary>
|
/// <param name="version">模板版本</param>
|
/// <returns>下载的模板文件</returns>
|
[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 私有方法
|
|
/// <summary>
|
/// 根据联合主键验证数据是否已存在-数据库
|
/// </summary>
|
/// <param name="input"></param>
|
/// <param name="isEdit"></param>
|
/// <returns></returns>
|
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);
|
}
|
|
/// <summary>
|
/// 根据联合主键验证数据是否已存在-导入时验证
|
/// </summary>
|
/// <param name="inputs"></param>
|
/// <returns></returns>
|
private async Task CheckExisitForImport(List<WmsMaterial> 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<WmsMaterial>();
|
var item = existExcelItem.Adapt<WmsMaterial>();
|
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<WmsMaterial>();
|
var item = existExcelItem2.Adapt<WmsMaterial>();
|
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<WmsMaterial>();
|
var item = existExcelItem.Adapt<WmsMaterial>();
|
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<WmsMaterial>();
|
var item = existExcelItem.Adapt<WmsMaterial>();
|
throw Oops.Oh($"系统中,物料编号[{item.MaterialName}]已存在");
|
}
|
}
|
|
#endregion
|
}
|
}
|