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>
|
||||
/// base controller
|
||||
/// </summary>
|
||||
//[Authorize]
|
||||
[Authorize]
|
||||
[Produces("application/json")]
|
||||
public class BaseController : ControllerBase
|
||||
{
|
||||
|
|
|
@ -30,6 +30,9 @@ using ModernWMS.Core.DI;
|
|||
using Microsoft.Extensions.Localization;
|
||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
||||
using Microsoft.EntityFrameworkCore.Migrations.Internal;
|
||||
using System.Security.AccessControl;
|
||||
using Hangfire;
|
||||
using Hangfire.MemoryStorage;
|
||||
|
||||
namespace ModernWMS.Core.Extentions
|
||||
{
|
||||
|
@ -43,6 +46,7 @@ namespace ModernWMS.Core.Extentions
|
|||
var sharedLocalizer = sp.GetRequiredService<IStringLocalizer<MultiLanguage>>();
|
||||
return sharedLocalizer;
|
||||
});
|
||||
services.AddHttpClient();
|
||||
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
||||
services.AddSingleton<CacheManager>();
|
||||
services.AddSingleton<IMemoryCache>(factory =>
|
||||
|
@ -50,25 +54,27 @@ namespace ModernWMS.Core.Extentions
|
|||
var cache = new MemoryCache(new MemoryCacheOptions());
|
||||
return cache;
|
||||
});
|
||||
|
||||
var database_config = configuration.GetSection("Database")["db"];
|
||||
services.AddDbContextPool<SqlDBContext>(t =>
|
||||
{
|
||||
if (database_config == "SqlLite")
|
||||
if (database_config.ToUpper() == "SQLLITE")
|
||||
{
|
||||
var SqlLite_connection = configuration.GetConnectionString("SqlLiteConn");
|
||||
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");
|
||||
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");
|
||||
t.UseSqlServer(SqlServer_connection);
|
||||
}
|
||||
else if (database_config == "PostGres")
|
||||
|
||||
else if (database_config.ToUpper() == "POSTGRES")
|
||||
{
|
||||
var Postgre_connection = configuration.GetConnectionString("PostGresConn");
|
||||
t.UseNpgsql(Postgre_connection);
|
||||
|
@ -79,7 +85,7 @@ namespace ModernWMS.Core.Extentions
|
|||
t.UseLoggerFactory(new LoggerFactory(new[] { new DebugLoggerProvider() }));
|
||||
}, 100); ;
|
||||
services.AddMemoryCache();
|
||||
services.AddScoped<MultiTenancy.ITenantProvider, MultiTenancy.TenantProvider>();
|
||||
services.AddScoped<MultiTenancy.ITenantProvider, MultiTenancy.TenantProvider>();
|
||||
services.AddSwaggerService(configuration, AppContext.BaseDirectory);
|
||||
services.AddTokenGeneratorService(configuration);
|
||||
services.RegisterAssembly();
|
||||
|
@ -98,13 +104,20 @@ namespace ModernWMS.Core.Extentions
|
|||
options.SerializerSettings.Converters.Add(new JsonStringTrimConverter());
|
||||
options.SerializerSettings.Formatting = Formatting.Indented;
|
||||
options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
|
||||
}).AddDataAnnotationsLocalization(options =>
|
||||
{
|
||||
}).AddDataAnnotationsLocalization(options => {
|
||||
options.DataAnnotationLocalizerProvider = (type, factory) =>
|
||||
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)
|
||||
{
|
||||
if (env.IsDevelopment())
|
||||
|
@ -118,20 +131,28 @@ namespace ModernWMS.Core.Extentions
|
|||
app.UseTokenGeneratorConfigure(configuration);
|
||||
app.UseAuthorization();
|
||||
app.UseMiddleware<GlobalExceptionMiddleware>();
|
||||
var support_languages = new[] { "zh-cn", "en-us" };
|
||||
var support_languages = new[] { "zh-cn", "en-us" };
|
||||
var localization_options = new RequestLocalizationOptions()
|
||||
.SetDefaultCulture(support_languages[0])
|
||||
.AddSupportedCultures(support_languages)
|
||||
.AddSupportedUICultures(support_languages);
|
||||
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 =>
|
||||
{
|
||||
endpoints.MapControllers();
|
||||
});
|
||||
}
|
||||
|
||||
#region Swagger
|
||||
|
||||
/// <summary>
|
||||
/// Swagger
|
||||
/// </summary>
|
||||
|
@ -163,6 +184,7 @@ namespace ModernWMS.Core.Extentions
|
|||
});
|
||||
});
|
||||
|
||||
|
||||
if (settings.XmlFiles != null && settings.XmlFiles.Count > 0)
|
||||
{
|
||||
settings.XmlFiles.ForEach(fileName =>
|
||||
|
@ -178,6 +200,7 @@ namespace ModernWMS.Core.Extentions
|
|||
c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
|
||||
c.OperationFilter<SecurityRequirementsOperationFilter>();
|
||||
|
||||
|
||||
c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
|
||||
{
|
||||
Description = "please input Bearer {token}",
|
||||
|
@ -186,10 +209,10 @@ namespace ModernWMS.Core.Extentions
|
|||
Type = SecuritySchemeType.ApiKey
|
||||
});
|
||||
c.SwaggerGeneratorOptions.DescribeAllParametersInCamelCase = false;
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// register Swagger
|
||||
/// </summary>
|
||||
|
@ -197,6 +220,7 @@ namespace ModernWMS.Core.Extentions
|
|||
/// <param name="configuration">配置文件</param>
|
||||
private static void UseSwaggerConfigure(this IApplicationBuilder app, IConfiguration configuration)
|
||||
{
|
||||
|
||||
var swaggerSettings = configuration.GetSection("SwaggerSettings");
|
||||
|
||||
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.RoutePrefix = "";
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Swagger
|
||||
#endregion
|
||||
|
||||
#region JWT
|
||||
|
||||
/// <summary>
|
||||
/// register JWT
|
||||
/// </summary>
|
||||
|
@ -227,6 +251,7 @@ namespace ModernWMS.Core.Extentions
|
|||
/// <param name="configuration">configuration</param>
|
||||
private static void AddTokenGeneratorService(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
|
||||
if (services == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(services));
|
||||
|
@ -239,7 +264,7 @@ namespace ModernWMS.Core.Extentions
|
|||
{
|
||||
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
|
||||
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
|
||||
options.DefaultChallengeScheme = nameof(ApiResponseHandler);
|
||||
options.DefaultChallengeScheme = nameof(ApiResponseHandler);
|
||||
options.DefaultForbidScheme = nameof(ApiResponseHandler);
|
||||
}
|
||||
)
|
||||
|
@ -258,23 +283,24 @@ namespace ModernWMS.Core.Extentions
|
|||
};
|
||||
})
|
||||
.AddScheme<AuthenticationSchemeOptions, ApiResponseHandler>(nameof(ApiResponseHandler), o => { });
|
||||
|
||||
}
|
||||
|
||||
private static void UseTokenGeneratorConfigure(this IApplicationBuilder app, IConfiguration configuration)
|
||||
{
|
||||
app.UseAuthentication();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion JWT
|
||||
|
||||
#region dynamic injection
|
||||
|
||||
#region dynamic injection
|
||||
/// <summary>
|
||||
/// judge the dll to be injected by IDependency
|
||||
/// judge the dll to be injected by IDependency
|
||||
/// </summary>
|
||||
/// <param name="services">services</param>
|
||||
private static IServiceCollection RegisterAssembly(this IServiceCollection services)
|
||||
{
|
||||
|
||||
|
||||
var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
|
||||
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>();
|
||||
|
||||
// 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;
|
||||
}
|
||||
/// <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>
|
||||
[Required(ErrorMessage ="Required")]
|
||||
[Display(Name = "user_name")]
|
||||
[MaxLength(128, ErrorMessage = "MaxLength")]
|
||||
[MaxLength(128,ErrorMessage = "MaxLength")]
|
||||
public string user_name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// password
|
||||
/// </summary>
|
||||
|
||||
[Required(ErrorMessage ="Required")]
|
||||
[Display(Name = "password")]
|
||||
[MaxLength(64, ErrorMessage = "MaxLength")]
|
||||
|
|
|
@ -645,4 +645,13 @@
|
|||
<data name="username_existed" xml:space="preserve">
|
||||
<value>User name already exists</value>
|
||||
</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>
|
|
@ -645,4 +645,19 @@
|
|||
<data name="username_existed" xml:space="preserve">
|
||||
<value>用户名已存在</value>
|
||||
</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>
|
|
@ -23,7 +23,7 @@
|
|||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
|
||||
<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.Design" Version="7.0.1">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
|
@ -45,6 +45,9 @@
|
|||
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0-silver.1" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
|
||||
<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>
|
||||
|
|
|
@ -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>
|
||||
/// PutAway
|
||||
/// </summary>
|
||||
|
@ -321,6 +334,27 @@ namespace ModernWMS.WMS.Controllers
|
|||
}
|
||||
|
||||
#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
|
||||
|
||||
}
|
||||
|
|
|
@ -2,69 +2,75 @@
|
|||
* date:2022-12-22
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// stock controller
|
||||
/// </summary>
|
||||
[Route("stock")]
|
||||
[ApiController]
|
||||
[ApiExplorerSettings(GroupName = "WMS")]
|
||||
public class StockController : BaseController
|
||||
{
|
||||
#region Args
|
||||
|
||||
/// <summary>
|
||||
/// stock Service
|
||||
/// </summary>
|
||||
private readonly IStockService _stockService;
|
||||
|
||||
/// <summary>
|
||||
/// Localizer Service
|
||||
/// </summary>
|
||||
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
|
||||
#endregion
|
||||
|
||||
#region constructor
|
||||
/// <summary>
|
||||
/// constructor
|
||||
/// </summary>
|
||||
/// <param name="stockService">stock Service</param>
|
||||
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// stock controller
|
||||
/// </summary>
|
||||
[Route("stock")]
|
||||
[ApiController]
|
||||
[ApiExplorerSettings(GroupName = "WMS")]
|
||||
public class StockController : BaseController
|
||||
{
|
||||
#region Args
|
||||
|
||||
/// <summary>
|
||||
/// stock Service
|
||||
/// </summary>
|
||||
private readonly IStockService _stockService;
|
||||
|
||||
/// <summary>
|
||||
/// Localizer Service
|
||||
/// </summary>
|
||||
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
|
||||
|
||||
#endregion Args
|
||||
|
||||
#region constructor
|
||||
|
||||
/// <summary>
|
||||
/// constructor
|
||||
/// </summary>
|
||||
/// <param name="stockService">stock Service</param>
|
||||
/// <param name="stringLocalizer">Localizer</param>
|
||||
public StockController(
|
||||
IStockService stockService
|
||||
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
|
||||
)
|
||||
{
|
||||
this._stockService = stockService;
|
||||
this._stringLocalizer= stringLocalizer;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Api
|
||||
/// <summary>
|
||||
/// stock details page search
|
||||
/// </summary>
|
||||
/// <param name="pageSearch">args</param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("stock-list")]
|
||||
public async Task<ResultModel<PageData<StockManagementViewModel>>> StockPageAsync(PageSearch pageSearch)
|
||||
{
|
||||
var (data, totals) = await _stockService.StockPageAsync(pageSearch, CurrentUser);
|
||||
|
||||
return ResultModel<PageData<StockManagementViewModel>>.Success(new PageData<StockManagementViewModel>
|
||||
{
|
||||
Rows = data,
|
||||
Totals = totals
|
||||
});
|
||||
}
|
||||
public StockController(
|
||||
IStockService stockService
|
||||
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
|
||||
)
|
||||
{
|
||||
this._stockService = stockService;
|
||||
this._stringLocalizer = stringLocalizer;
|
||||
}
|
||||
|
||||
#endregion constructor
|
||||
|
||||
#region Api
|
||||
|
||||
/// <summary>
|
||||
/// stock details page search
|
||||
/// </summary>
|
||||
/// <param name="pageSearch">args</param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("stock-list")]
|
||||
public async Task<ResultModel<PageData<StockManagementViewModel>>> StockPageAsync(PageSearch pageSearch)
|
||||
{
|
||||
var (data, totals) = await _stockService.StockPageAsync(pageSearch, CurrentUser);
|
||||
|
||||
return ResultModel<PageData<StockManagementViewModel>>.Success(new PageData<StockManagementViewModel>
|
||||
{
|
||||
Rows = data,
|
||||
Totals = totals
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// location stock page search
|
||||
/// </summary>
|
||||
|
@ -115,8 +121,19 @@
|
|||
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.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// stockprocess controller
|
||||
/// </summary>
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// stockprocess controller
|
||||
/// </summary>
|
||||
[Route("stockprocess")]
|
||||
[ApiController]
|
||||
[ApiExplorerSettings(GroupName = "WMS")]
|
||||
|
@ -194,6 +193,26 @@
|
|||
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
|
||||
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
* date:2022-12-20
|
||||
* developer:NoNo
|
||||
*/
|
||||
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
|
@ -31,9 +32,11 @@ namespace ModernWMS.WMS.Controllers
|
|||
/// Localizer Service
|
||||
/// </summary>
|
||||
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
|
||||
#endregion
|
||||
|
||||
#endregion Args
|
||||
|
||||
#region constructor
|
||||
|
||||
/// <summary>
|
||||
/// constructor
|
||||
/// </summary>
|
||||
|
@ -47,9 +50,11 @@ namespace ModernWMS.WMS.Controllers
|
|||
this._userService = userService;
|
||||
this._stringLocalizer = stringLocalizer;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion constructor
|
||||
|
||||
#region Api
|
||||
|
||||
/// <summary>
|
||||
/// get select items
|
||||
/// </summary>
|
||||
|
@ -60,6 +65,7 @@ namespace ModernWMS.WMS.Controllers
|
|||
var datas = await _userService.GetSelectItemsAsnyc(CurrentUser);
|
||||
return ResultModel<List<FormSelectItem>>.Success(datas);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// page search
|
||||
/// </summary>
|
||||
|
@ -112,6 +118,7 @@ namespace ModernWMS.WMS.Controllers
|
|||
return ResultModel<UserViewModel>.Error(_stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// add a new record
|
||||
/// </summary>
|
||||
|
@ -124,13 +131,14 @@ namespace ModernWMS.WMS.Controllers
|
|||
var (id, msg) = await _userService.AddAsync(viewModel, CurrentUser);
|
||||
if (id > 0)
|
||||
{
|
||||
return ResultModel<int>.Success(id);
|
||||
return ResultModel<int>.Success(id, msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ResultModel<int>.Error(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// register a new tenant
|
||||
/// </summary>
|
||||
|
@ -150,6 +158,7 @@ namespace ModernWMS.WMS.Controllers
|
|||
return ResultModel<string>.Error(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// import users by excel
|
||||
/// </summary>
|
||||
|
@ -168,6 +177,7 @@ namespace ModernWMS.WMS.Controllers
|
|||
return ResultModel<string>.Error(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// update a record
|
||||
/// </summary>
|
||||
|
@ -205,6 +215,7 @@ namespace ModernWMS.WMS.Controllers
|
|||
return ResultModel<string>.Error(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// reset password
|
||||
/// </summary>
|
||||
|
@ -223,6 +234,7 @@ namespace ModernWMS.WMS.Controllers
|
|||
return ResultModel<string>.Error(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// change password
|
||||
/// </summary>
|
||||
|
@ -241,8 +253,7 @@ namespace ModernWMS.WMS.Controllers
|
|||
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
|
||||
{
|
||||
|
||||
#region constructor
|
||||
/// <summary>
|
||||
/// constructor
|
||||
/// </summary>
|
||||
public DispatchlistViewModel()
|
||||
{
|
||||
|
||||
}
|
||||
#endregion
|
||||
#region constructor
|
||||
/// <summary>
|
||||
/// constructor
|
||||
/// </summary>
|
||||
public DispatchlistViewModel()
|
||||
{
|
||||
|
||||
}
|
||||
#endregion
|
||||
#region Property
|
||||
|
||||
/// <summary>
|
||||
/// id
|
||||
/// </summary>
|
||||
[Display(Name = "id")]
|
||||
public int id { get; set; } = 0;
|
||||
public int id { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// dispatch_no
|
||||
/// </summary>
|
||||
[Display(Name = "dispatch_no")]
|
||||
[MaxLength(32, ErrorMessage = "MaxLength")]
|
||||
public string dispatch_no { get; set; } = string.Empty;
|
||||
[MaxLength(32,ErrorMessage = "MaxLength")]
|
||||
public string dispatch_no { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// dispatch_status
|
||||
/// </summary>
|
||||
[Display(Name = "dispatch_status")]
|
||||
public byte dispatch_status { get; set; } = 0;
|
||||
public byte dispatch_status { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// customer_id
|
||||
/// </summary>
|
||||
[Display(Name = "customer_id")]
|
||||
public int customer_id { get; set; } = 0;
|
||||
public int customer_id { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// customer_name
|
||||
/// </summary>
|
||||
[Display(Name = "customer_name")]
|
||||
[MaxLength(256, ErrorMessage = "MaxLength")]
|
||||
public string customer_name { get; set; } = string.Empty;
|
||||
[MaxLength(256,ErrorMessage = "MaxLength")]
|
||||
public string customer_name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// sku_id
|
||||
/// </summary>
|
||||
[Display(Name = "sku_id")]
|
||||
public int sku_id { get; set; } = 0;
|
||||
public int sku_id { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// qty
|
||||
/// </summary>
|
||||
[Display(Name = "qty")]
|
||||
public int qty { get; set; } = 0;
|
||||
public int qty { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// weight
|
||||
/// </summary>
|
||||
[Display(Name = "weight")]
|
||||
public decimal weight { get; set; } = 0;
|
||||
public decimal weight { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// volume
|
||||
/// </summary>
|
||||
[Display(Name = "volume")]
|
||||
public decimal volume { get; set; } = 0;
|
||||
public decimal volume { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// creator
|
||||
/// </summary>
|
||||
[Display(Name = "creator")]
|
||||
[MaxLength(64, ErrorMessage = "MaxLength")]
|
||||
public string creator { get; set; } = string.Empty;
|
||||
[MaxLength(64,ErrorMessage = "MaxLength")]
|
||||
public string creator { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// create_time
|
||||
/// </summary>
|
||||
[Display(Name = "create_time")]
|
||||
[DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")]
|
||||
public DateTime create_time { get; set; } = UtilConvert.MinDate;
|
||||
[DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")]
|
||||
public DateTime create_time { get; set; } = UtilConvert.MinDate;
|
||||
|
||||
/// <summary>
|
||||
/// damage_qty
|
||||
/// </summary>
|
||||
[Display(Name = "damage_qty")]
|
||||
public int damage_qty { get; set; } = 0;
|
||||
public int damage_qty { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// lock_qty
|
||||
/// </summary>
|
||||
[Display(Name = "lock_qty")]
|
||||
public int lock_qty { get; set; } = 0;
|
||||
public int lock_qty { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// picked_qty
|
||||
/// </summary>
|
||||
[Display(Name = "picked_qty")]
|
||||
public int picked_qty { get; set; } = 0;
|
||||
public int picked_qty { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// unpicked_qty
|
||||
|
@ -123,13 +123,13 @@ namespace ModernWMS.WMS.Entities.ViewModels
|
|||
/// intrasit_qty
|
||||
/// </summary>
|
||||
[Display(Name = "intrasit_qty")]
|
||||
public int intrasit_qty { get; set; } = 0;
|
||||
public int intrasit_qty { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// package_qty
|
||||
/// </summary>
|
||||
[Display(Name = "package_qty")]
|
||||
public int package_qty { get; set; } = 0;
|
||||
public int package_qty { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// unpackage_qty
|
||||
|
@ -141,7 +141,7 @@ namespace ModernWMS.WMS.Entities.ViewModels
|
|||
/// weighing_qty
|
||||
/// </summary>
|
||||
[Display(Name = "weighing_qty")]
|
||||
public int weighing_qty { get; set; } = 0;
|
||||
public int weighing_qty { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// weighing_qty
|
||||
|
@ -153,87 +153,87 @@ namespace ModernWMS.WMS.Entities.ViewModels
|
|||
/// actual_qty
|
||||
/// </summary>
|
||||
[Display(Name = "actual_qty")]
|
||||
public int actual_qty { get; set; } = 0;
|
||||
public int actual_qty { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// sign_qty
|
||||
/// </summary>
|
||||
[Display(Name = "sign_qty")]
|
||||
public int sign_qty { get; set; } = 0;
|
||||
public int sign_qty { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// package_no
|
||||
/// </summary>
|
||||
[Display(Name = "package_no")]
|
||||
[MaxLength(32, ErrorMessage = "MaxLength")]
|
||||
public string package_no { get; set; } = string.Empty;
|
||||
[MaxLength(32,ErrorMessage = "MaxLength")]
|
||||
public string package_no { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// package_person
|
||||
/// </summary>
|
||||
[Display(Name = "package_person")]
|
||||
[MaxLength(64, ErrorMessage = "MaxLength")]
|
||||
public string package_person { get; set; } = string.Empty;
|
||||
[MaxLength(64,ErrorMessage = "MaxLength")]
|
||||
public string package_person { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// package_time
|
||||
/// </summary>
|
||||
[Display(Name = "package_time")]
|
||||
[DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")]
|
||||
public DateTime package_time { get; set; } = UtilConvert.MinDate;
|
||||
[DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")]
|
||||
public DateTime package_time { get; set; } = UtilConvert.MinDate;
|
||||
|
||||
/// <summary>
|
||||
/// weighing_no
|
||||
/// </summary>
|
||||
[Display(Name = "weighing_no")]
|
||||
[MaxLength(32, ErrorMessage = "MaxLength")]
|
||||
public string weighing_no { get; set; } = string.Empty;
|
||||
[MaxLength(32,ErrorMessage = "MaxLength")]
|
||||
public string weighing_no { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// weighing_person
|
||||
/// </summary>
|
||||
[Display(Name = "weighing_person")]
|
||||
[MaxLength(64, ErrorMessage = "MaxLength")]
|
||||
public string weighing_person { get; set; } = string.Empty;
|
||||
[MaxLength(64,ErrorMessage = "MaxLength")]
|
||||
public string weighing_person { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// weighing_weight
|
||||
/// </summary>
|
||||
[Display(Name = "weighing_weight")]
|
||||
public decimal weighing_weight { get; set; } = 0;
|
||||
public decimal weighing_weight { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// waybill_no
|
||||
/// </summary>
|
||||
[Display(Name = "waybill_no")]
|
||||
[MaxLength(64, ErrorMessage = "MaxLength")]
|
||||
public string waybill_no { get; set; } = string.Empty;
|
||||
[MaxLength(64,ErrorMessage = "MaxLength")]
|
||||
public string waybill_no { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// carrier
|
||||
/// </summary>
|
||||
[Display(Name = "carrier")]
|
||||
[MaxLength(256, ErrorMessage = "MaxLength")]
|
||||
public string carrier { get; set; } = string.Empty;
|
||||
[MaxLength(256,ErrorMessage = "MaxLength")]
|
||||
public string carrier { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// freightfee
|
||||
/// </summary>
|
||||
[Display(Name = "freightfee")]
|
||||
public decimal freightfee { get; set; } = 0;
|
||||
public decimal freightfee { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// last_update_time
|
||||
/// </summary>
|
||||
[Display(Name = "last_update_time")]
|
||||
[DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")]
|
||||
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
|
||||
[DataType(DataType.DateTime, ErrorMessage = "DataType_DateTime")]
|
||||
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
|
||||
|
||||
/// <summary>
|
||||
/// tenant_id
|
||||
/// </summary>
|
||||
[Display(Name = "tenant_id")]
|
||||
public long tenant_id { get; set; } = 0;
|
||||
public long tenant_id { get; set; } = 0;
|
||||
|
||||
|
||||
/// <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
|
||||
/// </summary>
|
||||
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>
|
||||
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>
|
||||
/// PutAway
|
||||
/// </summary>
|
||||
|
@ -123,6 +130,16 @@ namespace ModernWMS.WMS.IServices
|
|||
/// <returns></returns>
|
||||
Task<(bool flag, string msg)> PutAwayAsync(AsnPutAwayInputViewModel viewModel, CurrentUser currentUser);
|
||||
#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>
|
||||
/// <returns></returns>
|
||||
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
|
||||
* developer:NoNo
|
||||
*/
|
||||
using ModernWMS.Core.Services;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.Core.JWT;
|
||||
using ModernWMS.WMS.Entities.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
|
||||
using ModernWMS.Core.Services;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.Core.JWT;
|
||||
using ModernWMS.WMS.Entities.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
|
||||
namespace ModernWMS.WMS.IServices
|
||||
{
|
||||
/// <summary>
|
||||
/// Interface of StockService
|
||||
/// </summary>
|
||||
public interface IStockService : IBaseService<StockEntity>
|
||||
{
|
||||
#region Api
|
||||
/// <summary>
|
||||
/// page search
|
||||
/// </summary>
|
||||
/// <param name="pageSearch">args</param>
|
||||
/// <param name="currentUser">current user</param>
|
||||
/// <returns></returns>
|
||||
Task<(List<StockManagementViewModel> data, int totals)> StockPageAsync(PageSearch pageSearch, CurrentUser currentUser);
|
||||
public interface IStockService : IBaseService<StockEntity>
|
||||
{
|
||||
#region Api
|
||||
|
||||
/// <summary>
|
||||
/// page search
|
||||
/// </summary>
|
||||
/// <param name="pageSearch">args</param>
|
||||
/// <param name="currentUser">current user</param>
|
||||
/// <returns></returns>
|
||||
Task<(List<StockManagementViewModel> data, int totals)> StockPageAsync(PageSearch pageSearch, CurrentUser currentUser);
|
||||
|
||||
/// <summary>
|
||||
/// location stock page search
|
||||
/// </summary>
|
||||
|
@ -45,7 +49,15 @@ namespace ModernWMS.WMS.IServices
|
|||
/// <param name="currentUser">currentUser</param>
|
||||
/// <returns></returns>
|
||||
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>
|
||||
/// <returns></returns>
|
||||
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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ using ModernWMS.Core.Services;
|
|||
using ModernWMS.WMS.Entities.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using System.Text;
|
||||
|
||||
namespace ModernWMS.WMS.Services
|
||||
{
|
||||
|
@ -66,20 +67,29 @@ namespace ModernWMS.WMS.Services
|
|||
queries.Add(s);
|
||||
});
|
||||
}
|
||||
var Asns = _dBContext.GetDbSet<AsnEntity>().AsNoTracking();
|
||||
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 = 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 Skus = _dBContext.GetDbSet<SkuEntity>();
|
||||
var Asns = _dBContext.GetDbSet<AsnEntity>();
|
||||
var query = from m in Asns.AsNoTracking()
|
||||
join p in Spus.AsNoTracking() on m.spu_id equals p.id
|
||||
join k in Skus.AsNoTracking() on m.sku_id equals k.id
|
||||
var Spus = _dBContext.GetDbSet<SpuEntity>().AsNoTracking();
|
||||
var Skus = _dBContext.GetDbSet<SkuEntity>().AsNoTracking();
|
||||
var query = from m in Asns
|
||||
join p in Spus on m.spu_id equals p.id
|
||||
join k in Skus on m.sku_id equals k.id
|
||||
where m.tenant_id == currentUser.tenant_id
|
||||
&& (asn_status == 255 || m.asn_status == asn_status)
|
||||
select new AsnViewModel
|
||||
{
|
||||
id = m.id,
|
||||
|
@ -154,8 +164,8 @@ namespace ModernWMS.WMS.Services
|
|||
shortage_qty = m.shortage_qty,
|
||||
more_qty = m.more_qty,
|
||||
damage_qty = m.damage_qty,
|
||||
weight = m.weight,
|
||||
volume = m.volume,
|
||||
weight = k.weight * m.asn_qty,
|
||||
volume = k.volume * m.asn_qty,
|
||||
supplier_id = m.supplier_id,
|
||||
supplier_name = m.supplier_name,
|
||||
goods_owner_id = m.goods_owner_id,
|
||||
|
@ -350,11 +360,11 @@ namespace ModernWMS.WMS.Services
|
|||
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
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;
|
||||
var qty = await _dBContext.SaveChangesAsync();
|
||||
|
@ -378,11 +388,11 @@ namespace ModernWMS.WMS.Services
|
|||
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
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;
|
||||
var qty = await _dBContext.SaveChangesAsync();
|
||||
|
@ -408,11 +418,11 @@ namespace ModernWMS.WMS.Services
|
|||
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
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.last_update_time = DateTime.Now;
|
||||
|
@ -439,11 +449,11 @@ namespace ModernWMS.WMS.Services
|
|||
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
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.last_update_time = DateTime.Now;
|
||||
|
@ -471,11 +481,11 @@ namespace ModernWMS.WMS.Services
|
|||
var entity = await Asns.FirstOrDefaultAsync(t => t.id == viewModel.asn_id);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
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
|
||||
{
|
||||
|
@ -511,11 +521,11 @@ namespace ModernWMS.WMS.Services
|
|||
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
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;
|
||||
if (entity.sorted_qty > entity.asn_qty)
|
||||
|
@ -550,15 +560,15 @@ namespace ModernWMS.WMS.Services
|
|||
var entity = await Asns.FirstOrDefaultAsync(t => t.id == id);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
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)
|
||||
{
|
||||
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.sorted_qty = 0;
|
||||
|
@ -577,6 +587,32 @@ namespace ModernWMS.WMS.Services
|
|||
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>
|
||||
/// PutAway
|
||||
/// </summary>
|
||||
|
@ -591,21 +627,21 @@ namespace ModernWMS.WMS.Services
|
|||
var Location = await Goodslocations.FirstOrDefaultAsync(t => t.id.Equals(viewModel.goods_location_id));
|
||||
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);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
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)
|
||||
{
|
||||
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;
|
||||
if (Location.warehouse_area_property.Equals(5))
|
||||
|
@ -651,6 +687,97 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
}
|
||||
#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
|
||||
* developer:NoNo
|
||||
*/
|
||||
|
||||
using Mapster;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
@ -16,6 +17,7 @@ using ModernWMS.WMS.Entities.Models;
|
|||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace ModernWMS.WMS.Services
|
||||
{
|
||||
|
@ -25,6 +27,7 @@ namespace ModernWMS.WMS.Services
|
|||
public class DispatchlistService : BaseService<DispatchlistEntity>, IDispatchlistService
|
||||
{
|
||||
#region Args
|
||||
|
||||
/// <summary>
|
||||
/// The DBContext
|
||||
/// </summary>
|
||||
|
@ -34,9 +37,11 @@ namespace ModernWMS.WMS.Services
|
|||
/// Localizer Service
|
||||
/// </summary>
|
||||
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
|
||||
#endregion
|
||||
|
||||
#endregion Args
|
||||
|
||||
#region constructor
|
||||
|
||||
/// <summary>
|
||||
///Dispatchlist constructor
|
||||
/// </summary>
|
||||
|
@ -50,9 +55,11 @@ namespace ModernWMS.WMS.Services
|
|||
this._dBContext = dBContext;
|
||||
this._stringLocalizer = stringLocalizer;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion constructor
|
||||
|
||||
#region Api
|
||||
|
||||
/// <summary>
|
||||
/// page search
|
||||
/// </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)));
|
||||
}
|
||||
|
||||
int totals = await query.CountAsync();
|
||||
var list = await query.OrderByDescending(t => t.create_time)
|
||||
.Skip((pageSearch.pageIndex - 1) * pageSearch.pageSize)
|
||||
|
@ -143,6 +151,7 @@ namespace ModernWMS.WMS.Services
|
|||
.ToListAsync();
|
||||
return (list, totals);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// get dispatchlist by dispatch_no
|
||||
/// </summary>
|
||||
|
@ -201,6 +210,7 @@ namespace ModernWMS.WMS.Services
|
|||
}).ToListAsync();
|
||||
return datas;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// update dispatchlist with same dispatch_no
|
||||
/// </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();
|
||||
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)
|
||||
{
|
||||
|
@ -227,7 +237,7 @@ namespace ModernWMS.WMS.Services
|
|||
var entity = entities.FirstOrDefault(t => t.id == -vm.id);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
DBSet.Remove(entity);
|
||||
delete_id_list.Add(entity.id);
|
||||
|
@ -237,7 +247,7 @@ namespace ModernWMS.WMS.Services
|
|||
var entity = entities.FirstOrDefault(t => t.id == vm.id);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
entity.sku_id = vm.sku_id;
|
||||
entity.qty = vm.qty;
|
||||
|
@ -261,7 +271,6 @@ namespace ModernWMS.WMS.Services
|
|||
dispatch_status = dispatch_status,
|
||||
sku_id = vm.sku_id,
|
||||
qty = vm.qty
|
||||
|
||||
};
|
||||
var sku = skus.FirstOrDefault(t => t.id == entity.sku_id);
|
||||
if (sku != null)
|
||||
|
@ -291,9 +300,10 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["save_failed"]);
|
||||
return (false, "[202]" + _stringLocalizer["save_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// get pick list by dispatch_id
|
||||
/// </summary>
|
||||
|
@ -332,7 +342,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// advanced dispatch order page search
|
||||
/// advanced dispatch order page search
|
||||
/// </summary>
|
||||
/// <param name="pageSearch">args</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("=", ""));
|
||||
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();
|
||||
var list = await query.OrderByDescending(t => t.dispatch_no)
|
||||
.Skip((pageSearch.pageIndex - 1) * pageSearch.pageSize)
|
||||
.Take(pageSearch.pageSize)
|
||||
.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 d_datas = await (from d in DbSet.AsNoTracking()
|
||||
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.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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get dispatchlist by dispatch_no
|
||||
/// </summary>
|
||||
|
@ -455,7 +474,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// add a new Dispatchlist
|
||||
/// add a new Dispatchlist
|
||||
/// </summary>
|
||||
/// <param name="viewModel">viewmodel</param>
|
||||
/// <param name="currentUser">current user</param>
|
||||
|
@ -490,7 +509,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["save_failed"]);
|
||||
return (false, "[202]" + _stringLocalizer["save_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -515,7 +534,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["delete_failed"]);
|
||||
return (false, "[202]" + _stringLocalizer["delete_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -685,7 +704,6 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -718,7 +736,7 @@ namespace ModernWMS.WMS.Services
|
|||
var d = dispatchlist_datas.Where(t => t.id == vm.dispatchlist_id).FirstOrDefault();
|
||||
if (d == null)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
if (vm.confirm == true)
|
||||
{
|
||||
|
@ -824,7 +842,7 @@ namespace ModernWMS.WMS.Services
|
|||
select tp).Any();
|
||||
if (if_not_stock)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
await pick_DBSet.AddRangeAsync(pick_datas);
|
||||
var dispatch_no = await GetOrderCode(currentUser);
|
||||
|
@ -849,12 +867,12 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["operation_failed"]);
|
||||
return (false, "[202]" + _stringLocalizer["operation_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// cancel order opration
|
||||
/// cancel order opration
|
||||
/// </summary>
|
||||
/// <param name="viewModel">viewmodel</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();
|
||||
if (entities.Count == 0)
|
||||
{
|
||||
return (false, _stringLocalizer["status_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["status_changed"]);
|
||||
}
|
||||
var time = DateTime.Now;
|
||||
var dispatch_id_list = entities.Select(t => t.id).ToList();
|
||||
|
@ -914,7 +932,7 @@ namespace ModernWMS.WMS.Services
|
|||
var proposedValues = entry.CurrentValues;
|
||||
var databaseValues = entry.GetDatabaseValues();
|
||||
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
|
||||
entry.OriginalValues.SetValues(databaseValues);
|
||||
}
|
||||
|
@ -931,7 +949,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["operation_failed"]);
|
||||
return (false, "[202]" + _stringLocalizer["operation_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -947,7 +965,7 @@ namespace ModernWMS.WMS.Services
|
|||
var time = DateTime.Now;
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
return (false, "[202]" + _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
if (entity.dispatch_status == 4)
|
||||
{
|
||||
|
@ -981,7 +999,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["status_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["status_changed"]);
|
||||
}
|
||||
entity.last_update_time = time;
|
||||
var qty = await _dBContext.SaveChangesAsync();
|
||||
|
@ -991,7 +1009,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["operation_failed"]);
|
||||
return (false, "[202]" + _stringLocalizer["operation_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1026,7 +1044,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
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);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
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.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"]));
|
||||
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)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1114,7 +1132,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
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);
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
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.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"]));
|
||||
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)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1204,7 +1222,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
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)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
entity.last_update_time = time;
|
||||
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 = await picks_g.ToListAsync();
|
||||
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();
|
||||
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);
|
||||
if (s == null)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
s.qty -= pick.picked_qty;
|
||||
s.last_update_time = time;
|
||||
|
@ -1258,6 +1276,7 @@ namespace ModernWMS.WMS.Services
|
|||
pick.is_update_stock = true;
|
||||
pick.last_update_time = DateTime.Now;
|
||||
}
|
||||
pick_DBSet.UpdateRange(pick_datas);
|
||||
var saved = false;
|
||||
int res = 0;
|
||||
while (!saved)
|
||||
|
@ -1278,7 +1297,7 @@ namespace ModernWMS.WMS.Services
|
|||
var databaseValues = entry.GetDatabaseValues();
|
||||
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;
|
||||
}
|
||||
|
@ -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"]));
|
||||
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["last_update_time"] = DateTime.Now;
|
||||
|
@ -1309,9 +1328,10 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["operation_failed"]);
|
||||
return (false, "[202]" + _stringLocalizer["operation_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// set dispatchlist freightfee
|
||||
/// </summary>
|
||||
|
@ -1354,9 +1374,10 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["operation_failed"]);
|
||||
return (false, "[202]" + _stringLocalizer["operation_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// sign for arrival
|
||||
/// </summary>
|
||||
|
@ -1372,7 +1393,7 @@ namespace ModernWMS.WMS.Services
|
|||
var vm = viewModels.FirstOrDefault(t => t.id == t.id && t.dispatch_status == entity.dispatch_status);
|
||||
if (vm == null)
|
||||
{
|
||||
return (false, _stringLocalizer["data_changed"]);
|
||||
return (false, "[202]" + _stringLocalizer["data_changed"]);
|
||||
}
|
||||
entity.sign_qty = entity.actual_qty - vm.damage_qty;
|
||||
entity.damage_qty = vm.damage_qty;
|
||||
|
@ -1386,9 +1407,10 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
return (false, _stringLocalizer["operation_failed"]);
|
||||
return (false, "[202]" + _stringLocalizer["operation_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// get next order code number
|
||||
/// </summary>
|
||||
|
@ -1432,7 +1454,106 @@ namespace ModernWMS.WMS.Services
|
|||
long timeStamp = Convert.ToInt32(DateTime.Now.Subtract(_dtStart).TotalSeconds);
|
||||
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>
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
return (true, _stringLocalizer["delete_success"]);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
* date:2022-12-22
|
||||
* developer:NoNo
|
||||
*/
|
||||
|
||||
using Mapster;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using ModernWMS.Core.DBContext;
|
||||
|
@ -25,6 +26,7 @@ namespace ModernWMS.WMS.Services
|
|||
public class StockService : BaseService<StockEntity>, IStockService
|
||||
{
|
||||
#region Args
|
||||
|
||||
/// <summary>
|
||||
/// The DBContext
|
||||
/// </summary>
|
||||
|
@ -34,9 +36,11 @@ namespace ModernWMS.WMS.Services
|
|||
/// Localizer Service
|
||||
/// </summary>
|
||||
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
|
||||
#endregion
|
||||
|
||||
#endregion Args
|
||||
|
||||
#region constructor
|
||||
|
||||
/// <summary>
|
||||
///Stock constructor
|
||||
/// </summary>
|
||||
|
@ -50,11 +54,11 @@ namespace ModernWMS.WMS.Services
|
|||
this._dBContext = dBContext;
|
||||
this._stringLocalizer = stringLocalizer;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion constructor
|
||||
|
||||
#region Api
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// stock page search
|
||||
/// </summary>
|
||||
|
@ -80,15 +84,15 @@ namespace ModernWMS.WMS.Services
|
|||
var processdetail_DBSet = _dBContext.GetDbSet<StockprocessdetailEntity>().AsNoTracking();
|
||||
var move_DBSet = _dBContext.GetDbSet<StockmoveEntity>();
|
||||
var stock_group_datas = from stock in DbSet.AsNoTracking()
|
||||
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
|
||||
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
|
||||
select new
|
||||
{
|
||||
sku_id = sg.Key,
|
||||
qty_frozen = sg.Where(t => t.stock.is_freeze == true).Sum(e => e.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_frozen = sg.Where(t=>t.gl.warehouse_area_property != 5 && t.stock.is_freeze == true).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),
|
||||
};
|
||||
var asn_group_datas = from asn in asn_DBSet.AsNoTracking()
|
||||
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
|
||||
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
|
||||
group new { pd , gl } by pd.sku_id into pdg
|
||||
group new { pd, gl } by pd.sku_id into pdg
|
||||
select new
|
||||
{
|
||||
sku_id = pdg.Key,
|
||||
|
@ -121,16 +125,16 @@ namespace ModernWMS.WMS.Services
|
|||
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
|
||||
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
|
||||
{
|
||||
sku_id = mg.Key,
|
||||
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
|
||||
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()
|
||||
join sg in stock_group_datas on sku.id equals sg.sku_id into sg_left
|
||||
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
|
||||
from m in m_left.DefaultIfEmpty()
|
||||
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
|
||||
{
|
||||
sku_id = sku.id,
|
||||
spu_name = spu.spu_name,
|
||||
spu_code = spu.spu_code,
|
||||
sku_code = sku.sku_code,
|
||||
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_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_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_sorted = ag.qty_sorted==null?0:ag.qty_sorted,
|
||||
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_to_sort = ag.qty_to_sort == null ? 0 : ag.qty_to_sort,
|
||||
shortage_qty = ag.shortage_qty == null ? 0 : ag.shortage_qty,
|
||||
qty_to_unload = ag.qty_to_unload == null ? 0 : ag.qty_to_unload,
|
||||
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();
|
||||
var list = await query.OrderBy(t => t.sku_code)
|
||||
.Skip((pageSearch.pageIndex - 1) * pageSearch.pageSize)
|
||||
|
@ -195,11 +199,12 @@ namespace ModernWMS.WMS.Services
|
|||
|
||||
var stock_group_datas = from stock in DbSet.AsNoTracking()
|
||||
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
|
||||
{
|
||||
sku_id = sg.Key.sku_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 = sg.Sum(t => t.qty)
|
||||
};
|
||||
|
@ -207,38 +212,41 @@ namespace ModernWMS.WMS.Services
|
|||
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 } into dg
|
||||
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,
|
||||
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 } into pdg
|
||||
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,
|
||||
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 } into mg
|
||||
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,
|
||||
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 } 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()
|
||||
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()
|
||||
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()
|
||||
join sku in sku_DBSet on sg.sku_id equals sku.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,
|
||||
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_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_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_owner_id,
|
||||
};
|
||||
query = query.Where(t => t.qty > 0).Where(queries.AsExpression<LocationStockManagementViewModel>());
|
||||
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
|
||||
from owner in o_left.DefaultIfEmpty()
|
||||
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
|
||||
, sg.qty , gl.location_name, sg.is_freeze, gl.warehouse_name ,sg.id,sku.unit,sg.tenant_id} into g
|
||||
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
|
||||
,
|
||||
sg.qty,
|
||||
gl.location_name,
|
||||
sg.is_freeze,
|
||||
gl.warehouse_name,
|
||||
sg.id,
|
||||
sku.unit,
|
||||
sg.tenant_id
|
||||
} into g
|
||||
select new StockViewModel
|
||||
{
|
||||
sku_id = g.Key.sku_id,
|
||||
|
@ -345,9 +371,9 @@ namespace ModernWMS.WMS.Services
|
|||
spu_code = g.Key.spu_code,
|
||||
sku_code = g.Key.sku_code,
|
||||
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,
|
||||
goods_location_id= g.Key.goods_location_id,
|
||||
goods_location_id = g.Key.goods_location_id,
|
||||
goods_owner_id = g.Key.goods_owner_id,
|
||||
location_name = g.Key.location_name,
|
||||
warehouse_name = g.Key.warehouse_name,
|
||||
|
@ -355,17 +381,16 @@ namespace ModernWMS.WMS.Services
|
|||
id = g.Key.id,
|
||||
tenant_id = g.Key.tenant_id,
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
@ -411,7 +436,7 @@ namespace ModernWMS.WMS.Services
|
|||
supplier_name = spu.supplier_name,
|
||||
brand = spu.brand,
|
||||
origin = spu.origin,
|
||||
sku_id = sku.id
|
||||
sku_id = sku.id,
|
||||
};
|
||||
query = query.Where(queries.AsExpression<SkuSelectViewModel>());
|
||||
int totals = await query.CountAsync();
|
||||
|
@ -421,7 +446,110 @@ namespace ModernWMS.WMS.Services
|
|||
.ToListAsync();
|
||||
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
|
||||
* developer:NoNo
|
||||
*/
|
||||
|
||||
using Mapster;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using ModernWMS.Core.DBContext;
|
||||
|
@ -26,6 +27,7 @@ namespace ModernWMS.WMS.Services
|
|||
public class StockmoveService : BaseService<StockmoveEntity>, IStockmoveService
|
||||
{
|
||||
#region Args
|
||||
|
||||
/// <summary>
|
||||
/// The DBContext
|
||||
/// </summary>
|
||||
|
@ -35,9 +37,11 @@ namespace ModernWMS.WMS.Services
|
|||
/// Localizer Service
|
||||
/// </summary>
|
||||
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
|
||||
#endregion
|
||||
|
||||
#endregion Args
|
||||
|
||||
#region constructor
|
||||
|
||||
/// <summary>
|
||||
///Stockmove constructor
|
||||
/// </summary>
|
||||
|
@ -51,9 +55,11 @@ namespace ModernWMS.WMS.Services
|
|||
this._dBContext = dBContext;
|
||||
this._stringLocalizer = stringLocalizer;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion constructor
|
||||
|
||||
#region Api
|
||||
|
||||
/// <summary>
|
||||
/// page search
|
||||
/// </summary>
|
||||
|
@ -120,36 +126,36 @@ namespace ModernWMS.WMS.Services
|
|||
{
|
||||
var DbSet = _dBContext.GetDbSet<StockmoveEntity>();
|
||||
var location_DBSet = _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking();
|
||||
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 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 dest_location in location_DBSet on m.dest_googs_location_id equals dest_location.id
|
||||
select new StockmoveViewModel
|
||||
{
|
||||
id = m.id,
|
||||
job_code = m.job_code,
|
||||
move_status = m.move_status,
|
||||
sku_id = m.sku_id,
|
||||
orig_goods_location_id = m.orig_goods_location_id,
|
||||
dest_googs_location_id = m.dest_googs_location_id,
|
||||
qty = m.qty,
|
||||
goods_owner_id = m.goods_owner_id,
|
||||
handler = m.handler,
|
||||
handle_time = m.handle_time,
|
||||
creator = m.creator,
|
||||
create_time = m.create_time,
|
||||
last_update_time = m.last_update_time,
|
||||
tenant_id = m.tenant_id,
|
||||
sku_code = sku.sku_code,
|
||||
sku_name = sku.sku_name,
|
||||
spu_code = spu.spu_code,
|
||||
spu_name = spu.spu_name,
|
||||
dest_googs_location_name = dest_location.location_name,
|
||||
dest_googs_warehouse = dest_location.warehouse_name,
|
||||
orig_goods_location_name = orig_location.location_name,
|
||||
orig_goods_warehouse = orig_location.warehouse_name,
|
||||
}
|
||||
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 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 dest_location in location_DBSet on m.dest_googs_location_id equals dest_location.id
|
||||
select new StockmoveViewModel
|
||||
{
|
||||
id = m.id,
|
||||
job_code = m.job_code,
|
||||
move_status = m.move_status,
|
||||
sku_id = m.sku_id,
|
||||
orig_goods_location_id = m.orig_goods_location_id,
|
||||
dest_googs_location_id = m.dest_googs_location_id,
|
||||
qty = m.qty,
|
||||
goods_owner_id = m.goods_owner_id,
|
||||
handler = m.handler,
|
||||
handle_time = m.handle_time,
|
||||
creator = m.creator,
|
||||
create_time = m.create_time,
|
||||
last_update_time = m.last_update_time,
|
||||
tenant_id = m.tenant_id,
|
||||
sku_code = sku.sku_code,
|
||||
sku_name = sku.sku_name,
|
||||
spu_code = spu.spu_code,
|
||||
spu_name = spu.spu_name,
|
||||
dest_googs_location_name = dest_location.location_name,
|
||||
dest_googs_warehouse = dest_location.warehouse_name,
|
||||
orig_goods_location_name = orig_location.location_name,
|
||||
orig_goods_warehouse = orig_location.warehouse_name,
|
||||
}
|
||||
).ToListAsync();
|
||||
return data.Adapt<List<StockmoveViewModel>>();
|
||||
}
|
||||
|
@ -163,42 +169,43 @@ namespace ModernWMS.WMS.Services
|
|||
var DbSet = _dBContext.GetDbSet<StockmoveEntity>();
|
||||
var location_DBSet = _dBContext.GetDbSet<GoodslocationEntity>().AsNoTracking();
|
||||
var data = await (from m in DbSet.AsNoTracking()
|
||||
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 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
|
||||
where m.id == id
|
||||
select new StockmoveViewModel
|
||||
{
|
||||
id = m.id,
|
||||
job_code = m.job_code,
|
||||
move_status = m.move_status,
|
||||
sku_id = m.sku_id,
|
||||
orig_goods_location_id = m.orig_goods_location_id,
|
||||
dest_googs_location_id = m.dest_googs_location_id,
|
||||
qty = m.qty,
|
||||
goods_owner_id = m.goods_owner_id,
|
||||
handler = m.handler,
|
||||
handle_time = m.handle_time,
|
||||
creator = m.creator,
|
||||
create_time = m.create_time,
|
||||
last_update_time = m.last_update_time,
|
||||
tenant_id = m.tenant_id,
|
||||
sku_code = sku.sku_code,
|
||||
sku_name = sku.sku_name,
|
||||
spu_code = spu.spu_code,
|
||||
spu_name = spu.spu_name,
|
||||
dest_googs_location_name = dest_location.location_name,
|
||||
dest_googs_warehouse = dest_location.warehouse_name,
|
||||
orig_goods_location_name = orig_location.location_name,
|
||||
orig_goods_warehouse = orig_location.warehouse_name,
|
||||
}).FirstOrDefaultAsync();
|
||||
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 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
|
||||
where m.id == id
|
||||
select new StockmoveViewModel
|
||||
{
|
||||
id = m.id,
|
||||
job_code = m.job_code,
|
||||
move_status = m.move_status,
|
||||
sku_id = m.sku_id,
|
||||
orig_goods_location_id = m.orig_goods_location_id,
|
||||
dest_googs_location_id = m.dest_googs_location_id,
|
||||
qty = m.qty,
|
||||
goods_owner_id = m.goods_owner_id,
|
||||
handler = m.handler,
|
||||
handle_time = m.handle_time,
|
||||
creator = m.creator,
|
||||
create_time = m.create_time,
|
||||
last_update_time = m.last_update_time,
|
||||
tenant_id = m.tenant_id,
|
||||
sku_code = sku.sku_code,
|
||||
sku_name = sku.sku_name,
|
||||
spu_code = spu.spu_code,
|
||||
spu_name = spu.spu_name,
|
||||
dest_googs_location_name = dest_location.location_name,
|
||||
dest_googs_warehouse = dest_location.warehouse_name,
|
||||
orig_goods_location_name = orig_location.location_name,
|
||||
orig_goods_warehouse = orig_location.warehouse_name,
|
||||
}).FirstOrDefaultAsync();
|
||||
if (data == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// add a new record
|
||||
/// </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_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
|
||||
&& 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
|
||||
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_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
|
||||
{
|
||||
sku_id = dg.Key.sku_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)
|
||||
};
|
||||
var process_locked_group_datas = from pd in processdetail_DBSet
|
||||
where pd.is_update_stock == false
|
||||
&& 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
|
||||
{
|
||||
sku_id = pdg.Key.sku_id,
|
||||
goods_location_id = pdg.Key.goods_location_id,
|
||||
pdg.Key.goods_owner_id,
|
||||
qty_locked = pdg.Sum(t => t.qty)
|
||||
};
|
||||
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
|
||||
group sm by new { sm.sku_id, goods_location_id = sm.orig_goods_location_id } into smg
|
||||
select new {
|
||||
smg.Key.sku_id,
|
||||
smg.Key.goods_location_id,
|
||||
qty_locked = smg.Sum(t => t.qty)
|
||||
&& sm.goods_owner_id == entity.goods_owner_id
|
||||
group sm by new { sm.sku_id, goods_location_id = sm.orig_goods_location_id, sm.goods_owner_id } into smg
|
||||
select new
|
||||
{
|
||||
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()
|
||||
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()
|
||||
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()
|
||||
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()
|
||||
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
|
||||
{
|
||||
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();
|
||||
var dest_stock = await stock_DBSet.FirstOrDefaultAsync(t => t.goods_location_id == entity.dest_googs_location_id && t.sku_id == entity.sku_id);
|
||||
if(orig_stock == null || orig_stock.qty_available<entity.qty)
|
||||
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)
|
||||
{
|
||||
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"]);
|
||||
}
|
||||
entity.id = 0;
|
||||
entity.move_status= 0;
|
||||
entity.move_status = 0;
|
||||
entity.create_time = DateTime.Now;
|
||||
entity.creator = currentUser.user_name;
|
||||
entity.last_update_time = DateTime.Now;
|
||||
entity.tenant_id = currentUser.tenant_id;
|
||||
entity.job_code =await GetOrderCode(currentUser);
|
||||
entity.job_code = await GetOrderCode(currentUser);
|
||||
await DbSet.AddAsync(entity);
|
||||
await _dBContext.SaveChangesAsync();
|
||||
if (entity.id > 0)
|
||||
|
@ -285,16 +299,17 @@ namespace ModernWMS.WMS.Services
|
|||
return (0, _stringLocalizer["save_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// confirm move
|
||||
/// </summary>
|
||||
/// <param name="id">id</param>
|
||||
/// <param name="currentUser">current user</param>
|
||||
/// <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 stock_DBSet = _dBContext.GetDbSet<StockEntity>();
|
||||
var stock_DBSet = _dBContext.GetDbSet<StockEntity>();
|
||||
var entity = await DbSet.FirstOrDefaultAsync(t => t.id.Equals(id));
|
||||
if (entity == null)
|
||||
{
|
||||
|
@ -304,21 +319,21 @@ namespace ModernWMS.WMS.Services
|
|||
entity.handle_time = DateTime.Now;
|
||||
entity.move_status = 1;
|
||||
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 dest_stock = await stock_DBSet.FirstOrDefaultAsync(t=>t.goods_location_id == entity.dest_googs_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.goods_owner_id == entity.goods_owner_id && t.sku_id == entity.sku_id);
|
||||
if (orig_stock != null)
|
||||
{
|
||||
if(orig_stock.qty == entity.qty)
|
||||
if (orig_stock.qty == entity.qty)
|
||||
{
|
||||
stock_DBSet.Remove(orig_stock);
|
||||
}
|
||||
else
|
||||
{
|
||||
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
|
||||
{
|
||||
|
@ -361,7 +376,7 @@ namespace ModernWMS.WMS.Services
|
|||
{
|
||||
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;
|
||||
}
|
||||
|
@ -371,7 +386,7 @@ namespace ModernWMS.WMS.Services
|
|||
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;
|
||||
}
|
||||
|
@ -394,6 +409,7 @@ namespace ModernWMS.WMS.Services
|
|||
return (false, _stringLocalizer["operation_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// delete a record
|
||||
/// </summary>
|
||||
|
@ -401,7 +417,7 @@ namespace ModernWMS.WMS.Services
|
|||
/// <returns></returns>
|
||||
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)
|
||||
{
|
||||
return (true, _stringLocalizer["delete_success"]);
|
||||
|
@ -420,7 +436,7 @@ namespace ModernWMS.WMS.Services
|
|||
{
|
||||
string code;
|
||||
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)
|
||||
{
|
||||
code = date + "-0001";
|
||||
|
@ -443,7 +459,7 @@ namespace ModernWMS.WMS.Services
|
|||
|
||||
return code;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Api
|
||||
}
|
||||
}
|
|
@ -19,6 +19,7 @@ using System.Collections.Generic;
|
|||
using Microsoft.AspNetCore.Mvc.Formatters.Xml;
|
||||
using Microsoft.AspNetCore.SignalR.Protocol;
|
||||
using System.Linq;
|
||||
using Microsoft.CodeAnalysis;
|
||||
|
||||
namespace ModernWMS.WMS.Services
|
||||
{
|
||||
|
@ -150,7 +151,7 @@ namespace ModernWMS.WMS.Services
|
|||
spu_code = spu.spu_code,
|
||||
spu_name = spu.spu_name,
|
||||
unit = sku.unit,
|
||||
location_name = gl.location_name == null?"":gl.location_name
|
||||
location_name = gl.location_name == null ? "" : gl.location_name
|
||||
}).ToListAsync();
|
||||
if (entity == null)
|
||||
{
|
||||
|
@ -163,7 +164,7 @@ namespace ModernWMS.WMS.Services
|
|||
where a.job_type == 2 && d.stock_process_id == id
|
||||
select a
|
||||
).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.target_detail_list = details.Where(t => t.is_source == false).ToList();
|
||||
return res;
|
||||
|
@ -226,7 +227,7 @@ namespace ModernWMS.WMS.Services
|
|||
await DbSet.AddAsync(entity);
|
||||
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.id = 0;
|
||||
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)
|
||||
{
|
||||
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();
|
||||
if (qty > 0)
|
||||
{
|
||||
|
@ -359,7 +360,7 @@ namespace ModernWMS.WMS.Services
|
|||
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);
|
||||
d.is_update_stock= true;
|
||||
d.is_update_stock = true;
|
||||
d.last_update_time = DateTime.Now;
|
||||
if (d.is_source)
|
||||
{
|
||||
|
@ -372,16 +373,16 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
if(stock == null)
|
||||
if (stock == null)
|
||||
{
|
||||
await stock_DBSet.AddAsync(new StockEntity
|
||||
{
|
||||
sku_id= d.sku_id,
|
||||
goods_location_id= d.goods_location_id,
|
||||
goods_owner_id= d.goods_owner_id,
|
||||
is_freeze =false,
|
||||
last_update_time =DateTime.Now,
|
||||
qty= d.qty,
|
||||
sku_id = d.sku_id,
|
||||
goods_location_id = d.goods_location_id,
|
||||
goods_owner_id = d.goods_owner_id,
|
||||
is_freeze = false,
|
||||
last_update_time = DateTime.Now,
|
||||
qty = d.qty,
|
||||
tenant_id = currentUser.tenant_id
|
||||
});
|
||||
}
|
||||
|
@ -412,7 +413,7 @@ namespace ModernWMS.WMS.Services
|
|||
{
|
||||
var DBSet = _dBContext.GetDbSet<StockprocessEntity>();
|
||||
var entity = await DBSet.FirstOrDefaultAsync(t => t.id == id);
|
||||
if(entity == null)
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
|
@ -440,8 +441,8 @@ namespace ModernWMS.WMS.Services
|
|||
{
|
||||
string code;
|
||||
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);
|
||||
if (maxNo == null)
|
||||
string maxNo = await _dBContext.GetDbSet<StockprocessEntity>().AsNoTracking().Where(t => t.tenant_id == currentUser.tenant_id).MaxAsync(t => t.job_code);
|
||||
if (maxNo == null)
|
||||
{
|
||||
code = date + "-0001";
|
||||
}
|
||||
|
@ -460,7 +461,7 @@ namespace ModernWMS.WMS.Services
|
|||
code = date + "-0001";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return code;
|
||||
}
|
||||
/// <summary>
|
||||
|
@ -494,6 +495,181 @@ namespace ModernWMS.WMS.Services
|
|||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
* date:2022-12-20
|
||||
* developer:NoNo
|
||||
*/
|
||||
|
||||
using Mapster;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using ModernWMS.Core.DBContext;
|
||||
|
@ -26,6 +27,7 @@ namespace ModernWMS.WMS.Services
|
|||
public class UserService : BaseService<userEntity>, IUserService
|
||||
{
|
||||
#region Args
|
||||
|
||||
/// <summary>
|
||||
/// The DBContext
|
||||
/// </summary>
|
||||
|
@ -35,9 +37,11 @@ namespace ModernWMS.WMS.Services
|
|||
/// Localizer Service
|
||||
/// </summary>
|
||||
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
|
||||
#endregion
|
||||
|
||||
#endregion Args
|
||||
|
||||
#region constructor
|
||||
|
||||
/// <summary>
|
||||
///User constructor
|
||||
/// </summary>
|
||||
|
@ -51,9 +55,11 @@ namespace ModernWMS.WMS.Services
|
|||
this._dBContext = dBContext;
|
||||
this._stringLocalizer = stringLocalizer;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion constructor
|
||||
|
||||
#region Api
|
||||
|
||||
/// <summary>
|
||||
/// get select items
|
||||
/// </summary>
|
||||
|
@ -106,6 +112,7 @@ namespace ModernWMS.WMS.Services
|
|||
.ToListAsync();
|
||||
return (list.Adapt<List<UserViewModel>>(), totals);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get all records
|
||||
/// </summary>
|
||||
|
@ -113,7 +120,7 @@ namespace ModernWMS.WMS.Services
|
|||
public async Task<List<UserViewModel>> GetAllAsync(CurrentUser currentUser)
|
||||
{
|
||||
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>>();
|
||||
}
|
||||
|
||||
|
@ -131,6 +138,7 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
return entity.Adapt<UserViewModel>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// add a new record
|
||||
/// </summary>
|
||||
|
@ -146,7 +154,8 @@ namespace ModernWMS.WMS.Services
|
|||
}
|
||||
var entity = viewModel.Adapt<userEntity>();
|
||||
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.last_update_time = DateTime.Now;
|
||||
entity.tenant_id = currentUser.tenant_id;
|
||||
|
@ -154,13 +163,14 @@ namespace ModernWMS.WMS.Services
|
|||
await _dBContext.SaveChangesAsync();
|
||||
if (entity.id > 0)
|
||||
{
|
||||
return (entity.id, _stringLocalizer["save_success"]);
|
||||
return (entity.id, new_auth);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (0, _stringLocalizer["save_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// update a record
|
||||
/// </summary>
|
||||
|
@ -197,6 +207,7 @@ namespace ModernWMS.WMS.Services
|
|||
return (false, _stringLocalizer["save_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// delete a record
|
||||
/// </summary>
|
||||
|
@ -214,27 +225,28 @@ namespace ModernWMS.WMS.Services
|
|||
return (false, _stringLocalizer["delete_failed"]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// import users by excel
|
||||
/// </summary>
|
||||
/// <param name="datas">excel datas</param>
|
||||
/// <param name="currentUser">current user</param>
|
||||
/// <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();
|
||||
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();
|
||||
foreach(var repeat in user_num_repeat_excel)
|
||||
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)
|
||||
{
|
||||
sb.AppendLine(string.Format(_stringLocalizer["exists_entity"], _stringLocalizer["user_num"], repeat.user_num));
|
||||
}
|
||||
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)
|
||||
{
|
||||
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>>();
|
||||
entities.ForEach(t => {
|
||||
entities.ForEach(t =>
|
||||
{
|
||||
t.creator = currentUser.user_name;
|
||||
t.tenant_id= currentUser.tenant_id;
|
||||
t.tenant_id = currentUser.tenant_id;
|
||||
t.auth_string = Md5Helper.Md5Encrypt32("pwd123456");
|
||||
t.create_time = DateTime.Now;
|
||||
t.last_update_time= DateTime.Now;
|
||||
t.last_update_time = DateTime.Now;
|
||||
t.is_valid = true;
|
||||
});
|
||||
});
|
||||
await DbSet.AddRangeAsync(entities);
|
||||
var res = await _dBContext.SaveChangesAsync();
|
||||
if (res > 0)
|
||||
|
@ -267,18 +280,18 @@ namespace ModernWMS.WMS.Services
|
|||
/// </summary>
|
||||
/// <param name="viewModel">viewmodel</param>
|
||||
/// <returns></returns>
|
||||
public async Task<(bool,string)> ResetPwd(BatchOperationViewModel viewModel)
|
||||
public async Task<(bool, string)> ResetPwd(BatchOperationViewModel viewModel)
|
||||
{
|
||||
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();
|
||||
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)
|
||||
{
|
||||
return (true, newpassword);
|
||||
}
|
||||
return (false,_stringLocalizer["operation_failed"]);
|
||||
return (false, _stringLocalizer["operation_failed"]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -286,21 +299,23 @@ namespace ModernWMS.WMS.Services
|
|||
/// </summary>
|
||||
/// <param name="viewModel">viewmodel</param>
|
||||
/// <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 entity =await DBSet.FirstOrDefaultAsync(t => t.id.Equals(viewModel.id));
|
||||
if(entity == null)
|
||||
var entity = await DBSet.FirstOrDefaultAsync(t => t.id.Equals(viewModel.id));
|
||||
if (entity == null)
|
||||
{
|
||||
return (false, _stringLocalizer["not_exists_entity"]);
|
||||
}
|
||||
if (!entity.auth_string.Equals(viewModel.old_password)){
|
||||
return(false, _stringLocalizer["old_password"] + _stringLocalizer["is_incorrect"]);
|
||||
if (!entity.auth_string.Equals(viewModel.old_password))
|
||||
{
|
||||
return (false, _stringLocalizer["old_password"] + _stringLocalizer["is_incorrect"]);
|
||||
}
|
||||
entity.auth_string = viewModel.new_password;
|
||||
await _dBContext.SaveChangesAsync();
|
||||
return (true, _stringLocalizer["save_success"]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// register a new tenant
|
||||
/// </summary>
|
||||
|
@ -329,7 +344,9 @@ namespace ModernWMS.WMS.Services
|
|||
if (entity.id > 0)
|
||||
{
|
||||
var tenant_id = entity.id;
|
||||
|
||||
#region menus
|
||||
|
||||
var menus = new List<MenuEntity>
|
||||
{
|
||||
new MenuEntity
|
||||
|
@ -512,15 +529,17 @@ namespace ModernWMS.WMS.Services
|
|||
tenant_id = tenant_id
|
||||
}
|
||||
};
|
||||
#endregion
|
||||
|
||||
#endregion menus
|
||||
|
||||
entity.tenant_id = tenant_id;
|
||||
entity.creator = entity.user_name;
|
||||
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<MenuEntity>().AddRangeAsync(menus);
|
||||
await _dBContext.SaveChangesAsync();
|
||||
foreach(var menu in menus)
|
||||
foreach (var menu in menus)
|
||||
{
|
||||
await _dBContext.GetDbSet<RolemenuEntity>().AddAsync(new RolemenuEntity
|
||||
{
|
||||
|
@ -528,7 +547,7 @@ namespace ModernWMS.WMS.Services
|
|||
authority = 1,
|
||||
menu_id = menu.id,
|
||||
tenant_id = tenant_id,
|
||||
last_update_time=time,
|
||||
last_update_time = time,
|
||||
create_time = time,
|
||||
});
|
||||
}
|
||||
|
@ -559,7 +578,6 @@ namespace ModernWMS.WMS.Services
|
|||
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