WMS 1.0 final version

This commit is contained in:
liufu 2024-01-10 17:43:03 +08:00
parent a0df59edda
commit 114526d880
33 changed files with 1717 additions and 438 deletions

View file

@ -10,7 +10,7 @@ namespace ModernWMS.Core.Controller
/// <summary> /// <summary>
/// base controller /// base controller
/// </summary> /// </summary>
//[Authorize] [Authorize]
[Produces("application/json")] [Produces("application/json")]
public class BaseController : ControllerBase public class BaseController : ControllerBase
{ {

View file

@ -30,6 +30,9 @@ using ModernWMS.Core.DI;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
using Microsoft.EntityFrameworkCore.Migrations.Internal; using Microsoft.EntityFrameworkCore.Migrations.Internal;
using System.Security.AccessControl;
using Hangfire;
using Hangfire.MemoryStorage;
namespace ModernWMS.Core.Extentions namespace ModernWMS.Core.Extentions
{ {
@ -43,6 +46,7 @@ namespace ModernWMS.Core.Extentions
var sharedLocalizer = sp.GetRequiredService<IStringLocalizer<MultiLanguage>>(); var sharedLocalizer = sp.GetRequiredService<IStringLocalizer<MultiLanguage>>();
return sharedLocalizer; return sharedLocalizer;
}); });
services.AddHttpClient();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<CacheManager>(); services.AddSingleton<CacheManager>();
services.AddSingleton<IMemoryCache>(factory => services.AddSingleton<IMemoryCache>(factory =>
@ -50,25 +54,27 @@ namespace ModernWMS.Core.Extentions
var cache = new MemoryCache(new MemoryCacheOptions()); var cache = new MemoryCache(new MemoryCacheOptions());
return cache; return cache;
}); });
var database_config = configuration.GetSection("Database")["db"]; var database_config = configuration.GetSection("Database")["db"];
services.AddDbContextPool<SqlDBContext>(t => services.AddDbContextPool<SqlDBContext>(t =>
{ {
if (database_config == "SqlLite") if (database_config.ToUpper() == "SQLLITE")
{ {
var SqlLite_connection = configuration.GetConnectionString("SqlLiteConn"); var SqlLite_connection = configuration.GetConnectionString("SqlLiteConn");
t.UseSqlite(SqlLite_connection, b => b.MigrationsAssembly("ModernWMS")); t.UseSqlite(SqlLite_connection, b => b.MigrationsAssembly("ModernWMS"));
} }
else if (database_config == "MySql") else if (database_config.ToUpper() == "MYSQL")
{ {
var Mysql_connection = configuration.GetConnectionString("MySqlConn"); var Mysql_connection = configuration.GetConnectionString("MySqlConn");
t.UseMySql(Mysql_connection, new MySqlServerVersion(new Version(8, 0, 26))); t.UseMySql(Mysql_connection, new MySqlServerVersion(new Version(8, 0, 26)));
} }
else if (database_config == "SqlServer") else if (database_config.ToUpper() == "SQLSERVER")
{ {
var SqlServer_connection = configuration.GetConnectionString("SqlServerConn"); var SqlServer_connection = configuration.GetConnectionString("SqlServerConn");
t.UseSqlServer(SqlServer_connection); t.UseSqlServer(SqlServer_connection);
} }
else if (database_config == "PostGres")
else if (database_config.ToUpper() == "POSTGRES")
{ {
var Postgre_connection = configuration.GetConnectionString("PostGresConn"); var Postgre_connection = configuration.GetConnectionString("PostGresConn");
t.UseNpgsql(Postgre_connection); t.UseNpgsql(Postgre_connection);
@ -79,7 +85,7 @@ namespace ModernWMS.Core.Extentions
t.UseLoggerFactory(new LoggerFactory(new[] { new DebugLoggerProvider() })); t.UseLoggerFactory(new LoggerFactory(new[] { new DebugLoggerProvider() }));
}, 100); ; }, 100); ;
services.AddMemoryCache(); services.AddMemoryCache();
services.AddScoped<MultiTenancy.ITenantProvider, MultiTenancy.TenantProvider>(); services.AddScoped<MultiTenancy.ITenantProvider, MultiTenancy.TenantProvider>();
services.AddSwaggerService(configuration, AppContext.BaseDirectory); services.AddSwaggerService(configuration, AppContext.BaseDirectory);
services.AddTokenGeneratorService(configuration); services.AddTokenGeneratorService(configuration);
services.RegisterAssembly(); services.RegisterAssembly();
@ -98,13 +104,20 @@ namespace ModernWMS.Core.Extentions
options.SerializerSettings.Converters.Add(new JsonStringTrimConverter()); options.SerializerSettings.Converters.Add(new JsonStringTrimConverter());
options.SerializerSettings.Formatting = Formatting.Indented; options.SerializerSettings.Formatting = Formatting.Indented;
options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(); options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
}).AddDataAnnotationsLocalization(options => }).AddDataAnnotationsLocalization(options => {
{
options.DataAnnotationLocalizerProvider = (type, factory) => options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(ModernWMS.Core.MultiLanguage)); factory.Create(typeof(ModernWMS.Core.MultiLanguage));
}); ; });
}
// Hangfire
services.AddHangfire(x => x.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseStorage(new MemoryStorage()));
services.AddHangfireServer();
}
public static void UseExtensionsConfigure(this IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IConfiguration configuration) public static void UseExtensionsConfigure(this IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IConfiguration configuration)
{ {
if (env.IsDevelopment()) if (env.IsDevelopment())
@ -118,20 +131,28 @@ namespace ModernWMS.Core.Extentions
app.UseTokenGeneratorConfigure(configuration); app.UseTokenGeneratorConfigure(configuration);
app.UseAuthorization(); app.UseAuthorization();
app.UseMiddleware<GlobalExceptionMiddleware>(); app.UseMiddleware<GlobalExceptionMiddleware>();
var support_languages = new[] { "zh-cn", "en-us" }; var support_languages = new[] { "zh-cn", "en-us" };
var localization_options = new RequestLocalizationOptions() var localization_options = new RequestLocalizationOptions()
.SetDefaultCulture(support_languages[0]) .SetDefaultCulture(support_languages[0])
.AddSupportedCultures(support_languages) .AddSupportedCultures(support_languages)
.AddSupportedUICultures(support_languages); .AddSupportedUICultures(support_languages);
app.UseRequestLocalization(localization_options); app.UseRequestLocalization(localization_options);
var option = new BackgroundJobServerOptions
{
ServerName = String.Format("{0}.{1}", Environment.MachineName, Guid.NewGuid().ToString()),
WorkerCount = Environment.ProcessorCount * 5,
Queues = new[] { "wms" }
};
app.UseHangfireServer(option);
app.UseHangfireDashboard();
AddHangfireJob(serviceProvider);
app.UseEndpoints(endpoints => app.UseEndpoints(endpoints =>
{ {
endpoints.MapControllers(); endpoints.MapControllers();
}); });
} }
#region Swagger #region Swagger
/// <summary> /// <summary>
/// Swagger /// Swagger
/// </summary> /// </summary>
@ -163,6 +184,7 @@ namespace ModernWMS.Core.Extentions
}); });
}); });
if (settings.XmlFiles != null && settings.XmlFiles.Count > 0) if (settings.XmlFiles != null && settings.XmlFiles.Count > 0)
{ {
settings.XmlFiles.ForEach(fileName => settings.XmlFiles.ForEach(fileName =>
@ -178,6 +200,7 @@ namespace ModernWMS.Core.Extentions
c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>(); c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
c.OperationFilter<SecurityRequirementsOperationFilter>(); c.OperationFilter<SecurityRequirementsOperationFilter>();
c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{ {
Description = "please input Bearer {token}", Description = "please input Bearer {token}",
@ -186,10 +209,10 @@ namespace ModernWMS.Core.Extentions
Type = SecuritySchemeType.ApiKey Type = SecuritySchemeType.ApiKey
}); });
c.SwaggerGeneratorOptions.DescribeAllParametersInCamelCase = false; c.SwaggerGeneratorOptions.DescribeAllParametersInCamelCase = false;
}); });
} }
} }
/// <summary> /// <summary>
/// register Swagger /// register Swagger
/// </summary> /// </summary>
@ -197,6 +220,7 @@ namespace ModernWMS.Core.Extentions
/// <param name="configuration">配置文件</param> /// <param name="configuration">配置文件</param>
private static void UseSwaggerConfigure(this IApplicationBuilder app, IConfiguration configuration) private static void UseSwaggerConfigure(this IApplicationBuilder app, IConfiguration configuration)
{ {
var swaggerSettings = configuration.GetSection("SwaggerSettings"); var swaggerSettings = configuration.GetSection("SwaggerSettings");
if (swaggerSettings != null && swaggerSettings["Name"].Equals("ModernWMS")) if (swaggerSettings != null && swaggerSettings["Name"].Equals("ModernWMS"))
@ -212,14 +236,14 @@ namespace ModernWMS.Core.Extentions
c.IndexStream = () => Assembly.GetExecutingAssembly().GetManifestResourceStream("ModernWMS.Core.Swagger.index.html"); c.IndexStream = () => Assembly.GetExecutingAssembly().GetManifestResourceStream("ModernWMS.Core.Swagger.index.html");
c.RoutePrefix = ""; c.RoutePrefix = "";
}); });
} }
} }
#endregion
#endregion Swagger
#region JWT #region JWT
/// <summary> /// <summary>
/// register JWT /// register JWT
/// </summary> /// </summary>
@ -227,6 +251,7 @@ namespace ModernWMS.Core.Extentions
/// <param name="configuration">configuration</param> /// <param name="configuration">configuration</param>
private static void AddTokenGeneratorService(this IServiceCollection services, IConfiguration configuration) private static void AddTokenGeneratorService(this IServiceCollection services, IConfiguration configuration)
{ {
if (services == null) if (services == null)
{ {
throw new ArgumentNullException(nameof(services)); throw new ArgumentNullException(nameof(services));
@ -239,7 +264,7 @@ namespace ModernWMS.Core.Extentions
{ {
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = nameof(ApiResponseHandler); options.DefaultChallengeScheme = nameof(ApiResponseHandler);
options.DefaultForbidScheme = nameof(ApiResponseHandler); options.DefaultForbidScheme = nameof(ApiResponseHandler);
} }
) )
@ -258,23 +283,24 @@ namespace ModernWMS.Core.Extentions
}; };
}) })
.AddScheme<AuthenticationSchemeOptions, ApiResponseHandler>(nameof(ApiResponseHandler), o => { }); .AddScheme<AuthenticationSchemeOptions, ApiResponseHandler>(nameof(ApiResponseHandler), o => { });
} }
private static void UseTokenGeneratorConfigure(this IApplicationBuilder app, IConfiguration configuration) private static void UseTokenGeneratorConfigure(this IApplicationBuilder app, IConfiguration configuration)
{ {
app.UseAuthentication(); app.UseAuthentication();
} }
#endregion
#endregion JWT #region dynamic injection
#region dynamic injection
/// <summary> /// <summary>
/// judge the dll to be injected by IDependency /// judge the dll to be injected by IDependency
/// </summary> /// </summary>
/// <param name="services">services</param> /// <param name="services">services</param>
private static IServiceCollection RegisterAssembly(this IServiceCollection services) private static IServiceCollection RegisterAssembly(this IServiceCollection services)
{ {
var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
var referencedAssemblies = System.IO.Directory.GetFiles(path, "ModernWMS*.dll").Select(Assembly.LoadFrom).ToArray(); var referencedAssemblies = System.IO.Directory.GetFiles(path, "ModernWMS*.dll").Select(Assembly.LoadFrom).ToArray();
@ -292,9 +318,50 @@ namespace ModernWMS.Core.Extentions
} }
services.AddScoped<Services.IAccountService, Services.AccountService>(); services.AddScoped<Services.IAccountService, Services.AccountService>();
// Register Job
var typeJobs = referencedAssemblies
.SelectMany(a => a.DefinedTypes)
.Select(type => type.AsType())
.Where(x => x != typeof(Job.IJob) && typeof(Job.IJob).IsAssignableFrom(x)).ToArray();
if (types != null && types.Length > 0)
{
var implementJobs = typeJobs.Where(x => x.IsClass).ToArray();
foreach (var implementType in implementJobs)
{
services.AddScoped(implementType);
}
}
return services; return services;
} }
/// <summary>
/// AddHangfireJob
/// </summary>
/// <param name="serviceProvider"></param>
private static void AddHangfireJob(IServiceProvider serviceProvider)
{
var baseType = typeof(Core.Job.IJob);
var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
var referencedAssemblies = System.IO.Directory.GetFiles(path, "ModernWMS*.dll").Select(Assembly.LoadFrom).ToArray();
var types = referencedAssemblies
.SelectMany(a => a.DefinedTypes)
.Select(type => type.AsType())
.Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();
if (types != null && types.Length > 0)
{
var implementTypes = types.Where(x => x.IsClass).ToArray();
foreach (var implementType in implementTypes)
{
var job = serviceProvider.GetService(implementType) as Core.Job.IJob;
if (job != null)
{
Hangfire.RecurringJob.AddOrUpdate(() => job.Execute(), job.CronExpression, TimeZoneInfo.Local, "wms");
}
}
}
}
#endregion
#endregion dynamic injection
} }
} }

View file

@ -0,0 +1,24 @@
/*
* date2023-02-08
* developerAMo
*/
namespace ModernWMS.Core.Job
{
/// <summary>
/// base interface
/// </summary>
public interface IJob
{
/// <summary>
/// cron
/// </summary>
string CronExpression { get; }
/// <summary>
/// Execute
/// </summary>
/// <returns></returns>
Task Execute();
}
}

View file

@ -0,0 +1,61 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Json;
using System.Net;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.Core.Job
{
/// <summary>
///
/// </summary>
public class TestJob : IJob
{
/// <summary>
///
/// </summary>
private IHttpClientFactory _httpClient;
/// <summary>
///
/// </summary>
/// <param name="httpClient"></param>
public TestJob(IHttpClientFactory httpClient) {
this._httpClient = httpClient;
}
/// <summary>
///
/// </summary>
public string CronExpression => Hangfire.Cron.Hourly(3);
/// <summary>
///
/// </summary>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task Execute()
{
using (HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Add("Method", "Post");
await httpClient.PostAsync("https://wmsonline.ikeyly.com:20011/hello-world?culture=zh-cn", null);
//HttpResponseMessage response = await httpClient.PostAsync("https://wmsonline.ikeyly.com:20011/hello-world?culture=zh-cn", null);
//if (response.StatusCode == HttpStatusCode.OK)
//{
// var data = await response.Content.ReadAsStringAsync();
//}
}
}
}
}

View file

@ -13,12 +13,12 @@ namespace ModernWMS.Core.Models
/// </summary> /// </summary>
[Required(ErrorMessage ="Required")] [Required(ErrorMessage ="Required")]
[Display(Name = "user_name")] [Display(Name = "user_name")]
[MaxLength(128, ErrorMessage = "MaxLength")] [MaxLength(128,ErrorMessage = "MaxLength")]
public string user_name { get; set; } = string.Empty; public string user_name { get; set; } = string.Empty;
/// <summary> /// <summary>
/// password /// password
/// </summary> /// </summary>
[Required(ErrorMessage ="Required")] [Required(ErrorMessage ="Required")]
[Display(Name = "password")] [Display(Name = "password")]
[MaxLength(64, ErrorMessage = "MaxLength")] [MaxLength(64, ErrorMessage = "MaxLength")]

View file

@ -645,4 +645,13 @@
<data name="username_existed" xml:space="preserve"> <data name="username_existed" xml:space="preserve">
<value>User name already exists</value> <value>User name already exists</value>
</data> </data>
<data name="stock_insufficiency" xml:space="preserve">
<value>present stock is not sufficient.</value>
</data>
<data name="job_number" xml:space="preserve">
<value>Job Number</value>
</data>
<data name="process_valid" xml:space="preserve">
<value>Processing details cannot all be source products or target products.</value>
</data>
</root> </root>

View file

@ -645,4 +645,19 @@
<data name="username_existed" xml:space="preserve"> <data name="username_existed" xml:space="preserve">
<value>用户名已存在</value> <value>用户名已存在</value>
</data> </data>
<data name="dest_stock_freeze" xml:space="preserve">
<value>目标库位被冻结</value>
</data>
<data name="qty_not_available" xml:space="preserve">
<value>可用数量不足</value>
</data>
<data name="stock_insufficiency" xml:space="preserve">
<value>当前库存不足</value>
</data>
<data name="job_number" xml:space="preserve">
<value>加工序号</value>
</data>
<data name="process_valid" xml:space="preserve">
<value>加工明细不能全部为来源商品也不能全部为目标商品</value>
</data>
</root> </root>

View file

@ -23,7 +23,7 @@
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" /> <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.1" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.1" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.0.1" /> <PackageReference Include="Microsoft.Data.SqlClient" Version="5.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.1"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.1">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
@ -45,6 +45,9 @@
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0-silver.1" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0-silver.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.6" /> <PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.6" />
<PackageReference Include="Hangfire.AspNetCore" Version="1.7.33" />
<PackageReference Include="HangFire.Core" Version="1.7.33" />
<PackageReference Include="Hangfire.MemoryStorage" Version="1.7.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -301,6 +301,19 @@ namespace ModernWMS.WMS.Controllers
} }
} }
/// <summary>
/// get pending putaway data by asn_id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("pending-putaway")]
public async Task<ResultModel<List<AsnPendingPutawayViewModel>>> GetPendingPutawayDataAsync(int id)
{
var data = await _asnService.GetPendingPutawayDataAsync(id);
data ??= new List<AsnPendingPutawayViewModel>();
return ResultModel<List<AsnPendingPutawayViewModel>>.Success(data);
}
/// <summary> /// <summary>
/// PutAway /// PutAway
/// </summary> /// </summary>
@ -321,6 +334,27 @@ namespace ModernWMS.WMS.Controllers
} }
#endregion #endregion
#region excel import
/// <summary>
/// excel import
/// </summary>
/// <param name="excelData">excel data</param>
/// <returns></returns>
[HttpPost("excel-import")]
public async Task<ResultModel<List<AsnExcelImportViewModel>>> ImportAsync(List<AsnExcelImportViewModel> excelData)
{
var (flag, msg, errList) = await _asnService.ImportAsync(excelData, CurrentUser);
if (flag)
{
return ResultModel<List<AsnExcelImportViewModel>>.Success(errList);
}
else
{
return ResultModel<List<AsnExcelImportViewModel>>.Error(msg, 400, errList);
}
}
#endregion
} }
} }

View file

@ -336,6 +336,24 @@ namespace ModernWMS.WMS.Controllers
} }
} }
/// <summary>
/// Excel Import
/// </summary>
/// <param name="viewModels">viewModels</param>
/// <returns></returns>
[HttpPost("import")]
public async Task<ResultModel<string>> Import(List<DispatchlistImportViewModel> viewModels)
{
var (flag, msg) = await _dispatchlistService.Import(viewModels, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion #endregion
} }

View file

@ -2,69 +2,75 @@
* date2022-12-22 * date2022-12-22
* developerNoNo * developerNoNo
*/ */
using Microsoft.AspNetCore.Mvc;
using ModernWMS.Core.Controller; using Microsoft.AspNetCore.Mvc;
using ModernWMS.Core.Models; using ModernWMS.Core.Controller;
using ModernWMS.WMS.Entities.ViewModels; using ModernWMS.Core.Models;
using ModernWMS.WMS.IServices; using ModernWMS.WMS.Entities.ViewModels;
using Microsoft.Extensions.Localization; using ModernWMS.WMS.IServices;
using Microsoft.Extensions.Localization;
namespace ModernWMS.WMS.Controllers
{ namespace ModernWMS.WMS.Controllers
/// <summary> {
/// stock controller /// <summary>
/// </summary> /// stock controller
[Route("stock")] /// </summary>
[ApiController] [Route("stock")]
[ApiExplorerSettings(GroupName = "WMS")] [ApiController]
public class StockController : BaseController [ApiExplorerSettings(GroupName = "WMS")]
{ public class StockController : BaseController
#region Args {
#region Args
/// <summary>
/// stock Service /// <summary>
/// </summary> /// stock Service
private readonly IStockService _stockService; /// </summary>
private readonly IStockService _stockService;
/// <summary>
/// Localizer Service /// <summary>
/// </summary> /// Localizer Service
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer; /// </summary>
#endregion private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#region constructor #endregion Args
/// <summary>
/// constructor #region constructor
/// </summary>
/// <param name="stockService">stock Service</param> /// <summary>
/// constructor
/// </summary>
/// <param name="stockService">stock Service</param>
/// <param name="stringLocalizer">Localizer</param> /// <param name="stringLocalizer">Localizer</param>
public StockController( public StockController(
IStockService stockService IStockService stockService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer , IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
) )
{ {
this._stockService = stockService; this._stockService = stockService;
this._stringLocalizer= stringLocalizer; this._stringLocalizer = stringLocalizer;
} }
#endregion
#endregion constructor
#region Api
/// <summary> #region Api
/// stock details page search
/// </summary> /// <summary>
/// <param name="pageSearch">args</param> /// stock details page search
/// <returns></returns> /// </summary>
[HttpPost("stock-list")] /// <param name="pageSearch">args</param>
public async Task<ResultModel<PageData<StockManagementViewModel>>> StockPageAsync(PageSearch pageSearch) /// <returns></returns>
{ [HttpPost("stock-list")]
var (data, totals) = await _stockService.StockPageAsync(pageSearch, CurrentUser); public async Task<ResultModel<PageData<StockManagementViewModel>>> StockPageAsync(PageSearch pageSearch)
{
return ResultModel<PageData<StockManagementViewModel>>.Success(new PageData<StockManagementViewModel> var (data, totals) = await _stockService.StockPageAsync(pageSearch, CurrentUser);
{
Rows = data, return ResultModel<PageData<StockManagementViewModel>>.Success(new PageData<StockManagementViewModel>
Totals = totals {
}); Rows = data,
} Totals = totals
});
}
/// <summary> /// <summary>
/// location stock page search /// location stock page search
/// </summary> /// </summary>
@ -115,8 +121,19 @@
Totals = totals Totals = totals
}); });
} }
#endregion
/// <summary>
/// get stock infomation by phone
/// </summary>
/// <param name="input">input</param>
/// <returns></returns>
[HttpPost("qrcode-list")]
public async Task<ResultModel<List<LocationStockManagementViewModel>>> LocationStockForPhoneAsync(LocationStockForPhoneSearchViewModel input)
{
var datas = await _stockService.LocationStockForPhoneAsync(input, CurrentUser);
return ResultModel<List<LocationStockManagementViewModel>>.Success(datas);
}
#endregion Api
} }
} }

View file

@ -8,12 +8,11 @@
using ModernWMS.WMS.Entities.ViewModels; using ModernWMS.WMS.Entities.ViewModels;
using ModernWMS.WMS.IServices; using ModernWMS.WMS.IServices;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
namespace ModernWMS.WMS.Controllers
namespace ModernWMS.WMS.Controllers {
{ /// <summary>
/// <summary> /// stockprocess controller
/// stockprocess controller /// </summary>
/// </summary>
[Route("stockprocess")] [Route("stockprocess")]
[ApiController] [ApiController]
[ApiExplorerSettings(GroupName = "WMS")] [ApiExplorerSettings(GroupName = "WMS")]
@ -194,6 +193,26 @@
return ResultModel<string>.Error(msg); return ResultModel<string>.Error(msg);
} }
} }
/// <summary>
/// Excel Import
/// </summary>
/// <param name="viewModels">viewModels</param>
/// <returns></returns>
[HttpPost("import")]
public async Task<ResultModel<string>> Import(List<StockprocessImportViewModel> viewModels)
{
var (flag, msg) = await _stockprocessService.Import(viewModels, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion #endregion
} }

View file

@ -2,6 +2,7 @@
* date2022-12-20 * date2022-12-20
* developerNoNo * developerNoNo
*/ */
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using ModernWMS.Core.Controller; using ModernWMS.Core.Controller;
using ModernWMS.Core.Models; using ModernWMS.Core.Models;
@ -31,9 +32,11 @@ namespace ModernWMS.WMS.Controllers
/// Localizer Service /// Localizer Service
/// </summary> /// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer; private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#endregion Args
#region constructor #region constructor
/// <summary> /// <summary>
/// constructor /// constructor
/// </summary> /// </summary>
@ -47,9 +50,11 @@ namespace ModernWMS.WMS.Controllers
this._userService = userService; this._userService = userService;
this._stringLocalizer = stringLocalizer; this._stringLocalizer = stringLocalizer;
} }
#endregion
#endregion constructor
#region Api #region Api
/// <summary> /// <summary>
/// get select items /// get select items
/// </summary> /// </summary>
@ -60,6 +65,7 @@ namespace ModernWMS.WMS.Controllers
var datas = await _userService.GetSelectItemsAsnyc(CurrentUser); var datas = await _userService.GetSelectItemsAsnyc(CurrentUser);
return ResultModel<List<FormSelectItem>>.Success(datas); return ResultModel<List<FormSelectItem>>.Success(datas);
} }
/// <summary> /// <summary>
/// page search /// page search
/// </summary> /// </summary>
@ -112,6 +118,7 @@ namespace ModernWMS.WMS.Controllers
return ResultModel<UserViewModel>.Error(_stringLocalizer["not_exists_entity"]); return ResultModel<UserViewModel>.Error(_stringLocalizer["not_exists_entity"]);
} }
} }
/// <summary> /// <summary>
/// add a new record /// add a new record
/// </summary> /// </summary>
@ -124,13 +131,14 @@ namespace ModernWMS.WMS.Controllers
var (id, msg) = await _userService.AddAsync(viewModel, CurrentUser); var (id, msg) = await _userService.AddAsync(viewModel, CurrentUser);
if (id > 0) if (id > 0)
{ {
return ResultModel<int>.Success(id); return ResultModel<int>.Success(id, msg);
} }
else else
{ {
return ResultModel<int>.Error(msg); return ResultModel<int>.Error(msg);
} }
} }
/// <summary> /// <summary>
/// register a new tenant /// register a new tenant
/// </summary> /// </summary>
@ -150,6 +158,7 @@ namespace ModernWMS.WMS.Controllers
return ResultModel<string>.Error(msg); return ResultModel<string>.Error(msg);
} }
} }
/// <summary> /// <summary>
/// import users by excel /// import users by excel
/// </summary> /// </summary>
@ -168,6 +177,7 @@ namespace ModernWMS.WMS.Controllers
return ResultModel<string>.Error(msg); return ResultModel<string>.Error(msg);
} }
} }
/// <summary> /// <summary>
/// update a record /// update a record
/// </summary> /// </summary>
@ -205,6 +215,7 @@ namespace ModernWMS.WMS.Controllers
return ResultModel<string>.Error(msg); return ResultModel<string>.Error(msg);
} }
} }
/// <summary> /// <summary>
/// reset password /// reset password
/// </summary> /// </summary>
@ -223,6 +234,7 @@ namespace ModernWMS.WMS.Controllers
return ResultModel<string>.Error(msg); return ResultModel<string>.Error(msg);
} }
} }
/// <summary> /// <summary>
/// change password /// change password
/// </summary> /// </summary>
@ -241,8 +253,7 @@ namespace ModernWMS.WMS.Controllers
return ResultModel<string>.Error(msg); return ResultModel<string>.Error(msg);
} }
} }
#endregion
#endregion Api
} }
} }

View file

@ -0,0 +1,161 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.WMS.Entities.ViewModels
{
/// <summary>
/// asn excel import view model
/// </summary>
public class AsnExcelImportViewModel
{
#region constructor
/// <summary>
/// constructor
/// </summary>
public AsnExcelImportViewModel()
{
}
#endregion
#region Property
/// <summary>
/// asn_no
/// </summary>
[Display(Name = "asn_no")]
[Required(ErrorMessage = "Required")]
[MaxLength(32, ErrorMessage = "MaxLength")]
public string asn_no { get; set; } = string.Empty;
/// <summary>
/// spu_id
/// </summary>
[Display(Name = "spu_id")]
[Required(ErrorMessage = "Required")]
public int spu_id { get; set; } = 0;
/// <summary>
/// spu_code
/// </summary>
[Display(Name = "spu_code")]
[Required(ErrorMessage = "Required")]
[MaxLength(32, ErrorMessage = "MaxLength")]
public string spu_code { get; set; } = string.Empty;
/// <summary>
/// spu_name
/// </summary>
[Display(Name = "spu_name")]
[Required(ErrorMessage = "Required")]
[MaxLength(200, ErrorMessage = "MaxLength")]
public string spu_name { get; set; } = string.Empty;
/// <summary>
/// sku_id
/// </summary>
[Display(Name = "sku_id")]
public int sku_id { get; set; } = 0;
/// <summary>
/// sku_code
/// </summary>
[Display(Name = "sku_code")]
[Required(ErrorMessage = "Required")]
[MaxLength(32, ErrorMessage = "MaxLength")]
public string sku_code { get; set; } = string.Empty;
/// <summary>
/// sku_name
/// </summary>
[Display(Name = "sku_name")]
[MaxLength(200, ErrorMessage = "MaxLength")]
public string sku_name { get; set; } = string.Empty;
/// <summary>
/// origin
/// </summary>
[Display(Name = "origin")]
[MaxLength(256, ErrorMessage = "MaxLength")]
public string origin { get; set; } = string.Empty;
/// <summary>
/// length_unit 0=毫米、1=厘米、2=分米、3=米)
/// </summary>
[Display(Name = "length_unit")]
public byte length_unit { get; set; } = 0;
/// <summary>
/// volume_unit 0=立方厘米、1=立方分米、2=立方米)
/// </summary>
[Display(Name = "volume_unit")]
public byte volume_unit { get; set; } = 0;
/// <summary>
/// weight_unit 0=毫克、1=克、2=千克)
/// </summary>
[Display(Name = "weight_unit")]
public byte weight_unit { get; set; } = 0;
/// <summary>
/// asn_qty
/// </summary>
[Display(Name = "asn_qty")]
public int asn_qty { get; set; } = 0;
/// <summary>
/// weight
/// </summary>
[Display(Name = "weight")]
public decimal weight { get; set; } = 0;
/// <summary>
/// volume
/// </summary>
[Display(Name = "volume")]
public decimal volume { get; set; } = 0;
/// <summary>
/// supplier_id
/// </summary>
[Display(Name = "supplier_id")]
public int supplier_id { get; set; } = 0;
/// <summary>
/// supplier_name
/// </summary>
[Display(Name = "supplier_name")]
[Required(ErrorMessage = "Required")]
[MaxLength(256, ErrorMessage = "MaxLength")]
public string supplier_name { get; set; } = string.Empty;
/// <summary>
/// goods_owner_id
/// </summary>
[Display(Name = "goods_owner_id")]
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// goods_owner_name
/// </summary>
[Display(Name = "goods_owner_name")]
[MaxLength(256, ErrorMessage = "MaxLength")]
public string goods_owner_name { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public string _X_ROW_KEY { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public string error_msg { get; set; } = string.Empty;
#endregion
}
}

View file

@ -0,0 +1,58 @@
/*
* date2023-09-05
* developerAMo
*/
using System.ComponentModel.DataAnnotations;
namespace ModernWMS.WMS.Entities.ViewModels
{
/// <summary>
/// pending putwaay viewModel
/// </summary>
public class AsnPendingPutawayViewModel
{
#region constructor
/// <summary>
/// constructor
/// </summary>
public AsnPendingPutawayViewModel()
{
}
#endregion
#region Property
/// <summary>
/// asn_id
/// </summary>
[Display(Name = "asn_id")]
public int asn_id { get; set; } = 0;
/// <summary>
/// goods_owner_id
/// </summary>
[Display(Name = "goods_owner_id")]
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// goods_owner_name
/// </summary>
[Display(Name = "goods_owner_name")]
public string goods_owner_name { get; set; } = string.Empty;
/// <summary>
/// series_number
/// </summary>
[Display(Name = "series_number")]
public string series_number { get; set; } = string.Empty;
/// <summary>
/// sorted_qty
/// </summary>
[Display(Name = "sorted_qty")]
public int sorted_qty { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.WMS.Entities.ViewModels
{
/// <summary>
/// ImportViewModel
/// </summary>
public class DispatchlistImportViewModel
{
/// <summary>
/// import_group
/// </summary>
public int import_group { get; set; } = 0;
/// <summary>
/// customer_name
/// </summary>
public string customer_name { get; set; } = string.Empty;
/// <summary>
/// sku_name
/// </summary>
public string sku_name { get; set; } = string.Empty;
/// <summary>
/// spu_code
/// </summary>
public string spu_code { get; set; } = string.Empty;
/// <summary>
/// sku_code
/// </summary>
public string sku_code { get; set; } = string.Empty;
/// <summary>
/// qty
/// </summary>
public int qty { get; set; } = 0;
}
}

View file

@ -14,104 +14,104 @@ namespace ModernWMS.WMS.Entities.ViewModels
public class DispatchlistViewModel public class DispatchlistViewModel
{ {
#region constructor #region constructor
/// <summary> /// <summary>
/// constructor /// constructor
/// </summary> /// </summary>
public DispatchlistViewModel() public DispatchlistViewModel()
{ {
} }
#endregion #endregion
#region Property #region Property
/// <summary> /// <summary>
/// id /// id
/// </summary> /// </summary>
[Display(Name = "id")] [Display(Name = "id")]
public int id { get; set; } = 0; public int id { get; set; } = 0;
/// <summary> /// <summary>
/// dispatch_no /// dispatch_no
/// </summary> /// </summary>
[Display(Name = "dispatch_no")] [Display(Name = "dispatch_no")]
[MaxLength(32, ErrorMessage = "MaxLength")] [MaxLength(32,ErrorMessage = "MaxLength")]
public string dispatch_no { get; set; } = string.Empty; public string dispatch_no { get; set; } = string.Empty;
/// <summary> /// <summary>
/// dispatch_status /// dispatch_status
/// </summary> /// </summary>
[Display(Name = "dispatch_status")] [Display(Name = "dispatch_status")]
public byte dispatch_status { get; set; } = 0; public byte dispatch_status { get; set; } = 0;
/// <summary> /// <summary>
/// customer_id /// customer_id
/// </summary> /// </summary>
[Display(Name = "customer_id")] [Display(Name = "customer_id")]
public int customer_id { get; set; } = 0; public int customer_id { get; set; } = 0;
/// <summary> /// <summary>
/// customer_name /// customer_name
/// </summary> /// </summary>
[Display(Name = "customer_name")] [Display(Name = "customer_name")]
[MaxLength(256, ErrorMessage = "MaxLength")] [MaxLength(256,ErrorMessage = "MaxLength")]
public string customer_name { get; set; } = string.Empty; public string customer_name { get; set; } = string.Empty;
/// <summary> /// <summary>
/// sku_id /// sku_id
/// </summary> /// </summary>
[Display(Name = "sku_id")] [Display(Name = "sku_id")]
public int sku_id { get; set; } = 0; public int sku_id { get; set; } = 0;
/// <summary> /// <summary>
/// qty /// qty
/// </summary> /// </summary>
[Display(Name = "qty")] [Display(Name = "qty")]
public int qty { get; set; } = 0; public int qty { get; set; } = 0;
/// <summary> /// <summary>
/// weight /// weight
/// </summary> /// </summary>
[Display(Name = "weight")] [Display(Name = "weight")]
public decimal weight { get; set; } = 0; public decimal weight { get; set; } = 0;
/// <summary> /// <summary>
/// volume /// volume
/// </summary> /// </summary>
[Display(Name = "volume")] [Display(Name = "volume")]
public decimal volume { get; set; } = 0; public decimal volume { get; set; } = 0;
/// <summary> /// <summary>
/// creator /// creator
/// </summary> /// </summary>
[Display(Name = "creator")] [Display(Name = "creator")]
[MaxLength(64, ErrorMessage = "MaxLength")] [MaxLength(64,ErrorMessage = "MaxLength")]
public string creator { get; set; } = string.Empty; public string creator { get; set; } = string.Empty;
/// <summary> /// <summary>
/// create_time /// create_time
/// </summary> /// </summary>
[Display(Name = "create_time")] [Display(Name = "create_time")]
[DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")] [DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")]
public DateTime create_time { get; set; } = UtilConvert.MinDate; public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary> /// <summary>
/// damage_qty /// damage_qty
/// </summary> /// </summary>
[Display(Name = "damage_qty")] [Display(Name = "damage_qty")]
public int damage_qty { get; set; } = 0; public int damage_qty { get; set; } = 0;
/// <summary> /// <summary>
/// lock_qty /// lock_qty
/// </summary> /// </summary>
[Display(Name = "lock_qty")] [Display(Name = "lock_qty")]
public int lock_qty { get; set; } = 0; public int lock_qty { get; set; } = 0;
/// <summary> /// <summary>
/// picked_qty /// picked_qty
/// </summary> /// </summary>
[Display(Name = "picked_qty")] [Display(Name = "picked_qty")]
public int picked_qty { get; set; } = 0; public int picked_qty { get; set; } = 0;
/// <summary> /// <summary>
/// unpicked_qty /// unpicked_qty
@ -123,13 +123,13 @@ namespace ModernWMS.WMS.Entities.ViewModels
/// intrasit_qty /// intrasit_qty
/// </summary> /// </summary>
[Display(Name = "intrasit_qty")] [Display(Name = "intrasit_qty")]
public int intrasit_qty { get; set; } = 0; public int intrasit_qty { get; set; } = 0;
/// <summary> /// <summary>
/// package_qty /// package_qty
/// </summary> /// </summary>
[Display(Name = "package_qty")] [Display(Name = "package_qty")]
public int package_qty { get; set; } = 0; public int package_qty { get; set; } = 0;
/// <summary> /// <summary>
/// unpackage_qty /// unpackage_qty
@ -141,7 +141,7 @@ namespace ModernWMS.WMS.Entities.ViewModels
/// weighing_qty /// weighing_qty
/// </summary> /// </summary>
[Display(Name = "weighing_qty")] [Display(Name = "weighing_qty")]
public int weighing_qty { get; set; } = 0; public int weighing_qty { get; set; } = 0;
/// <summary> /// <summary>
/// weighing_qty /// weighing_qty
@ -153,87 +153,87 @@ namespace ModernWMS.WMS.Entities.ViewModels
/// actual_qty /// actual_qty
/// </summary> /// </summary>
[Display(Name = "actual_qty")] [Display(Name = "actual_qty")]
public int actual_qty { get; set; } = 0; public int actual_qty { get; set; } = 0;
/// <summary> /// <summary>
/// sign_qty /// sign_qty
/// </summary> /// </summary>
[Display(Name = "sign_qty")] [Display(Name = "sign_qty")]
public int sign_qty { get; set; } = 0; public int sign_qty { get; set; } = 0;
/// <summary> /// <summary>
/// package_no /// package_no
/// </summary> /// </summary>
[Display(Name = "package_no")] [Display(Name = "package_no")]
[MaxLength(32, ErrorMessage = "MaxLength")] [MaxLength(32,ErrorMessage = "MaxLength")]
public string package_no { get; set; } = string.Empty; public string package_no { get; set; } = string.Empty;
/// <summary> /// <summary>
/// package_person /// package_person
/// </summary> /// </summary>
[Display(Name = "package_person")] [Display(Name = "package_person")]
[MaxLength(64, ErrorMessage = "MaxLength")] [MaxLength(64,ErrorMessage = "MaxLength")]
public string package_person { get; set; } = string.Empty; public string package_person { get; set; } = string.Empty;
/// <summary> /// <summary>
/// package_time /// package_time
/// </summary> /// </summary>
[Display(Name = "package_time")] [Display(Name = "package_time")]
[DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")] [DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")]
public DateTime package_time { get; set; } = UtilConvert.MinDate; public DateTime package_time { get; set; } = UtilConvert.MinDate;
/// <summary> /// <summary>
/// weighing_no /// weighing_no
/// </summary> /// </summary>
[Display(Name = "weighing_no")] [Display(Name = "weighing_no")]
[MaxLength(32, ErrorMessage = "MaxLength")] [MaxLength(32,ErrorMessage = "MaxLength")]
public string weighing_no { get; set; } = string.Empty; public string weighing_no { get; set; } = string.Empty;
/// <summary> /// <summary>
/// weighing_person /// weighing_person
/// </summary> /// </summary>
[Display(Name = "weighing_person")] [Display(Name = "weighing_person")]
[MaxLength(64, ErrorMessage = "MaxLength")] [MaxLength(64,ErrorMessage = "MaxLength")]
public string weighing_person { get; set; } = string.Empty; public string weighing_person { get; set; } = string.Empty;
/// <summary> /// <summary>
/// weighing_weight /// weighing_weight
/// </summary> /// </summary>
[Display(Name = "weighing_weight")] [Display(Name = "weighing_weight")]
public decimal weighing_weight { get; set; } = 0; public decimal weighing_weight { get; set; } = 0;
/// <summary> /// <summary>
/// waybill_no /// waybill_no
/// </summary> /// </summary>
[Display(Name = "waybill_no")] [Display(Name = "waybill_no")]
[MaxLength(64, ErrorMessage = "MaxLength")] [MaxLength(64,ErrorMessage = "MaxLength")]
public string waybill_no { get; set; } = string.Empty; public string waybill_no { get; set; } = string.Empty;
/// <summary> /// <summary>
/// carrier /// carrier
/// </summary> /// </summary>
[Display(Name = "carrier")] [Display(Name = "carrier")]
[MaxLength(256, ErrorMessage = "MaxLength")] [MaxLength(256,ErrorMessage = "MaxLength")]
public string carrier { get; set; } = string.Empty; public string carrier { get; set; } = string.Empty;
/// <summary> /// <summary>
/// freightfee /// freightfee
/// </summary> /// </summary>
[Display(Name = "freightfee")] [Display(Name = "freightfee")]
public decimal freightfee { get; set; } = 0; public decimal freightfee { get; set; } = 0;
/// <summary> /// <summary>
/// last_update_time /// last_update_time
/// </summary> /// </summary>
[Display(Name = "last_update_time")] [Display(Name = "last_update_time")]
[DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")] [DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")]
public DateTime last_update_time { get; set; } = UtilConvert.MinDate; public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary> /// <summary>
/// tenant_id /// tenant_id
/// </summary> /// </summary>
[Display(Name = "tenant_id")] [Display(Name = "tenant_id")]
public long tenant_id { get; set; } = 0; public long tenant_id { get; set; } = 0;
/// <summary> /// <summary>

View file

@ -0,0 +1,44 @@
/*
* date2023-9-3
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.WMS.Entities.ViewModels
{
/// <summary>
/// get stock infomation by phone api input viewmodel
/// </summary>
public class LocationStockForPhoneSearchViewModel
{
/// <summary>
/// sku_id
/// </summary>
public int sku_id { get; set; } = 0;
/// <summary>
/// goods_location_id
/// </summary>
public int goods_location_id { get; set; } = 0;
/// <summary>
/// warehouse_id
/// </summary>
public int warehouse_id { get; set; } = 0;
/// <summary>
/// spu name
/// </summary>
public string spu_name { get; set; } = string.Empty;
/// <summary>
/// location name
/// </summary>
public string location_name { get; set; } = string.Empty;
}
}

View file

@ -67,5 +67,15 @@ namespace ModernWMS.WMS.Entities.ViewModels
/// quantity frozen /// quantity frozen
/// </summary> /// </summary>
public int qty_frozen { get; set; } = 0; public int qty_frozen { get; set; } = 0;
/// <summary>
/// goods owner name
/// </summary>
public string goods_owner_name { get; set; } = string.Empty;
/// <summary>
/// goods_location_id
/// </summary>
public int goods_location_id { get; set; } = 0;
} }
} }

View file

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.WMS.Entities.ViewModels
{
/// <summary>
/// StockprocessImportViewModel
/// </summary>
public class StockprocessImportViewModel
{
/// <summary>
/// import_group
/// </summary>
public int import_group { get; set; } = 0;
/// <summary>
/// spu_code
/// </summary>
public string spu_code { get; set; } = string.Empty;
/// <summary>
/// sku_name
/// </summary>
public string sku_name { get; set; } = string.Empty;
/// <summary>
/// sku_code
/// </summary>
public string sku_code { get; set; } = string.Empty;
/// <summary>
/// location_name
/// </summary>
public string location_name { get; set; } = string.Empty;
/// <summary>
/// goods_owner_name
/// </summary>
public string goods_owner_name { get; set; } = string.Empty;
/// <summary>
/// qty
/// </summary>
public int qty { get; set; } = 0;
/// <summary>
/// is origin
/// </summary>
public bool is_ori { get; set; } = false;
}
}

View file

@ -115,6 +115,13 @@ namespace ModernWMS.WMS.IServices
/// <returns></returns> /// <returns></returns>
Task<(bool flag, string msg)> SortedCancelAsync(int id); Task<(bool flag, string msg)> SortedCancelAsync(int id);
/// <summary>
/// get pending putaway data by asn_id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<List<AsnPendingPutawayViewModel>> GetPendingPutawayDataAsync(int id);
/// <summary> /// <summary>
/// PutAway /// PutAway
/// </summary> /// </summary>
@ -123,6 +130,16 @@ namespace ModernWMS.WMS.IServices
/// <returns></returns> /// <returns></returns>
Task<(bool flag, string msg)> PutAwayAsync(AsnPutAwayInputViewModel viewModel, CurrentUser currentUser); Task<(bool flag, string msg)> PutAwayAsync(AsnPutAwayInputViewModel viewModel, CurrentUser currentUser);
#endregion #endregion
#region excel import
/// <summary>
/// excel import
/// </summary>
/// <param name="excelData">excel data</param>
/// <param name="currentUser">current user</param>
/// <returns></returns>
Task<(bool flag, string msg, List<AsnExcelImportViewModel> errList)> ImportAsync(List<AsnExcelImportViewModel> excelData, CurrentUser currentUser);
#endregion
} }
} }

View file

@ -149,7 +149,16 @@ namespace ModernWMS.WMS.IServices
/// <param name="id">dispatchlist_id</param> /// <param name="id">dispatchlist_id</param>
/// <returns></returns> /// <returns></returns>
Task<(bool flag, string msg)> CancelDispatchlistDetailOpration(int id); Task<(bool flag, string msg)> CancelDispatchlistDetailOpration(int id);
#endregion
}
/// <summary>
/// Excel Import
/// </summary>
/// <param name="viewModels">viewModels</param>
/// <param name="currentUser">currentUser</param>
/// <returns></returns>
Task<(bool flag, string msg)> Import(List<DispatchlistImportViewModel> viewModels, CurrentUser currentUser);
#endregion
}
} }

View file

@ -2,26 +2,30 @@
* date2022-12-22 * date2022-12-22
* developerNoNo * developerNoNo
*/ */
using ModernWMS.Core.Services;
using ModernWMS.Core.Models; using ModernWMS.Core.Services;
using ModernWMS.Core.JWT; using ModernWMS.Core.Models;
using ModernWMS.WMS.Entities.Models; using ModernWMS.Core.JWT;
using ModernWMS.WMS.Entities.ViewModels; using ModernWMS.WMS.Entities.Models;
using ModernWMS.WMS.Entities.ViewModels;
namespace ModernWMS.WMS.IServices namespace ModernWMS.WMS.IServices
{ {
/// <summary> /// <summary>
/// Interface of StockService /// Interface of StockService
/// </summary> /// </summary>
public interface IStockService : IBaseService<StockEntity> public interface IStockService : IBaseService<StockEntity>
{ {
#region Api #region Api
/// <summary>
/// page search /// <summary>
/// </summary> /// page search
/// <param name="pageSearch">args</param> /// </summary>
/// <param name="currentUser">current user</param> /// <param name="pageSearch">args</param>
/// <returns></returns> /// <param name="currentUser">current user</param>
Task<(List<StockManagementViewModel> data, int totals)> StockPageAsync(PageSearch pageSearch, CurrentUser currentUser); /// <returns></returns>
Task<(List<StockManagementViewModel> data, int totals)> StockPageAsync(PageSearch pageSearch, CurrentUser currentUser);
/// <summary> /// <summary>
/// location stock page search /// location stock page search
/// </summary> /// </summary>
@ -45,7 +49,15 @@ namespace ModernWMS.WMS.IServices
/// <param name="currentUser">currentUser</param> /// <param name="currentUser">currentUser</param>
/// <returns></returns> /// <returns></returns>
Task<(List<SkuSelectViewModel> data, int totals)> SkuSelectPageAsync(PageSearch pageSearch, CurrentUser currentUser); Task<(List<SkuSelectViewModel> data, int totals)> SkuSelectPageAsync(PageSearch pageSearch, CurrentUser currentUser);
#endregion
} /// <summary>
} /// get stock infomation by phone
/// </summary>
/// <param name="input">input</param>
/// <param name="currentUser">current user</param>
/// <returns></returns>
Task<List<LocationStockManagementViewModel>> LocationStockForPhoneAsync(LocationStockForPhoneSearchViewModel input, CurrentUser currentUser);
#endregion Api
}
}

View file

@ -70,6 +70,12 @@
/// <param name="currentUser">current user</param> /// <param name="currentUser">current user</param>
/// <returns></returns> /// <returns></returns>
Task<(bool flag, string msg)> ConfirmAdjustment(int id, CurrentUser currentUser); Task<(bool flag, string msg)> ConfirmAdjustment(int id, CurrentUser currentUser);
/// <summary>
/// Excel Import
/// </summary>
/// <returns></returns>
Task<(bool flag, string msg)> Import(List<StockprocessImportViewModel> viewModels, CurrentUser currentUser);
#endregion #endregion
} }
} }

View file

@ -13,6 +13,7 @@ using ModernWMS.Core.Services;
using ModernWMS.WMS.Entities.Models; using ModernWMS.WMS.Entities.Models;
using ModernWMS.WMS.Entities.ViewModels; using ModernWMS.WMS.Entities.ViewModels;
using ModernWMS.WMS.IServices; using ModernWMS.WMS.IServices;
using System.Text;
namespace ModernWMS.WMS.Services namespace ModernWMS.WMS.Services
{ {
@ -66,20 +67,29 @@ namespace ModernWMS.WMS.Services
queries.Add(s); queries.Add(s);
}); });
} }
var Asns = _dBContext.GetDbSet<AsnEntity>().AsNoTracking();
Byte asn_status = 255; Byte asn_status = 255;
if (pageSearch.sqlTitle.ToLower().Contains("asn_status")) bool isShowAllData = false;
if (pageSearch.sqlTitle.ToLower().Contains("asn_status:-1"))
{
isShowAllData = true;
}
else if (pageSearch.sqlTitle.ToLower().Contains("asn_status:alltodo"))
{
Asns = Asns.Where(t => t.asn_status <= 3);
}
else if (pageSearch.sqlTitle.ToLower().Contains("asn_status"))
{ {
asn_status = Convert.ToByte(pageSearch.sqlTitle.Trim().ToLower().Replace("asn_status","").Replace("", "").Replace(":", "").Replace("=", "")); asn_status = Convert.ToByte(pageSearch.sqlTitle.Trim().ToLower().Replace("asn_status","").Replace("", "").Replace(":", "").Replace("=", ""));
asn_status = asn_status.Equals(4) ? (Byte)255 : asn_status; //asn_status = asn_status.Equals(4) ? (Byte)255 : asn_status;
Asns = Asns.Where(t => t.asn_status == asn_status);
} }
var Spus = _dBContext.GetDbSet<SpuEntity>(); var Spus = _dBContext.GetDbSet<SpuEntity>().AsNoTracking();
var Skus = _dBContext.GetDbSet<SkuEntity>(); var Skus = _dBContext.GetDbSet<SkuEntity>().AsNoTracking();
var Asns = _dBContext.GetDbSet<AsnEntity>(); var query = from m in Asns
var query = from m in Asns.AsNoTracking() join p in Spus on m.spu_id equals p.id
join p in Spus.AsNoTracking() on m.spu_id equals p.id join k in Skus on m.sku_id equals k.id
join k in Skus.AsNoTracking() on m.sku_id equals k.id
where m.tenant_id == currentUser.tenant_id where m.tenant_id == currentUser.tenant_id
&& (asn_status == 255 || m.asn_status == asn_status)
select new AsnViewModel select new AsnViewModel
{ {
id = m.id, id = m.id,
@ -154,8 +164,8 @@ namespace ModernWMS.WMS.Services
shortage_qty = m.shortage_qty, shortage_qty = m.shortage_qty,
more_qty = m.more_qty, more_qty = m.more_qty,
damage_qty = m.damage_qty, damage_qty = m.damage_qty,
weight = m.weight, weight = k.weight * m.asn_qty,
volume = m.volume, volume = k.volume * m.asn_qty,
supplier_id = m.supplier_id, supplier_id = m.supplier_id,
supplier_name = m.supplier_name, supplier_name = m.supplier_name,
goods_owner_id = m.goods_owner_id, goods_owner_id = m.goods_owner_id,
@ -350,11 +360,11 @@ namespace ModernWMS.WMS.Services
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id); var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
} }
else if (entity.asn_status > 0) else if (entity.asn_status > 0)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Delivery"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Delivery"]}");
} }
entity.asn_status = 1; entity.asn_status = 1;
var qty = await _dBContext.SaveChangesAsync(); var qty = await _dBContext.SaveChangesAsync();
@ -378,11 +388,11 @@ namespace ModernWMS.WMS.Services
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id); var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
} }
else if (entity.asn_status != (byte)1) else if (entity.asn_status != (byte)1)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Delivery"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Delivery"]}");
} }
entity.asn_status = 0; entity.asn_status = 0;
var qty = await _dBContext.SaveChangesAsync(); var qty = await _dBContext.SaveChangesAsync();
@ -408,11 +418,11 @@ namespace ModernWMS.WMS.Services
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id); var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
} }
else if (entity.asn_status > 1) else if (entity.asn_status > 1)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Load"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Load"]}");
} }
entity.asn_status = 2; entity.asn_status = 2;
entity.last_update_time = DateTime.Now; entity.last_update_time = DateTime.Now;
@ -439,11 +449,11 @@ namespace ModernWMS.WMS.Services
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id); var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
} }
else if (entity.asn_status != (byte)2) else if (entity.asn_status != (byte)2)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Load"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Load"]}");
} }
entity.asn_status = 1; entity.asn_status = 1;
entity.last_update_time = DateTime.Now; entity.last_update_time = DateTime.Now;
@ -471,11 +481,11 @@ namespace ModernWMS.WMS.Services
var entity = await Asns.FirstOrDefaultAsync(t => t.id == viewModel.asn_id); var entity = await Asns.FirstOrDefaultAsync(t => t.id == viewModel.asn_id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
} }
else if (entity.asn_status != 2) else if (entity.asn_status != 2)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Sort"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Pre_Sort"]}");
} }
await Asnsorts.AddAsync(new AsnsortEntity await Asnsorts.AddAsync(new AsnsortEntity
{ {
@ -511,11 +521,11 @@ namespace ModernWMS.WMS.Services
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id); var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
} }
else if (entity.sorted_qty < 1) else if (entity.sorted_qty < 1)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Sorting"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Sorting"]}");
} }
entity.asn_status = 3; entity.asn_status = 3;
if (entity.sorted_qty > entity.asn_qty) if (entity.sorted_qty > entity.asn_qty)
@ -550,15 +560,15 @@ namespace ModernWMS.WMS.Services
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id); var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
} }
else if (entity.actual_qty > 0) else if (entity.actual_qty > 0)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Putaway"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Putaway"]}");
} }
else if (entity.sorted_qty < 1) else if (entity.sorted_qty < 1)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Sorting"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Sorting"]}");
} }
entity.asn_status = 2; entity.asn_status = 2;
entity.sorted_qty = 0; entity.sorted_qty = 0;
@ -577,6 +587,32 @@ namespace ModernWMS.WMS.Services
return (false, _stringLocalizer["save_failed"]); return (false, _stringLocalizer["save_failed"]);
} }
} }
/// <summary>
/// get pending putaway data by asn_id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<List<AsnPendingPutawayViewModel>> GetPendingPutawayDataAsync(int id)
{
var Asns = _dBContext.GetDbSet<AsnEntity>();
var Asnsorts = _dBContext.GetDbSet<AsnsortEntity>();
var data = await (from m in Asns.AsNoTracking()
join s in Asnsorts.AsNoTracking() on m.id equals s.asn_id
where m.id == id
group new { m, s } by new { m.id, m.goods_owner_id, m.goods_owner_name, m.actual_qty }
into g
select new AsnPendingPutawayViewModel
{
asn_id = g.Key.id,
goods_owner_id = g.Key.goods_owner_id,
goods_owner_name = g.Key.goods_owner_name,
series_number = "",
sorted_qty = g.Sum(o => o.s.sorted_qty) - g.Key.actual_qty
}).ToListAsync();
return data;
}
/// <summary> /// <summary>
/// PutAway /// PutAway
/// </summary> /// </summary>
@ -591,21 +627,21 @@ namespace ModernWMS.WMS.Services
var Location = await Goodslocations.FirstOrDefaultAsync(t => t.id.Equals(viewModel.goods_location_id)); var Location = await Goodslocations.FirstOrDefaultAsync(t => t.id.Equals(viewModel.goods_location_id));
if (Location == null) if (Location == null)
{ {
return (false, string.Format(_stringLocalizer["Required"], _stringLocalizer["location_name"])); return (false, "[202]" + string.Format(_stringLocalizer["Required"], _stringLocalizer["location_name"]));
} }
var entity = await Asns.FirstOrDefaultAsync(t => t.id == viewModel.asn_id); var entity = await Asns.FirstOrDefaultAsync(t => t.id == viewModel.asn_id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
} }
else if (entity.asn_status != 3) else if (entity.asn_status != 3)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Sorted"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Status_Is_Not_Sorted"]}");
} }
else if (entity.actual_qty + viewModel.putaway_qty > entity.sorted_qty) else if (entity.actual_qty + viewModel.putaway_qty > entity.sorted_qty)
{ {
return (false, $"{entity.asn_no}{_stringLocalizer["ASN_Total_PutAway_Qty_Greater_Than_Sorted_Qty"]}"); return (false, "[202]" + $"{entity.asn_no}{_stringLocalizer["ASN_Total_PutAway_Qty_Greater_Than_Sorted_Qty"]}");
} }
entity.actual_qty += viewModel.putaway_qty; entity.actual_qty += viewModel.putaway_qty;
if (Location.warehouse_area_property.Equals(5)) if (Location.warehouse_area_property.Equals(5))
@ -651,6 +687,97 @@ namespace ModernWMS.WMS.Services
} }
} }
#endregion #endregion
#region excel import
/// <summary>
/// excel import
/// </summary>
/// <param name="excelData">excel data</param>
/// <param name="currentUser">current user</param>
/// <returns></returns>
public async Task<(bool flag, string msg, List<AsnExcelImportViewModel> errList)> ImportAsync(List<AsnExcelImportViewModel> excelData, CurrentUser currentUser)
{
var Spus = _dBContext.GetDbSet<SpuEntity>().AsNoTracking();
var Skus = _dBContext.GetDbSet<SkuEntity>().AsNoTracking();
var ownerList = excelData.Where(e => e.goods_owner_name != "").Select(e => e.goods_owner_name).ToList();
if (ownerList == null)
{
ownerList = new List<string>();
}
var goods_owner = await _dBContext.GetDbSet<GoodsownerEntity>().AsNoTracking()
.Where(t => t.tenant_id == currentUser.tenant_id)
.Where(t => ownerList.Contains(t.goods_owner_name))
.Select(t => new { t.id, t.goods_owner_name}).ToListAsync();
var dbSku = await (from m in Spus
join d in Skus on m.id equals d.spu_id
where m.tenant_id == currentUser.tenant_id
select new
{
spu_id = m.id,
m.spu_code,
m.spu_name,
m.supplier_id,
m.supplier_name,
sku_id = d.id,
d.sku_code,
d.sku_name
}).ToListAsync();
StringBuilder sb = new StringBuilder();
excelData.ForEach(ex =>
{
var sku = dbSku.FirstOrDefault(t => t.spu_code == ex.spu_code && t.sku_code == ex.sku_code && t.supplier_name == ex.supplier_name);
if (sku != null)
{
ex.spu_id = sku.spu_id;
ex.sku_id = sku.sku_id;
ex.supplier_id = sku.supplier_id;
var owner = goods_owner.FirstOrDefault(t => t.goods_owner_name == ex.goods_owner_name);
if (owner != null)
{
ex.goods_owner_id = owner.id;
}
}
else
{
string err = $"[{_stringLocalizer["spu_code"]}:{ex.spu_name},{_stringLocalizer["sku_code"]}:{ex.sku_code},{_stringLocalizer["supplier_name"]}:{ex.supplier_name}{_stringLocalizer["not_exists_entity"]}]";
ex.error_msg = err;
sb.AppendLine(err);
}
});
if (excelData.Any(t => t.error_msg.Length > 0))
{
return (false, sb.ToString(), excelData.Where(t => t.error_msg.Length > 0).ToList());
}
else
{
var DbSet = _dBContext.GetDbSet<AsnEntity>();
var entities = excelData.Adapt<List<AsnEntity>>();
foreach (var entity in entities)
{
entity.id = 0;
entity.creator = currentUser.user_name;
entity.create_time = DateTime.Now;
entity.last_update_time = DateTime.Now;
entity.tenant_id = currentUser.tenant_id;
entity.is_valid = true;
}
await DbSet.AddRangeAsync(entities);
int qty = await _dBContext.SaveChangesAsync();
if (qty > 0)
{
return (true, _stringLocalizer["save_success"], new List<AsnExcelImportViewModel>());
}
else
{
return (false, _stringLocalizer["save_failed"], new List<AsnExcelImportViewModel>());
}
}
}
#endregion
} }
} }

View file

@ -2,6 +2,7 @@
* date2022-12-27 * date2022-12-27
* developerNoNo * developerNoNo
*/ */
using Mapster; using Mapster;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -16,6 +17,7 @@ using ModernWMS.WMS.Entities.Models;
using ModernWMS.WMS.Entities.ViewModels; using ModernWMS.WMS.Entities.ViewModels;
using ModernWMS.WMS.IServices; using ModernWMS.WMS.IServices;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace ModernWMS.WMS.Services namespace ModernWMS.WMS.Services
{ {
@ -25,6 +27,7 @@ namespace ModernWMS.WMS.Services
public class DispatchlistService : BaseService<DispatchlistEntity>, IDispatchlistService public class DispatchlistService : BaseService<DispatchlistEntity>, IDispatchlistService
{ {
#region Args #region Args
/// <summary> /// <summary>
/// The DBContext /// The DBContext
/// </summary> /// </summary>
@ -34,9 +37,11 @@ namespace ModernWMS.WMS.Services
/// Localizer Service /// Localizer Service
/// </summary> /// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer; private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#endregion Args
#region constructor #region constructor
/// <summary> /// <summary>
///Dispatchlist constructor ///Dispatchlist constructor
/// </summary> /// </summary>
@ -50,9 +55,11 @@ namespace ModernWMS.WMS.Services
this._dBContext = dBContext; this._dBContext = dBContext;
this._stringLocalizer = stringLocalizer; this._stringLocalizer = stringLocalizer;
} }
#endregion
#endregion constructor
#region Api #region Api
/// <summary> /// <summary>
/// page search /// page search
/// </summary> /// </summary>
@ -136,6 +143,7 @@ namespace ModernWMS.WMS.Services
{ {
query = query.Where(t => t.picked_qty == t.qty && (t.dispatch_status.Equals(3) || t.dispatch_status.Equals(4) || t.dispatch_status.Equals(5))); query = query.Where(t => t.picked_qty == t.qty && (t.dispatch_status.Equals(3) || t.dispatch_status.Equals(4) || t.dispatch_status.Equals(5)));
} }
int totals = await query.CountAsync(); int totals = await query.CountAsync();
var list = await query.OrderByDescending(t => t.create_time) var list = await query.OrderByDescending(t => t.create_time)
.Skip((pageSearch.pageIndex - 1) * pageSearch.pageSize) .Skip((pageSearch.pageIndex - 1) * pageSearch.pageSize)
@ -143,6 +151,7 @@ namespace ModernWMS.WMS.Services
.ToListAsync(); .ToListAsync();
return (list, totals); return (list, totals);
} }
/// <summary> /// <summary>
/// get dispatchlist by dispatch_no /// get dispatchlist by dispatch_no
/// </summary> /// </summary>
@ -201,6 +210,7 @@ namespace ModernWMS.WMS.Services
}).ToListAsync(); }).ToListAsync();
return datas; return datas;
} }
/// <summary> /// <summary>
/// update dispatchlist with same dispatch_no /// update dispatchlist with same dispatch_no
/// </summary> /// </summary>
@ -218,7 +228,7 @@ namespace ModernWMS.WMS.Services
var skus = await (_dBContext.GetDbSet<SkuEntity>().AsNoTracking().Where(t => sku_id_list.Contains(t.id))).ToListAsync(); var skus = await (_dBContext.GetDbSet<SkuEntity>().AsNoTracking().Where(t => sku_id_list.Contains(t.id))).ToListAsync();
if (entities.Any(t => t.dispatch_status != 1 && t.dispatch_status != 0)) if (entities.Any(t => t.dispatch_status != 1 && t.dispatch_status != 0))
{ {
return (false, _stringLocalizer["data_changed"]); return (false,"[202]"+ _stringLocalizer["data_changed"]);
} }
foreach (var vm in viewModels) foreach (var vm in viewModels)
{ {
@ -227,7 +237,7 @@ namespace ModernWMS.WMS.Services
var entity = entities.FirstOrDefault(t => t.id == -vm.id); var entity = entities.FirstOrDefault(t => t.id == -vm.id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
DBSet.Remove(entity); DBSet.Remove(entity);
delete_id_list.Add(entity.id); delete_id_list.Add(entity.id);
@ -237,7 +247,7 @@ namespace ModernWMS.WMS.Services
var entity = entities.FirstOrDefault(t => t.id == vm.id); var entity = entities.FirstOrDefault(t => t.id == vm.id);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
entity.sku_id = vm.sku_id; entity.sku_id = vm.sku_id;
entity.qty = vm.qty; entity.qty = vm.qty;
@ -261,7 +271,6 @@ namespace ModernWMS.WMS.Services
dispatch_status = dispatch_status, dispatch_status = dispatch_status,
sku_id = vm.sku_id, sku_id = vm.sku_id,
qty = vm.qty qty = vm.qty
}; };
var sku = skus.FirstOrDefault(t => t.id == entity.sku_id); var sku = skus.FirstOrDefault(t => t.id == entity.sku_id);
if (sku != null) if (sku != null)
@ -291,9 +300,10 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["save_failed"]); return (false, "[202]" + _stringLocalizer["save_failed"]);
} }
} }
/// <summary> /// <summary>
/// get pick list by dispatch_id /// get pick list by dispatch_id
/// </summary> /// </summary>
@ -332,7 +342,7 @@ namespace ModernWMS.WMS.Services
} }
/// <summary> /// <summary>
/// advanced dispatch order page search /// advanced dispatch order page search
/// </summary> /// </summary>
/// <param name="pageSearch">args</param> /// <param name="pageSearch">args</param>
/// <param name="currentUser">currentUser</param> /// <param name="currentUser">currentUser</param>
@ -376,12 +386,18 @@ namespace ModernWMS.WMS.Services
var dispatch_status = Convert.ToByte(pageSearch.sqlTitle.Trim().ToLower().Replace("dispatch_status", "").Replace("", "").Replace(":", "").Replace("=", "")); var dispatch_status = Convert.ToByte(pageSearch.sqlTitle.Trim().ToLower().Replace("dispatch_status", "").Replace("", "").Replace(":", "").Replace("=", ""));
query = query.Where(t => t.dispatch_status.Equals(dispatch_status)); query = query.Where(t => t.dispatch_status.Equals(dispatch_status));
} }
else if (pageSearch.sqlTitle.Equals("todo"))
{
query = query.Where(t => t.dispatch_status >= 2 && t.dispatch_status <= 5);
}
int totals = await query.CountAsync(); int totals = await query.CountAsync();
var list = await query.OrderByDescending(t => t.dispatch_no) var list = await query.OrderByDescending(t => t.dispatch_no)
.Skip((pageSearch.pageIndex - 1) * pageSearch.pageSize) .Skip((pageSearch.pageIndex - 1) * pageSearch.pageSize)
.Take(pageSearch.pageSize) .Take(pageSearch.pageSize)
.ToListAsync(); .ToListAsync();
#region sqlit cannot sum data of decimal type
#region sqlit cannot sum data of decimal type
var dispatch_no_list = list.Select(t => t.dispatch_no).Distinct().ToList(); var dispatch_no_list = list.Select(t => t.dispatch_no).Distinct().ToList();
var d_datas = await (from d in DbSet.AsNoTracking() var d_datas = await (from d in DbSet.AsNoTracking()
join sku in _dBContext.GetDbSet<SkuEntity>().AsNoTracking() on d.sku_id equals sku.id join sku in _dBContext.GetDbSet<SkuEntity>().AsNoTracking() on d.sku_id equals sku.id
@ -398,9 +414,12 @@ namespace ModernWMS.WMS.Services
t.volume = d_datas.Where(d => d.dispatch_no == t.dispatch_no).Sum(t => t.volume); t.volume = d_datas.Where(d => d.dispatch_no == t.dispatch_no).Sum(t => t.volume);
t.weight = d_datas.Where(d => d.dispatch_no == t.dispatch_no).Sum(t => t.weight); t.weight = d_datas.Where(d => d.dispatch_no == t.dispatch_no).Sum(t => t.weight);
}); });
#endregion
#endregion sqlit cannot sum data of decimal type
return (list, totals); return (list, totals);
} }
/// <summary> /// <summary>
/// Get dispatchlist by dispatch_no /// Get dispatchlist by dispatch_no
/// </summary> /// </summary>
@ -455,7 +474,7 @@ namespace ModernWMS.WMS.Services
} }
/// <summary> /// <summary>
/// add a new Dispatchlist /// add a new Dispatchlist
/// </summary> /// </summary>
/// <param name="viewModel">viewmodel</param> /// <param name="viewModel">viewmodel</param>
/// <param name="currentUser">current user</param> /// <param name="currentUser">current user</param>
@ -490,7 +509,7 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["save_failed"]); return (false, "[202]" + _stringLocalizer["save_failed"]);
} }
} }
@ -515,7 +534,7 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["delete_failed"]); return (false, "[202]" + _stringLocalizer["delete_failed"]);
} }
} }
@ -685,7 +704,6 @@ namespace ModernWMS.WMS.Services
} }
return res; return res;
} }
/// <summary> /// <summary>
@ -718,7 +736,7 @@ namespace ModernWMS.WMS.Services
var d = dispatchlist_datas.Where(t => t.id == vm.dispatchlist_id).FirstOrDefault(); var d = dispatchlist_datas.Where(t => t.id == vm.dispatchlist_id).FirstOrDefault();
if (d == null) if (d == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
if (vm.confirm == true) if (vm.confirm == true)
{ {
@ -824,7 +842,7 @@ namespace ModernWMS.WMS.Services
select tp).Any(); select tp).Any();
if (if_not_stock) if (if_not_stock)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
await pick_DBSet.AddRangeAsync(pick_datas); await pick_DBSet.AddRangeAsync(pick_datas);
var dispatch_no = await GetOrderCode(currentUser); var dispatch_no = await GetOrderCode(currentUser);
@ -849,12 +867,12 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["operation_failed"]); return (false, "[202]" + _stringLocalizer["operation_failed"]);
} }
} }
/// <summary> /// <summary>
/// cancel order opration /// cancel order opration
/// </summary> /// </summary>
/// <param name="viewModel">viewmodel</param> /// <param name="viewModel">viewmodel</param>
/// <param name="currentUser">current user</param> /// <param name="currentUser">current user</param>
@ -866,7 +884,7 @@ namespace ModernWMS.WMS.Services
var entities = await DBSet.Where(t => t.dispatch_no == viewModel.dispatch_no && t.tenant_id == currentUser.tenant_id && t.dispatch_status == viewModel.dispatch_status).ToListAsync(); var entities = await DBSet.Where(t => t.dispatch_no == viewModel.dispatch_no && t.tenant_id == currentUser.tenant_id && t.dispatch_status == viewModel.dispatch_status).ToListAsync();
if (entities.Count == 0) if (entities.Count == 0)
{ {
return (false, _stringLocalizer["status_changed"]); return (false, "[202]" + _stringLocalizer["status_changed"]);
} }
var time = DateTime.Now; var time = DateTime.Now;
var dispatch_id_list = entities.Select(t => t.id).ToList(); var dispatch_id_list = entities.Select(t => t.id).ToList();
@ -914,7 +932,7 @@ namespace ModernWMS.WMS.Services
var proposedValues = entry.CurrentValues; var proposedValues = entry.CurrentValues;
var databaseValues = entry.GetDatabaseValues(); var databaseValues = entry.GetDatabaseValues();
if (UtilConvert.ObjToInt(databaseValues["dispatch_status"]) != viewModel.dispatch_status) if (UtilConvert.ObjToInt(databaseValues["dispatch_status"]) != viewModel.dispatch_status)
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
// Refresh original values to bypass next concurrency check // Refresh original values to bypass next concurrency check
entry.OriginalValues.SetValues(databaseValues); entry.OriginalValues.SetValues(databaseValues);
} }
@ -931,7 +949,7 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["operation_failed"]); return (false, "[202]" + _stringLocalizer["operation_failed"]);
} }
} }
@ -947,7 +965,7 @@ namespace ModernWMS.WMS.Services
var time = DateTime.Now; var time = DateTime.Now;
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
} }
if (entity.dispatch_status == 4) if (entity.dispatch_status == 4)
{ {
@ -981,7 +999,7 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["status_changed"]); return (false, "[202]" + _stringLocalizer["status_changed"]);
} }
entity.last_update_time = time; entity.last_update_time = time;
var qty = await _dBContext.SaveChangesAsync(); var qty = await _dBContext.SaveChangesAsync();
@ -991,7 +1009,7 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["operation_failed"]); return (false, "[202]" + _stringLocalizer["operation_failed"]);
} }
} }
@ -1026,7 +1044,7 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["operation_failed"]); return (false, "[202]" + _stringLocalizer["operation_failed"]);
} }
} }
@ -1049,11 +1067,11 @@ namespace ModernWMS.WMS.Services
var entity = entities.FirstOrDefault(t => t.id == vm.id && t.dispatch_status == vm.dispatch_status); var entity = entities.FirstOrDefault(t => t.id == vm.id && t.dispatch_status == vm.dispatch_status);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
if ((entity.package_qty + vm.package_qty) > entity.picked_qty) if ((entity.package_qty + vm.package_qty) > entity.picked_qty)
{ {
return (false, _stringLocalizer["unpackgeqty_lessthen"]); return (false, "[202]" + _stringLocalizer["unpackgeqty_lessthen"]);
} }
entity.last_update_time = time; entity.last_update_time = time;
entity.package_person = currentUser.user_name; entity.package_person = currentUser.user_name;
@ -1083,11 +1101,11 @@ namespace ModernWMS.WMS.Services
var t_vm = viewModels.FirstOrDefault(t => t.id == UtilConvert.ObjToInt(databaseValues["id"])); var t_vm = viewModels.FirstOrDefault(t => t.id == UtilConvert.ObjToInt(databaseValues["id"]));
if (t_vm == null) if (t_vm == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
if (UtilConvert.ObjToInt(databaseValues["package_qty"]) + t_vm.package_qty > t_vm.picked_qty) if (UtilConvert.ObjToInt(databaseValues["package_qty"]) + t_vm.package_qty > t_vm.picked_qty)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
else else
{ {
@ -1114,7 +1132,7 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["operation_failed"]); return (false,"[202]"+ _stringLocalizer["operation_failed"]);
} }
} }
@ -1137,11 +1155,11 @@ namespace ModernWMS.WMS.Services
var entity = entities.FirstOrDefault(t => t.id == vm.id && t.dispatch_status == vm.dispatch_status); var entity = entities.FirstOrDefault(t => t.id == vm.id && t.dispatch_status == vm.dispatch_status);
if (entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
if ((entity.weighing_qty + vm.weighing_qty) > entity.picked_qty) if ((entity.weighing_qty + vm.weighing_qty) > entity.picked_qty)
{ {
return (false, _stringLocalizer["unweightqty_lessthen"]); return (false, "[202]" + _stringLocalizer["unweightqty_lessthen"]);
} }
entity.last_update_time = time; entity.last_update_time = time;
entity.weighing_person = currentUser.user_name; entity.weighing_person = currentUser.user_name;
@ -1172,11 +1190,11 @@ namespace ModernWMS.WMS.Services
var t_vm = viewModels.FirstOrDefault(t => t.id == UtilConvert.ObjToInt(databaseValues["id"])); var t_vm = viewModels.FirstOrDefault(t => t.id == UtilConvert.ObjToInt(databaseValues["id"]));
if (t_vm == null) if (t_vm == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
if (UtilConvert.ObjToInt(databaseValues["weighing_qty"]) + t_vm.weighing_qty > t_vm.picked_qty) if (UtilConvert.ObjToInt(databaseValues["weighing_qty"]) + t_vm.weighing_qty > t_vm.picked_qty)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
else else
{ {
@ -1204,7 +1222,7 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["operation_failed"]); return (false, "[202]" + _stringLocalizer["operation_failed"]);
} }
} }
@ -1227,7 +1245,7 @@ namespace ModernWMS.WMS.Services
{ {
if (entity.dispatch_status != 3 && entity.dispatch_status != 4 && entity.dispatch_status != 5) if (entity.dispatch_status != 3 && entity.dispatch_status != 4 && entity.dispatch_status != 5)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
entity.last_update_time = time; entity.last_update_time = time;
entity.dispatch_status = 6; entity.dispatch_status = 6;
@ -1240,14 +1258,14 @@ namespace ModernWMS.WMS.Services
var picks_g = pick_sql.AsNoTracking().GroupBy(e => new { e.goods_location_id, e.sku_id, e.goods_owner_id }).Select(c => new { c.Key.goods_location_id, c.Key.sku_id, c.Key.goods_owner_id, picked_qty = c.Sum(t => t.picked_qty) }); var picks_g = pick_sql.AsNoTracking().GroupBy(e => new { e.goods_location_id, e.sku_id, e.goods_owner_id }).Select(c => new { c.Key.goods_location_id, c.Key.sku_id, c.Key.goods_owner_id, picked_qty = c.Sum(t => t.picked_qty) });
var picks = await picks_g.ToListAsync(); var picks = await picks_g.ToListAsync();
var stocks = await (from stock in stock_DBSet var stocks = await (from stock in stock_DBSet
where picks_g.Any(t => t.goods_location_id == stock.goods_location_id && t.sku_id == stock.sku_id && t.goods_owner_id == stock.goods_owner_id) where pick_sql.Any(t => t.goods_location_id == stock.goods_location_id && t.sku_id == stock.sku_id && t.goods_owner_id == stock.goods_owner_id)
select stock).ToListAsync(); select stock).ToListAsync();
foreach (var pick in picks) foreach (var pick in picks)
{ {
var s = stocks.FirstOrDefault(t => t.goods_location_id == pick.goods_location_id && t.sku_id == pick.sku_id && t.goods_owner_id == pick.goods_owner_id); var s = stocks.FirstOrDefault(t => t.goods_location_id == pick.goods_location_id && t.sku_id == pick.sku_id && t.goods_owner_id == pick.goods_owner_id);
if (s == null) if (s == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
s.qty -= pick.picked_qty; s.qty -= pick.picked_qty;
s.last_update_time = time; s.last_update_time = time;
@ -1258,6 +1276,7 @@ namespace ModernWMS.WMS.Services
pick.is_update_stock = true; pick.is_update_stock = true;
pick.last_update_time = DateTime.Now; pick.last_update_time = DateTime.Now;
} }
pick_DBSet.UpdateRange(pick_datas);
var saved = false; var saved = false;
int res = 0; int res = 0;
while (!saved) while (!saved)
@ -1278,7 +1297,7 @@ namespace ModernWMS.WMS.Services
var databaseValues = entry.GetDatabaseValues(); var databaseValues = entry.GetDatabaseValues();
if (UtilConvert.ObjToInt(databaseValues["dispatch_status"]) != 3 && UtilConvert.ObjToInt(databaseValues["dispatch_status"]) != 4 && UtilConvert.ObjToInt(databaseValues["dispatch_status"]) != 5) if (UtilConvert.ObjToInt(databaseValues["dispatch_status"]) != 3 && UtilConvert.ObjToInt(databaseValues["dispatch_status"]) != 4 && UtilConvert.ObjToInt(databaseValues["dispatch_status"]) != 5)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
proposedValues["last_update_time"] = DateTime.Now; proposedValues["last_update_time"] = DateTime.Now;
} }
@ -1289,7 +1308,7 @@ namespace ModernWMS.WMS.Services
var t_p = picks.FirstOrDefault(t => t.goods_location_id == UtilConvert.ObjToInt(databaseValues["goods_location_id"]) && t.sku_id == UtilConvert.ObjToInt(databaseValues["sku_id"]) && t.goods_owner_id == UtilConvert.ObjToInt(databaseValues["goods_owner_id"])); var t_p = picks.FirstOrDefault(t => t.goods_location_id == UtilConvert.ObjToInt(databaseValues["goods_location_id"]) && t.sku_id == UtilConvert.ObjToInt(databaseValues["sku_id"]) && t.goods_owner_id == UtilConvert.ObjToInt(databaseValues["goods_owner_id"]));
if (t_p == null) if (t_p == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
proposedValues["qty"] = UtilConvert.ObjToInt(databaseValues["qty"]) - t_p.picked_qty; proposedValues["qty"] = UtilConvert.ObjToInt(databaseValues["qty"]) - t_p.picked_qty;
proposedValues["last_update_time"] = DateTime.Now; proposedValues["last_update_time"] = DateTime.Now;
@ -1309,9 +1328,10 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["operation_failed"]); return (false, "[202]" + _stringLocalizer["operation_failed"]);
} }
} }
/// <summary> /// <summary>
/// set dispatchlist freightfee /// set dispatchlist freightfee
/// </summary> /// </summary>
@ -1354,9 +1374,10 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["operation_failed"]); return (false, "[202]" + _stringLocalizer["operation_failed"]);
} }
} }
/// <summary> /// <summary>
/// sign for arrival /// sign for arrival
/// </summary> /// </summary>
@ -1372,7 +1393,7 @@ namespace ModernWMS.WMS.Services
var vm = viewModels.FirstOrDefault(t => t.id == t.id && t.dispatch_status == entity.dispatch_status); var vm = viewModels.FirstOrDefault(t => t.id == t.id && t.dispatch_status == entity.dispatch_status);
if (vm == null) if (vm == null)
{ {
return (false, _stringLocalizer["data_changed"]); return (false, "[202]" + _stringLocalizer["data_changed"]);
} }
entity.sign_qty = entity.actual_qty - vm.damage_qty; entity.sign_qty = entity.actual_qty - vm.damage_qty;
entity.damage_qty = vm.damage_qty; entity.damage_qty = vm.damage_qty;
@ -1386,9 +1407,10 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
return (false, _stringLocalizer["operation_failed"]); return (false, "[202]" + _stringLocalizer["operation_failed"]);
} }
} }
/// <summary> /// <summary>
/// get next order code number /// get next order code number
/// </summary> /// </summary>
@ -1432,7 +1454,106 @@ namespace ModernWMS.WMS.Services
long timeStamp = Convert.ToInt32(DateTime.Now.Subtract(_dtStart).TotalSeconds); long timeStamp = Convert.ToInt32(DateTime.Now.Subtract(_dtStart).TotalSeconds);
return date + timeStamp.ToString(); return date + timeStamp.ToString();
} }
#endregion /// <summary>
} /// Excel Import
} /// </summary>
/// <param name="viewModels">viewModels</param>
/// <param name="currentUser">currentUser</param>
/// <returns></returns>
public async Task<(bool flag, string msg)> Import(List<DispatchlistImportViewModel> viewModels, CurrentUser currentUser)
{
var DbSet = _dBContext.GetDbSet<DispatchlistEntity>();
var import_sku_code = viewModels.Select(e => e.sku_code).ToList();
var import_customer_name = viewModels.Select(e => e.customer_name).ToList();
var sku_list = await (from sku in _dBContext.GetDbSet<SkuEntity>()
join spu in _dBContext.GetDbSet<SpuEntity>() on sku.spu_id equals spu.id
where spu.tenant_id == currentUser.tenant_id && import_sku_code.Contains(sku.sku_code)
select sku).ToListAsync();
var customer_list = await _dBContext.GetDbSet<CustomerEntity>().Where(t => t.tenant_id == currentUser.tenant_id && import_customer_name.Contains(t.customer_name)).ToListAsync();
var entities = new List<DispatchlistEntity>();
var groups = viewModels.Select(t => t.import_group).Distinct().ToList();
var groups_code = await GetOrderCodeList(currentUser, groups.Count());
var group_code_dic = new Dictionary<int, string>();
for (int i = 0; i < groups.Count(); i++)
{
group_code_dic.Add(groups[i], groups_code[i]);
}
foreach (var vm in viewModels)
{
var customer = customer_list.FirstOrDefault(t => t.customer_name == vm.customer_name);
if (customer == null)
{
return (false, _stringLocalizer["customer_name"] + ":" + vm.customer_name + " " + _stringLocalizer["not_exists_entity"]);
}
var sku = sku_list.FirstOrDefault(t => t.sku_code == vm.sku_code);
if (sku == null)
{
return (false, _stringLocalizer["sku_name"] + ":" + vm.sku_name + "-" + _stringLocalizer["sku_code"] + ":" + vm.sku_code + " " + _stringLocalizer["not_exists_entity"]);
}
entities.Add(new DispatchlistEntity
{
customer_id = customer.id,
customer_name = vm.customer_name,
sku_id = sku.id,
qty = vm.qty,
creator = currentUser.user_name,
create_time = DateTime.Now,
last_update_time = DateTime.Now,
tenant_id = currentUser.tenant_id,
dispatch_no = group_code_dic[vm.import_group],
});
}
await DbSet.AddRangeAsync(entities);
var qty = await _dBContext.SaveChangesAsync();
if (qty > 0)
{
return (true, _stringLocalizer["save_success"]);
}
else
{
return (false, _stringLocalizer["save_failed"]);
}
}
/// <summary>
/// get next order code number
/// </summary>
/// <returns></returns>
public async Task<List<string>> GetOrderCodeList(CurrentUser currentUser, int cnt)
{
List<string> code = new List<string>();
string date = DateTime.Now.ToString("yyyy" + "MM" + "dd");
string maxNo = await _dBContext.GetDbSet<DispatchlistEntity>().Where(t => t.tenant_id == currentUser.tenant_id).MaxAsync(t => t.dispatch_no);
if (maxNo == null)
{
for (int i = 1; i <= cnt; i++)
{
code.Add(date + "-" + i.ToString("0000"));
}
}
else
{
string maxDate = maxNo.Substring(0, 8);
string maxDateNo = maxNo.Substring(9, 4);
if (date == maxDate)
{
int.TryParse(maxDateNo, out int dd);
for (int i = 1; i <= cnt; i++)
{
code.Add(date + "-" + (dd + i).ToString("0000"));
}
}
else
{
for (int i = 1; i <= cnt; i++)
{
code.Add(date + "-" + i.ToString("0000"));
}
}
}
return code;
}
#endregion Api
}
}

View file

@ -212,12 +212,12 @@
/// <returns></returns> /// <returns></returns>
public async Task<(bool flag, string msg)> DeleteAsync(int id) public async Task<(bool flag, string msg)> DeleteAsync(int id)
{ {
var exist_stock = await _dBContext.GetDbSet<StockEntity>().AsNoTracking().Where(t => t.qty > 0 && t.goods_location_id == id).AnyAsync(); var exist_stock =await _dBContext.GetDbSet<StockEntity>().AsNoTracking().Where(t=>t.qty>0&&t.goods_location_id == id ).AnyAsync();
if (exist_stock) if (exist_stock)
{ {
return (false, _stringLocalizer["location_exist_stock_not_delete"]); return (false, _stringLocalizer["location_exist_stock_not_delete"]);
} }
var qty = await _dBContext.GetDbSet<GoodslocationEntity>().Where(t => t.id.Equals(id)).ExecuteDeleteAsync(); var qty = await _dBContext.GetDbSet<GoodslocationEntity>().Where(t => t.id.Equals(id)).ExecuteDeleteAsync();
if (qty > 0) if (qty > 0)
{ {
return (true, _stringLocalizer["delete_success"]); return (true, _stringLocalizer["delete_success"]);

View file

@ -2,6 +2,7 @@
* date2022-12-22 * date2022-12-22
* developerNoNo * developerNoNo
*/ */
using Mapster; using Mapster;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using ModernWMS.Core.DBContext; using ModernWMS.Core.DBContext;
@ -25,6 +26,7 @@ namespace ModernWMS.WMS.Services
public class StockService : BaseService<StockEntity>, IStockService public class StockService : BaseService<StockEntity>, IStockService
{ {
#region Args #region Args
/// <summary> /// <summary>
/// The DBContext /// The DBContext
/// </summary> /// </summary>
@ -34,9 +36,11 @@ namespace ModernWMS.WMS.Services
/// Localizer Service /// Localizer Service
/// </summary> /// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer; private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#endregion Args
#region constructor #region constructor
/// <summary> /// <summary>
///Stock constructor ///Stock constructor
/// </summary> /// </summary>
@ -50,11 +54,11 @@ namespace ModernWMS.WMS.Services
this._dBContext = dBContext; this._dBContext = dBContext;
this._stringLocalizer = stringLocalizer; this._stringLocalizer = stringLocalizer;
} }
#endregion
#endregion constructor
#region Api #region Api
/// <summary> /// <summary>
/// stock page search /// stock page search
/// </summary> /// </summary>
@ -80,15 +84,15 @@ namespace ModernWMS.WMS.Services
var processdetail_DBSet = _dBContext.GetDbSet<StockprocessdetailEntity>().AsNoTracking(); var processdetail_DBSet = _dBContext.GetDbSet<StockprocessdetailEntity>().AsNoTracking();
var move_DBSet = _dBContext.GetDbSet<StockmoveEntity>(); var move_DBSet = _dBContext.GetDbSet<StockmoveEntity>();
var stock_group_datas = from stock in DbSet.AsNoTracking() var stock_group_datas = from stock in DbSet.AsNoTracking()
join gl in _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking() on stock.goods_location_id equals gl.id join gl in _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking() on stock.goods_location_id equals gl.id
group new { stock ,gl} by stock.sku_id into sg group new { stock, gl } by stock.sku_id into sg
select new select new
{ {
sku_id = sg.Key, sku_id = sg.Key,
qty_frozen = sg.Where(t => t.stock.is_freeze == true).Sum(e => e.stock.qty), qty_frozen = sg.Where(t => t.stock.is_freeze == true).Sum(e => e.stock.qty),
qty = sg.Sum(t => t.stock.qty), qty = sg.Sum(t => t.stock.qty),
qty_normal = sg.Where(t=>t.gl.warehouse_area_property != 5).Sum(t=>t.stock.qty), qty_normal = sg.Where(t => t.gl.warehouse_area_property != 5).Sum(t => t.stock.qty),
qty_normal_frozen = sg.Where(t=>t.gl.warehouse_area_property != 5 && t.stock.is_freeze == true).Sum(t=>t.stock.qty), qty_normal_frozen = sg.Where(t => t.gl.warehouse_area_property != 5 && t.stock.is_freeze == true).Sum(t => t.stock.qty),
}; };
var asn_group_datas = from asn in asn_DBSet.AsNoTracking() var asn_group_datas = from asn in asn_DBSet.AsNoTracking()
group asn by asn.sku_id into ag group asn by asn.sku_id into ag
@ -111,7 +115,7 @@ namespace ModernWMS.WMS.Services
var process_locked_group_datas = from pd in processdetail_DBSet var process_locked_group_datas = from pd in processdetail_DBSet
join gl in _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking() on pd.goods_location_id equals gl.id join gl in _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking() on pd.goods_location_id equals gl.id
where pd.is_update_stock == false && pd.is_source == true where pd.is_update_stock == false && pd.is_source == true
group new { pd , gl } by pd.sku_id into pdg group new { pd, gl } by pd.sku_id into pdg
select new select new
{ {
sku_id = pdg.Key, sku_id = pdg.Key,
@ -121,16 +125,16 @@ namespace ModernWMS.WMS.Services
var move_locked_group_datas = from m in move_DBSet.AsNoTracking() var move_locked_group_datas = from m in move_DBSet.AsNoTracking()
join gl in _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking() on m.orig_goods_location_id equals gl.id join gl in _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking() on m.orig_goods_location_id equals gl.id
where m.move_status == 0 where m.move_status == 0
group new { m , gl } by m.sku_id into mg group new { m, gl } by m.sku_id into mg
select new select new
{ {
sku_id = mg.Key, sku_id = mg.Key,
qty_locked = mg.Sum(t => t.m.qty), qty_locked = mg.Sum(t => t.m.qty),
qty_normal_locked = mg.Where(t=>t.gl.warehouse_area_property !=5).Sum(t => t.m.qty), qty_normal_locked = mg.Where(t => t.gl.warehouse_area_property != 5).Sum(t => t.m.qty),
}; };
var query = from sku in sku_DBSet var query = from sku in sku_DBSet
join ag in asn_group_datas on sku.id equals ag.sku_id into ag_left join ag in asn_group_datas on sku.id equals ag.sku_id into ag_left
from ag in ag_left.DefaultIfEmpty() from ag in ag_left.DefaultIfEmpty()
join sg in stock_group_datas on sku.id equals sg.sku_id into sg_left join sg in stock_group_datas on sku.id equals sg.sku_id into sg_left
from sg in sg_left.DefaultIfEmpty() from sg in sg_left.DefaultIfEmpty()
@ -141,24 +145,24 @@ namespace ModernWMS.WMS.Services
join m in move_locked_group_datas on sku.id equals m.sku_id into m_left join m in move_locked_group_datas on sku.id equals m.sku_id into m_left
from m in m_left.DefaultIfEmpty() from m in m_left.DefaultIfEmpty()
join spu in spu_DBSet on sku.spu_id equals spu.id join spu in spu_DBSet on sku.spu_id equals spu.id
where spu.tenant_id == currentUser.tenant_id where spu.tenant_id == currentUser.tenant_id
select new StockManagementViewModel select new StockManagementViewModel
{ {
sku_id = sku.id, sku_id = sku.id,
spu_name = spu.spu_name, spu_name = spu.spu_name,
spu_code = spu.spu_code, spu_code = spu.spu_code,
sku_code = sku.sku_code, sku_code = sku.sku_code,
qty_asn = ag.qty_asn == null ? 0: ag.qty_asn, qty_asn = ag.qty_asn == null ? 0 : ag.qty_asn,
qty_available = (sg.qty_normal == null ? 0 : sg.qty_normal) - (sg.qty_normal_frozen == null ? 0 : sg.qty_normal_frozen) - (dp.qty_locked == null ? 0 : dp.qty_locked) - (pl.qty_normal_locked == null ? 0 : pl.qty_normal_locked) - (m.qty_normal_locked == null ? 0 : m.qty_normal_locked) , qty_available = (sg.qty_normal == null ? 0 : sg.qty_normal) - (sg.qty_normal_frozen == null ? 0 : sg.qty_normal_frozen) - (dp.qty_locked == null ? 0 : dp.qty_locked) - (pl.qty_normal_locked == null ? 0 : pl.qty_normal_locked) - (m.qty_normal_locked == null ? 0 : m.qty_normal_locked),
qty_frozen = sg.qty_frozen == null ? 0 : sg.qty_frozen, qty_frozen = sg.qty_frozen == null ? 0 : sg.qty_frozen,
qty_locked = (dp.qty_locked == null ? 0 : dp.qty_locked) + (pl.qty_locked == null ? 0 : pl.qty_locked) + (m.qty_locked == null ? 0:m.qty_locked), qty_locked = (dp.qty_locked == null ? 0 : dp.qty_locked) + (pl.qty_locked == null ? 0 : pl.qty_locked) + (m.qty_locked == null ? 0 : m.qty_locked),
qty_sorted = ag.qty_sorted==null?0:ag.qty_sorted, qty_sorted = ag.qty_sorted == null ? 0 : ag.qty_sorted,
qty_to_sort = ag.qty_to_sort == null ? 0 : ag.qty_to_sort, qty_to_sort = ag.qty_to_sort == null ? 0 : ag.qty_to_sort,
shortage_qty = ag.shortage_qty == null ? 0 : ag.shortage_qty, shortage_qty = ag.shortage_qty == null ? 0 : ag.shortage_qty,
qty_to_unload = ag.qty_to_unload == null ? 0 : ag.qty_to_unload, qty_to_unload = ag.qty_to_unload == null ? 0 : ag.qty_to_unload,
qty = sg.qty == null ? 0 : sg.qty, qty = sg.qty == null ? 0 : sg.qty,
}; };
query = query.Where(t=>t.qty_asn>0 || t.qty > 0).Where(queries.AsExpression<StockManagementViewModel>()); query = query.Where(t => t.qty_asn > 0 || t.qty > 0).Where(queries.AsExpression<StockManagementViewModel>());
int totals = await query.CountAsync(); int totals = await query.CountAsync();
var list = await query.OrderBy(t => t.sku_code) var list = await query.OrderBy(t => t.sku_code)
.Skip((pageSearch.pageIndex - 1) * pageSearch.pageSize) .Skip((pageSearch.pageIndex - 1) * pageSearch.pageSize)
@ -195,11 +199,12 @@ namespace ModernWMS.WMS.Services
var stock_group_datas = from stock in DbSet.AsNoTracking() var stock_group_datas = from stock in DbSet.AsNoTracking()
where stock.tenant_id == currentUser.tenant_id where stock.tenant_id == currentUser.tenant_id
group stock by new { stock.sku_id, stock.goods_location_id } into sg group stock by new { stock.sku_id, stock.goods_location_id, stock.goods_owner_id } into sg
select new select new
{ {
sku_id = sg.Key.sku_id, sku_id = sg.Key.sku_id,
goods_location_id = sg.Key.goods_location_id, goods_location_id = sg.Key.goods_location_id,
sg.Key.goods_owner_id,
qty_frozen = sg.Where(t => t.is_freeze == true).Sum(e => e.qty), qty_frozen = sg.Where(t => t.is_freeze == true).Sum(e => e.qty),
qty = sg.Sum(t => t.qty) qty = sg.Sum(t => t.qty)
}; };
@ -207,38 +212,41 @@ namespace ModernWMS.WMS.Services
var dispatch_group_datas = from dp in dispatch_DBSet.AsNoTracking() var dispatch_group_datas = from dp in dispatch_DBSet.AsNoTracking()
join dpp in dispatchpick_DBSet.AsNoTracking() on dp.id equals dpp.dispatchlist_id join dpp in dispatchpick_DBSet.AsNoTracking() on dp.id equals dpp.dispatchlist_id
where dp.dispatch_status > 1 && dp.dispatch_status < 6 where dp.dispatch_status > 1 && dp.dispatch_status < 6
group dpp by new { dpp.sku_id, dpp.goods_location_id } into dg group dpp by new { dpp.sku_id, dpp.goods_location_id, dpp.goods_owner_id } into dg
select new select new
{ {
sku_id = dg.Key.sku_id, sku_id = dg.Key.sku_id,
goods_location_id = dg.Key.goods_location_id, goods_location_id = dg.Key.goods_location_id,
dg.Key.goods_owner_id,
qty_locked = dg.Sum(t => t.pick_qty) qty_locked = dg.Sum(t => t.pick_qty)
}; };
var process_locked_group_datas = from pd in processdetail_DBSet var process_locked_group_datas = from pd in processdetail_DBSet
where pd.is_update_stock == false && pd.is_source == true where pd.is_update_stock == false && pd.is_source == true
group pd by new { pd.sku_id, pd.goods_location_id } into pdg group pd by new { pd.sku_id, pd.goods_location_id, pd.goods_owner_id } into pdg
select new select new
{ {
sku_id = pdg.Key.sku_id, sku_id = pdg.Key.sku_id,
goods_location_id = pdg.Key.goods_location_id, goods_location_id = pdg.Key.goods_location_id,
pdg.Key.goods_owner_id,
qty_locked = pdg.Sum(t => t.qty) qty_locked = pdg.Sum(t => t.qty)
}; };
var move_locked_group_datas = from m in move_DBSet.AsNoTracking() var move_locked_group_datas = from m in move_DBSet.AsNoTracking()
where m.move_status == 0 where m.move_status == 0
group m by new { m.sku_id, m.orig_goods_location_id } into mg group m by new { m.sku_id, m.orig_goods_location_id, m.goods_owner_id } into mg
select new select new
{ {
sku_id = mg.Key.sku_id, sku_id = mg.Key.sku_id,
goods_location_id = mg.Key.orig_goods_location_id, goods_location_id = mg.Key.orig_goods_location_id,
mg.Key.goods_owner_id,
qty_locked = mg.Sum(t => t.qty) qty_locked = mg.Sum(t => t.qty)
}; };
var query = from sg in stock_group_datas var query = from sg in stock_group_datas
join dp in dispatch_group_datas on new { sg.sku_id, sg.goods_location_id } equals new { dp.sku_id, dp.goods_location_id } into dp_left join dp in dispatch_group_datas on new { sg.sku_id, sg.goods_location_id, sg.goods_owner_id } equals new { dp.sku_id, dp.goods_location_id, dp.goods_owner_id } into dp_left
from dp in dp_left.DefaultIfEmpty() from dp in dp_left.DefaultIfEmpty()
join pl in process_locked_group_datas on new { sg.sku_id, sg.goods_location_id } equals new { pl.sku_id, pl.goods_location_id } into pl_left join pl in process_locked_group_datas on new { sg.sku_id, sg.goods_location_id, sg.goods_owner_id } equals new { pl.sku_id, pl.goods_location_id, pl.goods_owner_id } into pl_left
from pl in pl_left.DefaultIfEmpty() from pl in pl_left.DefaultIfEmpty()
join m in move_locked_group_datas on new { sg.sku_id, sg.goods_location_id } equals new { m.sku_id, m.goods_location_id } into m_left join m in move_locked_group_datas on new { sg.sku_id, sg.goods_location_id, sg.goods_owner_id } equals new { m.sku_id, m.goods_location_id, m.goods_owner_id } into m_left
from m in m_left.DefaultIfEmpty() from m in m_left.DefaultIfEmpty()
join sku in sku_DBSet on sg.sku_id equals sku.id join sku in sku_DBSet on sg.sku_id equals sku.id
join spu in spu_DBSet on sku.spu_id equals spu.id join spu in spu_DBSet on sku.spu_id equals spu.id
@ -250,12 +258,13 @@ namespace ModernWMS.WMS.Services
spu_code = spu.spu_code, spu_code = spu.spu_code,
sku_code = sku.sku_code, sku_code = sku.sku_code,
sku_name = sku.sku_name, sku_name = sku.sku_name,
qty_available =gl.warehouse_area_property == 5?0:( sg.qty - sg.qty_frozen - (dp.qty_locked == null ? 0 : dp.qty_locked) - (pl.qty_locked == null ? 0 : pl.qty_locked) - (m.qty_locked == null ? 0 : m.qty_locked)), qty_available = gl.warehouse_area_property == 5 ? 0 : (sg.qty - sg.qty_frozen - (dp.qty_locked == null ? 0 : dp.qty_locked) - (pl.qty_locked == null ? 0 : pl.qty_locked) - (m.qty_locked == null ? 0 : m.qty_locked)),
qty_frozen = sg.qty_frozen, qty_frozen = sg.qty_frozen,
qty_locked = (dp.qty_locked == null ? 0 : dp.qty_locked) + (pl.qty_locked == null ? 0 : pl.qty_locked)+ (m.qty_locked == null ? 0 : m.qty_locked), qty_locked = (dp.qty_locked == null ? 0 : dp.qty_locked) + (pl.qty_locked == null ? 0 : pl.qty_locked) + (m.qty_locked == null ? 0 : m.qty_locked),
qty = sg.qty, qty = sg.qty,
location_name = gl.location_name, location_name = gl.location_name,
warehouse_name = gl.warehouse_name, warehouse_name = gl.warehouse_name,
goods_location_id = sg.goods_owner_id,
}; };
query = query.Where(t => t.qty > 0).Where(queries.AsExpression<LocationStockManagementViewModel>()); query = query.Where(t => t.qty > 0).Where(queries.AsExpression<LocationStockManagementViewModel>());
int totals = await query.CountAsync(); int totals = await query.CountAsync();
@ -336,8 +345,25 @@ namespace ModernWMS.WMS.Services
join owner in _dBContext.GetDbSet<GoodsownerEntity>().AsNoTracking() on sg.goods_owner_id equals owner.id into o_left join owner in _dBContext.GetDbSet<GoodsownerEntity>().AsNoTracking() on sg.goods_owner_id equals owner.id into o_left
from owner in o_left.DefaultIfEmpty() from owner in o_left.DefaultIfEmpty()
where sg.tenant_id == currentUser.tenant_id where sg.tenant_id == currentUser.tenant_id
group new {sg,dp,pl,m,sku,spu,gl} by new { sg.sku_id ,spu.spu_name , spu.spu_code, sku.sku_code,sku.sku_name,sg.goods_location_id,sg.goods_owner_id,owner.goods_owner_name group new { sg, dp, pl, m, sku, spu, gl } by new
, sg.qty , gl.location_name, sg.is_freeze, gl.warehouse_name ,sg.id,sku.unit,sg.tenant_id} into g {
sg.sku_id,
spu.spu_name,
spu.spu_code,
sku.sku_code,
sku.sku_name,
sg.goods_location_id,
sg.goods_owner_id,
owner.goods_owner_name
,
sg.qty,
gl.location_name,
sg.is_freeze,
gl.warehouse_name,
sg.id,
sku.unit,
sg.tenant_id
} into g
select new StockViewModel select new StockViewModel
{ {
sku_id = g.Key.sku_id, sku_id = g.Key.sku_id,
@ -345,9 +371,9 @@ namespace ModernWMS.WMS.Services
spu_code = g.Key.spu_code, spu_code = g.Key.spu_code,
sku_code = g.Key.sku_code, sku_code = g.Key.sku_code,
sku_name = g.Key.sku_name, sku_name = g.Key.sku_name,
qty_available = g.Key.is_freeze ? 0 : (g.Key.qty - g.Sum(t=>t.dp.qty_locked == null ? 0 : t.dp.qty_locked) - g.Sum(t => t.pl.qty_locked == null ? 0 : t.pl.qty_locked) - g.Sum(t=>(t.m.qty_locked == null ? 0 : t.m.qty_locked))), qty_available = g.Key.is_freeze ? 0 : (g.Key.qty - g.Sum(t => t.dp.qty_locked == null ? 0 : t.dp.qty_locked) - g.Sum(t => t.pl.qty_locked == null ? 0 : t.pl.qty_locked) - g.Sum(t => (t.m.qty_locked == null ? 0 : t.m.qty_locked))),
qty = g.Key.qty, qty = g.Key.qty,
goods_location_id= g.Key.goods_location_id, goods_location_id = g.Key.goods_location_id,
goods_owner_id = g.Key.goods_owner_id, goods_owner_id = g.Key.goods_owner_id,
location_name = g.Key.location_name, location_name = g.Key.location_name,
warehouse_name = g.Key.warehouse_name, warehouse_name = g.Key.warehouse_name,
@ -355,17 +381,16 @@ namespace ModernWMS.WMS.Services
id = g.Key.id, id = g.Key.id,
tenant_id = g.Key.tenant_id, tenant_id = g.Key.tenant_id,
unit = g.Key.unit, unit = g.Key.unit,
goods_owner_name = g.Key.goods_owner_name == null? "":g.Key.goods_owner_name, goods_owner_name = g.Key.goods_owner_name == null ? "" : g.Key.goods_owner_name,
}; };
if(pageSearch.sqlTitle == "") if (pageSearch.sqlTitle == "")
{ {
query = query.Where(t => t.qty_available > 0); query = query.Where(t => t.qty_available > 0);
} }
else if(pageSearch.sqlTitle == "all") else if (pageSearch.sqlTitle == "all")
{ {
} }
else if(pageSearch.sqlTitle == "frozen") else if (pageSearch.sqlTitle == "frozen")
{ {
query = query.Where(t => t.is_freeze == true); query = query.Where(t => t.is_freeze == true);
} }
@ -411,7 +436,7 @@ namespace ModernWMS.WMS.Services
supplier_name = spu.supplier_name, supplier_name = spu.supplier_name,
brand = spu.brand, brand = spu.brand,
origin = spu.origin, origin = spu.origin,
sku_id = sku.id sku_id = sku.id,
}; };
query = query.Where(queries.AsExpression<SkuSelectViewModel>()); query = query.Where(queries.AsExpression<SkuSelectViewModel>());
int totals = await query.CountAsync(); int totals = await query.CountAsync();
@ -421,7 +446,110 @@ namespace ModernWMS.WMS.Services
.ToListAsync(); .ToListAsync();
return (list, totals); return (list, totals);
} }
#endregion
}
}
/// <summary>
/// get stock infomation by phone
/// </summary>
/// <param name="input">input</param>
/// <param name="currentUser">current user</param>
/// <returns></returns>
public async Task<List<LocationStockManagementViewModel>> LocationStockForPhoneAsync(LocationStockForPhoneSearchViewModel input, CurrentUser currentUser)
{
var DbSet = _dBContext.GetDbSet<StockEntity>().Where(t => t.tenant_id.Equals(currentUser.tenant_id));
var dispatchpick_DBSet = _dBContext.GetDbSet<DispatchpicklistEntity>();
var dispatch_DBSet = _dBContext.GetDbSet<DispatchlistEntity>().Where(t => t.tenant_id.Equals(currentUser.tenant_id));
var sku_DBSet = _dBContext.GetDbSet<SkuEntity>().AsNoTracking();
var spu_DBSet = _dBContext.GetDbSet<SpuEntity>().AsNoTracking();
var location_DBSet = _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking();
var processdetail_DBSet = _dBContext.GetDbSet<StockprocessdetailEntity>().AsNoTracking();
var move_DBSet = _dBContext.GetDbSet<StockmoveEntity>();
var stock_group_datas = from stock in DbSet.AsNoTracking()
join gw in _dBContext.GetDbSet<GoodsownerEntity>().AsNoTracking() on stock.goods_owner_id equals gw.id into gw_left
from gw in gw_left.DefaultIfEmpty()
join gl in _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking() on stock.goods_location_id equals gl.id
join sku in _dBContext.GetDbSet<SkuEntity>().AsNoTracking() on stock.sku_id equals sku.id
join spu in _dBContext.GetDbSet<SpuEntity>().AsNoTracking() on sku.spu_id equals spu.id
where stock.tenant_id == currentUser.tenant_id && (input.sku_id == 0 || stock.sku_id == input.sku_id)
&& (input.goods_location_id == 0 || stock.goods_location_id == input.goods_location_id)
&& (input.warehouse_id == 0 || gl.warehouse_id == input.warehouse_id)
&& (input.spu_name == "" || spu.spu_name.Contains(input.spu_name))
&& (input.location_name == "" || gl.location_name.Contains(input.location_name))
group new { stock, gw } by new { stock.sku_id, stock.goods_location_id, stock.goods_owner_id, gw.goods_owner_name } into sg
select new
{
sku_id = sg.Key.sku_id,
goods_location_id = sg.Key.goods_location_id,
goods_owner_id = sg.Key.goods_owner_id,
goods_owner_name = sg.Key.goods_owner_name,
qty_frozen = sg.Where(t => t.stock.is_freeze == true).Sum(e => e.stock.qty),
qty = sg.Sum(t => t.stock.qty)
};
var dispatch_group_datas = from dp in dispatch_DBSet.AsNoTracking()
join dpp in dispatchpick_DBSet.AsNoTracking() on dp.id equals dpp.dispatchlist_id
where dp.dispatch_status > 1 && dp.dispatch_status < 6
group dpp by new { dpp.sku_id, dpp.goods_location_id, dpp.goods_owner_id } into dg
select new
{
sku_id = dg.Key.sku_id,
goods_location_id = dg.Key.goods_location_id,
goods_owner_id = dg.Key.goods_owner_id,
qty_locked = dg.Sum(t => t.pick_qty)
};
var process_locked_group_datas = from pd in processdetail_DBSet
where pd.is_update_stock == false && pd.is_source == true
group pd by new { pd.sku_id, pd.goods_location_id, pd.goods_owner_id } into pdg
select new
{
sku_id = pdg.Key.sku_id,
goods_location_id = pdg.Key.goods_location_id,
goods_owner_id = pdg.Key.goods_owner_id,
qty_locked = pdg.Sum(t => t.qty)
};
var move_locked_group_datas = from m in move_DBSet.AsNoTracking()
where m.move_status == 0
group m by new { m.sku_id, m.orig_goods_location_id, m.goods_owner_id } into mg
select new
{
sku_id = mg.Key.sku_id,
goods_location_id = mg.Key.orig_goods_location_id,
goods_owner_id = mg.Key.goods_owner_id,
qty_locked = mg.Sum(t => t.qty)
};
var query = from sg in stock_group_datas
join dp in dispatch_group_datas on new { sg.sku_id, sg.goods_location_id, sg.goods_owner_id } equals new { dp.sku_id, dp.goods_location_id, dp.goods_owner_id } into dp_left
from dp in dp_left.DefaultIfEmpty()
join pl in process_locked_group_datas on new { sg.sku_id, sg.goods_location_id, sg.goods_owner_id } equals new { pl.sku_id, pl.goods_location_id, pl.goods_owner_id } into pl_left
from pl in pl_left.DefaultIfEmpty()
join m in move_locked_group_datas on new { sg.sku_id, sg.goods_location_id, sg.goods_owner_id } equals new { m.sku_id, m.goods_location_id, m.goods_owner_id } into m_left
from m in m_left.DefaultIfEmpty()
join sku in sku_DBSet on sg.sku_id equals sku.id
join spu in spu_DBSet on sku.spu_id equals spu.id
join gl in location_DBSet on sg.goods_location_id equals gl.id
select new LocationStockManagementViewModel
{
sku_id = sg.sku_id,
goods_owner_name = sg.goods_owner_name,
spu_name = spu.spu_name,
spu_code = spu.spu_code,
sku_code = sku.sku_code,
sku_name = sku.sku_name,
qty_available = gl.warehouse_area_property == 5 ? 0 : (sg.qty - sg.qty_frozen - (dp.qty_locked == null ? 0 : dp.qty_locked) - (pl.qty_locked == null ? 0 : pl.qty_locked) - (m.qty_locked == null ? 0 : m.qty_locked)),
qty_frozen = sg.qty_frozen,
qty_locked = (dp.qty_locked == null ? 0 : dp.qty_locked) + (pl.qty_locked == null ? 0 : pl.qty_locked) + (m.qty_locked == null ? 0 : m.qty_locked),
qty = sg.qty,
location_name = gl.location_name,
warehouse_name = gl.warehouse_name,
goods_location_id = sg.goods_location_id
};
var list = await query.OrderBy(t => t.sku_code)
.ToListAsync();
return list;
}
#endregion Api
}
}

View file

@ -2,6 +2,7 @@
* date2022-12-27 * date2022-12-27
* developerNoNo * developerNoNo
*/ */
using Mapster; using Mapster;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using ModernWMS.Core.DBContext; using ModernWMS.Core.DBContext;
@ -26,6 +27,7 @@ namespace ModernWMS.WMS.Services
public class StockmoveService : BaseService<StockmoveEntity>, IStockmoveService public class StockmoveService : BaseService<StockmoveEntity>, IStockmoveService
{ {
#region Args #region Args
/// <summary> /// <summary>
/// The DBContext /// The DBContext
/// </summary> /// </summary>
@ -35,9 +37,11 @@ namespace ModernWMS.WMS.Services
/// Localizer Service /// Localizer Service
/// </summary> /// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer; private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#endregion Args
#region constructor #region constructor
/// <summary> /// <summary>
///Stockmove constructor ///Stockmove constructor
/// </summary> /// </summary>
@ -51,9 +55,11 @@ namespace ModernWMS.WMS.Services
this._dBContext = dBContext; this._dBContext = dBContext;
this._stringLocalizer = stringLocalizer; this._stringLocalizer = stringLocalizer;
} }
#endregion
#endregion constructor
#region Api #region Api
/// <summary> /// <summary>
/// page search /// page search
/// </summary> /// </summary>
@ -120,36 +126,36 @@ namespace ModernWMS.WMS.Services
{ {
var DbSet = _dBContext.GetDbSet<StockmoveEntity>(); var DbSet = _dBContext.GetDbSet<StockmoveEntity>();
var location_DBSet = _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking(); var location_DBSet = _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking();
var data = await(from m in DbSet.AsNoTracking().Where(t => t.tenant_id.Equals(currentUser.tenant_id)) var data = await (from m in DbSet.AsNoTracking().Where(t => t.tenant_id.Equals(currentUser.tenant_id))
join sku in _dBContext.GetDbSet<SkuEntity>().AsNoTracking() on m.sku_id equals sku.id join sku in _dBContext.GetDbSet<SkuEntity>().AsNoTracking() on m.sku_id equals sku.id
join spu in _dBContext.GetDbSet<SpuEntity>().AsNoTracking() on sku.spu_id equals spu.id join spu in _dBContext.GetDbSet<SpuEntity>().AsNoTracking() on sku.spu_id equals spu.id
join orig_location in location_DBSet on m.orig_goods_location_id equals orig_location.id join orig_location in location_DBSet on m.orig_goods_location_id equals orig_location.id
join dest_location in location_DBSet on m.dest_googs_location_id equals dest_location.id join dest_location in location_DBSet on m.dest_googs_location_id equals dest_location.id
select new StockmoveViewModel select new StockmoveViewModel
{ {
id = m.id, id = m.id,
job_code = m.job_code, job_code = m.job_code,
move_status = m.move_status, move_status = m.move_status,
sku_id = m.sku_id, sku_id = m.sku_id,
orig_goods_location_id = m.orig_goods_location_id, orig_goods_location_id = m.orig_goods_location_id,
dest_googs_location_id = m.dest_googs_location_id, dest_googs_location_id = m.dest_googs_location_id,
qty = m.qty, qty = m.qty,
goods_owner_id = m.goods_owner_id, goods_owner_id = m.goods_owner_id,
handler = m.handler, handler = m.handler,
handle_time = m.handle_time, handle_time = m.handle_time,
creator = m.creator, creator = m.creator,
create_time = m.create_time, create_time = m.create_time,
last_update_time = m.last_update_time, last_update_time = m.last_update_time,
tenant_id = m.tenant_id, tenant_id = m.tenant_id,
sku_code = sku.sku_code, sku_code = sku.sku_code,
sku_name = sku.sku_name, sku_name = sku.sku_name,
spu_code = spu.spu_code, spu_code = spu.spu_code,
spu_name = spu.spu_name, spu_name = spu.spu_name,
dest_googs_location_name = dest_location.location_name, dest_googs_location_name = dest_location.location_name,
dest_googs_warehouse = dest_location.warehouse_name, dest_googs_warehouse = dest_location.warehouse_name,
orig_goods_location_name = orig_location.location_name, orig_goods_location_name = orig_location.location_name,
orig_goods_warehouse = orig_location.warehouse_name, orig_goods_warehouse = orig_location.warehouse_name,
} }
).ToListAsync(); ).ToListAsync();
return data.Adapt<List<StockmoveViewModel>>(); return data.Adapt<List<StockmoveViewModel>>();
} }
@ -163,42 +169,43 @@ namespace ModernWMS.WMS.Services
var DbSet = _dBContext.GetDbSet<StockmoveEntity>(); var DbSet = _dBContext.GetDbSet<StockmoveEntity>();
var location_DBSet = _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking(); var location_DBSet = _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking();
var data = await (from m in DbSet.AsNoTracking() var data = await (from m in DbSet.AsNoTracking()
join sku in _dBContext.GetDbSet<SkuEntity>().AsNoTracking() on m.sku_id equals sku.id join sku in _dBContext.GetDbSet<SkuEntity>().AsNoTracking() on m.sku_id equals sku.id
join spu in _dBContext.GetDbSet<SpuEntity>().AsNoTracking() on sku.spu_id equals spu.id join spu in _dBContext.GetDbSet<SpuEntity>().AsNoTracking() on sku.spu_id equals spu.id
join orig_location in location_DBSet on m.orig_goods_location_id equals orig_location.id join orig_location in location_DBSet on m.orig_goods_location_id equals orig_location.id
join dest_location in location_DBSet on m.dest_googs_location_id equals dest_location.id join dest_location in location_DBSet on m.dest_googs_location_id equals dest_location.id
where m.id == id where m.id == id
select new StockmoveViewModel select new StockmoveViewModel
{ {
id = m.id, id = m.id,
job_code = m.job_code, job_code = m.job_code,
move_status = m.move_status, move_status = m.move_status,
sku_id = m.sku_id, sku_id = m.sku_id,
orig_goods_location_id = m.orig_goods_location_id, orig_goods_location_id = m.orig_goods_location_id,
dest_googs_location_id = m.dest_googs_location_id, dest_googs_location_id = m.dest_googs_location_id,
qty = m.qty, qty = m.qty,
goods_owner_id = m.goods_owner_id, goods_owner_id = m.goods_owner_id,
handler = m.handler, handler = m.handler,
handle_time = m.handle_time, handle_time = m.handle_time,
creator = m.creator, creator = m.creator,
create_time = m.create_time, create_time = m.create_time,
last_update_time = m.last_update_time, last_update_time = m.last_update_time,
tenant_id = m.tenant_id, tenant_id = m.tenant_id,
sku_code = sku.sku_code, sku_code = sku.sku_code,
sku_name = sku.sku_name, sku_name = sku.sku_name,
spu_code = spu.spu_code, spu_code = spu.spu_code,
spu_name = spu.spu_name, spu_name = spu.spu_name,
dest_googs_location_name = dest_location.location_name, dest_googs_location_name = dest_location.location_name,
dest_googs_warehouse = dest_location.warehouse_name, dest_googs_warehouse = dest_location.warehouse_name,
orig_goods_location_name = orig_location.location_name, orig_goods_location_name = orig_location.location_name,
orig_goods_warehouse = orig_location.warehouse_name, orig_goods_warehouse = orig_location.warehouse_name,
}).FirstOrDefaultAsync(); }).FirstOrDefaultAsync();
if (data == null) if (data == null)
{ {
return null; return null;
} }
return data; return data;
} }
/// <summary> /// <summary>
/// add a new record /// add a new record
/// </summary> /// </summary>
@ -215,65 +222,72 @@ namespace ModernWMS.WMS.Services
var dispatch_DBSet = _dBContext.GetDbSet<DispatchlistEntity>().Where(t => t.tenant_id.Equals(currentUser.tenant_id)); var dispatch_DBSet = _dBContext.GetDbSet<DispatchlistEntity>().Where(t => t.tenant_id.Equals(currentUser.tenant_id));
var dispatch_group_datas = from dp in dispatch_DBSet.AsNoTracking() var dispatch_group_datas = from dp in dispatch_DBSet.AsNoTracking()
join dpp in dispatchpick_DBSet.AsNoTracking() on dp.id equals dpp.dispatchlist_id join dpp in dispatchpick_DBSet.AsNoTracking() on dp.id equals dpp.dispatchlist_id
where dp.dispatch_status > 1 && dp.dispatch_status < 6 where dp.dispatch_status > 1 && dp.dispatch_status < 6
&& dpp.goods_location_id == entity.orig_goods_location_id && dpp.sku_id == entity.sku_id && dpp.goods_location_id == entity.orig_goods_location_id && dpp.sku_id == entity.sku_id
group dpp by new { dpp.sku_id, dpp.goods_location_id } into dg && dpp.goods_owner_id == entity.goods_owner_id
group dpp by new { dpp.sku_id, dpp.goods_location_id, dpp.goods_owner_id } into dg
select new select new
{ {
sku_id = dg.Key.sku_id, sku_id = dg.Key.sku_id,
goods_location_id = dg.Key.goods_location_id, goods_location_id = dg.Key.goods_location_id,
goods_owner_id = dg.Key.goods_location_id,
qty_locked = dg.Sum(t => t.pick_qty) qty_locked = dg.Sum(t => t.pick_qty)
}; };
var process_locked_group_datas = from pd in processdetail_DBSet var process_locked_group_datas = from pd in processdetail_DBSet
where pd.is_update_stock == false where pd.is_update_stock == false
&& pd.sku_id == entity.sku_id && pd.goods_location_id == entity.orig_goods_location_id && pd.sku_id == entity.sku_id && pd.goods_location_id == entity.orig_goods_location_id
group pd by new { pd.sku_id, pd.goods_location_id } into pdg && pd.goods_owner_id == entity.goods_owner_id
group pd by new { pd.sku_id, pd.goods_location_id, pd.goods_owner_id } into pdg
select new select new
{ {
sku_id = pdg.Key.sku_id, sku_id = pdg.Key.sku_id,
goods_location_id = pdg.Key.goods_location_id, goods_location_id = pdg.Key.goods_location_id,
pdg.Key.goods_owner_id,
qty_locked = pdg.Sum(t => t.qty) qty_locked = pdg.Sum(t => t.qty)
}; };
var move_locked_group_datas = from sm in DbSet.AsNoTracking() var move_locked_group_datas = from sm in DbSet.AsNoTracking()
where sm.move_status == 0 && sm.sku_id == entity.sku_id && sm.orig_goods_location_id == entity.orig_goods_location_id where sm.move_status == 0 && sm.sku_id == entity.sku_id && sm.orig_goods_location_id == entity.orig_goods_location_id
group sm by new { sm.sku_id, goods_location_id = sm.orig_goods_location_id } into smg && sm.goods_owner_id == entity.goods_owner_id
select new { group sm by new { sm.sku_id, goods_location_id = sm.orig_goods_location_id, sm.goods_owner_id } into smg
smg.Key.sku_id, select new
smg.Key.goods_location_id, {
qty_locked = smg.Sum(t => t.qty) smg.Key.sku_id,
smg.Key.goods_location_id,
smg.Key.goods_owner_id,
qty_locked = smg.Sum(t => t.qty)
}; };
var orig_stock =await var orig_stock = await
(from sg in stock_DBSet.AsNoTracking() (from sg in stock_DBSet.AsNoTracking()
join dp in dispatch_group_datas on new { sg.sku_id, sg.goods_location_id } equals new { dp.sku_id, dp.goods_location_id } into dp_left join dp in dispatch_group_datas on new { sg.sku_id, sg.goods_location_id, sg.goods_owner_id } equals new { dp.sku_id, dp.goods_location_id, dp.goods_owner_id } into dp_left
from dp in dp_left.DefaultIfEmpty() from dp in dp_left.DefaultIfEmpty()
join pl in process_locked_group_datas on new { sg.sku_id, sg.goods_location_id } equals new { pl.sku_id, pl.goods_location_id } into pl_left join pl in process_locked_group_datas on new { sg.sku_id, sg.goods_location_id, sg.goods_owner_id } equals new { pl.sku_id, pl.goods_location_id, pl.goods_owner_id } into pl_left
from pl in pl_left.DefaultIfEmpty() from pl in pl_left.DefaultIfEmpty()
join sm in move_locked_group_datas on new {sg.sku_id,sg.goods_location_id} equals new {sm.sku_id, goods_location_id = sm.goods_location_id} into sm_left join sm in move_locked_group_datas on new { sg.sku_id, sg.goods_location_id, sg.goods_owner_id } equals new { sm.sku_id, goods_location_id = sm.goods_location_id, sm.goods_owner_id } into sm_left
from sm in sm_left.DefaultIfEmpty() from sm in sm_left.DefaultIfEmpty()
where sg.sku_id == entity.sku_id && sg.goods_location_id == entity.orig_goods_location_id where sg.sku_id == entity.sku_id && sg.goods_location_id == entity.orig_goods_location_id && sg.goods_owner_id == entity.goods_owner_id
select new select new
{ {
id = sg.id, id = sg.id,
qty_available = sg.is_freeze ? 0 : (sg.qty - (dp.qty_locked == null ? 0 : dp.qty_locked) - (pl.qty_locked == null ? 0 : pl.qty_locked) - (sm.qty_locked == null ? 0 : sm.qty_locked)) , qty_available = sg.is_freeze ? 0 : (sg.qty - (dp.qty_locked == null ? 0 : dp.qty_locked) - (pl.qty_locked == null ? 0 : pl.qty_locked) - (sm.qty_locked == null ? 0 : sm.qty_locked)),
} }
).FirstOrDefaultAsync(); ).FirstOrDefaultAsync();
var dest_stock = await stock_DBSet.FirstOrDefaultAsync(t => t.goods_location_id == entity.dest_googs_location_id && t.sku_id == entity.sku_id); var dest_stock = await stock_DBSet.FirstOrDefaultAsync(t => t.goods_location_id == entity.dest_googs_location_id && t.sku_id == entity.sku_id && t.goods_owner_id == entity.goods_owner_id);
if(orig_stock == null || orig_stock.qty_available<entity.qty) if (orig_stock == null || orig_stock.qty_available < entity.qty)
{ {
return (0, _stringLocalizer["qty_not_available"]); return (0, _stringLocalizer["qty_not_available"]);
} }
if(dest_stock!=null && dest_stock.is_freeze == true) if (dest_stock != null && dest_stock.is_freeze == true)
{ {
return (0, _stringLocalizer["dest_stock_freeze"]); return (0, _stringLocalizer["dest_stock_freeze"]);
} }
entity.id = 0; entity.id = 0;
entity.move_status= 0; entity.move_status = 0;
entity.create_time = DateTime.Now; entity.create_time = DateTime.Now;
entity.creator = currentUser.user_name; entity.creator = currentUser.user_name;
entity.last_update_time = DateTime.Now; entity.last_update_time = DateTime.Now;
entity.tenant_id = currentUser.tenant_id; entity.tenant_id = currentUser.tenant_id;
entity.job_code =await GetOrderCode(currentUser); entity.job_code = await GetOrderCode(currentUser);
await DbSet.AddAsync(entity); await DbSet.AddAsync(entity);
await _dBContext.SaveChangesAsync(); await _dBContext.SaveChangesAsync();
if (entity.id > 0) if (entity.id > 0)
@ -285,16 +299,17 @@ namespace ModernWMS.WMS.Services
return (0, _stringLocalizer["save_failed"]); return (0, _stringLocalizer["save_failed"]);
} }
} }
/// <summary> /// <summary>
/// confirm move /// confirm move
/// </summary> /// </summary>
/// <param name="id">id</param> /// <param name="id">id</param>
/// <param name="currentUser">current user</param> /// <param name="currentUser">current user</param>
/// <returns></returns> /// <returns></returns>
public async Task<(bool flag, string msg)> Confirm(int id,CurrentUser currentUser) public async Task<(bool flag, string msg)> Confirm(int id, CurrentUser currentUser)
{ {
var DbSet = _dBContext.GetDbSet<StockmoveEntity>(); var DbSet = _dBContext.GetDbSet<StockmoveEntity>();
var stock_DBSet = _dBContext.GetDbSet<StockEntity>(); var stock_DBSet = _dBContext.GetDbSet<StockEntity>();
var entity = await DbSet.FirstOrDefaultAsync(t => t.id.Equals(id)); var entity = await DbSet.FirstOrDefaultAsync(t => t.id.Equals(id));
if (entity == null) if (entity == null)
{ {
@ -304,21 +319,21 @@ namespace ModernWMS.WMS.Services
entity.handle_time = DateTime.Now; entity.handle_time = DateTime.Now;
entity.move_status = 1; entity.move_status = 1;
entity.last_update_time = DateTime.Now; entity.last_update_time = DateTime.Now;
var orig_stock = await stock_DBSet.FirstOrDefaultAsync(t => t.goods_location_id == entity.orig_goods_location_id && t.sku_id == entity.sku_id) ; var orig_stock = await stock_DBSet.FirstOrDefaultAsync(t => t.goods_location_id == entity.orig_goods_location_id && t.goods_owner_id == entity.goods_owner_id && t.sku_id == entity.sku_id);
var dest_stock = await stock_DBSet.FirstOrDefaultAsync(t=>t.goods_location_id == entity.dest_googs_location_id && t.sku_id!= entity.sku_id); var dest_stock = await stock_DBSet.FirstOrDefaultAsync(t => t.goods_location_id == entity.dest_googs_location_id && t.goods_owner_id == entity.goods_owner_id && t.sku_id == entity.sku_id);
if (orig_stock != null) if (orig_stock != null)
{ {
if(orig_stock.qty == entity.qty) if (orig_stock.qty == entity.qty)
{ {
stock_DBSet.Remove(orig_stock); stock_DBSet.Remove(orig_stock);
} }
else else
{ {
orig_stock.qty -= entity.qty; orig_stock.qty -= entity.qty;
orig_stock.last_update_time=DateTime.Now; orig_stock.last_update_time = DateTime.Now;
} }
} }
if(dest_stock == null) if (dest_stock == null)
{ {
dest_stock = new StockEntity dest_stock = new StockEntity
{ {
@ -361,7 +376,7 @@ namespace ModernWMS.WMS.Services
{ {
throw new NotSupportedException(_stringLocalizer["try_agin"]); throw new NotSupportedException(_stringLocalizer["try_agin"]);
} }
else if(UtilConvert.ObjToInt(databaseValues["qty"]) - entity.qty==0) else if (UtilConvert.ObjToInt(databaseValues["qty"]) - entity.qty == 0)
{ {
entry.State = EntityState.Deleted; entry.State = EntityState.Deleted;
} }
@ -371,7 +386,7 @@ namespace ModernWMS.WMS.Services
proposedValues["qty"] = UtilConvert.ObjToInt(databaseValues["qty"]) - entity.qty; proposedValues["qty"] = UtilConvert.ObjToInt(databaseValues["qty"]) - entity.qty;
} }
} }
else if(UtilConvert.ObjToInt(proposedValues["id"]) == dest_stock.id) else if (UtilConvert.ObjToInt(proposedValues["id"]) == dest_stock.id)
{ {
proposedValues["qty"] = UtilConvert.ObjToInt(databaseValues["qty"]) + entity.qty; proposedValues["qty"] = UtilConvert.ObjToInt(databaseValues["qty"]) + entity.qty;
} }
@ -394,6 +409,7 @@ namespace ModernWMS.WMS.Services
return (false, _stringLocalizer["operation_failed"]); return (false, _stringLocalizer["operation_failed"]);
} }
} }
/// <summary> /// <summary>
/// delete a record /// delete a record
/// </summary> /// </summary>
@ -401,7 +417,7 @@ namespace ModernWMS.WMS.Services
/// <returns></returns> /// <returns></returns>
public async Task<(bool flag, string msg)> DeleteAsync(int id) public async Task<(bool flag, string msg)> DeleteAsync(int id)
{ {
var qty = await _dBContext.GetDbSet<StockmoveEntity>().Where(t => t.id.Equals(id)&&t.move_status == 0).ExecuteDeleteAsync(); var qty = await _dBContext.GetDbSet<StockmoveEntity>().Where(t => t.id.Equals(id) && t.move_status == 0).ExecuteDeleteAsync();
if (qty > 0) if (qty > 0)
{ {
return (true, _stringLocalizer["delete_success"]); return (true, _stringLocalizer["delete_success"]);
@ -420,7 +436,7 @@ namespace ModernWMS.WMS.Services
{ {
string code; string code;
string date = DateTime.Now.ToString("yyyy" + "MM" + "dd"); string date = DateTime.Now.ToString("yyyy" + "MM" + "dd");
string maxNo = await _dBContext.GetDbSet<StockmoveEntity>().AsNoTracking().Where(t=>t.tenant_id == currentUser.tenant_id).MaxAsync(t => t.job_code); string maxNo = await _dBContext.GetDbSet<StockmoveEntity>().AsNoTracking().Where(t => t.tenant_id == currentUser.tenant_id).MaxAsync(t => t.job_code);
if (maxNo == null) if (maxNo == null)
{ {
code = date + "-0001"; code = date + "-0001";
@ -443,7 +459,7 @@ namespace ModernWMS.WMS.Services
return code; return code;
} }
#endregion
}
}
#endregion Api
}
}

View file

@ -19,6 +19,7 @@ using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Formatters.Xml; using Microsoft.AspNetCore.Mvc.Formatters.Xml;
using Microsoft.AspNetCore.SignalR.Protocol; using Microsoft.AspNetCore.SignalR.Protocol;
using System.Linq; using System.Linq;
using Microsoft.CodeAnalysis;
namespace ModernWMS.WMS.Services namespace ModernWMS.WMS.Services
{ {
@ -150,7 +151,7 @@ namespace ModernWMS.WMS.Services
spu_code = spu.spu_code, spu_code = spu.spu_code,
spu_name = spu.spu_name, spu_name = spu.spu_name,
unit = sku.unit, unit = sku.unit,
location_name = gl.location_name == null?"":gl.location_name location_name = gl.location_name == null ? "" : gl.location_name
}).ToListAsync(); }).ToListAsync();
if (entity == null) if (entity == null)
{ {
@ -163,7 +164,7 @@ namespace ModernWMS.WMS.Services
where a.job_type == 2 && d.stock_process_id == id where a.job_type == 2 && d.stock_process_id == id
select a select a
).AnyAsync(); ).AnyAsync();
res.adjust_status =entity.process_status && adjusted; res.adjust_status = entity.process_status && adjusted;
res.source_detail_list = details.Where(t => t.is_source == true).ToList(); res.source_detail_list = details.Where(t => t.is_source == true).ToList();
res.target_detail_list = details.Where(t => t.is_source == false).ToList(); res.target_detail_list = details.Where(t => t.is_source == false).ToList();
return res; return res;
@ -226,7 +227,7 @@ namespace ModernWMS.WMS.Services
await DbSet.AddAsync(entity); await DbSet.AddAsync(entity);
foreach (var d in entity.detailList) foreach (var d in entity.detailList)
{ {
d.tenant_id =currentUser.tenant_id; d.tenant_id = currentUser.tenant_id;
d.last_update_time = DateTime.Now; d.last_update_time = DateTime.Now;
d.id = 0; d.id = 0;
var s = stocks.FirstOrDefault(t => t.sku_id == d.sku_id && t.goods_location_id == d.goods_location_id); var s = stocks.FirstOrDefault(t => t.sku_id == d.sku_id && t.goods_location_id == d.goods_location_id);
@ -295,7 +296,7 @@ namespace ModernWMS.WMS.Services
public async Task<(bool flag, string msg)> DeleteAsync(int id) public async Task<(bool flag, string msg)> DeleteAsync(int id)
{ {
var entity = await _dBContext.GetDbSet<StockprocessEntity>().Where(t => t.id.Equals(id) && t.process_status == false).Include(e => e.detailList).FirstOrDefaultAsync(); var entity = await _dBContext.GetDbSet<StockprocessEntity>().Where(t => t.id.Equals(id) && t.process_status == false).Include(e => e.detailList).FirstOrDefaultAsync();
_dBContext.GetDbSet<StockprocessEntity>().Remove(entity); _dBContext.GetDbSet<StockprocessEntity>().Remove(entity);
var qty = await _dBContext.SaveChangesAsync(); var qty = await _dBContext.SaveChangesAsync();
if (qty > 0) if (qty > 0)
{ {
@ -359,7 +360,7 @@ namespace ModernWMS.WMS.Services
foreach (var d in details) foreach (var d in details)
{ {
var stock = stocks.FirstOrDefault(t => t.goods_location_id == d.goods_location_id && t.sku_id == d.sku_id && t.goods_owner_id == d.goods_owner_id); var stock = stocks.FirstOrDefault(t => t.goods_location_id == d.goods_location_id && t.sku_id == d.sku_id && t.goods_owner_id == d.goods_owner_id);
d.is_update_stock= true; d.is_update_stock = true;
d.last_update_time = DateTime.Now; d.last_update_time = DateTime.Now;
if (d.is_source) if (d.is_source)
{ {
@ -372,16 +373,16 @@ namespace ModernWMS.WMS.Services
} }
else else
{ {
if(stock == null) if (stock == null)
{ {
await stock_DBSet.AddAsync(new StockEntity await stock_DBSet.AddAsync(new StockEntity
{ {
sku_id= d.sku_id, sku_id = d.sku_id,
goods_location_id= d.goods_location_id, goods_location_id = d.goods_location_id,
goods_owner_id= d.goods_owner_id, goods_owner_id = d.goods_owner_id,
is_freeze =false, is_freeze = false,
last_update_time =DateTime.Now, last_update_time = DateTime.Now,
qty= d.qty, qty = d.qty,
tenant_id = currentUser.tenant_id tenant_id = currentUser.tenant_id
}); });
} }
@ -412,7 +413,7 @@ namespace ModernWMS.WMS.Services
{ {
var DBSet = _dBContext.GetDbSet<StockprocessEntity>(); var DBSet = _dBContext.GetDbSet<StockprocessEntity>();
var entity = await DBSet.FirstOrDefaultAsync(t => t.id == id); var entity = await DBSet.FirstOrDefaultAsync(t => t.id == id);
if(entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, _stringLocalizer["not_exists_entity"]);
} }
@ -440,8 +441,8 @@ namespace ModernWMS.WMS.Services
{ {
string code; string code;
string date = DateTime.Now.ToString("yyyy" + "MM" + "dd"); string date = DateTime.Now.ToString("yyyy" + "MM" + "dd");
string maxNo = await _dBContext.GetDbSet<StockprocessEntity>().AsNoTracking().Where(t=>t.tenant_id == currentUser.tenant_id).MaxAsync(t => t.job_code); string maxNo = await _dBContext.GetDbSet<StockprocessEntity>().AsNoTracking().Where(t => t.tenant_id == currentUser.tenant_id).MaxAsync(t => t.job_code);
if (maxNo == null) if (maxNo == null)
{ {
code = date + "-0001"; code = date + "-0001";
} }
@ -460,7 +461,7 @@ namespace ModernWMS.WMS.Services
code = date + "-0001"; code = date + "-0001";
} }
} }
return code; return code;
} }
/// <summary> /// <summary>
@ -494,6 +495,181 @@ namespace ModernWMS.WMS.Services
return code; return code;
} }
/// <summary>
/// get next order code number
/// </summary>
/// <returns></returns>
public async Task<List<string>> GetOrderCodeList(CurrentUser currentUser, int cnt)
{
List<string> code = new List<string>();
string date = DateTime.Now.ToString("yyyy" + "MM" + "dd");
string maxNo = await _dBContext.GetDbSet<DispatchlistEntity>().Where(t => t.tenant_id == currentUser.tenant_id).MaxAsync(t => t.dispatch_no);
if (maxNo == null)
{
for (int i = 1; i <= cnt; i++)
{
code.Add(date + "-" + i.ToString("0000"));
}
}
else
{
string maxDate = maxNo.Substring(0, 8);
string maxDateNo = maxNo.Substring(9, 4);
if (date == maxDate)
{
int.TryParse(maxDateNo, out int dd);
for (int i = 1; i <= cnt; i++)
{
code.Add(date + "-" + (dd + i).ToString("0000"));
}
}
else
{
for (int i = 1; i <= cnt; i++)
{
code.Add(date + "-" + i.ToString("0000"));
}
}
}
return code;
}
/// <summary>
/// Excel Import
/// </summary>
/// <returns></returns>
public async Task<(bool flag, string msg)> Import(List<StockprocessImportViewModel> viewModels, CurrentUser currentUser)
{
var sku_code_list = viewModels.Select(t => t.sku_code).Distinct().ToList();
var sku_list = await (from sku in _dBContext.GetDbSet<SkuEntity>().AsNoTracking()
join spu in _dBContext.GetDbSet<SpuEntity>().AsNoTracking() on sku.spu_id equals spu.id
where sku_code_list.Contains(sku.sku_code) && spu.tenant_id == currentUser.tenant_id
select sku).ToListAsync();
var location_name_list = viewModels.Select(t => t.location_name).Distinct().ToList();
var location_list = await (from l in _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking()
where location_name_list.Contains(l.location_name) && l.tenant_id == currentUser.tenant_id
select new
{
l.id,
l.location_name
}).ToListAsync();
var goods_owner_name_list = viewModels.Select(t => t.goods_owner_name).Distinct().ToList();
var goods_owner_list = await _dBContext.GetDbSet<GoodsownerEntity>().AsNoTracking().Where(t => goods_owner_name_list.Contains(t.goods_owner_name) && t.tenant_id == currentUser.tenant_id).ToListAsync();
var entities = new List<StockprocessEntity>();
var vm_group = viewModels.GroupBy(t => t.import_group);
foreach(var vg in vm_group)
{
if (vg.All(t => t.is_ori==true) || vg.All(t=>t.is_ori == false))
{
return (false,_stringLocalizer["job_number"]+": " +vg.Key.ToString() +" "+ _stringLocalizer["process_valid"]);
}
}
var groups = vm_group.Select(t => t.Key).ToList();
var groups_code = await GetOrderCodeList(currentUser, groups.Count());
var group_code_dic = new Dictionary<int, string>();
for (int i = 0; i < groups.Count(); i++)
{
group_code_dic.Add(groups[i], groups_code[i]);
}
var location_id_list = location_list.Select(t => t.id).ToList();
var sku_id_list = sku_list.Select(t => t.id).ToList();
var check_details_all = new List<StockprocessdetailViewModel>();
foreach (var vg in vm_group)
{
var ent = new StockprocessEntity();
ent.creator = currentUser.user_name;
ent.create_time = DateTime.Now;
ent.last_update_time = DateTime.Now;
ent.tenant_id = currentUser.tenant_id;
ent.job_code = group_code_dic[vg.Key];
ent.job_type = true;
foreach (var v in vg)
{
var sku = sku_list.FirstOrDefault(t => t.sku_code == v.sku_code);
if (sku == null)
{
return (false, _stringLocalizer["sku_name"] + ":" + v.sku_name + "-" + _stringLocalizer["sku_code"] + ":" + v.sku_code + " " + _stringLocalizer["not_exists_entity"]);
}
var area = location_list.FirstOrDefault(t => t.location_name == v.location_name);
if (area == null)
{
return (false, _stringLocalizer["location_name"] + ":" + v.location_name + " " + _stringLocalizer["not_exists_entity"]);
}
var goods_owner = goods_owner_list.FirstOrDefault(t => t.goods_owner_name == v.goods_owner_name);
ent.detailList.Add(new StockprocessdetailEntity
{
sku_id = sku.id,
is_source = v.is_ori,
last_update_time = DateTime.Now,
goods_owner_id = goods_owner == null ? 0 : goods_owner.id,
is_update_stock = false,
qty = v.qty,
goods_location_id = area.id,
tenant_id = currentUser.tenant_id,
});
if (v.is_ori)
check_details_all.Add(new StockprocessdetailViewModel
{
sku_id = sku.id,
sku_code = v.sku_code,
goods_location_id = area.id,
qty = v.qty,
goods_owner_id = goods_owner == null ? 0 : goods_owner.id,
location_name = v.location_name
});
}
entities.Add(ent);
}
var check_details_sum = check_details_all.GroupBy(t => new { t.sku_id, t.goods_location_id, t.goods_owner_id, t.sku_code, t.location_name }).Select(t => new
{
t.Key.sku_id,
t.Key.sku_code,
t.Key.goods_location_id,
t.Key.location_name,
t.Key.goods_owner_id,
qty = t.Sum(e=>e.qty),
}).ToList();
var stocks = await _dBContext.GetDbSet<StockEntity>().Where(t => sku_id_list.Contains(t.sku_id) && location_id_list.Contains(t.goods_location_id)).ToListAsync();
var lockeds = await (from d in _dBContext.GetDbSet<StockprocessdetailEntity>().AsNoTracking()
where d.is_update_stock == false && location_id_list.Contains(d.goods_location_id)
&& sku_id_list.Contains(d.sku_id)
group d by new { d.goods_location_id, d.sku_id } into lg
select new
{
sku_id = lg.Key.sku_id,
goods_location_id = lg.Key.goods_location_id,
qty_locked = lg.Sum(e => e.qty)
}).ToListAsync();
foreach (var c in check_details_sum)
{
var s = stocks.FirstOrDefault(t => t.sku_id == c.sku_id && t.goods_location_id == c.goods_location_id);
if (s == null)
{
return (false, _stringLocalizer["sku_code"]+":"+c.sku_code + "-" + _stringLocalizer["location_name"] +c.location_name+" "+ _stringLocalizer["stock_insufficiency"]);
}
var locked = lockeds.FirstOrDefault(t => t.sku_id == c.sku_id && t.goods_location_id == c.goods_location_id );
if ((s.qty - (locked == null ? 0 : locked.qty_locked)) < c.qty)
{
return (false, _stringLocalizer["sku_code"] + ":" + c.sku_code + "-" + _stringLocalizer["location_name"] + c.location_name + " " + _stringLocalizer["stock_insufficiency"]);
}
if (s.is_freeze == true)
{
return (false, _stringLocalizer["stock_frozen"]);
}
}
await _dBContext.GetDbSet<StockprocessEntity>().AddRangeAsync(entities);
await _dBContext.SaveChangesAsync();
return (true, "");
}
#endregion #endregion
} }
} }

View file

@ -2,6 +2,7 @@
* date2022-12-20 * date2022-12-20
* developerNoNo * developerNoNo
*/ */
using Mapster; using Mapster;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using ModernWMS.Core.DBContext; using ModernWMS.Core.DBContext;
@ -26,6 +27,7 @@ namespace ModernWMS.WMS.Services
public class UserService : BaseService<userEntity>, IUserService public class UserService : BaseService<userEntity>, IUserService
{ {
#region Args #region Args
/// <summary> /// <summary>
/// The DBContext /// The DBContext
/// </summary> /// </summary>
@ -35,9 +37,11 @@ namespace ModernWMS.WMS.Services
/// Localizer Service /// Localizer Service
/// </summary> /// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer; private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#endregion Args
#region constructor #region constructor
/// <summary> /// <summary>
///User constructor ///User constructor
/// </summary> /// </summary>
@ -51,9 +55,11 @@ namespace ModernWMS.WMS.Services
this._dBContext = dBContext; this._dBContext = dBContext;
this._stringLocalizer = stringLocalizer; this._stringLocalizer = stringLocalizer;
} }
#endregion
#endregion constructor
#region Api #region Api
/// <summary> /// <summary>
/// get select items /// get select items
/// </summary> /// </summary>
@ -106,6 +112,7 @@ namespace ModernWMS.WMS.Services
.ToListAsync(); .ToListAsync();
return (list.Adapt<List<UserViewModel>>(), totals); return (list.Adapt<List<UserViewModel>>(), totals);
} }
/// <summary> /// <summary>
/// Get all records /// Get all records
/// </summary> /// </summary>
@ -113,7 +120,7 @@ namespace ModernWMS.WMS.Services
public async Task<List<UserViewModel>> GetAllAsync(CurrentUser currentUser) public async Task<List<UserViewModel>> GetAllAsync(CurrentUser currentUser)
{ {
var DbSet = _dBContext.GetDbSet<userEntity>(); var DbSet = _dBContext.GetDbSet<userEntity>();
var data = await DbSet.AsNoTracking().Where(t=>t.tenant_id == currentUser.tenant_id).ToListAsync(); var data = await DbSet.AsNoTracking().Where(t => t.tenant_id == currentUser.tenant_id).ToListAsync();
return data.Adapt<List<UserViewModel>>(); return data.Adapt<List<UserViewModel>>();
} }
@ -131,6 +138,7 @@ namespace ModernWMS.WMS.Services
} }
return entity.Adapt<UserViewModel>(); return entity.Adapt<UserViewModel>();
} }
/// <summary> /// <summary>
/// add a new record /// add a new record
/// </summary> /// </summary>
@ -146,7 +154,8 @@ namespace ModernWMS.WMS.Services
} }
var entity = viewModel.Adapt<userEntity>(); var entity = viewModel.Adapt<userEntity>();
entity.id = 0; entity.id = 0;
entity.auth_string = Md5Helper.Md5Encrypt32("pwd123456"); var new_auth = GetRandomPassword();
entity.auth_string = Md5Helper.Md5Encrypt32(new_auth);
entity.create_time = DateTime.Now; entity.create_time = DateTime.Now;
entity.last_update_time = DateTime.Now; entity.last_update_time = DateTime.Now;
entity.tenant_id = currentUser.tenant_id; entity.tenant_id = currentUser.tenant_id;
@ -154,13 +163,14 @@ namespace ModernWMS.WMS.Services
await _dBContext.SaveChangesAsync(); await _dBContext.SaveChangesAsync();
if (entity.id > 0) if (entity.id > 0)
{ {
return (entity.id, _stringLocalizer["save_success"]); return (entity.id, new_auth);
} }
else else
{ {
return (0, _stringLocalizer["save_failed"]); return (0, _stringLocalizer["save_failed"]);
} }
} }
/// <summary> /// <summary>
/// update a record /// update a record
/// </summary> /// </summary>
@ -197,6 +207,7 @@ namespace ModernWMS.WMS.Services
return (false, _stringLocalizer["save_failed"]); return (false, _stringLocalizer["save_failed"]);
} }
} }
/// <summary> /// <summary>
/// delete a record /// delete a record
/// </summary> /// </summary>
@ -214,27 +225,28 @@ namespace ModernWMS.WMS.Services
return (false, _stringLocalizer["delete_failed"]); return (false, _stringLocalizer["delete_failed"]);
} }
} }
/// <summary> /// <summary>
/// import users by excel /// import users by excel
/// </summary> /// </summary>
/// <param name="datas">excel datas</param> /// <param name="datas">excel datas</param>
/// <param name="currentUser">current user</param> /// <param name="currentUser">current user</param>
/// <returns></returns> /// <returns></returns>
public async Task<(bool flag,string msg)>ExcelAsync(List<UserExcelImportViewModel> datas,CurrentUser currentUser) public async Task<(bool flag, string msg)> ExcelAsync(List<UserExcelImportViewModel> datas, CurrentUser currentUser)
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
var DbSet = _dBContext.GetDbSet<userEntity>(); var DbSet = _dBContext.GetDbSet<userEntity>();
var user_num_repeat_excel = datas.GroupBy(t => t.user_num).Select(t=>new { user_num= t.Key,cnt = t.Count()}).Where(t=>t.cnt>1).ToList(); var user_num_repeat_excel = datas.GroupBy(t => t.user_num).Select(t => new { user_num = t.Key, cnt = t.Count() }).Where(t => t.cnt > 1).ToList();
foreach(var repeat in user_num_repeat_excel) foreach (var repeat in user_num_repeat_excel)
{ {
sb.AppendLine(string.Format(_stringLocalizer["exists_entity"], _stringLocalizer["user_num"], repeat.user_num)); sb.AppendLine(string.Format(_stringLocalizer["exists_entity"], _stringLocalizer["user_num"], repeat.user_num));
} }
if (user_num_repeat_excel.Count > 0) if (user_num_repeat_excel.Count > 0)
{ {
return (false,sb.ToString()); return (false, sb.ToString());
} }
var user_num_repeat_exists =await DbSet.Where(t=>t.tenant_id == currentUser.tenant_id).Where(t => datas.Select(t => t.user_num).ToList().Contains(t.user_num)).Select(t=>t.user_num).ToListAsync(); var user_num_repeat_exists = await DbSet.Where(t => t.tenant_id == currentUser.tenant_id).Where(t => datas.Select(t => t.user_num).ToList().Contains(t.user_num)).Select(t => t.user_num).ToListAsync();
foreach (var repeat in user_num_repeat_exists) foreach (var repeat in user_num_repeat_exists)
{ {
sb.AppendLine(string.Format(_stringLocalizer["exists_entity"], _stringLocalizer["user_num"], repeat)); sb.AppendLine(string.Format(_stringLocalizer["exists_entity"], _stringLocalizer["user_num"], repeat));
@ -245,14 +257,15 @@ namespace ModernWMS.WMS.Services
} }
var entities = datas.Adapt<List<userEntity>>(); var entities = datas.Adapt<List<userEntity>>();
entities.ForEach(t => { entities.ForEach(t =>
{
t.creator = currentUser.user_name; t.creator = currentUser.user_name;
t.tenant_id= currentUser.tenant_id; t.tenant_id = currentUser.tenant_id;
t.auth_string = Md5Helper.Md5Encrypt32("pwd123456"); t.auth_string = Md5Helper.Md5Encrypt32("pwd123456");
t.create_time = DateTime.Now; t.create_time = DateTime.Now;
t.last_update_time= DateTime.Now; t.last_update_time = DateTime.Now;
t.is_valid = true; t.is_valid = true;
}); });
await DbSet.AddRangeAsync(entities); await DbSet.AddRangeAsync(entities);
var res = await _dBContext.SaveChangesAsync(); var res = await _dBContext.SaveChangesAsync();
if (res > 0) if (res > 0)
@ -267,18 +280,18 @@ namespace ModernWMS.WMS.Services
/// </summary> /// </summary>
/// <param name="viewModel">viewmodel</param> /// <param name="viewModel">viewmodel</param>
/// <returns></returns> /// <returns></returns>
public async Task<(bool,string)> ResetPwd(BatchOperationViewModel viewModel) public async Task<(bool, string)> ResetPwd(BatchOperationViewModel viewModel)
{ {
var DBSet = _dBContext.GetDbSet<userEntity>(); var DBSet = _dBContext.GetDbSet<userEntity>();
var entities =await DBSet.Where(t => viewModel.id_list.Contains(t.id)).ToListAsync(); var entities = await DBSet.Where(t => viewModel.id_list.Contains(t.id)).ToListAsync();
var newpassword = GetRandomPassword(); var newpassword = GetRandomPassword();
entities.ForEach(t => { t.auth_string = Md5Helper.Md5Encrypt32(newpassword); t.last_update_time = DateTime.Now; }); entities.ForEach(t => { t.auth_string = Md5Helper.Md5Encrypt32(newpassword); t.last_update_time = DateTime.Now; });
var res = await _dBContext.SaveChangesAsync(); var res = await _dBContext.SaveChangesAsync();
if (res > 0) if (res > 0)
{ {
return (true, newpassword); return (true, newpassword);
} }
return (false,_stringLocalizer["operation_failed"]); return (false, _stringLocalizer["operation_failed"]);
} }
/// <summary> /// <summary>
@ -286,21 +299,23 @@ namespace ModernWMS.WMS.Services
/// </summary> /// </summary>
/// <param name="viewModel">viewmodel</param> /// <param name="viewModel">viewmodel</param>
/// <returns></returns> /// <returns></returns>
public async Task<(bool flag,string msg)> ChangePwd(UserChangePwdViewModel viewModel) public async Task<(bool flag, string msg)> ChangePwd(UserChangePwdViewModel viewModel)
{ {
var DBSet = _dBContext.GetDbSet<userEntity>(); var DBSet = _dBContext.GetDbSet<userEntity>();
var entity =await DBSet.FirstOrDefaultAsync(t => t.id.Equals(viewModel.id)); var entity = await DBSet.FirstOrDefaultAsync(t => t.id.Equals(viewModel.id));
if(entity == null) if (entity == null)
{ {
return (false, _stringLocalizer["not_exists_entity"]); return (false, _stringLocalizer["not_exists_entity"]);
} }
if (!entity.auth_string.Equals(viewModel.old_password)){ if (!entity.auth_string.Equals(viewModel.old_password))
return(false, _stringLocalizer["old_password"] + _stringLocalizer["is_incorrect"]); {
return (false, _stringLocalizer["old_password"] + _stringLocalizer["is_incorrect"]);
} }
entity.auth_string = viewModel.new_password; entity.auth_string = viewModel.new_password;
await _dBContext.SaveChangesAsync(); await _dBContext.SaveChangesAsync();
return (true, _stringLocalizer["save_success"]); return (true, _stringLocalizer["save_success"]);
} }
/// <summary> /// <summary>
/// register a new tenant /// register a new tenant
/// </summary> /// </summary>
@ -329,7 +344,9 @@ namespace ModernWMS.WMS.Services
if (entity.id > 0) if (entity.id > 0)
{ {
var tenant_id = entity.id; var tenant_id = entity.id;
#region menus #region menus
var menus = new List<MenuEntity> var menus = new List<MenuEntity>
{ {
new MenuEntity new MenuEntity
@ -512,15 +529,17 @@ namespace ModernWMS.WMS.Services
tenant_id = tenant_id tenant_id = tenant_id
} }
}; };
#endregion
#endregion menus
entity.tenant_id = tenant_id; entity.tenant_id = tenant_id;
entity.creator = entity.user_name; entity.creator = entity.user_name;
entity.user_role = "admin"; entity.user_role = "admin";
var adminrole = new UserroleEntity {is_valid = true, last_update_time = time, create_time = time, role_name = "admin", tenant_id = tenant_id }; var adminrole = new UserroleEntity { is_valid = true, last_update_time = time, create_time = time, role_name = "admin", tenant_id = tenant_id };
await _dBContext.GetDbSet<UserroleEntity>().AddAsync(adminrole); await _dBContext.GetDbSet<UserroleEntity>().AddAsync(adminrole);
await _dBContext.GetDbSet<MenuEntity>().AddRangeAsync(menus); await _dBContext.GetDbSet<MenuEntity>().AddRangeAsync(menus);
await _dBContext.SaveChangesAsync(); await _dBContext.SaveChangesAsync();
foreach(var menu in menus) foreach (var menu in menus)
{ {
await _dBContext.GetDbSet<RolemenuEntity>().AddAsync(new RolemenuEntity await _dBContext.GetDbSet<RolemenuEntity>().AddAsync(new RolemenuEntity
{ {
@ -528,7 +547,7 @@ namespace ModernWMS.WMS.Services
authority = 1, authority = 1,
menu_id = menu.id, menu_id = menu.id,
tenant_id = tenant_id, tenant_id = tenant_id,
last_update_time=time, last_update_time = time,
create_time = time, create_time = time,
}); });
} }
@ -559,7 +578,6 @@ namespace ModernWMS.WMS.Services
return password; return password;
} }
#endregion #endregion Api
} }
} }

Binary file not shown.

Binary file not shown.