mirror of
https://github.com/fjykTec/ModernWMS.git
synced 2024-09-20 06:56:08 +08:00
WMS 1.0 final version
This commit is contained in:
parent
a0df59edda
commit
114526d880
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
24
backend/ModernWMS.Core/Job/IJob.cs
Normal file
24
backend/ModernWMS.Core/Job/IJob.cs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* date:2023-02-08
|
||||||
|
* developer:AMo
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace ModernWMS.Core.Job
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// base interface
|
||||||
|
/// </summary>
|
||||||
|
public interface IJob
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// cron
|
||||||
|
/// </summary>
|
||||||
|
string CronExpression { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Execute
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task Execute();
|
||||||
|
}
|
||||||
|
}
|
61
backend/ModernWMS.Core/Job/TestJob.cs
Normal file
61
backend/ModernWMS.Core/Job/TestJob.cs
Normal 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();
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -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")]
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,69 +2,75 @@
|
||||||
* date:2022-12-22
|
* date:2022-12-22
|
||||||
* developer:NoNo
|
* developer:NoNo
|
||||||
*/
|
*/
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* date:2022-12-20
|
* date:2022-12-20
|
||||||
* developer:NoNo
|
* developer:NoNo
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* date:2023-09-05
|
||||||
|
* developer:AMo
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* date:2023-9-3
|
||||||
|
* developer:NoNo
|
||||||
|
*/
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,26 +2,30 @@
|
||||||
* date:2022-12-22
|
* date:2022-12-22
|
||||||
* developer:NoNo
|
* developer:NoNo
|
||||||
*/
|
*/
|
||||||
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
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* date:2022-12-27
|
* date:2022-12-27
|
||||||
* developer:NoNo
|
* developer:NoNo
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"]);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* date:2022-12-22
|
* date:2022-12-22
|
||||||
* developer:NoNo
|
* developer:NoNo
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
* date:2022-12-27
|
* date:2022-12-27
|
||||||
* developer:NoNo
|
* developer:NoNo
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* date:2022-12-20
|
* date:2022-12-20
|
||||||
* developer:NoNo
|
* developer:NoNo
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
BIN
backend/ModernWMS/wms.db-shm
Normal file
BIN
backend/ModernWMS/wms.db-shm
Normal file
Binary file not shown.
BIN
backend/ModernWMS/wms.db-wal
Normal file
BIN
backend/ModernWMS/wms.db-wal
Normal file
Binary file not shown.
Loading…
Reference in a new issue