Merge: Merge first commit from develop to release (#1)

* init

* init

* init

* first commit

* feat(全局): 增加hook组件, 用于对话框、消息提示; 修改系统标题

* feat(Global):Sync gitee code with frontend on 2023-01-09 09:14.

* feat(Global):Remove 'sqls' file.

* feat(Commodity management): Delete volume verification

* feat(Delivery Management): Modify tab English

* feat(Back End): Synchronize back-end code_2023-01-09 10:33

* feat(package.json):Fixed dependecies version.

* feat(Global):Update the readme.

* feat(Global):Fix the readme.

Co-authored-by: lysddp <lysddp@gmail.com>
Co-authored-by: liufu <809388027@qq.com>
Co-authored-by: Jokerls波吉 <11269866+jokerls-poji@user.noreply.gitee.com>
This commit is contained in:
ModernWMS 2023-01-10 14:54:08 +08:00 committed by GitHub
parent 4742218402
commit fe23c5959d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
441 changed files with 60941 additions and 0 deletions

388
.gitignore vendored Normal file
View file

@ -0,0 +1,388 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Nuget personal access tokens and Credentials
nuget.config
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
.idea/
*.sln.iml

198
README.md Normal file
View file

@ -0,0 +1,198 @@
# ModernWMS - 仓库管理系统
<div align="center">
<img src="/logo.png" alt="ModernWMS logo" width="200" height="auto" />
<h1>ModernWMS</h1>
<p>开源的简易完整的仓库管理系统</p>
<!-- Badges -->
[![License: MIT](https://img.shields.io/badge/license-MIT-orange.svg)](https://opensource.org/licenses/MIT/)
![Release Version (latest Version)](https://img.shields.io/github/v/release/fjykTec/ModernWMS?color=orange&include_prereleases)
![QR Code Support](https://img.shields.io/badge/QR--Code-Support-orange.svg)
![Docker Support](https://img.shields.io/badge/Docker-Support-orange.svg)
![i18n Support](https://img.shields.io/badge/i18n-Support-orange.svg)
[![MySQL8](https://img.shields.io/badge/MySQL-8.0%2B-orange)](https://www.mysql.com/downloads/)
![repo size](https://img.shields.io/github/repo-size/fjykTec/ModernWMS)
![GitHub commit activity](https://img.shields.io/github/commit-activity/m/fjykTec/ModernWMS)
<!--![Contributors](https://img.shields.io/github/contributors/fjykTec/ModernWMS?color=blue) -->
![GitHub Org's stars](https://img.shields.io/github/stars/ModernWMS?style=social)
![GitHub Follows](https://img.shields.io/github/followers/ModernWMS?style=social)
![GitHub Forks](https://img.shields.io/github/forks/fjykTec/ModernWMS?style=social)
![GitHub Watch](https://img.shields.io/github/watchers/fjykTec/ModernWMS?style=social)
![Gitee Stars](https://gitee.com/modernwms/ModernWMS/badge/star.svg?theme=social)
![Gitee Forks](https://gitee.com/modernwms/ModernWMS/badge/fork.svg?theme=social)
![.NET](https://img.shields.io/badge/.NET-7.0.0-green)
![Vuetify Cli](https://img.shields.io/badge/Vuetify/cli-3.0.4-green)
![Vue](https://img.shields.io/badge/Vue-3.2.45-green)
![TypeScript](https://img.shields.io/badge/TypeScript-4.1.2-green)
![VXE Table](https://img.shields.io/badge/VXETable-4.3.7-green)
![Vite](https://img.shields.io/badge/Vite-4.0.0-green)
![NodeJS](https://img.shields.io/badge/NodeJS-16.13.1-green)
</div>
# Contents - 目录
- [ModernWMS - 仓库管理系统](#modernwms---仓库管理系统)
- [Contents - 目录](#contents---目录)
- [Introduction - 介绍](#introduction---介绍)
- [Requirements - 必要条件](#requirements---必要条件)
- [Linux OS](#linux-os)
- [Windows OS](#windows-os)
- [Installation - 安装](#installation---安装)
- [Linux](#linux)
- [Windows](#windows)
- [Docker](#docker)
- [Usage - 用法](#usage---用法)
- [Contact - 联系](#contact---联系)
- [License - 版权信息](#license---版权信息)
## Introduction - 介绍
该库存管理系统是我们从多年ERP系统研发中总结出来的一套针对小型物流仓储供应链流程。 在工作过程中我们很多的中小企业由于IT预算有限所以无法用上适合他们的系统却又实实在在存在仓储管理方面的需求以此我们开始了这个项目。 为了帮助一些有需要的用户。
## Requirements - 必要条件
### Linux OS
+ Ubuntu 18.04(LTS),20.04(LTS),22.04(LTS)
+ CentOS Stream 8,9
+ RHEL 8(8.7),9(9.1)
+ Debian 10,11
+ openSUSE 15
### Windows OS
+ Windows 10 版本 1607 或更高版本
+ Windows Server 2012 或更高版本
## Installation - 安装
### Linux
+ 下载源码后编译
+ 第一步,下载源码
```bash
cd /tmp/ && wget https://github.com/fjykTec/ModernWMS/archive/refs/heads/master.zip
```
+ 第二步,安装.NET SDK 、运行时 和 NodeJS
```bash
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update && sudo apt-get install -y dotnet-sdk-7.0
sudo apt-get install -y aspnetcore-runtime-7.0
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs
```
+ 第三步,编译前端和后端
```bash
cd /tmp/ && unzip master.zip && cd ./ModernWMS-master
mkdir -p /ModernWMS/frontend/ /ModernWMS/backend/
cd ./frontend/ && yarn && yarn build && cp -rf ./frontend/dist/* /ModernWMS/frontend/
cd ./backend/ && sudo dotnet publish && cp -rf ./backend/ModernWMS/bin/Debug/net7.0/publish/* /ModernWMS/backend/
```
+ 第四步安装nginx
```bash
cd /tmp/ && wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz && cd nginx-1.18.0
./configure --prefix=/etc/nginx --with-http_secure_link_module --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
make && make install
```
### Windows
+ 下载源码后编译部署
+ 第一步,下载源码
```PowerShell
cd c:\
wget -Uri https://github.com/fjykTec/ModernWMS/archive/refs/heads/master.zip -OutFile master.zip
Expand-Archive -Path C:\master.zip -DestinationPath C:\
```
+ 第二步,安装.NET SDK 、运行时 和 NodeJS
```CMD
wget -Uri https://download.visualstudio.microsoft.com/download/pr/35660869-0942-4c5d-8692-6e0d4040137a/4921a36b578d8358dac4c27598519832/dotnet-sdk-7.0.101-win-x64.exe -OutFile dotnet-sdk-7.0.101-win-x64.exe
dotnet-sdk-7.0.100-win-x64.exe /install /quiet /norestart
wget -Uri https://nodejs.org/dist/v16.13.1/node-v16.13.1-x64.msi -OutFile node-v16.13.1-x64.msi
msiexec /i .\node-v16.13.1-x64.msi /passive /norestart
```
+ 第三步,编译前端和后端
```
md C:\ModernWMS\frontend\
md C:\ModernWMS\backend\
cd c:\ModernWMS-master\backend
dotnet publish
copy-item -path ".\backend\ModernWMS\bin\Debug\net7.0\publish\" -destination "C:\ModernWMS\backend\" -recurse
cd c:\ModernWMS-master\frontend
yarn && yarn build
copy-item -path ".\frontend\dist\" -destination "C:\ModernWMS\frontend\" -recurse
```
+ 第四步安装nginx并启动
```
cd C:\
wget -Uri http://nginx.org/download/nginx-1.16.1.zip -OutFile nginx-1.16.1.zip
Expand-Archive -Path C:\nginx-1.16.1.zip -DestinationPath C:\
start .\nginx-1.16.1\nginx.exe
cd C:\ModernWMS\backend\
dotnet ModernWMS.dll --urls http://0.0.0.0:20011
```
### Docker
+ 下载源码后编译
+ 第一步,下载源码
```bash
cd /tmp/ && wget https://github.com/fjykTec/ModernWMS/archive/refs/heads/master.zip
```
+ 第二步,编译前端和后端
```bash
cd /tmp/ && unzip master.zip && cd ./ModernWMS-master
cd ./frontend/ && yarn && yarn build && cp -rf ./frontend/dist/* ./docker/frontend/
cd ./backend/ && sudo dotnet publish && cp -rf ./backend/ModernWMS/bin/Debug/net7.0/publish/* ./docker/backend/
```
+ 第三步,部署
```bash
cd /tmp/ModernWMS-master/docker/
docker build -t modernwms:1.0 .
docker run -d -p 80:80 modernwms:1.0 /bin/bash ./run.sh
```
## Usage - 用法
```
打开浏览器进入http://127.0.0.1 或者 http://部署电脑的IP地址
```
<h4>
<a href="https://wmsonline.ikeyly.com">体验地址入口</a>
</h4> 
![image0.png](https://gitee.com/modernwms/ModernWMS/raw/develop/image0.png)
![image1.png](https://gitee.com/modernwms/ModernWMS/raw/develop/image1.png)
![image2.png](https://gitee.com/modernwms/ModernWMS/raw/develop/image2.png)
## Contact - 联系
<h4>
<a href="https://github.com/fjykTec/ModernWMS/issues/new?template=bug_report.md&title=[BUG]">提交一个Bug</a>
</h4>
<h4>
<a href="https://github.com/fjykTec/ModernWMS/issues/new?template=feature_request.md&title=[FR]">提交一个建议</a>
</h4>
<h4>
<a href="https://jq.qq.com/?_wv=1027&k=YgVJGWnI">加入QQ群 757128595</a>
</h4>
## License - 版权信息
该项目使用的是 [MIT](https://opensource.org/licenses/MIT/) 协议. 详情查阅[LICENSE.txt](https://github.com/fjykTec/ModernWMS/master/LICENSE).必须遵守此协议。

View file

@ -0,0 +1,138 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using ModernWMS.Core.JWT;
using ModernWMS.Core.Models;
using ModernWMS.Core.Services;
namespace ModernWMS.Core.Controller
{
/// <summary>
/// account
/// </summary>
[Route("[controller]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class AccountController : BaseController
{
/// <summary>
/// token manger
/// </summary>
private readonly ITokenManager _tokenManager;
/// <summary>
/// Log helper
/// </summary>
private readonly ILogger<AccountController> _logger;
/// <summary>
/// cache helper
/// </summary>
private readonly CacheManager _cacheManager;
/// <summary>
/// account service class
/// </summary>
private readonly IAccountService _accountService;
/// <summary>
/// Localizer
/// </summary>
private readonly IStringLocalizer _stringLocalizer;
/// <summary>
/// Structure
/// </summary>
/// <param name="logger">logger helper</param>
/// <param name="tokenManager">token manger</param>
/// <param name="cacheManager">cache helper</param>
/// <param name="accountService">account service class</param>
/// <param name="stringLocalizer">Localizer</param>
public AccountController(ILogger<AccountController> logger
, ITokenManager tokenManager
, CacheManager cacheManager
, IAccountService accountService
, IStringLocalizer stringLocalizer
)
{
this._tokenManager = tokenManager;
this._logger = logger;
this._cacheManager = cacheManager;
this._accountService = accountService;
this._stringLocalizer = stringLocalizer;
}
#region Login
/// <summary>
/// login
/// </summary>
/// <param name="loginAccount">user's account infomation</param>
/// <returns></returns>
[AllowAnonymous]
[HttpPost("/login")]
public async Task<ResultModel<LoginOutputViewModel>> LoginAsync(LoginInputViewModel loginAccount)
{
var user = await _accountService.Login(loginAccount,CurrentUser);
if (user != null)
{
var result = _tokenManager.GenerateToken(
new CurrentUser
{
user_id = user.user_id,
user_name = user.user_name,
user_num = user.user_num,
user_role = user.user_role,
tenant_id = user.tenant_id
}
);
string rt = this._tokenManager.GenerateRefreshToken();
user.access_token = result.token;
user.expire = result.expire;
user.refresh_token = rt;
await _cacheManager.TokenSet(user.user_id, "WebRefreshToken", rt, _tokenManager.GetRefreshTokenExpireMinute());
return ResultModel<LoginOutputViewModel>.Success(user);
}
else
{
return ResultModel<LoginOutputViewModel>.Error(_stringLocalizer["login_failed"]);
}
}
/// <summary>
/// get a new token
/// </summary>
/// <param name="inPutViewModel">old access token and refreshtoken key</param>
/// <returns></returns>
[AllowAnonymous]
[HttpPost("/refresh-token")]
public async Task<ResultModel<string>> RefreshToken([FromBody] RefreshTokenInPutViewModel inPutViewModel)
{
var currentUser = this._tokenManager.GetCurrentUser(inPutViewModel.AccessToken);
var flag = _cacheManager.Is_Token_Exist<string>(currentUser.user_id, "WebRefreshToken", _tokenManager.GetRefreshTokenExpireMinute());
if (!flag)
{
return ResultModel<string>.Error("refreshtoken_failure");
}
else
{
var result = _tokenManager.GenerateToken(currentUser);
return ResultModel<string>.Success(result.token);
}
}
#endregion
#region hello world
[AllowAnonymous]
[HttpPost("/hello-world")]
public ResultModel<string> hello_world()
{
return ResultModel<string>.Success(_accountService.HelloWorld());
}
#endregion
}
}

View file

@ -0,0 +1,40 @@

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using ModernWMS.Core.JWT;
using ModernWMS.Core.Utility;
using System.Linq;
namespace ModernWMS.Core.Controller
{
/// <summary>
/// base controller
/// </summary>
//[Authorize]
[Produces("application/json")]
public class BaseController : ControllerBase
{
/// <summary>
/// current user
/// </summary>
public CurrentUser CurrentUser
{
get
{
if (User != null && User.Claims.ToList().Count > 0)
{
var Claim = User.Claims.First(claim => claim.Type == ClaimValueTypes.Json);
return Claim == null ? new CurrentUser() : JsonHelper.DeserializeObject<CurrentUser>(Claim.Value);
}
else
{
return new CurrentUser();
}
}
}
public BaseController()
{
}
}
}

View file

@ -0,0 +1,30 @@
using System.Collections.Concurrent;
using System.Threading;
namespace ModernWMS.Core.DBContext
{
/// <summary>
/// 当前连接的上下文
/// </summary>
public static class CallContext
{
/// <summary>
/// 静态字典
/// </summary>
static ConcurrentDictionary<string, AsyncLocal<object>> state = new ConcurrentDictionary<string, AsyncLocal<object>>();
/// <summary>
/// 设置值
/// </summary>
/// <param name="name">键</param>
/// <param name="data">值</param>
public static void SetData(string name, object data) =>
state.GetOrAdd(name, _ => new AsyncLocal<object>()).Value = data;
/// <summary>
/// 获取值
/// </summary>
/// <param name="name">键</param>
/// <returns></returns>
public static object GetData(string name) =>
state.TryGetValue(name, out AsyncLocal<object> data) ? data.Value : null;
}
}

View file

@ -0,0 +1,128 @@

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.Logging;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Reflection;
using ModernWMS.Core;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
namespace ModernWMS.Core.DBContext
{
/// <summary>
/// SqlDBContext
/// </summary>
public class SqlDBContext : DbContext
{
/// <summary>
/// current user's tenant_id
/// </summary>
public byte tenant_id { get; set; } = 1;
/// <summary>
/// Database
/// </summary>
/// <returns></returns>
public DatabaseFacade GetDatabase() => Database;
/// <summary>
/// s
/// </summary>
/// <param name="options">options</param>
public SqlDBContext(DbContextOptions options) : base(options)
{
}
#region overwrite
/// <summary>
/// Auto Mapping Entity
/// </summary>
/// <param name="modelBuilder">ModelBuilder</param>
private void MappingEntityTypes(ModelBuilder modelBuilder)
{
var baseType = typeof(Models.BaseModel);
var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
var referencedAssemblies = System.IO.Directory.GetFiles(path, $"ModernWMS*.dll").Select(Assembly.LoadFrom).ToArray();
var list = referencedAssemblies
.SelectMany(a => a.DefinedTypes)
.Select(type => type.AsType())
.Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToList();
if (list != null && list.Any())
{
list.ForEach(t =>
{
var entityType = modelBuilder.Model.FindEntityType(t);
if (entityType == null)
{
modelBuilder.Model.AddEntityType(t);
}
});
}
}
/// <summary>
/// overwrite OnModelCreating
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
MappingEntityTypes(modelBuilder);
/* foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
if (typeof(Models.IHasTenant).IsAssignableFrom(entityType.ClrType))
{
ConfigureGlobalFiltersMethodInfo
.MakeGenericMethod(entityType.ClrType)
.Invoke(this, new object[] { modelBuilder });
}
}*/
base.OnModelCreating(modelBuilder);
}
/// <summary>
/// create DbSet
/// </summary>
/// <typeparam name="T">实体</typeparam>
/// <returns></returns>
public virtual DbSet<T> GetDbSet<T>() where T : class
{
if (Model.FindEntityType(typeof(T)) != null)
{
return Set<T>();
}
else
{
throw new Exception($"type {typeof(T).Name} is not add into DbContext ");
}
}
/// <summary>
/// over write EnsureCreated
/// </summary>
/// <returns></returns>
public virtual bool EnsureCreated()
{
return Database.EnsureCreated();
}
/// <summary>
/// over write OnConfiguring
/// </summary>
/// <param name="optionsBuilder"></param>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
#endregion
}
}

View file

@ -0,0 +1,7 @@

namespace ModernWMS.Core.DI
{
public interface IDependency
{
}
}

View file

@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.Core.DynamicSearch
{
/// <summary>
/// Dynamic Query
/// </summary>
public class QueryCollection : Collection<SearchObject>
{
/// <summary>
/// Expression
/// </summary>
/// <typeparam name="T">entity</typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> True<T>() { return f => true; }
/// <summary>
/// Expression
/// </summary>
/// <typeparam name="T">entity</typeparam>
/// <param name="condition">condition</param>
/// <returns></returns>
public Expression<Func<T, bool>> AsExpression<T>(Condition? condition = Condition.AndAlso) where T : class
{
if (this.Count == 0)
{
return True<T>();
}
Type targetType = typeof(T);
TypeInfo typeInfo = targetType.GetTypeInfo();
var parameter = Expression.Parameter(targetType, "m");
Expression expression = null;
Func<Expression, Expression, Expression> Append = (exp1, exp2) =>
{
if (exp1 == null)
{
return exp2;
}
return (condition ?? Condition.OrElse) == Condition.OrElse ? Expression.OrElse(exp1, exp2) : Expression.AndAlso(exp1, exp2);
};
foreach (var item in this)
{
var property = typeInfo.GetProperty(item.Name);
if (property == null ||
!property.CanRead ||
(item.Text.Trim().Length == 0))
{
continue;
}
if (item.Text.Length == 0)
{
item.Text = item.Value.ToString();
}
Type realType = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
if (item.Text.Length > 0)
{
if (item.Type.ToUpper().Equals("DATETIMEPICKER")
&& (item.Operator == Operators.LessThanOrEqual || item.Operator == Operators.LessThan))
{
item.Text = Convert.ToDateTime(item.Text).ToString("yyyy-MM-dd") + " 23:59:59";
}
item.Value = Convert.ChangeType(item.Text, realType);
}
Expression<Func<object>> valueLamba = () => item.Value;
switch (item.Operator)
{
case Operators.Equal:
{
expression = Append(expression, Expression.Equal(Expression.Property(parameter, item.Name),
Expression.Convert(valueLamba.Body, property.PropertyType)));
break;
}
case Operators.GreaterThan:
{
expression = Append(expression, Expression.GreaterThan(Expression.Property(parameter, item.Name),
Expression.Convert(valueLamba.Body, property.PropertyType)));
break;
}
case Operators.GreaterThanOrEqual:
{
expression = Append(expression, Expression.GreaterThanOrEqual(Expression.Property(parameter, item.Name),
Expression.Convert(valueLamba.Body, property.PropertyType)));
break;
}
case Operators.LessThan:
{
expression = Append(expression, Expression.LessThan(Expression.Property(parameter, item.Name),
Expression.Convert(valueLamba.Body, property.PropertyType)));
break;
}
case Operators.LessThanOrEqual:
{
expression = Append(expression, Expression.LessThanOrEqual(Expression.Property(parameter, item.Name),
Expression.Convert(valueLamba.Body, property.PropertyType)));
break;
}
case Operators.Contains:
{
var nullCheck = Expression.Not(Expression.Call(typeof(string), "IsNullOrEmpty", null, Expression.Property(parameter, item.Name)));
var contains = Expression.Call(Expression.Property(parameter, item.Name), "Contains", null,
Expression.Convert(valueLamba.Body, property.PropertyType));
expression = Append(expression, Expression.AndAlso(nullCheck, contains));
break;
}
}
}
if (expression == null)
{
return null;
}
return ((Expression<Func<T, bool>>)Expression.Lambda(expression, parameter));
}
}
}

View file

@ -0,0 +1,71 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.Core.DynamicSearch
{
/// <summary>
/// DynamicSearch Operators
/// </summary>
public enum Operators
{
/// <summary>
/// None
/// </summary>
None = 0,
/// <summary>
/// Equal =
/// </summary>
Equal = 1,
/// <summary>
/// GreaterThan
/// </summary>
GreaterThan = 2,
/// <summary>
/// GreaterThanOrEqual
/// </summary>
GreaterThanOrEqual = 3,
/// <summary>
/// LessThan
/// </summary>
LessThan = 4,
/// <summary>
/// LessThanOrEqual
/// </summary>
LessThanOrEqual = 5,
/// <summary>
/// Contains
/// </summary>
Contains = 6
}
/// <summary>
/// Condition
/// </summary>
public enum Condition
{
/// <summary>
/// OR
/// </summary>
OrElse = 1,
/// <summary>
/// AND
/// </summary>
AndAlso = 2
}
/// <summary>
/// select item combox
/// </summary>
public class ComboxItem
{
/// <summary>
/// value
/// </summary>
public string value { get; set; }
/// <summary>
/// text
/// </summary>
public string text { get; set; }
}
}

View file

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.Core.DynamicSearch
{
/// <summary>
/// SearchObject
/// </summary>
public class SearchObject
{
/// <summary>
/// sort
/// </summary>
public int Sort { get; set; } = 0;
/// <summary>
/// label
/// </summary>
public string Label { get; set; } = string.Empty;
/// <summary>
/// name
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// type
/// </summary>
public string Type { get; set; } = string.Empty;
/// <summary>
/// operator
/// </summary>
public Operators Operator { get; set; } = Operators.Equal;
/// <summary>
/// text
/// </summary>
public string Text { get; set; } = string.Empty;
/// <summary>
/// value
/// </summary>
public object Value { get; set; } = new object();
/// <summary>
/// select item combox list
/// </summary>
public List<ComboxItem> comboxItem { get; set; } = new List<ComboxItem>();
}
}

View file

@ -0,0 +1,62 @@
using Newtonsoft.Json;
using System;
namespace ModernWMS.Core.Extentions
{
/// <summary>
/// JSON extentions
/// </summary>
public class JsonStringTrimConverter : JsonConverter
{
/// <summary>
/// Determines whether this instance can convert the specified object type.
/// </summary>
/// <param name="objectType">Type of the object.</param>
/// <returns></returns>
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
/// <summary>
/// Reads the JSON representation of the object.
/// </summary>
/// <param name="reader"> The Newtonsoft.Json.JsonReader to read from.</param>
/// <param name="objectType">Type of the object.</param>
/// <param name="existingValue">The existing value of object being read.</param>
/// <param name="serializer">The calling serializer.</param>
/// <returns></returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (objectType == typeof(string) && reader.Value != null)
{
if (reader.TokenType == JsonToken.Date)
{
return Convert.ToDateTime(reader.Value).ToString("yyyy-MM-dd HH:mm:ss");
}
else
{
return (reader.Value as string).Trim();
}
}
return reader.Value;
}
/// <summary>
/// Writes the JSON representation of the object.
/// </summary>
/// <param name="writer">The Newtonsoft.Json.JsonWriter to write to.</param>
/// <param name="value">The value.</param>
/// <param name="serializer">The calling serializer.</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var text = (string)value;
if (text == null)
{
writer.WriteNull();
}
else
{
writer.WriteValue(text.Trim());
}
}
}
}

View file

@ -0,0 +1,292 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.EntityFrameworkCore;
using Pomelo.EntityFrameworkCore.MySql;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Filters;
using System.Reflection;
using System.Text;
using ModernWMS.Core.DBContext;
using System.Reflection.PortableExecutable;
using Microsoft.Extensions.Logging.Debug;
using ModernWMS.Core.Swagger;
using ModernWMS.Core.JWT;
using Newtonsoft.Json;
using Microsoft.AspNetCore.Cors.Infrastructure;
using ModernWMS.Core.Middleware;
using Microsoft.Extensions.DependencyModel;
using ModernWMS.Core.DI;
using Microsoft.Extensions.Localization;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
using Microsoft.EntityFrameworkCore.Migrations.Internal;
namespace ModernWMS.Core.Extentions
{
public static class StartupExtensions
{
public static void AddExtensionsService(this IServiceCollection services, IConfiguration configuration)
{
services.AddLocalization();
services.AddSingleton<IStringLocalizer>((sp) =>
{
var sharedLocalizer = sp.GetRequiredService<IStringLocalizer<MultiLanguage>>();
return sharedLocalizer;
});
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<CacheManager>();
services.AddSingleton<IMemoryCache>(factory =>
{
var cache = new MemoryCache(new MemoryCacheOptions());
return cache;
});
var Mysql_connection = configuration.GetConnectionString("MySqlConn");
var SqlLite_connection = configuration.GetConnectionString("SqlLiteConn");
var database_config = configuration.GetSection("Database")["db"];
services.AddDbContextPool<SqlDBContext>(t =>
{
if(database_config == "SqlLite")
{
t.UseSqlite(SqlLite_connection, b => b.MigrationsAssembly("ModernWMS"));
}
else
{
t.UseMySql(Mysql_connection, new MySqlServerVersion(new Version(8, 0, 26)));
}
t.EnableSensitiveDataLogging();
t.UseLoggerFactory(new LoggerFactory(new[] { new DebugLoggerProvider() }));
}, 100); ;
services.AddMemoryCache( );
services.AddScoped<MultiTenancy.ITenantProvider, MultiTenancy.TenantProvider>();
services.AddSwaggerService(configuration, AppContext.BaseDirectory);
services.AddTokenGeneratorService(configuration);
services.RegisterAssembly();
services.AddControllers(c =>
{
c.Filters.Add(typeof(ViewModelActionFiter));
c.MaxModelValidationErrors = 99999;
}).ConfigureApiBehaviorOptions(o =>
{
o.SuppressModelStateInvalidFilter = true;
})//format
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
options.SerializerSettings.Converters.Add(new JsonStringTrimConverter());
options.SerializerSettings.Formatting = Formatting.Indented;
options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
}).AddDataAnnotationsLocalization(options => {
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(ModernWMS.Core.MultiLanguage));
}); ;
}
public static void UseExtensionsConfigure(this IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IConfiguration configuration)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseSwaggerConfigure(configuration);
app.UseRouting();
app.UseMiddleware<ModernWMS.Core.Middleware.CorsMiddleware>();
app.UseTokenGeneratorConfigure(configuration);
app.UseAuthorization();
app.UseMiddleware<GlobalExceptionMiddleware>();
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);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
#region Swagger
/// <summary>
/// Swagger
/// </summary>
/// <param name="services">服务容器</param>
/// <param name="configuration">配置文件</param>
/// <param name="BaseDirectory">主目录</param>
private static void AddSwaggerService(this IServiceCollection services, IConfiguration configuration, string BaseDirectory)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
var swaggerSettings = configuration.GetSection("SwaggerSettings");
var provider = services.Configure<SwaggerSettings>(swaggerSettings).BuildServiceProvider();
var settings = provider.GetService<IOptions<SwaggerSettings>>()?.Value;
if (settings != null && settings.Name.Equals("ModernWMS"))
{
services.AddSwaggerGen(c =>
{
typeof(CustomApiVersion.ApiVersions).GetEnumNames().ToList().ForEach(version =>
{
c.SwaggerDoc(version, new OpenApiInfo
{
Title = settings.ApiTitle,
Version = settings.ApiVersion,
Description = settings.Description
});
});
if (settings.XmlFiles != null && settings.XmlFiles.Count > 0)
{
settings.XmlFiles.ForEach(fileName =>
{
if (File.Exists(Path.Combine(BaseDirectory, fileName)))
{
c.IncludeXmlComments(Path.Combine(BaseDirectory, fileName), true);
}
});
}
c.OperationFilter<AddResponseHeadersFilter>();
c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
c.OperationFilter<SecurityRequirementsOperationFilter>();
c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{
Description = "please input Bearer {token}",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey
});
c.SwaggerGeneratorOptions.DescribeAllParametersInCamelCase = false;
});
}
}
/// <summary>
/// register Swagger
/// </summary>
/// <param name="app"></param>
/// <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"))
{
app.UseSwagger();
app.UseSwaggerUI(c =>
{
typeof(CustomApiVersion.ApiVersions).GetEnumNames().OrderBy(e => e).ToList().ForEach(version =>
{
c.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"{swaggerSettings["Name"]} {version}");
});
c.IndexStream = () => Assembly.GetExecutingAssembly().GetManifestResourceStream("ModernWMS.Core.Swagger.index.html");
c.RoutePrefix = "";
});
}
}
#endregion
#region JWT
/// <summary>
/// register JWT
/// </summary>
/// <param name="services">services</param>
/// <param name="configuration">configuration</param>
private static void AddTokenGeneratorService(this IServiceCollection services, IConfiguration configuration)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
var tokenSettings = configuration.GetSection("TokenSettings");
services.Configure<TokenSettings>(tokenSettings);
services.AddTransient<ITokenManager, TokenManager>();
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = nameof(ApiResponseHandler);
options.DefaultForbidScheme = nameof(ApiResponseHandler);
}
)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = true,
ValidAudience = tokenSettings["Audience"],
ValidateIssuer = true,
ValidIssuer = tokenSettings["Issuer"],
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenSettings["SigningKey"])),
ClockSkew = TimeSpan.Zero
};
})
.AddScheme<AuthenticationSchemeOptions, ApiResponseHandler>(nameof(ApiResponseHandler), o => { });
}
private static void UseTokenGeneratorConfigure(this IApplicationBuilder app, IConfiguration configuration)
{
app.UseAuthentication();
}
#endregion
#region dynamic injection
/// <summary>
/// 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();
var types = referencedAssemblies
.SelectMany(a => a.DefinedTypes)
.Select(type => type.AsType())
.Where(x => x != typeof(IDependency) && typeof(IDependency).IsAssignableFrom(x)).ToArray();
var implementTypes = types.Where(x => x.IsClass).ToArray();
var interfaceTypes = types.Where(x => x.IsInterface).ToArray();
foreach (var implementType in implementTypes)
{
var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType));
if (interfaceType != null)
services.AddScoped(interfaceType, implementType);
}
services.AddScoped<Services.IAccountService, Services.AccountService>();
return services;
}
#endregion
}
}

View file

@ -0,0 +1,85 @@

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using System;
using System.Threading.Tasks;
using System.Text.Encodings.Web;
using Microsoft.Extensions.Logging;
using ModernWMS.Core.Models;
using System.Linq;
using ModernWMS.Core.Utility;
using ModernWMS.Core.JWT;
namespace ModernWMS.Core.JWT
{
/// <summary>
/// Custom Processing Unit
/// </summary>
public class ApiResponseHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
/// <summary>
/// token manager
/// </summary>
private readonly ITokenManager _tokenManager;
/// <summary>
/// cache manager
/// </summary>
private readonly CacheManager _cacheManager;
/// <summary>
/// constructor
/// </summary>
/// <param name="options">options</param>
/// <param name="logger">logger</param>
/// <param name="encoder">encoder</param>
/// <param name="clock"></param>
/// <param name="tokenManager">tokenManager</param>
/// <param name="cacheManager">cacheManagerparam>
public ApiResponseHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock
, ITokenManager tokenManager
, CacheManager cacheManager)
: base(options, logger, encoder, clock)
{
this._tokenManager = tokenManager;
_cacheManager = cacheManager;
}
/// <summary>
/// handle authority
/// </summary>
/// <returns></returns>
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
var token = Request.Headers["Authorization"].ObjToString().Replace("Bearer ", "");
var currentUser = this._tokenManager.GetCurrentUser(token);
var flag = _cacheManager.Is_Token_Exist<string>(currentUser.user_id, "WebToken", _tokenManager.GetRefreshTokenExpireMinute());
if (!flag)
{
return AuthenticateResult.Fail("Sorry, you don't have the authority required!");
}
throw new NotImplementedException();
}
/// <summary>
/// authentication
/// </summary>
/// <param name="properties">参数</param>
/// <returns></returns>
protected override async Task HandleChallengeAsync(AuthenticationProperties properties)
{
Response.ContentType = "application/json";
Response.StatusCode = StatusCodes.Status401Unauthorized;
await Response.WriteAsync(JsonHelper.SerializeObject(ResultModel<object>.Error("Sorry, please sign in first!", 403)));
}
/// <summary>
/// access denied
/// </summary>
/// <param name="properties"></param>
/// <returns></returns>
protected override async Task HandleForbiddenAsync(AuthenticationProperties properties)
{
Response.ContentType = "application/json";
Response.StatusCode = StatusCodes.Status403Forbidden;
await Response.WriteAsync(JsonHelper.SerializeObject(ResultModel<object>.Error("Sorry, you don't have the authority required!", 403)));
}
}
}

View file

@ -0,0 +1,152 @@
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
namespace ModernWMS.Core.JWT
{
public class CacheManager
{
public static CacheManager Default = new CacheManager();
private IMemoryCache _cache = new MemoryCache(new MemoryCacheOptions());
public CacheManager()
{
}
/// <summary>
/// get value by key
/// </summary>
/// <typeparam name="T">type of value</typeparam>
/// <param name="key">key</param>
/// <returns></returns>
public T Get<T>(string key)
{
if (string.IsNullOrWhiteSpace(key))
throw new ArgumentNullException(nameof(key));
T value;
_cache.TryGetValue<T>(key, out value);
return value;
}
/// <summary>
/// set cache
/// </summary>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Set_NotExpire<T>(string key, T value)
{
if (string.IsNullOrWhiteSpace(key))
throw new ArgumentNullException(nameof(key));
T v;
if (_cache.TryGetValue(key, out v))
_cache.Remove(key);
_cache.Set(key, value);
}
/// <summary>
/// set cache with expire
/// </summary>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Set_SlidingExpire<T>(string key, T value, TimeSpan span)
{
if (string.IsNullOrWhiteSpace(key))
throw new ArgumentNullException(nameof(key));
T v;
if (_cache.TryGetValue(key, out v))
_cache.Remove(key);
_cache.Set(key, value, new MemoryCacheEntryOptions()
{
SlidingExpiration = span
});
}
public void Set_AbsoluteExpire<T>(string key, T value, TimeSpan span)
{
if (string.IsNullOrWhiteSpace(key))
throw new ArgumentNullException(nameof(key));
T v;
if (_cache.TryGetValue(key, out v))
_cache.Remove(key);
_cache.Set(key, value, span);
}
public void Set_SlidingAndAbsoluteExpire<T>(string key, T value, TimeSpan slidingSpan, TimeSpan absoluteSpan)
{
if (string.IsNullOrWhiteSpace(key))
throw new ArgumentNullException(nameof(key));
T v;
if (_cache.TryGetValue(key, out v))
_cache.Remove(key);
_cache.Set(key, value, new MemoryCacheEntryOptions()
{
SlidingExpiration = slidingSpan,
AbsoluteExpiration = DateTimeOffset.Now.AddMilliseconds(absoluteSpan.TotalMilliseconds)
});
}
/// <summary>
/// remove cache by key
/// </summary>
/// <param name="key">key</param>
public void Remove(string key)
{
if (string.IsNullOrWhiteSpace(key))
throw new ArgumentNullException(nameof(key));
_cache.Remove(key);
}
/// <summary>
/// dispose
/// </summary>
public void Dispose()
{
if (_cache != null)
_cache.Dispose();
GC.SuppressFinalize(this);
}
#region TokenHelper
public bool Is_Token_Exist<T>(int userID, string type, int expireMinute)
{
var key = $"ModernWMS_{type}_{userID}";
if (string.IsNullOrWhiteSpace(key))
throw new ArgumentNullException(nameof(key));
T value;
if (_cache.TryGetValue<T>(key, out value))
{
Set_SlidingExpire(key, value, TimeSpan.FromMinutes(expireMinute) );
return true;
}
return false;
}
public async Task<bool> TokenSet(int userID, string type, string token, int expireMinute)
{
string key = $"ModernWMS_{type}_{userID}";
try
{
Set_AbsoluteExpire(key, token, TimeSpan.FromMinutes(expireMinute));
}
catch
{
return false;
}
return true;
}
#endregion
}
}

View file

@ -0,0 +1,13 @@
namespace ModernWMS.Core.JWT
{
/// <summary>
/// JWT custom type
/// </summary>
public static class ClaimValueTypes
{
/// <summary>
/// JSON
/// </summary>
public const string Json = "json";
}
}

View file

@ -0,0 +1,34 @@
using System.ComponentModel.DataAnnotations;
using System.Xml.Linq;
namespace ModernWMS.Core.JWT
{
/// <summary>
/// CurrentUser
/// </summary>
public class CurrentUser
{
/// <summary>
/// user_id
/// </summary>
public int user_id { get; set; } = 1;
/// <summary>
/// user_num
/// </summary>
public string user_num { get; set; } = "admin";
/// <summary>
/// user_name
/// </summary>
public string user_name { get; set; } = "admin";
/// <summary>
/// user_role
/// </summary>
public string user_role { get; set; } = "admin";
/// <summary>
/// tenant
/// </summary>
public long tenant_id { get; set; } = 1;
}
}

View file

@ -0,0 +1,36 @@

namespace ModernWMS.Core.JWT
{
/// <summary>
/// token manager interface
/// </summary>
public interface ITokenManager
{
/// <summary>
/// Method of generating AccessToken
/// </summary>
/// <param name="userClaims">userClaims</param>
/// <returns></returns>
(string token, int expire) GenerateToken(CurrentUser userClaims);
/// <summary>
/// Method of refreshing token
/// </summary>
/// <returns></returns>
string GenerateRefreshToken();
/// <summary>
/// Get the minutes of refreshed token invalidation
/// </summary>
/// <returns></returns>
int GetRefreshTokenExpireMinute();
/// <summary>
/// Get the current user information in the token
/// </summary>
/// <returns></returns>
CurrentUser GetCurrentUser();
/// <summary>
/// Get the current user information in the token
/// </summary>
/// <returns></returns>
CurrentUser GetCurrentUser(string token);
}
}

View file

@ -0,0 +1,182 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Security.Cryptography;
using System.Text;
using ModernWMS.Core.Utility;
namespace ModernWMS.Core.JWT
{
/// <summary>
/// token manager
/// </summary>
public class TokenManager : ITokenManager
{
private readonly IOptions<TokenSettings> _tokenSettings;//token setting
private readonly IHttpContextAccessor _accessor; // Inject IHttpContextAccessor
/// <summary>
/// Constructor
/// </summary>
/// <param name="tokenSettings">token setting s</param>
/// <param name="accessor">Inject IHttpContextAccessor</param>
public TokenManager(IOptions<TokenSettings> tokenSettings
, IHttpContextAccessor accessor)
{
this._tokenSettings = tokenSettings;
this._accessor = accessor;
}
/// <summary>
/// Method of refreshing token
/// </summary>
/// <returns></returns>
public string GenerateRefreshToken()
{
var randomNumber = new byte[32];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(randomNumber);
return Convert.ToBase64String(randomNumber);
}
}
/// <summary>
/// Method of generating AccessToken
/// </summary>
/// <param name="userClaims">自定义信息</param>
/// <returns>(token,有效分钟数)</returns>
public (string token, int expire) GenerateToken(CurrentUser userClaims)
{
string token = new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(
issuer: _tokenSettings.Value.Issuer,
audience: _tokenSettings.Value.Audience,
claims: SetClaims(userClaims),
expires: DateTime.Now.AddMinutes(_tokenSettings.Value.ExpireMinute),
signingCredentials: new SigningCredentials(
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(GlobalConsts.SigningKey)),
SecurityAlgorithms.HmacSha256)
));
return (token, _tokenSettings.Value.ExpireMinute);
}
/// <summary>
/// Get the current user information in the token
/// </summary>
/// <returns></returns>
public CurrentUser GetCurrentUser()
{
if (_accessor.HttpContext == null)
{
return new CurrentUser();
}
var token = _accessor.HttpContext.Request.Headers["Authorization"].ObjToString();
if (!token.StartsWith("Bearer"))
{
return new CurrentUser();
}
token = token.Replace("Bearer ", "");
if (token.Length > 0)
{
var principal = new JwtSecurityTokenHandler().ValidateToken(token,
new TokenValidationParameters
{
ValidateAudience = false,
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(GlobalConsts.SigningKey)),
ValidateLifetime = false
},
out var securityToken);
if (!(securityToken is JwtSecurityToken jwtSecurityToken) ||
!jwtSecurityToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256, StringComparison.InvariantCultureIgnoreCase))
{
return new CurrentUser();
}
var user = JsonHelper.DeserializeObject<CurrentUser>(principal.Claims.First(claim => claim.Type == ClaimValueTypes.Json).Value);
if (user != null)
{
return user;
}
else
{
return new CurrentUser();
}
}
else
{
return new CurrentUser();
}
}
/// <summary>
/// Get the current user information in the token
/// </summary>
/// <returns></returns>
public CurrentUser GetCurrentUser(string token)
{
if (token.Length > 0)
{
var principal = new JwtSecurityTokenHandler().ValidateToken(token,
new TokenValidationParameters
{
ValidateAudience = false,
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(GlobalConsts.SigningKey)),
ValidateLifetime = false
},
out var securityToken);
if (!(securityToken is JwtSecurityToken jwtSecurityToken) ||
!jwtSecurityToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256, StringComparison.InvariantCultureIgnoreCase))
{
return new CurrentUser();
}
var user = JsonHelper.DeserializeObject<CurrentUser>(principal.Claims.First(claim => claim.Type == ClaimValueTypes.Json).Value);
if (user != null)
{
return user;
}
else
{
return new CurrentUser();
}
}
else
{
return new CurrentUser();
}
}
/// <summary>
/// Method of refreshing token
/// </summary>
/// <returns></returns>
public int GetRefreshTokenExpireMinute()
{
return _tokenSettings.Value.ExpireMinute + 1;
}
/// <summary>
/// Setting Custom Information
/// </summary>
/// <param name="userClaims">Custom Information</param>
/// <returns></returns>
private static IEnumerable<Claim> SetClaims(CurrentUser userClaims)
{
return new List<Claim>
{
new Claim(ClaimTypes.Sid, Guid.NewGuid().ToString()),
new Claim(ClaimValueTypes.Json,JsonHelper.SerializeObject(userClaims), ClaimValueTypes.Json)
};
}
}
}

View file

@ -0,0 +1,26 @@

namespace ModernWMS.Core.JWT
{
/// <summary>
/// token settings
/// </summary>
public class TokenSettings
{
/// <summary>
/// Audience
/// </summary>
public string Audience { get; set; }
/// <summary>
/// Issuer
/// </summary>
public string Issuer { get; set; }
/// <summary>
/// SigningKey
/// </summary>
public string SigningKey { get; set; }
/// <summary>
/// Expire
/// </summary>
public int ExpireMinute { get; set; }
}
}

View file

@ -0,0 +1,61 @@
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace ModernWMS.Core.Middleware
{
/// <summary>
/// Cross domain middleware
/// </summary>
public class CorsMiddleware
{
#region parameter
/// <summary>
/// agent
/// </summary>
private readonly RequestDelegate _next;
#endregion
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="next">Delegate in next step</param>
public CorsMiddleware(RequestDelegate next)
{
_next = next;
}
#endregion
/// <summary>
/// Invoke
/// </summary>
/// <param name="httpContext">httpContext</param>
/// <returns></returns>
public Task Invoke(HttpContext httpContext)
{
if (httpContext.Request.Method == "OPTIONS")
{
httpContext.Response.Headers.Add("Access-Control-Allow-Origin", httpContext.Request.Headers["Origin"]);
httpContext.Response.Headers.Add("Access-Control-Allow-Headers", httpContext.Request.Headers["Access-Control-Request-Headers"]);
httpContext.Response.Headers.Add("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH");
httpContext.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
httpContext.Response.Headers.Add("Access-Control-Max-Age", "86400");
httpContext.Response.StatusCode = StatusCodes.Status200OK;
return Task.CompletedTask;
}
if (httpContext.Request.Headers["Origin"] != "")
{
httpContext.Response.Headers.Add("Access-Control-Allow-Origin", httpContext.Request.Headers["Origin"]);
}
httpContext.Response.Headers.Add("Access-Control-Allow-Headers", httpContext.Request.Headers["Access-Control-Request-Headers"]);
httpContext.Response.Headers.Add("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH");
httpContext.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
httpContext.Response.Headers.Add("Access-Control-Max-Age", "86400");
return _next.Invoke(httpContext);
}
}
}

View file

@ -0,0 +1,105 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
using System.Threading.Tasks;
using ModernWMS.Core.Models;
using Microsoft.Extensions.Localization;
namespace ModernWMS.Core.Middleware
{
/// <summary>
/// Global exception middleware
/// </summary>
public class GlobalExceptionMiddleware
{
#region parameter
private readonly RequestDelegate next;
private readonly ILogger<GlobalExceptionMiddleware> logger;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<MultiLanguage> _stringLocalizer;
#endregion
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="next">Delegate in next step</param>
/// <param name="logger">log manager</param>
/// <param name="stringLocalizer">Localizer</param>
public GlobalExceptionMiddleware(RequestDelegate next,
ILogger<GlobalExceptionMiddleware> logger,
IStringLocalizer<MultiLanguage> stringLocalizer
)
{
this.next = next;
this.logger = logger;
this._stringLocalizer = stringLocalizer;
}
#endregion
/// <summary>
/// invoke
/// </summary>
/// <param name="context">httpcontext</param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
try
{
await next.Invoke(context);
}
catch (Exception ex)
{
await WriteExceptionAsync(context, ex);
}
}
/// <summary>
/// Write Log
/// </summary>
/// <param name="context">httpcontext</param>
/// <param name="e">error messasge</param>
/// <returns></returns>
private async Task WriteExceptionAsync(HttpContext context, Exception e)
{
if (e != null)
{
var response = context.Response;
var message = e.InnerException == null ? e.Message : e.InnerException.Message;
response.ContentType = "application/json";
var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (string.IsNullOrEmpty(ip))
{
ip = context.Connection.RemoteIpAddress.ToString();
}
logger.LogError($"\r\n\r\nIP:{ip},Exception{e.Message}\r\nStackTrace{e.StackTrace}");
string result = Utility.JsonHelper.SerializeObject(ResultModel<object>.Error(_stringLocalizer["operation_failed"]));
await context.Response.WriteAsync(result).ConfigureAwait(false);
}
else
{
var code = context.Response.StatusCode;
switch (code)
{
case 200:
return;
case 204:
return;
case 401:
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(Utility.JsonHelper.SerializeObject(ResultModel<object>.Error("Invalid Token"))).ConfigureAwait(false);
break;
default:
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(Utility.JsonHelper.SerializeObject(ResultModel<object>.Error("Unknown Error"))).ConfigureAwait(false);
break;
}
}
}
}
}

View file

@ -0,0 +1,138 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using ModernWMS.Core.Models;
namespace ModernWMS.Core.Middleware
{
/// <summary>
/// Request response middleware
/// </summary>
public class RequestResponseMiddleware
{
#region parameter
/// <summary>
/// Delegate
/// </summary>
private readonly RequestDelegate _next;
/// <summary>
/// log manager
/// </summary>
private readonly ILogger<RequestResponseMiddleware> _logger;
#endregion
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="next">Delegate</param>
/// <param name="logger">log manager</param>
public RequestResponseMiddleware(RequestDelegate next
, ILogger<RequestResponseMiddleware> logger)
{
_next = next;
_logger = logger;
}
#endregion
/// <summary>
/// Invoke
/// </summary>
/// <param name="context">httpcontext</param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
if (ModernWMS.Core.Utility.GlobalConsts.IsRequestResponseMiddleware)
{
string requestInfo = "", responseInfo = "";
var originalBodyStream = context.Response.Body;
var stopwach = Stopwatch.StartNew();
try
{
requestInfo = await FormatRequest(context.Request);
using (var responseBody = new MemoryStream())
{
context.Response.Body = responseBody;
await _next(context);
stopwach.Stop();
responseInfo = await FormatResponse(context.Response);
await responseBody.CopyToAsync(originalBodyStream);
}
var logMsg = $@"request information: {requestInfo} ;time spent: {stopwach.ElapsedMilliseconds}ms";
_logger.LogInformation(logMsg);
}
catch (Exception ex)
{
stopwach.Stop();
if (ex != null)
{
var logMsg = $@"request information: {requestInfo}{Environment.NewLine}exception: {ex.ToString()}{Environment.NewLine}time spent: {stopwach.ElapsedMilliseconds}ms";
_logger.LogError(logMsg);
_logger.LogError(ex.ToString());
string result = Utility.JsonHelper.SerializeObject(ResultModel<object>.Error(ex.Message));
var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(result));
await originalBodyStream.WriteAsync(bytes, 0, bytes.Length);
}
}
}
else
{
await _next(context);
}
}
/// <summary>
/// format request
/// </summary>
/// <param name="request">request</param>
/// <returns></returns>
private async Task<string> FormatRequest(HttpRequest request)
{
HttpRequestRewindExtensions.EnableBuffering(request);
var body = request.Body;
var buffer = new byte[Convert.ToInt32(request.ContentLength)];
await request.Body.ReadAsync(buffer, 0, buffer.Length);
var bodyAsText = Encoding.UTF8.GetString(buffer);
body.Seek(0, SeekOrigin.Begin);
request.Body = body;
return $" {request.Method} {request.Scheme}://{request.Host}{request.Path} {request.QueryString} {bodyAsText}";
}
/// <summary>
/// format response
/// </summary>
/// <param name="response">response</param>
/// <returns></returns>
private async Task<string> FormatResponse(HttpResponse response)
{
response.Body.Seek(0, SeekOrigin.Begin);
var text = await new StreamReader(response.Body).ReadToEndAsync();
response.Body.Seek(0, SeekOrigin.Begin);
return $"{response.StatusCode}: {text}";
}
}
}

View file

@ -0,0 +1,78 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using ModernWMS.Core.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.Core.Middleware
{
/// <summary>
/// ViewModelActionFiter
/// </summary>
public class ViewModelActionFiter : ActionFilterAttribute
{
/// <summary>
/// override OnActionExecuting
/// </summary>
/// <param name="context">context</param>
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
string method = context.HttpContext.Request.Method;
ResultModel<object> result = new ResultModel<object>();
StringBuilder msg = new StringBuilder();
bool flag = false;
foreach (var item in context.ModelState.Values)
{
if (method.Equals("GET"))
{
msg.Append($",parameter value“{item.AttemptedValue}”does not pass the verification");
}
else
{
foreach (var error in item.Errors)
{
if (error.ErrorMessage.Contains("convert")
|| error.ErrorMessage.Contains("Unexpected character")
|| error.ErrorMessage.Contains("is not")
|| error.ErrorMessage.Contains("valid")
|| error.ErrorMessage.Contains("Input "))
{
flag = true;
}
else
{
msg.Append($",{error.ErrorMessage}");
}
}
}
}
if (flag)
{
msg.Append($",The data is of incorrect type or the value exceeds the type range");
}
if (msg.ToString().Length > 0)
{
result.ErrorMessage += msg.ToString().Substring(1);
}
result.Code = 400;
context.Result = new JsonResult(result, new Newtonsoft.Json.JsonSerializerSettings()
{
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(),
Formatting = Newtonsoft.Json.Formatting.Indented,
DateFormatString = "yyyy-MM-dd HH:mm:ss"
});
}
else
{
base.OnActionExecuting(context);
}
}
}
}

View file

@ -0,0 +1,16 @@

using System;
using System.ComponentModel.DataAnnotations;
namespace ModernWMS.Core.Models
{
[Serializable]
public abstract class BaseModel
{
/// <summary>
/// id
/// </summary>
[Key]
public int id { get; set; } = 0;
}
}

View file

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.Core.Models
{
public class BatchOperationViewModel
{
public List<int> id_list { get; set; } = new List<int>();
}
}

View file

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.Core.Models
{
/// <summary>
/// select items model
/// </summary>
public class FormSelectItem
{
/// <summary>
/// key
/// </summary>
public string code { get; set; } = string.Empty;
/// <summary>
/// comment
/// </summary>
public string comments { get; set; } = string.Empty;
/// <summary>
/// text
/// </summary>
public string name { get; set; } = string.Empty;
/// <summary>
/// value
/// </summary>
public string value { get; set; } = string.Empty;
}
}

View file

@ -0,0 +1,25 @@

using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
namespace ModernWMS.Core.Models
{
/// <summary>
/// login input viewmodel
/// </summary>
public class LoginInputViewModel
{
/// <summary>
/// username
/// </summary>
[Required(ErrorMessage ="Required")]
[Display(Name = "user_name")]
public string user_name { get; set; } = string.Empty;
/// <summary>
/// password
/// </summary>
[Required(ErrorMessage ="Required")]
[Display(Name = "password")]
public string password { get; set; } = string.Empty;
}
}

View file

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
namespace ModernWMS.Core.Models
{
/// <summary>
/// LoginOutputViewModel
/// </summary>
public class LoginOutputViewModel
{
/// <summary>
/// user's num
/// </summary>
public string user_num { get; set; }
/// <summary>
/// user's name
/// </summary>
public string user_name { get; set; }
/// <summary>
/// user's id
/// </summary>
public int user_id { get; set; }
/// <summary>
/// user's role
/// </summary>
public string user_role { get; set; }
/// <summary>
/// id of user's role
/// </summary>
public int userrole_id { get; set; }
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; }
/// <summary>
/// token expire time
/// </summary>
public int expire { get; set; }
/// <summary>
/// token
/// </summary>
public string access_token { get; set; }
/// <summary>
/// refresh token
/// </summary>
public string refresh_token { get; set; }
}
}

View file

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.Core
{
public class MultiLanguage
{
}
}

View file

@ -0,0 +1,636 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="carrier" xml:space="preserve">
<value>carrier</value>
</data>
<data name="departure_city" xml:space="preserve">
<value>Departure City</value>
</data>
<data name="arrival_city" xml:space="preserve">
<value>Arrival City</value>
</data>
<data name="price_per_weight" xml:space="preserve">
<value>Weight Fee</value>
</data>
<data name="price_per_volume" xml:space="preserve">
<value>Volume Fee</value>
</data>
<data name="min_payment" xml:space="preserve">
<value>Min Payment</value>
</data>
<data name="creator" xml:space="preserve">
<value>Creator</value>
</data>
<data name="create_time" xml:space="preserve">
<value>Create Time</value>
</data>
<data name="last_update_time" xml:space="preserve">
<value>Last Update Time</value>
</data>
<data name="is_valid" xml:space="preserve">
<value>Valid</value>
</data>
<data name="user_num" xml:space="preserve">
<value>User Num</value>
</data>
<data name="user_name" xml:space="preserve">
<value>User Name</value>
</data>
<data name="user_role" xml:space="preserve">
<value>Role</value>
</data>
<data name="contact_tel" xml:space="preserve">
<value>Contact Information</value>
</data>
<data name="sex" xml:space="preserve">
<value>Sex</value>
</data>
<data name="warehouseSetting" xml:space="preserve">
<value>Warehouse Setting</value>
</data>
<data name="reservoirSetting" xml:space="preserve">
<value>Reservoir Setting</value>
</data>
<data name="locationSetting" xml:space="preserve">
<value>Location Setting</value>
</data>
<data name="locationSelectModal" xml:space="preserve">
<value>Location Select Modal</value>
</data>
<data name="email" xml:space="preserve">
<value>Email</value>
</data>
<data name="warehouse_name" xml:space="preserve">
<value>Warehouse Name</value>
</data>
<data name="city" xml:space="preserve">
<value>City</value>
</data>
<data name="address" xml:space="preserve">
<value>Address</value>
</data>
<data name="manager" xml:space="preserve">
<value>Manager</value>
</data>
<data name="area_name" xml:space="preserve">
<value>Reservoir Name</value>
</data>
<data name="area_property" xml:space="preserve">
<value>Reservoir Category</value>
</data>
<data name="location_name" xml:space="preserve">
<value>Location Code</value>
</data>
<data name="location_length" xml:space="preserve">
<value>Location Length</value>
</data>
<data name="location_width" xml:space="preserve">
<value>Location Width</value>
</data>
<data name="location_heigth" xml:space="preserve">
<value>Location Height</value>
</data>
<data name="location_volume" xml:space="preserve">
<value>Location Volume</value>
</data>
<data name="location_load" xml:space="preserve">
<value>Location Load</value>
</data>
<data name="roadway_number" xml:space="preserve">
<value>Roadway Number</value>
</data>
<data name="shelf_number" xml:space="preserve">
<value>Shelf Number</value>
</data>
<data name="layer_number" xml:space="preserve">
<value>Layer Number</value>
</data>
<data name="tag_number" xml:space="preserve">
<value>Tag Number</value>
</data>
<data name="picking_area" xml:space="preserve">
<value>Picking Area</value>
</data>
<data name="stocking_area" xml:space="preserve">
<value>Stocking Area</value>
</data>
<data name="receiving_area" xml:space="preserve">
<value>Receiving Area</value>
</data>
<data name="return_area" xml:space="preserve">
<value>Return Area</value>
</data>
<data name="defective_area" xml:space="preserve">
<value>Defective Area</value>
</data>
<data name="inventory_area" xml:space="preserve">
<value>Inventory Area</value>
</data>
<data name="customer_name" xml:space="preserve">
<value>Customer Name</value>
</data>
<data name="supplier_name" xml:space="preserve">
<value>Supplier Name</value>
</data>
<data name="role_name" xml:space="preserve">
<value>User Role</value>
</data>
<data name="company_name" xml:space="preserve">
<value>Corporate Name</value>
</data>
<data name="goods_owner_name" xml:space="preserve">
<value>Owner Of Cargo</value>
</data>
<data name="category_name" xml:space="preserve">
<value>Commodity category</value>
</data>
<data name="parent_name" xml:space="preserve">
<value>Parent Category</value>
</data>
<data name="menu_name" xml:space="preserve">
<value>Menu Name</value>
</data>
<data name="spu_code" xml:space="preserve">
<value>Commodity Code</value>
</data>
<data name="spu_name" xml:space="preserve">
<value>Commodity Name</value>
</data>
<data name="sku_code" xml:space="preserve">
<value>Specification Code</value>
</data>
<data name="sku_name" xml:space="preserve">
<value>Specification Name</value>
</data>
<data name="spu_description" xml:space="preserve">
<value>Commodity Description</value>
</data>
<data name="bar_code" xml:space="preserve">
<value>Specification Code</value>
</data>
<data name="brand" xml:space="preserve">
<value>Brand</value>
</data>
<data name="unit" xml:space="preserve">
<value>Commodity Unit</value>
</data>
<data name="cost" xml:space="preserve">
<value>Commodity Cost</value>
</data>
<data name="price" xml:space="preserve">
<value>Commodity Price</value>
</data>
<data name="origin" xml:space="preserve">
<value>origin</value>
</data>
<data name="length_unit" xml:space="preserve">
<value>Length Unit</value>
</data>
<data name="volume_unit" xml:space="preserve">
<value>Volume Unit</value>
</data>
<data name="weight_unit" xml:space="preserve">
<value>Weight Unit</value>
</data>
<data name="weight" xml:space="preserve">
<value>Commodity Weight</value>
</data>
<data name="lenght" xml:space="preserve">
<value>Commodity Length</value>
</data>
<data name="width" xml:space="preserve">
<value>Commodity Width</value>
</data>
<data name="height" xml:space="preserve">
<value>Commodity Height</value>
</data>
<data name="volume" xml:space="preserve">
<value>Commodity Volume</value>
</data>
<data name="warehouse" xml:space="preserve">
<value>Warehouse Name</value>
</data>
<data name="qty_available" xml:space="preserve">
<value>Available Qty</value>
</data>
<data name="job_code" xml:space="preserve">
<value>Job Code</value>
</data>
<data name="job_type" xml:space="preserve">
<value>Job Type</value>
</data>
<data name="process_status" xml:space="preserve">
<value>Process Status</value>
</data>
<data name="processor" xml:space="preserve">
<value>Processor</value>
</data>
<data name="process_time" xml:space="preserve">
<value>Process Time</value>
</data>
<data name="qty" xml:space="preserve">
<value>Quantity</value>
</data>
<data name="is_source" xml:space="preserve">
<value>Is Source</value>
</data>
<data name="target_warehouse" xml:space="preserve">
<value>Target Warehouse</value>
</data>
<data name="target_location" xml:space="preserve">
<value>Target Location</value>
</data>
<data name="is_update_stock" xml:space="preserve">
<value>Is Updated Stock</value>
</data>
<data name="adjust_status" xml:space="preserve">
<value>Is Updated Stock</value>
</data>
<data name="source" xml:space="preserve">
<value>Source</value>
</data>
<data name="target" xml:space="preserve">
<value>Target</value>
</data>
<data name="move_status" xml:space="preserve">
<value>Move Status</value>
</data>
<data name="handler" xml:space="preserve">
<value>Handler</value>
</data>
<data name="handle_time" xml:space="preserve">
<value>Handle Time</value>
</data>
<data name="orig_goods_warehouse" xml:space="preserve">
<value>Origin Warehouse</value>
</data>
<data name="orig_goods_location_name" xml:space="preserve">
<value>Origin Location</value>
</data>
<data name="dest_googs_warehouse" xml:space="preserve">
<value>Target Warehouse</value>
</data>
<data name="dest_googs_location_name" xml:space="preserve">
<value>Target Location</value>
</data>
<data name="freeze" xml:space="preserve">
<value>Freeze</value>
</data>
<data name="unfreeze" xml:space="preserve">
<value>Unfreeze</value>
</data>
<data name="job_status" xml:space="preserve">
<value>Job Status</value>
</data>
<data name="book_qty" xml:space="preserve">
<value>Book Qty</value>
</data>
<data name="counted_qty" xml:space="preserve">
<value>Actual Qty</value>
</data>
<data name="difference_qty" xml:space="preserve">
<value>Difference Qty</value>
</data>
<data name="confirmTaking" xml:space="preserve">
<value>Confirm Taking</value>
</data>
<data name="stockLocation" xml:space="preserve">
<value>Stock Location</value>
</data>
<data name="stock" xml:space="preserve">
<value>Stock</value>
</data>
<data name="sku_id" xml:space="preserve">
<value>Sku Id</value>
</data>
<data name="qty_locked" xml:space="preserve">
<value>Locked Quantity</value>
</data>
<data name="qty_frozen" xml:space="preserve">
<value>Frozen Quantity</value>
</data>
<data name="qty_asn" xml:space="preserve">
<value>Asn Quantity</value>
</data>
<data name="qty_to_unload" xml:space="preserve">
<value>Unload Quantity</value>
</data>
<data name="qty_to_sort" xml:space="preserve">
<value>Sort Quantity</value>
</data>
<data name="qty_sorted" xml:space="preserve">
<value>Sorted Quantity</value>
</data>
<data name="shortage_qty" xml:space="preserve">
<value>Shortage Quantity</value>
</data>
<data name="id" xml:space="preserve">
<value>ID</value>
</data>
<data name="asn_no" xml:space="preserve">
<value>Asn No</value>
</data>
<data name="asn_status" xml:space="preserve">
<value>Asn Status</value>
</data>
<data name="spu_id" xml:space="preserve">
<value>Spu Id</value>
</data>
<data name="asn_qty" xml:space="preserve">
<value>Asn Quantity</value>
</data>
<data name="actual_qty" xml:space="preserve">
<value>Actual Quantity</value>
</data>
<data name="sorted_qty" xml:space="preserve">
<value>Sorted Quantity</value>
</data>
<data name="more_qty" xml:space="preserve">
<value>More Quantity</value>
</data>
<data name="damage_qty" xml:space="preserve">
<value>Damage Quantity</value>
</data>
<data name="supplier_id" xml:space="preserve">
<value>Supplier Id</value>
</data>
<data name="goods_owner_id" xml:space="preserve">
<value>Goods Owner Id</value>
</data>
<data name="shipment" xml:space="preserve">
<value>Invoice</value>
</data>
<data name="preShipment" xml:space="preserve">
<value>Pre Shipment</value>
</data>
<data name="newShipment" xml:space="preserve">
<value>New Shipment</value>
</data>
<data name="goodsToBePicked" xml:space="preserve">
<value>Goods To Be Picked</value>
</data>
<data name="picked" xml:space="preserve">
<value>Picked</value>
</data>
<data name="toBePackaged" xml:space="preserve">
<value>To Be Packaged</value>
</data>
<data name="package" xml:space="preserve">
<value>Pack</value>
</data>
<data name="packaged" xml:space="preserve">
<value>Packaged</value>
</data>
<data name="toBeWeighed" xml:space="preserve">
<value>To Be Weighed</value>
</data>
<data name="weigh" xml:space="preserve">
<value>Weigh</value>
</data>
<data name="weighed" xml:space="preserve">
<value>Weighed</value>
</data>
<data name="delivery" xml:space="preserve">
<value>Delivery</value>
</data>
<data name="toBeDelivered" xml:space="preserve">
<value>To Be Delivered</value>
</data>
<data name="outOfWarehouse" xml:space="preserve">
<value>Out Of Warehouse</value>
</data>
<data name="signIn" xml:space="preserve">
<value>Sign In</value>
</data>
<data name="signedIn" xml:space="preserve">
<value>Signed In</value>
</data>
<data name="dispatch_no" xml:space="preserve">
<value>Shipment No</value>
</data>
<data name="dispatch_status" xml:space="preserve">
<value>Shipment Doc Status</value>
</data>
<data name="detailQty" xml:space="preserve">
<value>Quantity</value>
</data>
<data name="data_changed" xml:space="preserve">
<value>The data has changed.Please refresh and retry the operation</value>
</data>
<data name="delete_failed" xml:space="preserve">
<value>Delete failed</value>
</data>
<data name="delete_referenced" xml:space="preserve">
<value>The data has been referenced and cannot be deleted</value>
</data>
<data name="delete_success" xml:space="preserve">
<value>Delete success</value>
</data>
<data name="exists_entity" xml:space="preserve">
<value>The {0}:{1} is exists</value>
</data>
<data name="not_exists_entity" xml:space="preserve">
<value>The data does not exist or has been deleted</value>
</data>
<data name="MaxLength" xml:space="preserve">
<value>{0} input length must less than or equal {1}</value>
</data>
<data name="operation_failed" xml:space="preserve">
<value>Operation failed</value>
</data>
<data name="operation_success" xml:space="preserve">
<value>Operation succeeded</value>
</data>
<data name="Required" xml:space="preserve">
<value>{0} is Required</value>
</data>
<data name="save_failed" xml:space="preserve">
<value>Failure</value>
</data>
<data name="save_success" xml:space="preserve">
<value>Success</value>
</data>
<data name="status_changed" xml:space="preserve">
<value>The status of this data has changed.Please refresh and retry the operation</value>
</data>
<data name="status_not_delete" xml:space="preserve">
<value>Current status cannot be deleted</value>
</data>
<data name="ASN_Status_Is_Not_Pre_Delivery" xml:space="preserve">
<value>The ASN status is not PreDelivery</value>
</data>
<data name="ASN_Status_Is_Not_Pre_Load" xml:space="preserve">
<value>The ASN status is not PreLoad</value>
</data>
<data name="ASN_Status_Is_Not_Pre_Sort" xml:space="preserve">
<value>The ASN status is not PreSort</value>
</data>
<data name="ASN_Status_Is_Not_Sorted" xml:space="preserve">
<value>The ASN status is not Sorted</value>
</data>
<data name="ASN_Status_Is_Not_Sorting" xml:space="preserve">
<value>The ASN status is not Sorting</value>
</data>
<data name="ASN_Status_Is_Putaway" xml:space="preserve">
<value>The ASN status is putaway</value>
</data>
<data name="ASN_Total_PutAway_Qty_Greater_Than_Sorted_Qty" xml:space="preserve">
<value>The ASN putaway's quantity greater than sorted quantity</value>
</data>
<data name="putaway_success" xml:space="preserve">
<value>Putaway success</value>
</data>
<data name="putaway_failed" xml:space="preserve">
<value>Putaway failed</value>
</data>
<data name="sorted_success" xml:space="preserve">
<value>Sorted success</value>
</data>
<data name="sorted_failed" xml:space="preserve">
<value>Sorted failed</value>
</data>
<data name="try_agin" xml:space="preserve">
<value>The current operation cannot be performed. Please refresh and try again</value>
</data>
<data name="unpackgeqty_lessthen" xml:space="preserve">
<value>Unpacked quantity is less than the quantity to be packed.Please refresh and try again</value>
</data>
<data name="unweightqty_lessthen" xml:space="preserve">
<value>Unweighed quantity is less than the quantity to be weighed.Please refresh and try again</value>
</data>
<data name="login_failed" xml:space="preserve">
<value>Login failed</value>
</data>
<data name="exist_location_not_delete" xml:space="preserve">
<value>The warehouse location has been set under this warehouse area and cannot be deleted</value>
</data>
<data name="exist_warehousearea_not_delete" xml:space="preserve">
<value>The warehouse area has been set under this warehouse and cannot be deleted</value>
</data>
<data name="dispatch_not_comfirm" xml:space="preserve">
<value>There are un issued shipment documents</value>
</data>
<data name="move_not_comfirm" xml:space="preserve">
<value>There are unconfirmed inventory movements in this location</value>
</data>
<data name="process_not_comfirm" xml:space="preserve">
<value>There are unconfirmed warehouse processings</value>
</data>
</root>

View file

@ -0,0 +1,636 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="carrier" xml:space="preserve">
<value>承运商</value>
</data>
<data name="departure_city" xml:space="preserve">
<value>始发城市</value>
</data>
<data name="arrival_city" xml:space="preserve">
<value>到货城市</value>
</data>
<data name="price_per_weight" xml:space="preserve">
<value>单公斤运费</value>
</data>
<data name="price_per_volume" xml:space="preserve">
<value>单立方米运费</value>
</data>
<data name="min_payment" xml:space="preserve">
<value>最小运费</value>
</data>
<data name="creator" xml:space="preserve">
<value>创建人</value>
</data>
<data name="create_time" xml:space="preserve">
<value>创建时间</value>
</data>
<data name="last_update_time" xml:space="preserve">
<value>最后更新时间</value>
</data>
<data name="is_valid" xml:space="preserve">
<value>是否有效</value>
</data>
<data name="user_num" xml:space="preserve">
<value>员工编号</value>
</data>
<data name="user_name" xml:space="preserve">
<value>员工名称</value>
</data>
<data name="user_role" xml:space="preserve">
<value>角色</value>
</data>
<data name="contact_tel" xml:space="preserve">
<value>联系方式</value>
</data>
<data name="sex" xml:space="preserve">
<value>性别</value>
</data>
<data name="warehouseSetting" xml:space="preserve">
<value>仓库设置</value>
</data>
<data name="reservoirSetting" xml:space="preserve">
<value>库区设置</value>
</data>
<data name="locationSetting" xml:space="preserve">
<value>库位设置</value>
</data>
<data name="locationSelectModal" xml:space="preserve">
<value>库位选择框</value>
</data>
<data name="email" xml:space="preserve">
<value>Email</value>
</data>
<data name="warehouse_name" xml:space="preserve">
<value>仓库名称</value>
</data>
<data name="city" xml:space="preserve">
<value>所在城市</value>
</data>
<data name="address" xml:space="preserve">
<value>详细地址</value>
</data>
<data name="manager" xml:space="preserve">
<value>负责人</value>
</data>
<data name="area_name" xml:space="preserve">
<value>库区名称</value>
</data>
<data name="area_property" xml:space="preserve">
<value>库区类型</value>
</data>
<data name="location_name" xml:space="preserve">
<value>库位编码</value>
</data>
<data name="location_length" xml:space="preserve">
<value>库位长</value>
</data>
<data name="location_width" xml:space="preserve">
<value>库位宽</value>
</data>
<data name="location_heigth" xml:space="preserve">
<value>库位高</value>
</data>
<data name="location_volume" xml:space="preserve">
<value>库位容积</value>
</data>
<data name="location_load" xml:space="preserve">
<value>库位承重</value>
</data>
<data name="roadway_number" xml:space="preserve">
<value>巷道号</value>
</data>
<data name="shelf_number" xml:space="preserve">
<value>货架号</value>
</data>
<data name="layer_number" xml:space="preserve">
<value>层号</value>
</data>
<data name="tag_number" xml:space="preserve">
<value>位号</value>
</data>
<data name="picking_area" xml:space="preserve">
<value>拣货区</value>
</data>
<data name="stocking_area" xml:space="preserve">
<value>备货区</value>
</data>
<data name="receiving_area" xml:space="preserve">
<value>收货区</value>
</data>
<data name="return_area" xml:space="preserve">
<value>退货区</value>
</data>
<data name="defective_area" xml:space="preserve">
<value>次品区</value>
</data>
<data name="inventory_area" xml:space="preserve">
<value>存货区</value>
</data>
<data name="customer_name" xml:space="preserve">
<value>客户名称</value>
</data>
<data name="supplier_name" xml:space="preserve">
<value>供应商名称</value>
</data>
<data name="role_name" xml:space="preserve">
<value>用户角色</value>
</data>
<data name="company_name" xml:space="preserve">
<value>公司名称</value>
</data>
<data name="goods_owner_name" xml:space="preserve">
<value>货主名称</value>
</data>
<data name="category_name" xml:space="preserve">
<value>商品类别</value>
</data>
<data name="parent_name" xml:space="preserve">
<value>所属类别</value>
</data>
<data name="menu_name" xml:space="preserve">
<value>菜单名称</value>
</data>
<data name="spu_code" xml:space="preserve">
<value>商品编码</value>
</data>
<data name="spu_name" xml:space="preserve">
<value>商品名称</value>
</data>
<data name="sku_code" xml:space="preserve">
<value>规格编码</value>
</data>
<data name="sku_name" xml:space="preserve">
<value>规格名称</value>
</data>
<data name="spu_description" xml:space="preserve">
<value>商品描述</value>
</data>
<data name="bar_code" xml:space="preserve">
<value>商品条码</value>
</data>
<data name="brand" xml:space="preserve">
<value>品牌</value>
</data>
<data name="unit" xml:space="preserve">
<value>商品单位</value>
</data>
<data name="cost" xml:space="preserve">
<value>商品成本</value>
</data>
<data name="price" xml:space="preserve">
<value>商品价格</value>
</data>
<data name="origin" xml:space="preserve">
<value>产地</value>
</data>
<data name="length_unit" xml:space="preserve">
<value>长度单位</value>
</data>
<data name="volume_unit" xml:space="preserve">
<value>体积单位</value>
</data>
<data name="weight_unit" xml:space="preserve">
<value>重量单位</value>
</data>
<data name="weight" xml:space="preserve">
<value>商品重量</value>
</data>
<data name="lenght" xml:space="preserve">
<value>商品长度</value>
</data>
<data name="width" xml:space="preserve">
<value>商品宽度</value>
</data>
<data name="height" xml:space="preserve">
<value>商品高度</value>
</data>
<data name="volume" xml:space="preserve">
<value>商品体积</value>
</data>
<data name="warehouse" xml:space="preserve">
<value>仓库名称</value>
</data>
<data name="qty_available" xml:space="preserve">
<value>可用数量</value>
</data>
<data name="job_code" xml:space="preserve">
<value>作业单号</value>
</data>
<data name="job_type" xml:space="preserve">
<value>作业类型</value>
</data>
<data name="process_status" xml:space="preserve">
<value>加工状态</value>
</data>
<data name="processor" xml:space="preserve">
<value>操作人</value>
</data>
<data name="process_time" xml:space="preserve">
<value>操作时间</value>
</data>
<data name="qty" xml:space="preserve">
<value>数量</value>
</data>
<data name="is_source" xml:space="preserve">
<value>是否来源商品</value>
</data>
<data name="target_warehouse" xml:space="preserve">
<value>目标仓库</value>
</data>
<data name="target_location" xml:space="preserve">
<value>目标库位</value>
</data>
<data name="is_update_stock" xml:space="preserve">
<value>是否已更新库存</value>
</data>
<data name="adjust_status" xml:space="preserve">
<value>是否已调整</value>
</data>
<data name="source" xml:space="preserve">
<value>来源</value>
</data>
<data name="target" xml:space="preserve">
<value>目标</value>
</data>
<data name="move_status" xml:space="preserve">
<value>作业状态</value>
</data>
<data name="handler" xml:space="preserve">
<value>操作人</value>
</data>
<data name="handle_time" xml:space="preserve">
<value>操作时间</value>
</data>
<data name="orig_goods_warehouse" xml:space="preserve">
<value>来源仓库</value>
</data>
<data name="orig_goods_location_name" xml:space="preserve">
<value>来源库位</value>
</data>
<data name="dest_googs_warehouse" xml:space="preserve">
<value>目标仓库</value>
</data>
<data name="dest_googs_location_name" xml:space="preserve">
<value>目标库位</value>
</data>
<data name="freeze" xml:space="preserve">
<value>冻结</value>
</data>
<data name="unfreeze" xml:space="preserve">
<value>解冻</value>
</data>
<data name="job_status" xml:space="preserve">
<value>作业状态</value>
</data>
<data name="book_qty" xml:space="preserve">
<value>账面数量</value>
</data>
<data name="counted_qty" xml:space="preserve">
<value>盘点数量</value>
</data>
<data name="difference_qty" xml:space="preserve">
<value>差异数量</value>
</data>
<data name="confirmTaking" xml:space="preserve">
<value>确认盘点</value>
</data>
<data name="stockLocation" xml:space="preserve">
<value>库位列表</value>
</data>
<data name="stock" xml:space="preserve">
<value>库存列表</value>
</data>
<data name="sku_id" xml:space="preserve">
<value>规格标识</value>
</data>
<data name="qty_locked" xml:space="preserve">
<value>锁定数量</value>
</data>
<data name="qty_frozen" xml:space="preserve">
<value>冻结数量</value>
</data>
<data name="qty_asn" xml:space="preserve">
<value>到货通知书数量</value>
</data>
<data name="qty_to_unload" xml:space="preserve">
<value>待卸货数量</value>
</data>
<data name="qty_to_sort" xml:space="preserve">
<value>待分拣数量</value>
</data>
<data name="qty_sorted" xml:space="preserve">
<value>已分拣数量</value>
</data>
<data name="shortage_qty" xml:space="preserve">
<value>欠货数量</value>
</data>
<data name="id" xml:space="preserve">
<value>标识</value>
</data>
<data name="asn_no" xml:space="preserve">
<value>到货通知书编号</value>
</data>
<data name="asn_status" xml:space="preserve">
<value>到货通知书状态</value>
</data>
<data name="spu_id" xml:space="preserve">
<value>商品spu标识</value>
</data>
<data name="asn_qty" xml:space="preserve">
<value>到货通知书数据</value>
</data>
<data name="actual_qty" xml:space="preserve">
<value>上架数量</value>
</data>
<data name="sorted_qty" xml:space="preserve">
<value>分拣数量</value>
</data>
<data name="more_qty" xml:space="preserve">
<value>超量数量</value>
</data>
<data name="damage_qty" xml:space="preserve">
<value>破损数量</value>
</data>
<data name="supplier_id" xml:space="preserve">
<value>供应商标识</value>
</data>
<data name="goods_owner_id" xml:space="preserve">
<value>货主标识</value>
</data>
<data name="shipment" xml:space="preserve">
<value>发货单</value>
</data>
<data name="preShipment" xml:space="preserve">
<value>预发货</value>
</data>
<data name="newShipment" xml:space="preserve">
<value>新发货</value>
</data>
<data name="goodsToBePicked" xml:space="preserve">
<value>待拣货</value>
</data>
<data name="picked" xml:space="preserve">
<value>已拣货</value>
</data>
<data name="toBePackaged" xml:space="preserve">
<value>待打包</value>
</data>
<data name="package" xml:space="preserve">
<value>打包</value>
</data>
<data name="packaged" xml:space="preserve">
<value>已打包</value>
</data>
<data name="toBeWeighed" xml:space="preserve">
<value>待称重</value>
</data>
<data name="weigh" xml:space="preserve">
<value>称重</value>
</data>
<data name="weighed" xml:space="preserve">
<value>已称重</value>
</data>
<data name="delivery" xml:space="preserve">
<value>出库</value>
</data>
<data name="toBeDelivered" xml:space="preserve">
<value>待出库</value>
</data>
<data name="outOfWarehouse" xml:space="preserve">
<value>已出库</value>
</data>
<data name="signIn" xml:space="preserve">
<value>签收</value>
</data>
<data name="signedIn" xml:space="preserve">
<value>已签收</value>
</data>
<data name="dispatch_no" xml:space="preserve">
<value>发货单号</value>
</data>
<data name="dispatch_status" xml:space="preserve">
<value>发货单状态</value>
</data>
<data name="detailQty" xml:space="preserve">
<value>数量</value>
</data>
<data name="data_changed" xml:space="preserve">
<value>数据发生改变,请刷新后重试操作</value>
</data>
<data name="delete_failed" xml:space="preserve">
<value>删除失败</value>
</data>
<data name="delete_referenced" xml:space="preserve">
<value>数据已被引用,不能删除</value>
</data>
<data name="delete_success" xml:space="preserve">
<value>删除成功</value>
</data>
<data name="exists_entity" xml:space="preserve">
<value>{0}:{1} 已经存在</value>
</data>
<data name="not_exists_entity" xml:space="preserve">
<value>数据不存在或已被删除</value>
</data>
<data name="MaxLength" xml:space="preserve">
<value>{0}输入字符长度不能大于{1}个字符</value>
</data>
<data name="operation_failed" xml:space="preserve">
<value>操作失败</value>
</data>
<data name="operation_success" xml:space="preserve">
<value>操作成功</value>
</data>
<data name="Required" xml:space="preserve">
<value>{0}必填</value>
</data>
<data name="save_failed" xml:space="preserve">
<value>保存失败</value>
</data>
<data name="save_success" xml:space="preserve">
<value>保存成功</value>
</data>
<data name="status_changed" xml:space="preserve">
<value>当前状态已改变,请刷新后重试</value>
</data>
<data name="status_not_delete" xml:space="preserve">
<value>当前状态不可删除</value>
</data>
<data name="ASN_Status_Is_Not_Pre_Delivery" xml:space="preserve">
<value>ASN 状态不是待到货</value>
</data>
<data name="ASN_Status_Is_Not_Pre_Load" xml:space="preserve">
<value>ASN 状态不是待卸货</value>
</data>
<data name="ASN_Status_Is_Not_Pre_Sort" xml:space="preserve">
<value>ASN 状态不是待分拣</value>
</data>
<data name="ASN_Status_Is_Not_Sorted" xml:space="preserve">
<value>ASN 状态不是已分拣</value>
</data>
<data name="ASN_Status_Is_Not_Sorting" xml:space="preserve">
<value>ASN 尚未分拣</value>
</data>
<data name="ASN_Status_Is_Putaway" xml:space="preserve">
<value>ASN 已经上架</value>
</data>
<data name="ASN_Total_PutAway_Qty_Greater_Than_Sorted_Qty" xml:space="preserve">
<value>ASN 上架数量超过了分拣数量</value>
</data>
<data name="putaway_success" xml:space="preserve">
<value>上架成功</value>
</data>
<data name="putaway_failed" xml:space="preserve">
<value>上架失败</value>
</data>
<data name="sorted_success" xml:space="preserve">
<value>确认分拣完成成功</value>
</data>
<data name="sorted_failed" xml:space="preserve">
<value>确认分拣完成失败</value>
</data>
<data name="try_agin" xml:space="preserve">
<value>不能进行当前操作,请刷新后重试</value>
</data>
<data name="unpackgeqty_lessthen" xml:space="preserve">
<value>未打包数量小于当前操作打包数量,请刷新后重试</value>
</data>
<data name="unweightqty_lessthen" xml:space="preserve">
<value>未称重数量小于当前操作称重数量,请刷新后重试</value>
</data>
<data name="login_failed" xml:space="preserve">
<value>登录失败</value>
</data>
<data name="dispatch_not_comfirm" xml:space="preserve">
<value>该库位存在未出库的发货单</value>
</data>
<data name="exist_location_not_delete" xml:space="preserve">
<value>该库区下已设置库位,不能删除</value>
</data>
<data name="exist_warehousearea_not_delete" xml:space="preserve">
<value>该仓库下已设置库区,不能删除</value>
</data>
<data name="move_not_comfirm" xml:space="preserve">
<value>该库位存在未确认的库存移动</value>
</data>
<data name="process_not_comfirm" xml:space="preserve">
<value>该库位存在未确认的仓内加工</value>
</data>
</root>

View file

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModernWMS.Core.Models
{
/// <summary>
/// PageData
/// </summary>
/// <typeparam name="T"></typeparam>
public class PageData<T>
{
/// <summary>
/// data
/// </summary>
public List<T> Rows { get; set; } = new List<T>(2);
/// <summary>
/// total rows
/// </summary>
public int Totals { get; set; } = 0;
}
}

View file

@ -0,0 +1,30 @@
using ModernWMS.Core.DynamicSearch;
namespace ModernWMS.Core.Models
{
/// <summary>
/// PageSearch
/// </summary>
public class PageSearch
{
/// <summary>
/// current page number
/// </summary>
public int pageIndex { get; set; } = 1;
/// <summary>
/// rows per page
/// </summary>
public int pageSize { get; set; } = 20;
/// <summary>
/// Custom Classification
/// </summary>
public string sqlTitle { get; set; } = "";
/// <summary>
/// search condition
/// </summary>
public List<SearchObject> searchObjects { get; set; } = new List<SearchObject>();
}
}

View file

@ -0,0 +1,22 @@
using System.ComponentModel.DataAnnotations;
namespace ModernWMS.Core.Models
{
/// <summary>
/// RefreshTokenInPutViewModel
/// </summary>
public class RefreshTokenInPutViewModel
{
/// <summary>
/// old access token
/// </summary>
[Required(ErrorMessage = "AccessToken is Required")]
public string AccessToken { get; set; }
/// <summary>
/// refresh token
/// </summary>
[Required(ErrorMessage = "RefreshToken is Required")]
public string RefreshToken { get; set; }
}
}

View file

@ -0,0 +1,51 @@
namespace ModernWMS.Core.Models
{
/// <summary>
/// http response viewmodel
/// </summary>
public class ResultModel<T>
{
/// <summary>
/// is request success
/// </summary>
public bool IsSuccess { get; set; }
/// <summary>
/// status code
/// </summary>
public int Code { get; set; }
/// <summary>
/// error message
/// </summary>
public string ErrorMessage { get; set; } = "";
/// <summary>
/// data
/// </summary>
public T Data { get; set; }
/// <summary>
/// success
/// </summary>
/// <param name="data">data</param>
/// <param name="errMsg">error message</param>
/// <returns></returns>
public static ResultModel<T> Success(T data, string errMsg = "")
{
if (data == null)
{
return Error("Some errors have occurred");
}
return new ResultModel<T> { Data = data, ErrorMessage = errMsg, IsSuccess = true, Code = 200 };
}
/// <summary>
/// faild
/// </summary>
/// <param name="str">error message</param>
/// <param name="code">status code</param>
/// <param name="data">data</param>
/// <returns></returns>
public static ResultModel<T> Error(string str, int code = 400, T data = default)
{
return new ResultModel<T> { Data = data, ErrorMessage = str, IsSuccess = false, Code = code };
}
}
}

View file

@ -0,0 +1,52 @@
/*
* date2022-12-20
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.Core.Models
{
/// <summary>
/// userrole entity
/// </summary>
[Table("userrole")]
public class UserroleEntity : BaseModel
{
#region Property
/// <summary>
/// role_name
/// </summary>
public string role_name { get; set; } = string.Empty;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = false;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,83 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
using ModernWMS.Core.Utility;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace ModernWMS.Core.Models
{
/// <summary>
/// user entity
/// </summary>
[Table("user")]
public class userEntity : BaseModel
{
#region property
/// <summary>
/// user's number
/// </summary>
public string user_num { get; set; } = string.Empty;
/// <summary>
/// user's name
/// </summary>
public string user_name { get; set; } = string.Empty;
/// <summary>
/// contact
/// </summary>
public string contact_tel { get; set; } = string.Empty;
/// <summary>
/// user's role
/// </summary>
public string user_role { get; set; } = string.Empty;
/// <summary>
/// sex
/// </summary>
public string sex { get; set; } = string.Empty;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = false;
/// <summary>
/// password
/// </summary>
public string auth_string { get; set; } = string.Empty;
/// <summary>
/// email
/// </summary>
public string email { get; set; } = string.Empty;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// createtime
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last update time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,53 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<None Remove="Swagger\index.html" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Swagger\index.html" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Mapster" Version="7.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.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.EntityFrameworkCore" Version="7.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
<PackageReference Include="Microsoft.OpenApi" Version="1.4.5" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
<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" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Models\MultiLanguage.zh-cn.resx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
</Project>

View file

@ -0,0 +1,14 @@
namespace ModernWMS.Core.MultiTenancy
{
/// <summary>
/// TenantProvider
/// </summary>
public interface ITenantProvider
{
/// <summary>
/// Get Current User's TenantID
/// </summary>
/// <returns></returns>
byte GetCurrentTenantID();
}
}

View file

@ -0,0 +1,17 @@
namespace ModernWMS.Core.MultiTenancy
{
/// <summary>
/// Tenant Class
/// </summary>
public class Tenant
{
/// <summary>
/// tenant's id
/// </summary>
public byte tenant_id { get; set; } = 1;
/// <summary>
/// tenant's name
/// </summary>
public string tenant_name { get; set; } = "default";
}
}

View file

@ -0,0 +1,46 @@
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace ModernWMS.Core.MultiTenancy
{
/// <summary>
/// TenantProvider
/// </summary>
public class TenantProvider:ITenantProvider
{
/// <summary>
/// Tenant
/// </summary>
private readonly Tenant tenant;
/// <summary>
/// TenantProvider
/// </summary>
/// <param name="accessor">注入IHttpContextAccessor</param>
public TenantProvider(IHttpContextAccessor accessor)
{
if (accessor.HttpContext != null)
{
var headers = accessor.HttpContext.Request.Headers;
if (headers != null && headers.Count > 0
&& headers.ContainsKey("TenantName"))
{
var name = headers["TenantName"].FirstOrDefault();
}
}
//Default Value
tenant = new Tenant();
}
/// <summary>
/// Get Current User's TenantID
/// </summary>
/// <returns></returns>
public byte GetCurrentTenantID()
{
return tenant.tenant_id;
}
}
}

View file

@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using ModernWMS.Core.Models;
using System.Linq;
using ModernWMS.Core.Utility;
using System.Data;
using Mapster;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Internal;
using ModernWMS.Core.DBContext;
using Microsoft.Extensions.Localization;
using ModernWMS.Core.JWT;
namespace ModernWMS.Core.Services
{
/// <summary>
/// AccountService
/// </summary>
public class AccountService : IAccountService
{
private readonly SqlDBContext _sqlDBContext;
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
public AccountService(SqlDBContext sqlDBContext, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
_sqlDBContext = sqlDBContext;
_stringLocalizer = stringLocalizer;
}
/// <summary>
/// login
/// </summary>
/// <param name="loginInput"> login params viewmodel</param>
/// <param name="currentUser"> current user</param>
/// <returns></returns>
public async Task<LoginOutputViewModel> Login(LoginInputViewModel loginInput, CurrentUser currentUser)
{
var users = await (from user in _sqlDBContext.GetDbSet<userEntity>().AsNoTracking()
join ur in _sqlDBContext.GetDbSet<UserroleEntity>().AsNoTracking() on user.user_role equals ur.role_name
where ur.tenant_id == user.tenant_id&&(user.user_name == loginInput.user_name || user.user_num == loginInput.user_name)
select new {
user_id = user.id,
user_num = user.user_num,
user_name = user.user_name,
user_role = user.user_role,
userrole_id = ur.id,
cipher = user.auth_string,
tenant_id = user.tenant_id
}
).ToListAsync();
string md5_password = Core.Utility.Md5Helper.Md5Encrypt32(loginInput.password);
var result = users.FirstOrDefault(t=>t.cipher== md5_password || t.cipher == loginInput.password);
if(result!= null)
{
return new LoginOutputViewModel()
{
user_id = result.user_id,
user_name = result.user_name,
user_num = result.user_num,
user_role = result.user_role,
userrole_id = result.userrole_id,
tenant_id= result.tenant_id,
};
}
return null;
}
public string HelloWorld ()
{
return _stringLocalizer["hello word"];
}
}
}

View file

@ -0,0 +1,18 @@

using Mapster;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using ModernWMS.Core.Models;
using Microsoft.Extensions.Localization;
namespace ModernWMS.Core.Services
{
public class BaseService<TEntity> : IBaseService<TEntity> where TEntity : BaseModel
{
}
}

View file

@ -0,0 +1,24 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using ModernWMS.Core.JWT;
using ModernWMS.Core.Models;
namespace ModernWMS.Core.Services
{
/// <summary>
/// account service interface
/// </summary>
public interface IAccountService
{
/// <summary>
/// login
/// </summary>
/// <param name="loginInput">user 's account infomation</param>
/// <param name="currentUser">current user</param>
/// <returns></returns>
Task<LoginOutputViewModel> Login(LoginInputViewModel loginInput,CurrentUser currentUser);
string HelloWorld();
}
}

View file

@ -0,0 +1,16 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using ModernWMS.Core.DI;
using ModernWMS.Core.Models;
namespace ModernWMS.Core.Services
{
public interface IBaseService<TEntity> : IDependency where TEntity : BaseModel
{
}
}

View file

@ -0,0 +1,25 @@

namespace ModernWMS.Core.Swagger
{
/// <summary>
/// custom version
/// </summary>
public class CustomApiVersion
{
/// <summary>
/// Api module
/// </summary>
public enum ApiVersions
{
/// <summary>
/// Base
/// </summary>
Base,
/// <summary>
/// WMS
/// </summary>
WMS
}
}
}

View file

@ -0,0 +1,38 @@

using System.Collections.Generic;
namespace ModernWMS.Core.Swagger
{
/// <summary>
/// Swagger Settings
/// </summary>
public class SwaggerSettings
{
/// <summary>
/// SwaggerDoc Name
/// </summary>
public string Name { get; set; }
/// <summary>
/// OpenApiInfo Title
/// </summary>
public string ApiTitle { get; set; }
/// <summary>
/// OpenApiInfo Version
/// </summary>
public string ApiVersion { get; set; }
/// <summary>
/// OpenApiInfo Description
/// </summary>
public string Description { get; set; }
/// <summary>
/// Whether to turn on authorization verification
/// </summary>
public bool SecurityDefinition { get; set; }
/// <summary>
/// Included XML documents
/// </summary>
public List<string> XmlFiles { get; set; }
}
}

View file

@ -0,0 +1,120 @@
<!--<script async="async" id="mini-profiler" src="/profiler/includes.min.js?v=4.1.0+c940f0f28d"
data-version="4.1.0+c940f0f28d" data-path="/profiler/"
data-current-id="" data-ids="" data-position="Left"
data-authorized="true" data-max-traces="15" data-toggle-shortcut="Alt+P"
data-trivial-milliseconds="2.0" data-ignored-duplicate-execute-types="Open,OpenAsync,Close,CloseAsync">
</script>-->
<script async="async" id="mini-profiler" src="/profiler/includes.min.js?v=4.1.0+c940f0f28d"
data-version="4.1.0+c940f0f28d" data-path="/profiler/"
data-current-id="4ec7c742-49d4-4eaf-8281-3c1e0efa8888" data-ids="4ec7c742-49d4-4eaf-8281-3c1e0efa8888"
data-position="Left"
data-authorized="true" data-max-traces="5" data-toggle-shortcut="Alt+P"
data-trivial-milliseconds="2.0" data-ignored-duplicate-execute-types="Open,OpenAsync,Close,CloseAsync">
</script>
<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>%(DocumentTitle)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="./swagger-ui.css">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<style>
html {
box-sizing: border-box;
overflow: -moz-scrollbars-vertical;
overflow-y: scroll;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 0;
background: #fafafa;
}
.qqgroup {
float: right;
}
.info {
float: left;
}
.download-contents {
display: none;
}
</style>
%(HeadContent)
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
<defs>
<symbol viewBox="0 0 20 20" id="unlocked">
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
</symbol>
<symbol viewBox="0 0 20 20" id="locked">
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z" />
</symbol>
<symbol viewBox="0 0 20 20" id="close">
<path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z" />
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow">
<path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z" />
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow-down">
<path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z" />
</symbol>
<symbol viewBox="0 0 24 24" id="jump-to">
<path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z" />
</symbol>
<symbol viewBox="0 0 24 24" id="expand">
<path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z" />
</symbol>
</defs>
</svg>
<div id="swagger-ui"></div>
<!-- Workaround for https://github.com/swagger-api/swagger-editor/issues/1371 -->
<script>
if (window.navigator.userAgent.indexOf("Edge") > -1) {
console.log("Removing native Edge fetch in favor of swagger-ui's polyfill")
window.fetch = undefined;
}
</script>
<script src="./swagger-ui-bundle.js"></script>
<script src="./swagger-ui-standalone-preset.js"></script>
<script>
var int = null;
window.onload = function () {
var configObject = JSON.parse('%(ConfigObject)');
var oauthConfigObject = JSON.parse('%(OAuthConfigObject)');
// Apply mandatory parameters
configObject.dom_id = "#swagger-ui";
configObject.presets = [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset];
configObject.layout = "StandaloneLayout";
// If oauth2RedirectUrl isn't specified, use the built-in default
if (!configObject.hasOwnProperty("oauth2RedirectUrl"))
configObject.oauth2RedirectUrl = window.location.href.replace("index.html", "oauth2-redirect.html");
// Build a system
const ui = SwaggerUIBundle(configObject);
// Apply OAuth config
ui.initOAuth(oauthConfigObject);
}
</script>
</body>
</html>

View file

@ -0,0 +1,31 @@
namespace ModernWMS.Core.Utility
{
/// <summary>
/// global constant
/// </summary>
public static class GlobalConsts
{
/// <summary>
/// is Swagger enable
/// </summary>
public static bool IsEnabledSwagger = true;
/// <summary>
/// Is RequestResponseMiddleware enable
/// </summary>
public static bool IsRequestResponseMiddleware = true;
/// <summary>
/// token cipher
/// </summary>
public const string SigningKey = "ModernWMS_SigningKey";
/// <summary>
/// Password will expire every 30 days from last password change.
/// </summary>
public static int PasswordExpireDays = 30;
}
}

View file

@ -0,0 +1,63 @@

using System.Data;
using Newtonsoft.Json;
namespace ModernWMS.Core.Utility
{
/// <summary>
/// JSON Helper
/// </summary>
public static class JsonHelper
{
#region JSON Helper
/// <summary>
/// Deserialize
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <returns></returns>
public static T DeserializeObject<T>(string json) where T : class
{
return JsonConvert.DeserializeObject<T>(json);
}
/// <summary>
/// Serialize
/// </summary>
/// <param name="obj">data</param>
/// <returns></returns>
public static string SerializeObject(object obj)
{
return JsonConvert.SerializeObject(obj
, new JsonSerializerSettings()
{
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(),
Formatting = Formatting.Indented,
DateFormatString = "yyyy-MM-dd HH:mm:ss"
});
}
/// <summary>
/// Serialize to DataTable
/// </summary>
/// <param name="table">data</param>
/// <param name="replaceNullToEmpty">""</param>
/// <returns></returns>
public static string SerializeDataTable(DataTable table,bool replaceNullToEmpty = false)
{
string json = JsonConvert.SerializeObject(table
, new JsonSerializerSettings()
{
DateFormatString = "yyyy-MM-dd HH:mm:ss"
});
if (replaceNullToEmpty)
{
json = json.Replace("null", "\"\"");
}
return json;
}
#endregion
}
}

View file

@ -0,0 +1,32 @@

using System.Security.Cryptography;
using System.Text;
namespace ModernWMS.Core.Utility
{
/// <summary>
/// md5 Helper
/// </summary>
public static class Md5Helper
{
/// <summary>
/// 32bit UTF8 MD5 Encrypt
/// </summary>
/// <param name="plaintext">明文</param>
/// <returns></returns>
public static string Md5Encrypt32(string plaintext)
{
string pwd = string.Empty;
if (!string.IsNullOrEmpty(plaintext) && !string.IsNullOrWhiteSpace(plaintext))
{
MD5 md5 = MD5.Create();
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(plaintext));
foreach (var item in s)
{
pwd = string.Concat(pwd, item.ToString("x2"));
}
}
return pwd;
}
}
}

View file

@ -0,0 +1,106 @@

using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
namespace ModernWMS.Core.Utility
{
/// <summary>
/// dataTable convert to model
/// </summary>
/// <typeparam name="T">model</typeparam>
public static class ModelConvertHelper<T> where T : new()
{
/// <summary>
/// dataTable convert to model list
/// </summary>
/// <param name="dt">数据表</param>
/// <returns></returns>
public static List<T> ConvertToModel(DataTable dt)
{
List<T> ts = new List<T>();
Type type = typeof(T);
string tempName = "";
foreach (DataRow dr in dt.Rows)
{
T t = new T();
string colvalue = "";
try
{
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (dt.Columns.Contains(tempName))
{
if (!pi.CanWrite)
{
continue;
}
string TypeName = pi.PropertyType.FullName;
string value = dr[tempName] == DBNull.Value ? "" : Convert.ToString(dr[tempName]);
colvalue = value;
if (pi.PropertyType.Name.ToLower().Contains("datetime"))
{
pi.SetValue(t, string.IsNullOrEmpty(value) ? Convert.ToDateTime("1900-01-01") : Convert.ChangeType(value, pi.PropertyType), null);
}
else if (pi.PropertyType.Name.ToLower().Contains("double"))
{
if (string.IsNullOrEmpty(value))
{
pi.SetValue(t, 0M);
}
else
{
pi.SetValue(t, string.IsNullOrEmpty(value) ? Convert.ToDouble(0) : Convert.ChangeType(value, pi.PropertyType), null);
}
}
else if (pi.PropertyType.Name.ToLower().Contains("decimal"))
{
if (string.IsNullOrEmpty(value))
{
pi.SetValue(t, 0M);
}
else
{
pi.SetValue(t, string.IsNullOrEmpty(value) ? Convert.ToDecimal(0) : Convert.ChangeType(value, pi.PropertyType), null);
}
}
else if (pi.PropertyType.Name.ToLower().Contains("int"))
{
pi.SetValue(t, string.IsNullOrEmpty(value) ? 0 : Convert.ChangeType(value, pi.PropertyType), null);
}
else if (pi.PropertyType.Name.ToLower().Contains("bool"))
{
pi.SetValue(t, string.IsNullOrEmpty(value) ? false : Convert.ChangeType(value, pi.PropertyType), null);
}
else if (pi.PropertyType.Name.ToLower().Contains("string"))
{
pi.SetValue(t, string.IsNullOrEmpty(value) ? "" : Convert.ChangeType(value, pi.PropertyType), null);
}
else if (!pi.PropertyType.IsGenericType)
{
pi.SetValue(t, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, pi.PropertyType), null);
}
else
{
Type genericTypeDefinition = pi.PropertyType.GetGenericTypeDefinition();
if (genericTypeDefinition == typeof(Nullable<>))
{
pi.SetValue(t, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, Nullable.GetUnderlyingType(pi.PropertyType)), null);
}
}
}
}
ts.Add(t);
}
catch (Exception ) { }
}
return ts;
}
}
}

View file

@ -0,0 +1,285 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Text;
namespace ModernWMS.Core.Utility
{
/// <summary>
/// convert utility
/// </summary>
public static class UtilConvert
{
#region object convert function
/// <summary>
/// object convert to int
/// </summary>
/// <param name="thisValue">value</param>
/// <returns></returns>
public static int ObjToInt(this object thisValue)
{
int reval = 0;
if (thisValue == null)
{
return 0;
}
if (string.IsNullOrEmpty(thisValue.ToString()))
{
return 0;
}
if (thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval))
{
return reval;
}
return reval;
}
/// <summary>
/// object convert to int
/// </summary>
/// <param name="thisValue">value</param>
/// <param name="errorValue">value when error occured</param>
/// <returns></returns>
public static int ObjToInt(this object thisValue, int errorValue)
{
if (thisValue == null)
{
return errorValue;
}
if (string.IsNullOrEmpty(thisValue.ToString()))
{
return 0;
}
if (thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out int reval))
{
return reval;
}
return errorValue;
}
/// <summary>
/// object convert to double
/// </summary>
/// <param name="thisValue">value</param>
/// <returns></returns>
public static double ObjToDouble(this object thisValue)
{
if (string.IsNullOrEmpty(thisValue.ToString()))
{
return 0;
}
if (thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out double reval))
{
return reval;
}
return 0;
}
/// <summary>
/// object convert to double
/// </summary>
/// <param name="thisValue">value</param>
/// <param name="errorValue">value when error occured</param>
/// <returns></returns>
public static double ObjToDouble(this object thisValue, double errorValue)
{
if (string.IsNullOrEmpty(thisValue.ToString()))
{
return 0;
}
if (thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out double reval))
{
return reval;
}
return errorValue;
}
/// <summary>
/// object convert to string
/// </summary>
/// <param name="thisValue">value</param>
/// <returns></returns>
public static string ObjToString(this object thisValue)
{
if (thisValue != null) return thisValue.ToString().Trim();
return "";
}
/// <summary>
/// object convert to string
/// </summary>
/// <param name="thisValue">value</param>
/// <param name="errorValue">value when error occured</param>
/// <returns></returns>
public static string ObjToString(this object thisValue, string errorValue)
{
if (thisValue != null) return thisValue.ToString().Trim();
return errorValue;
}
/// <summary>
/// object convert to decimal
/// </summary>
/// <param name="thisValue">value</param>
/// <returns></returns>
public static decimal ObjToDecimal(this object thisValue)
{
if (string.IsNullOrEmpty(thisValue.ToString()))
{
return 0;
}
if (thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out decimal reval))
{
return reval;
}
return 0;
}
/// <summary>
/// object convert to decimal
/// </summary>
/// <param name="thisValue">value</param>
/// <param name="errorValue">value when error occured</param>
/// <returns></returns>
public static decimal ObjToDecimal(this object thisValue, decimal errorValue)
{
if (string.IsNullOrEmpty(thisValue.ToString()))
{
return 0;
}
if (thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out decimal reval))
{
return reval;
}
return errorValue;
}
/// <summary>
/// object convert to date
/// </summary>
/// <param name="thisValue">value</param>
/// <returns></returns>
public static DateTime ObjToDate(this object thisValue)
{
DateTime reval = Convert.ToDateTime("1900-01-01");
if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
{
reval = Convert.ToDateTime(thisValue);
}
return reval;
}
/// <summary>
/// object convert to date
/// </summary>
/// <param name="thisValue">value</param>
/// <param name="errorValue">value when error occured</param>
/// <returns></returns>
public static DateTime ObjToDate(this object thisValue, DateTime errorValue)
{
DateTime reval;
if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
{
return reval;
}
return errorValue;
}
/// <summary>
/// object convert to bool
/// </summary>
/// <param name="thisValue">value</param>
/// <returns></returns>
public static bool ObjToBool(this object thisValue)
{
bool reval = false;
if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval))
{
return reval;
}
return reval;
}
#endregion
#region compare function
/// <summary>
/// less than
/// </summary>
/// <param name="thisValue">thisValue</param>
/// <param name="compareValue">compareValue</param>
/// <returns></returns>
public static bool IsLessThan(this object thisValue,double compareValue)
{
return Convert.ToDouble(thisValue) < compareValue;
}
/// <summary>
/// less than or equal
/// </summary>
/// <param name="thisValue">thisValue</param>
/// <param name="compareValue">compareValue</param>
/// <returns></returns>
public static bool IsLessThanOrEqual(this object thisValue, double compareValue)
{
return Convert.ToDouble(thisValue) <= compareValue;
}
/// <summary>
/// greater than
/// </summary>
/// <param name="thisValue">当前值</param>
/// <param name="compareValue">比较值</param>
/// <returns></returns>
public static bool IsGreaterThan(this object thisValue, double compareValue)
{
return Convert.ToDouble(thisValue) > compareValue;
}
/// <summary>
/// greater than or equal
/// </summary>
/// <param name="thisValue">thisValue</param>
/// <param name="compareValue">compareValue</param>
/// <returns></returns>
public static bool IsGreaterThanOrEqual(this object thisValue, double compareValue)
{
return Convert.ToDouble(thisValue) >= compareValue;
}
/// <summary>
/// less then
/// </summary>
/// <param name="thisValue">thisValue</param>
/// <param name="compareValue">compareValue</param>
/// <returns></returns>
public static bool IsLessThan(this object thisValue, DateTime compareValue)
{
return Convert.ToDateTime(thisValue) < compareValue;
}
/// <summary>
/// less than or equal
/// </summary>
/// <param name="thisValue">thisValue</param>
/// <param name="compareValue">compareValue</param>
/// <returns></returns>
public static bool IsLessThanOrEqual(this object thisValue, DateTime compareValue)
{
return Convert.ToDateTime(thisValue) <= compareValue;
}
/// <summary>
/// less then
/// </summary>
/// <param name="thisValue">thisValue</param>
/// <param name="compareValue">compareValue</param>
/// <returns></returns>
public static bool IsGreaterThan(this object thisValue, DateTime compareValue)
{
return Convert.ToDateTime(thisValue) > compareValue;
}
/// <summary>
/// ess than or equal
/// </summary>
/// <param name="thisValue">thisValue</param>
/// <param name="compareValue">compareValue</param>
/// <returns></returns>
public static bool IsGreaterThanOrEqual(this object thisValue, DateTime compareValue)
{
return Convert.ToDateTime(thisValue) >= compareValue;
}
#endregion
/// <summary>
/// default min date
/// </summary>
public static DateTime MinDate => Convert.ToDateTime("1900-01-01");
}
}

View file

@ -0,0 +1,326 @@
/*
* date2022-12-22
* developerAMo
*/
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;
using ModernWMS.Core.JWT;
namespace ModernWMS.WMS.Controllers
{
/// <summary>
/// asn controller
/// </summary>
[Route("asn")]
[ApiController]
[ApiExplorerSettings(GroupName = "WMS")]
public class AsnController : BaseController
{
#region Args
/// <summary>
/// asn Service
/// </summary>
private readonly IAsnService _asnService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="asnService">asn Service</param>
/// <param name="stringLocalizer">Localizer</param>
public AsnController(
IAsnService asnService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._asnService = asnService;
this._stringLocalizer = stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search, sqlTitle input asn_status:0 ~ 4
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<AsnViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _asnService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<AsnViewModel>>.Success(new PageData<AsnViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<AsnViewModel>> GetAsync(int id)
{
var data = await _asnService.GetAsync(id);
if (data != null && data.id > 0)
{
return ResultModel<AsnViewModel>.Success(data);
}
else
{
return ResultModel<AsnViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(AsnViewModel viewModel)
{
var (id, msg) = await _asnService.AddAsync(viewModel, CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(AsnViewModel viewModel)
{
var (flag, msg) = await _asnService.UpdateAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _asnService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// Bulk modify Goodsowner
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut("bulk-modify-goods-owner")]
public async Task<ResultModel<bool>> BulkModifyGoodsownerAsync(AsnBulkModifyGoodsOwnerViewModel viewModel)
{
var (flag, msg) = await _asnService.BulkModifyGoodsownerAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
#endregion
#region Flow Api
/// <summary>
/// Confirm Delivery
/// change the asn_status from 0 to 1
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpPut("confirm/{id}")]
public async Task<ResultModel<string>> ConfirmAsync(int id)
{
var (flag, msg) = await _asnService.ConfirmAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// Cancel confirm, change asn_status 1 to 0
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpPut("confirm-cancel/{id}")]
public async Task<ResultModel<string>> ConfirmCancelAsync(int id)
{
var (flag, msg) = await _asnService.ConfirmCancelAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// Unload
/// change the asn_status from 1 to 2
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpPut("unload/{id}")]
public async Task<ResultModel<string>> UnloadAsync(int id)
{
var (flag, msg) = await _asnService.UnloadAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// Cancel unload
/// change the asn_status from 2 to 1
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpPut("unload-cancel/{id}")]
public async Task<ResultModel<string>> UnloadCancelAsync(int id)
{
var (flag, msg) = await _asnService.UnloadCancelAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// sorting add a new asnsort record and update asn sorted_qty
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut("sorting")]
public async Task<ResultModel<string>> SortingAsync(AsnsortInputViewModel viewModel)
{
var (flag, msg) = await _asnService.SortingAsync(viewModel, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// Sorted
/// change the asn_status from 2 to 3
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpPut("sorted/{id}")]
public async Task<ResultModel<string>> SortedAsync(int id)
{
var (flag, msg) = await _asnService.SortedAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// Cancel sorted
/// change the asn_status from 3 to 2
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpPut("sorted-cancel/{id}")]
public async Task<ResultModel<string>> SortedCancelAsync(int id)
{
var (flag, msg) = await _asnService.SortedCancelAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// PutAway
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut("putaway")]
public async Task<ResultModel<string>> PutAwayAsync(AsnPutAwayInputViewModel viewModel)
{
var (flag, msg) = await _asnService.PutAwayAsync(viewModel, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,179 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using ModernWMS.Core.Controller;
using ModernWMS.Core.JWT;
using ModernWMS.Core.Models;
using ModernWMS.WMS.Entities.ViewModels;
using ModernWMS.WMS.IServices;
namespace ModernWMS.WMS.Controllers
{
/// <summary>
/// customer controller
/// </summary>
[Route("customer")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class CustomerController : BaseController
{
#region Args
/// <summary>
/// customer Service
/// </summary>
private readonly ICustomerService _customerService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="customerService">customer Service</param>
/// <param name="stringLocalizer">Localizer</param>
public CustomerController(
ICustomerService customerService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._customerService = customerService;
this._stringLocalizer = stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<CustomerViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _customerService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<CustomerViewModel>>.Success(new PageData<CustomerViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// Get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<CustomerViewModel>>> GetAllAsync()
{
var data = await _customerService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<CustomerViewModel>>.Success(data);
}
else
{
return ResultModel<List<CustomerViewModel>>.Success(new List<CustomerViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<CustomerViewModel>> GetAsync(int id)
{
var data = await _customerService.GetAsync(id);
if (data != null && data.id > 0)
{
return ResultModel<CustomerViewModel>.Success(data);
}
else
{
return ResultModel<CustomerViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(CustomerViewModel viewModel)
{
var (id, msg) = await _customerService.AddAsync(viewModel, CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(CustomerViewModel viewModel)
{
var (flag, msg) = await _customerService.UpdateAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _customerService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
#region Import
/// <summary>
/// import customers by excel
/// </summary>
/// <param name="input">excel data</param>
/// <returns></returns>
[HttpPost("excel")]
public async Task<ResultModel<List<CustomerImportViewModel>>> ExcelAsync(List<CustomerImportViewModel> input)
{
var (flag, errorData) = await _customerService.ExcelAsync(input, CurrentUser);
if (flag)
{
return ResultModel<List<CustomerImportViewModel>>.Success(errorData);
}
else
{
return ResultModel<List<CustomerImportViewModel>>.Error("", 400, errorData);
}
}
#endregion
}
}

View file

@ -0,0 +1,343 @@
/*
* date2022-12-27
* developerNoNo
*/
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>
/// dispatchlist controller
/// </summary>
[Route("dispatchlist")]
[ApiController]
[ApiExplorerSettings(GroupName = "WMS")]
public class DispatchlistController : BaseController
{
#region Args
/// <summary>
/// dispatchlist Service
/// </summary>
private readonly IDispatchlistService _dispatchlistService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="dispatchlistService">dispatchlist Service</param>
/// <param name="stringLocalizer">Localizer</param>
public DispatchlistController(
IDispatchlistService dispatchlistService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._dispatchlistService = dispatchlistService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<DispatchlistViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _dispatchlistService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<DispatchlistViewModel>>.Success(new PageData<DispatchlistViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// advanced dispatch order page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("advanced-list")]
public async Task<ResultModel<PageData<PreDispatchlistViewModel>>> AdvancedDispatchlistPageAsync(PageSearch pageSearch)
{
var (data, totals) = await _dispatchlistService.AdvancedDispatchlistPageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<PreDispatchlistViewModel>>.Success(new PageData<PreDispatchlistViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<string>> AddAsync(List<DispatchlistAddViewModel> viewModel)
{
var (flag, msg) = await _dispatchlistService.AddAsync(viewModel,CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// update dispatchlist with same dispatch_no
/// </summary>
/// <param name="viewModel">viewModel</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<string>> UpdateAsycn(List<DispatchlistViewModel> viewModel)
{
var (flag, msg) = await _dispatchlistService.UpdateAsycn(viewModel, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// get dispatchlist by dispatch_no
/// </summary>
/// <param name="dispatch_no">dispatch_no</param>
/// <returns></returns>
[HttpGet("by-dispatch_no")]
public async Task<ResultModel<List<DispatchlistViewModel>>> GetByDispatchlistNo(string dispatch_no)
{
var datas = await _dispatchlistService.GetByDispatchlistNo(dispatch_no, CurrentUser);
return ResultModel<List<DispatchlistViewModel>>.Success(datas);
}
/// <summary>
/// get Dispatchlist details with available stock
/// </summary>
/// <param name="dispatch_no">dispatch_no</param>
/// <returns></returns>
[HttpGet("confirm-check")]
public async Task<ResultModel<List<DispatchlistConfirmDetailViewModel>>> ConfirmOrderCheck(string dispatch_no)
{
var datas = await _dispatchlistService.ConfirmOrderCheck(dispatch_no, CurrentUser);
return ResultModel<List<DispatchlistConfirmDetailViewModel>>.Success(datas);
}
/// <summary>
/// get pick list by dispatch_id
/// </summary>
/// <param name="dispatch_id">dispatch_id</param>
/// <returns></returns>
[HttpGet("pick-list")]
public async Task<ResultModel<List<DispatchpicklistViewModel>>> GetPickListByDispatchID(int dispatch_id)
{
var datas = await _dispatchlistService.GetPickListByDispatchID(dispatch_id);
return ResultModel<List<DispatchpicklistViewModel>>.Success(datas);
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="dispatch_no">dispatch_no</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(string dispatch_no)
{
var (flag, msg) = await _dispatchlistService.DeleteAsync(dispatch_no,CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// Confirm orders and create dispatchpicklist
/// </summary>
/// <param name="viewModels">viewModels</param>
/// <returns></returns>
[HttpPost("confirm-order")]
public async Task<ResultModel<string >> ConfirmOrder(List<DispatchlistConfirmDetailViewModel> viewModels)
{
var (flag, msg) = await _dispatchlistService.ConfirmOrder(viewModels, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// confirm dispatchpicklist picked by dispatch_no
/// </summary>
/// <param name="dispatch_no">viewModels</param>
/// <returns></returns>
[HttpPut("confirm-pick-dispatchlistno")]
public async Task<ResultModel<string>> ConfirmPickByDispatchNo(string dispatch_no)
{
var (flag, msg) = await _dispatchlistService.ConfirmPickByDispatchNo(dispatch_no, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// package dispatchpicklist
/// </summary>
/// <param name="viewModels">viewModels</param>
/// <returns></returns>
[HttpPost("package")]
public async Task<ResultModel<string>> Package(List<DispatchlistPackageViewModel> viewModels)
{
var (flag, msg) = await _dispatchlistService.Package(viewModels, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// weight dispatchpicklist
/// </summary>
/// <param name="viewModels">viewModels</param>
/// <returns></returns>
[HttpPost("weight")]
public async Task<ResultModel<string>> Weight(List<DispatchlistWeightViewModel> viewModels)
{
var (flag, msg) = await _dispatchlistService.Weight(viewModels, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// dispatchpicklist outbound delivery
/// </summary>
/// <param name="viewModels">viewModels</param>
/// <returns></returns>
[HttpPost("delivery")]
public async Task<ResultModel<string>> Delivery(List<DispatchlistDeliveryViewModel> viewModels)
{
var (flag, msg) = await _dispatchlistService.Delivery(viewModels, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// set dispatchlist freightfee
/// </summary>
/// <param name="viewModels">viewModels</param>
/// <returns></returns>
[HttpPost("freightfee")]
public async Task<ResultModel<string>> SetFreightfee(List<DispatchlistFreightfeeViewModel> viewModels)
{
var (flag, msg) = await _dispatchlistService.SetFreightfee(viewModels);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// sign for arrival
/// </summary>
/// <param name="viewModels">viewModels</param>
/// <returns></returns>
[HttpPost("sign")]
public async Task<ResultModel<string>> SignForArrival(List<DispatchlistSignViewModel> viewModels)
{
var (flag, msg) = await _dispatchlistService.SignForArrival(viewModels);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// cancel order opration
/// </summary>
/// <param name="viewModel">viewModel</param>
/// <returns></returns>
[HttpPost("cancel-order")]
public async Task<ResultModel<string>> CancelOrderOpration(CancelOrderOprationViewModel viewModel)
{
var (flag, msg) = await _dispatchlistService.CancelOrderOpration(viewModel,CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// cancel dispatchlist detail opration
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpPut("cancel-order")]
public async Task<ResultModel<string>> CancelDispatchlistDetailOpration(int id)
{
var (flag, msg) = await _dispatchlistService.CancelDispatchlistDetailOpration(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,182 @@
/*
* date2022-12-22
* developerNoNo
*/
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>
/// freightfee controller
/// </summary>
[Route("freightfee")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class FreightfeeController : BaseController
{
#region Args
/// <summary>
/// freightfee Service
/// </summary>
private readonly IFreightfeeService _freightfeeService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="freightfeeService">freightfee Service</param>
/// <param name="stringLocalizer">Localizer</param>
public FreightfeeController(
IFreightfeeService freightfeeService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._freightfeeService = freightfeeService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<FreightfeeViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _freightfeeService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<FreightfeeViewModel>>.Success(new PageData<FreightfeeViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<FreightfeeViewModel>>> GetAllAsync()
{
var data = await _freightfeeService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<FreightfeeViewModel>>.Success(data);
}
else
{
return ResultModel<List<FreightfeeViewModel>>.Success(new List<FreightfeeViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<FreightfeeViewModel>> GetAsync(int id)
{
var data = await _freightfeeService.GetAsync(id);
if (data!=null)
{
return ResultModel<FreightfeeViewModel>.Success(data);
}
else
{
return ResultModel<FreightfeeViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(FreightfeeViewModel viewModel)
{
var (id, msg) = await _freightfeeService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(FreightfeeViewModel viewModel)
{
var (flag, msg) = await _freightfeeService.UpdateAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _freightfeeService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// import freight fee by excel
/// </summary>
/// <param name="excel_datas">excel datas</param>
/// <returns></returns>
[HttpPost("excel")]
public async Task<ResultModel<string>> ExcelAsync(List<FreightfeeExcelmportViewModel> excel_datas)
{
var (flag, msg) = await _freightfeeService.ExcelAsync(excel_datas, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,179 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using ModernWMS.Core.Controller;
using ModernWMS.Core.Models;
using ModernWMS.WMS.Entities.ViewModels;
using ModernWMS.WMS.IServices;
using ModernWMS.WMS.Services;
namespace ModernWMS.WMS.Controllers
{
/// <summary>
/// goodsowner controller
/// </summary>
[Route("goodsowner")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class GoodsownerController : BaseController
{
#region Args
/// <summary>
/// goodsowner Service
/// </summary>
private readonly IGoodsownerService _goodsownerService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="goodsownerService">goodsowner Service</param>
/// <param name="stringLocalizer">Localizer</param>
public GoodsownerController(
IGoodsownerService goodsownerService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._goodsownerService = goodsownerService;
this._stringLocalizer = stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<GoodsownerViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _goodsownerService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<GoodsownerViewModel>>.Success(new PageData<GoodsownerViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// Get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<GoodsownerViewModel>>> GetAllAsync()
{
var data = await _goodsownerService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<GoodsownerViewModel>>.Success(data);
}
else
{
return ResultModel<List<GoodsownerViewModel>>.Success(new List<GoodsownerViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<GoodsownerViewModel>> GetAsync(int id)
{
var data = await _goodsownerService.GetAsync(id);
if (data != null && data.id > 0)
{
return ResultModel<GoodsownerViewModel>.Success(data);
}
else
{
return ResultModel<GoodsownerViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(GoodsownerViewModel viewModel)
{
var (id, msg) = await _goodsownerService.AddAsync(viewModel, CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(GoodsownerViewModel viewModel)
{
var (flag, msg) = await _goodsownerService.UpdateAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _goodsownerService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
#region Import
/// <summary>
/// import goodsowners by excel
/// </summary>
/// <param name="input">excel data</param>
/// <returns></returns>
[HttpPost("excel")]
public async Task<ResultModel<List<GoodsownerImportViewModel>>> ExcelAsync(List<GoodsownerImportViewModel> input)
{
var (flag, errorData) = await _goodsownerService.ExcelAsync(input, CurrentUser);
if (flag)
{
return ResultModel<List<GoodsownerImportViewModel>>.Success(errorData);
}
else
{
return ResultModel<List<GoodsownerImportViewModel>>.Error("", 400, errorData);
}
}
#endregion
}
}

View file

@ -0,0 +1,174 @@
/*
* date2022-12-21
* developerNoNo
*/
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>
/// goodslocation controller
/// </summary>
[Route("goodslocation")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class GoodslocationController : BaseController
{
#region Args
/// <summary>
/// goodslocation Service
/// </summary>
private readonly IGoodslocationService _goodslocationService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="goodslocationService">goodslocation Service</param>
/// <param name="stringLocalizer">Localizer</param>
public GoodslocationController(
IGoodslocationService goodslocationService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._goodslocationService = goodslocationService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// get select items
/// </summary>
/// <returns></returns>
[HttpGet("location-by-warehouseare_id")]
public async Task<ResultModel<List<FormSelectItem>>> GetSelectItemsAsnyc(int warehousearea_id)
{
var datas = await _goodslocationService.GetGoodslocationByWarehouse_area_id(warehousearea_id, CurrentUser);
return ResultModel<List<FormSelectItem>>.Success(datas);
}
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<GoodslocationViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _goodslocationService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<GoodslocationViewModel>>.Success(new PageData<GoodslocationViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<GoodslocationViewModel>>> GetAllAsync()
{
var data = await _goodslocationService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<GoodslocationViewModel>>.Success(data);
}
else
{
return ResultModel<List<GoodslocationViewModel>>.Success(new List<GoodslocationViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<GoodslocationViewModel>> GetAsync(int id)
{
var data = await _goodslocationService.GetAsync(id);
if (data!=null)
{
return ResultModel<GoodslocationViewModel>.Success(data);
}
else
{
return ResultModel<GoodslocationViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(GoodslocationViewModel viewModel)
{
var (id, msg) = await _goodslocationService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(GoodslocationViewModel viewModel)
{
var (flag, msg) = await _goodslocationService.UpdateAsync(viewModel, CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _goodslocationService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,181 @@
/*
* date2022-12-20
* developerAMo
*/
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>
/// rolemenu controller
/// </summary>
[Route("rolemenu")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class RolemenuController : BaseController
{
#region Args
/// <summary>
/// rolemenu Service
/// </summary>
private readonly IRolemenuService _rolemenuService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="rolemenuService">rolemenu Service</param>
/// <param name="stringLocalizer">Localizer</param>
public RolemenuController(
IRolemenuService rolemenuService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._rolemenuService = rolemenuService;
this._stringLocalizer = stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// Get menu's authority by user role id
/// </summary>
/// <param name="userrole_id">user role id</param>
/// <returns></returns>
[HttpGet("authority")]
public async Task<ResultModel<List<MenuViewModel>>> GetMenusByRoleId(int userrole_id)
{
var data = await _rolemenuService.GetMenusByRoleId(userrole_id);
if (data.Any())
{
return ResultModel<List<MenuViewModel>>.Success(data);
}
else
{
return ResultModel<List<MenuViewModel>>.Success(new List<MenuViewModel>());
}
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<RolemenuListViewModel>>> GetAllAsync()
{
var data = await _rolemenuService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<RolemenuListViewModel>>.Success(data);
}
else
{
return ResultModel<List<RolemenuListViewModel>>.Success(new List<RolemenuListViewModel>());
}
}
/// <summary>
/// Get all menus
/// </summary>
/// <returns></returns>
[HttpGet("menus")]
public async Task<ResultModel<List<MenuViewModel>>> GetAllMenusAsync()
{
var data = await _rolemenuService.GetAllMenusAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<MenuViewModel>>.Success(data);
}
else
{
return ResultModel<List<MenuViewModel>>.Success(new List<MenuViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<RolemenuBothViewModel>> GetAsync(int userrole_id)
{
var data = await _rolemenuService.GetAsync(userrole_id);
if (data != null && data.userrole_id > 0)
{
return ResultModel<RolemenuBothViewModel>.Success(data);
}
else
{
return ResultModel<RolemenuBothViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(RolemenuBothViewModel viewModel)
{
var (id, msg) = await _rolemenuService.AddAsync(viewModel, CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(RolemenuBothViewModel viewModel)
{
var (flag, msg) = await _rolemenuService.UpdateAsync(viewModel, CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="userrole_id">userrole id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int userrole_id)
{
var (flag, msg) = await _rolemenuService.DeleteAsync(userrole_id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,147 @@
/*
* date2022-12-20
* developerAMo
*/
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using ModernWMS.Core.Controller;
using ModernWMS.Core.Models;
using ModernWMS.WMS.Entities.ViewModels;
using ModernWMS.WMS.IServices;
namespace ModernWMS.WMS.Controllers
{
/// <summary>
/// category controller
/// </summary>
[Route("category")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class CategoryController : BaseController
{
#region Args
/// <summary>
/// category Service
/// </summary>
private readonly ICategoryService _categoryService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="categoryService">category Service</param>
/// <param name="stringLocalizer">Localizer</param>
public CategoryController(
ICategoryService categoryService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._categoryService = categoryService;
this._stringLocalizer = stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<CategoryViewModel>>> GetAllAsync()
{
var data = await _categoryService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<CategoryViewModel>>.Success(data);
}
else
{
return ResultModel<List<CategoryViewModel>>.Success(new List<CategoryViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<CategoryViewModel>> GetAsync(int id)
{
var data = await _categoryService.GetAsync(id);
if (data != null)
{
return ResultModel<CategoryViewModel>.Success(data);
}
else
{
return ResultModel<CategoryViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(CategoryViewModel viewModel)
{
var (id, msg) = await _categoryService.AddAsync(viewModel, CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(CategoryViewModel viewModel)
{
var (flag, msg) = await _categoryService.UpdateAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _categoryService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,164 @@
/*
* date2022-12-21
* developerNoNo
*/
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>
/// spu controller
/// </summary>
[Route("spu")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class SpuController : BaseController
{
#region Args
/// <summary>
/// spu Service
/// </summary>
private readonly ISpuService _spuService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="spuService">spu Service</param>
/// <param name="stringLocalizer">Localizer</param>
public SpuController(
ISpuService spuService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._spuService = spuService;
this._stringLocalizer = stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<SpuBothViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _spuService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<SpuBothViewModel>>.Success(new PageData<SpuBothViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<SpuBothViewModel>> GetAsync(int id)
{
var data = await _spuService.GetAsync(id);
if (data != null && data.id > 0)
{
return ResultModel<SpuBothViewModel>.Success(data);
}
else
{
return ResultModel<SpuBothViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// get sku info by sku_id
/// </summary>
/// <param name="sku_id">sku_id</param>
/// <returns></returns>
[HttpGet("sku")]
public async Task<ResultModel<SkuDetailViewModel>> GetSkuAsync(int sku_id)
{
var data = await _spuService.GetSkuAsync(sku_id);
if (data != null && data.sku_id > 0)
{
return ResultModel<SkuDetailViewModel>.Success(data);
}
else
{
return ResultModel<SkuDetailViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(SpuBothViewModel viewModel)
{
var (id, msg) = await _spuService.AddAsync(viewModel, CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(SpuBothViewModel viewModel)
{
var (flag, msg) = await _spuService.UpdateAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _spuService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,122 @@
/*
* date2022-12-22
* developerNoNo
*/
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>
/// <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
});
}
/// <summary>
/// location stock page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("location-list")]
public async Task<ResultModel<PageData<LocationStockManagementViewModel>>> LocationStockPageAsync(PageSearch pageSearch)
{
var (data, totals) = await _stockService.LocationStockPageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<LocationStockManagementViewModel>>.Success(new PageData<LocationStockManagementViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// page search select
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("select")]
public async Task<ResultModel<PageData<StockViewModel>>> SelectPageAsync(PageSearch pageSearch)
{
var (data, totals) = await _stockService.SelectPageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<StockViewModel>>.Success(new PageData<StockViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// sku page search select
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("sku-select")]
public async Task<ResultModel<PageData<SkuSelectViewModel>>> SkuSelectPageAsync(PageSearch pageSearch)
{
var (data, totals) = await _stockService.SkuSelectPageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<SkuSelectViewModel>>.Success(new PageData<SkuSelectViewModel>
{
Rows = data,
Totals = totals
});
}
#endregion
}
}

View file

@ -0,0 +1,72 @@
/*
* date2022-12-26
* developerNoNo
*/
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>
/// stockadjust controller
/// </summary>
[Route("stockadjust")]
[ApiController]
[ApiExplorerSettings(GroupName = "WMS")]
public class StockadjustController : BaseController
{
#region Args
/// <summary>
/// stockadjust Service
/// </summary>
private readonly IStockadjustService _stockadjustService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="stockadjustService">stockadjust Service</param>
/// <param name="stringLocalizer">Localizer</param>
public StockadjustController(
IStockadjustService stockadjustService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._stockadjustService = stockadjustService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<StockadjustViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _stockadjustService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<StockadjustViewModel>>.Success(new PageData<StockadjustViewModel>
{
Rows = data,
Totals = totals
});
}
#endregion
}
}

View file

@ -0,0 +1,164 @@
/*
* date2022-12-26
* developerNoNo
*/
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>
/// stockfreeze controller
/// </summary>
[Route("stockfreeze")]
[ApiController]
[ApiExplorerSettings(GroupName = "WMS")]
public class StockfreezeController : BaseController
{
#region Args
/// <summary>
/// stockfreeze Service
/// </summary>
private readonly IStockfreezeService _stockfreezeService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="stockfreezeService">stockfreeze Service</param>
/// <param name="stringLocalizer">Localizer</param>
public StockfreezeController(
IStockfreezeService stockfreezeService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._stockfreezeService = stockfreezeService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<StockfreezeViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _stockfreezeService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<StockfreezeViewModel>>.Success(new PageData<StockfreezeViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<StockfreezeViewModel>>> GetAllAsync()
{
var data = await _stockfreezeService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<StockfreezeViewModel>>.Success(data);
}
else
{
return ResultModel<List<StockfreezeViewModel>>.Success(new List<StockfreezeViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<StockfreezeViewModel>> GetAsync(int id)
{
var data = await _stockfreezeService.GetAsync(id);
if (data!=null)
{
return ResultModel<StockfreezeViewModel>.Success(data);
}
else
{
return ResultModel<StockfreezeViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(StockfreezeViewModel viewModel)
{
var (id, msg) = await _stockfreezeService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(StockfreezeViewModel viewModel)
{
var (flag, msg) = await _stockfreezeService.UpdateAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _stockfreezeService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,164 @@
/*
* date2022-12-27
* developerNoNo
*/
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>
/// stockmove controller
/// </summary>
[Route("stockmove")]
[ApiController]
[ApiExplorerSettings(GroupName = "WMS")]
public class StockmoveController : BaseController
{
#region Args
/// <summary>
/// stockmove Service
/// </summary>
private readonly IStockmoveService _stockmoveService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="stockmoveService">stockmove Service</param>
/// <param name="stringLocalizer">Localizer</param>
public StockmoveController(
IStockmoveService stockmoveService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._stockmoveService = stockmoveService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<StockmoveViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _stockmoveService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<StockmoveViewModel>>.Success(new PageData<StockmoveViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<StockmoveViewModel>>> GetAllAsync()
{
var data = await _stockmoveService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<StockmoveViewModel>>.Success(data);
}
else
{
return ResultModel<List<StockmoveViewModel>>.Success(new List<StockmoveViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<StockmoveViewModel>> GetAsync(int id)
{
var data = await _stockmoveService.GetAsync(id);
if (data!=null)
{
return ResultModel<StockmoveViewModel>.Success(data);
}
else
{
return ResultModel<StockmoveViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(StockmoveViewModel viewModel)
{
var (id, msg) = await _stockmoveService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// confirm move
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> Confirm(int id)
{
var (flag, msg) = await _stockmoveService.Confirm(id,CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _stockmoveService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,201 @@
/*
* date2022-12-23
* developerNoNo
*/
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>
/// stockprocess controller
/// </summary>
[Route("stockprocess")]
[ApiController]
[ApiExplorerSettings(GroupName = "WMS")]
public class StockprocessController : BaseController
{
#region Args
/// <summary>
/// stockprocess Service
/// </summary>
private readonly IStockprocessService _stockprocessService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="stockprocessService">stockprocess Service</param>
/// <param name="stringLocalizer">Localizer</param>
public StockprocessController(
IStockprocessService stockprocessService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._stockprocessService = stockprocessService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<StockprocessGetViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _stockprocessService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<StockprocessGetViewModel>>.Success(new PageData<StockprocessGetViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<StockprocessGetViewModel>>> GetAllAsync()
{
var data = await _stockprocessService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<StockprocessGetViewModel>>.Success(data);
}
else
{
return ResultModel<List<StockprocessGetViewModel>>.Success(new List<StockprocessGetViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<StockprocessWithDetailViewModel>> GetAsync(int id)
{
var data = await _stockprocessService.GetAsync(id);
if (data!=null)
{
return ResultModel<StockprocessWithDetailViewModel>.Success(data);
}
else
{
return ResultModel<StockprocessWithDetailViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(StockprocessViewModel viewModel)
{
var (id, msg) = await _stockprocessService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(StockprocessViewModel viewModel)
{
var (flag, msg) = await _stockprocessService.UpdateAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _stockprocessService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// confirm processing
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPut("process-confirm")]
public async Task<ResultModel<string>> ConfirmProcess(int id)
{
var (flag, msg) = await _stockprocessService.ConfirmProcess(id,CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// confirm adjustment
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPut("adjustment-confirm")]
public async Task<ResultModel<string>> ConfirmAdjustment(int id)
{
var (flag, msg) = await _stockprocessService.ConfirmAdjustment(id, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,165 @@
/*
* date2022-12-30
* developerAMo
*/
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>
/// stocktaking controller
/// </summary>
[Route("stocktaking")]
[ApiController]
[ApiExplorerSettings(GroupName = "WMS")]
public class StocktakingController : BaseController
{
#region Args
/// <summary>
/// stocktaking Service
/// </summary>
private readonly IStocktakingService _stocktakingService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="stocktakingService">stocktaking Service</param>
/// <param name="stringLocalizer">Localizer</param>
public StocktakingController(
IStocktakingService stocktakingService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._stocktakingService = stocktakingService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<StocktakingViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _stocktakingService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<StocktakingViewModel>>.Success(new PageData<StocktakingViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<StocktakingViewModel>> GetAsync(int id)
{
var data = await _stocktakingService.GetAsync(id);
if (data!=null)
{
return ResultModel<StocktakingViewModel>.Success(data);
}
else
{
return ResultModel<StocktakingViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(StocktakingBasicViewModel viewModel)
{
var (id, msg) = await _stocktakingService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// Confirm a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> PutAsync(StocktakingConfirmViewModel viewModel)
{
var (flag, msg) = await _stocktakingService.PutAsync(viewModel, CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// confrim a record and change stock and add to stockadjust
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpPut("adjustment-confirm")]
public async Task<ResultModel<bool>> ConfirmAsync(int id)
{
var (flag, msg) = await _stocktakingService.ConfirmAsync(id, CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _stocktakingService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,195 @@
/*
* date2022-12-21
* developerNoNo
*/
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;
using ModernWMS.WMS.Services;
namespace ModernWMS.WMS.Controllers
{
/// <summary>
/// warehouse controller
/// </summary>
[Route("warehouse")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class WarehouseController : BaseController
{
#region Args
/// <summary>
/// warehouse Service
/// </summary>
private readonly IWarehouseService _warehouseService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="warehouseService">warehouse Service</param>
/// <param name="stringLocalizer">Localizer</param>
public WarehouseController(
IWarehouseService warehouseService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._warehouseService = warehouseService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// get select items
/// </summary>
/// <returns></returns>
[HttpGet("select-item")]
public async Task<ResultModel<List<FormSelectItem>>> GetSelectItemsAsnyc()
{
var datas = await _warehouseService.GetSelectItemsAsnyc(CurrentUser);
return ResultModel<List<FormSelectItem>>.Success(datas);
}
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<WarehouseViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _warehouseService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<WarehouseViewModel>>.Success(new PageData<WarehouseViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<WarehouseViewModel>>> GetAllAsync()
{
var data = await _warehouseService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<WarehouseViewModel>>.Success(data);
}
else
{
return ResultModel<List<WarehouseViewModel>>.Success(new List<WarehouseViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<WarehouseViewModel>> GetAsync(int id)
{
var data = await _warehouseService.GetAsync(id);
if (data!=null)
{
return ResultModel<WarehouseViewModel>.Success(data);
}
else
{
return ResultModel<WarehouseViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(WarehouseViewModel viewModel)
{
var (id, msg) = await _warehouseService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(WarehouseViewModel viewModel)
{
var (flag, msg) = await _warehouseService.UpdateAsync(viewModel,CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _warehouseService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// import warehouses by excel
/// </summary>
/// <param name="excel_datas">excel datas</param>
/// <returns></returns>
[HttpPost("excel")]
public async Task<ResultModel<string>> ExcelAsync(List<WarehouseExcelImportViewModel> excel_datas)
{
var (flag, msg) = await _warehouseService.ExcelAsync(excel_datas, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,174 @@
/*
* date2022-12-21
* developerNoNo
*/
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>
/// warehousearea controller
/// </summary>
[Route("warehousearea")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class WarehouseareaController : BaseController
{
#region Args
/// <summary>
/// warehousearea Service
/// </summary>
private readonly IWarehouseareaService _warehouseareaService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="warehouseareaService">warehousearea Service</param>
/// <param name="stringLocalizer">Localizer</param>
public WarehouseareaController(
IWarehouseareaService warehouseareaService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._warehouseareaService = warehouseareaService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// get warehousearea select items by warehouse_id
/// </summary>
/// <returns></returns>
[HttpGet("areas-by-warehouse_id")]
public async Task<ResultModel<List<FormSelectItem>>> GetSelectItemsAsnyc(int warehouse_id)
{
var datas = await _warehouseareaService.GetWarehouseareaByWarehouse_id(warehouse_id,CurrentUser);
return ResultModel<List<FormSelectItem>>.Success(datas);
}
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<WarehouseareaViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _warehouseareaService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<WarehouseareaViewModel>>.Success(new PageData<WarehouseareaViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<WarehouseareaViewModel>>> GetAllAsync(int warehouse_id)
{
var data = await _warehouseareaService.GetAllAsync( warehouse_id, CurrentUser);
if (data.Any())
{
return ResultModel<List<WarehouseareaViewModel>>.Success(data);
}
else
{
return ResultModel<List<WarehouseareaViewModel>>.Success(new List<WarehouseareaViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<WarehouseareaViewModel>> GetAsync(int id)
{
var data = await _warehouseareaService.GetAsync(id);
if (data!=null)
{
return ResultModel<WarehouseareaViewModel>.Success(data);
}
else
{
return ResultModel<WarehouseareaViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(WarehouseareaViewModel viewModel)
{
var (id, msg) = await _warehouseareaService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(WarehouseareaViewModel viewModel)
{
var (flag, msg) = await _warehouseareaService.UpdateAsync(viewModel,CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _warehouseareaService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,142 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using ModernWMS.Core.Controller;
using ModernWMS.Core.Models;
using ModernWMS.WMS.Entities.ViewModels;
using ModernWMS.WMS.IServices;
namespace ModernWMS.WMS.Controllers
{
/// <summary>
/// company controller
/// </summary>
[Route("company")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class CompanyController: BaseController
{
#region Args
/// <summary>
/// company Service
/// </summary>
private readonly ICompanyService _companyService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="companyService">company Service</param>
/// <param name="stringLocalizer">Localizer</param>
public CompanyController(
ICompanyService companyService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._companyService = companyService;
this._stringLocalizer = stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// Get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<CompanyViewModel>>> GetAllAsync()
{
var data = await _companyService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<CompanyViewModel>>.Success(data);
}
else
{
return ResultModel<List<CompanyViewModel>>.Success(new List<CompanyViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<CompanyViewModel>> GetAsync(int id)
{
var data = await _companyService.GetAsync(id);
if (data != null && data.id > 0)
{
return ResultModel<CompanyViewModel>.Success(data);
}
else
{
return ResultModel<CompanyViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(CompanyViewModel viewModel)
{
var (id, msg) = await _companyService.AddAsync(viewModel, CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(CompanyViewModel viewModel)
{
var (flag, msg) = await _companyService.UpdateAsync(viewModel);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _companyService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,183 @@
/*
* date2022-12-21
* developerNoNo
*/
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>
/// supplier controller
/// </summary>
[Route("supplier")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class SupplierController : BaseController
{
#region Args
/// <summary>
/// supplier Service
/// </summary>
private readonly ISupplierService _supplierService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="supplierService">supplier Service</param>
/// <param name="stringLocalizer">Localizer</param>
public SupplierController(
ISupplierService supplierService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._supplierService = supplierService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<SupplierViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _supplierService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<SupplierViewModel>>.Success(new PageData<SupplierViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<SupplierViewModel>>> GetAllAsync()
{
var data = await _supplierService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<SupplierViewModel>>.Success(data);
}
else
{
return ResultModel<List<SupplierViewModel>>.Success(new List<SupplierViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<SupplierViewModel>> GetAsync(int id)
{
var data = await _supplierService.GetAsync(id);
if (data!=null)
{
return ResultModel<SupplierViewModel>.Success(data);
}
else
{
return ResultModel<SupplierViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(SupplierViewModel viewModel)
{
var (id, msg) = await _supplierService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(SupplierViewModel viewModel)
{
var (flag, msg) = await _supplierService.UpdateAsync(viewModel, CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _supplierService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// import suppliers by excel
/// </summary>
/// <param name="excel_datas">excel datas</param>
/// <returns></returns>
[HttpPost("excel")]
public async Task<ResultModel<string>> ExcelAsync(List<SupplierExcelImportViewModel> excel_datas)
{
var (flag, msg) = await _supplierService.ExcelAsync(excel_datas, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,248 @@
/*
* date2022-12-20
* developerNoNo
*/
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;
using Microsoft.AspNetCore.Authorization;
namespace ModernWMS.WMS.Controllers
{
/// <summary>
/// user controller
/// </summary>
[Route("user")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class UserController : BaseController
{
#region Args
/// <summary>
/// user Service
/// </summary>
private readonly IUserService _userService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="userService">user Service</param>
/// <param name="stringLocalizer">Localizer</param>
public UserController(
IUserService userService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._userService = userService;
this._stringLocalizer = stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// get select items
/// </summary>
/// <returns></returns>
[HttpGet("select-item")]
public async Task<ResultModel<List<FormSelectItem>>> GetSelectItemsAsnyc()
{
var datas = await _userService.GetSelectItemsAsnyc(CurrentUser);
return ResultModel<List<FormSelectItem>>.Success(datas);
}
/// <summary>
/// page search
/// </summary>
/// <param name="pageSearch">args</param>
/// <returns></returns>
[HttpPost("list")]
public async Task<ResultModel<PageData<UserViewModel>>> PageAsync(PageSearch pageSearch)
{
var (data, totals) = await _userService.PageAsync(pageSearch, CurrentUser);
return ResultModel<PageData<UserViewModel>>.Success(new PageData<UserViewModel>
{
Rows = data,
Totals = totals
});
}
/// <summary>
/// Get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<UserViewModel>>> GetAllAsync()
{
var data = await _userService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<UserViewModel>>.Success(data);
}
else
{
return ResultModel<List<UserViewModel>>.Success(new List<UserViewModel>());
}
}
/// <summary>
/// Get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<UserViewModel>> GetAsync(int id)
{
var data = await _userService.GetAsync(id);
if (data != null)
{
return ResultModel<UserViewModel>.Success(data);
}
else
{
return ResultModel<UserViewModel>.Error(_stringLocalizer["not_exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(UserViewModel viewModel)
{
viewModel.creator = CurrentUser.user_name;
var (id, msg) = await _userService.AddAsync(viewModel, CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// register a new tenant
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[AllowAnonymous]
[HttpPost("register")]
public async Task<ResultModel<string>> Register(RegisterViewModel viewModel)
{
var (flag, msg) = await _userService.Register(viewModel);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// import users by excel
/// </summary>
/// <param name="excel_datas">excel datas</param>
/// <returns></returns>
[HttpPost("excel")]
public async Task<ResultModel<string>> ExcelAsync(List<UserExcelImportViewModel> excel_datas)
{
var (flag, msg) = await _userService.ExcelAsync(excel_datas, CurrentUser);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(UserViewModel viewModel)
{
var (flag, msg) = await _userService.UpdateAsync(viewModel, CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _userService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// reset password
/// </summary>
/// <param name="viewModel">viewmodel</param>
/// <returns></returns>
[HttpPost("reset-pwd")]
public async Task<ResultModel<string>> ResetPwd(BatchOperationViewModel viewModel)
{
var (flag, msg) = await _userService.ResetPwd(viewModel);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
/// <summary>
/// change password
/// </summary>
/// <param name="viewModel">viewmodel</param>
/// <returns></returns>
[HttpPost("change-pwd")]
public async Task<ResultModel<string>> ChangePwd(UserChangePwdViewModel viewModel)
{
var (flag, msg) = await _userService.ChangePwd(viewModel);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,163 @@
/*
* date2022-12-20
* developerNoNo
*/
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>
/// userrole controller
/// </summary>
[Route("userrole")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class UserroleController : BaseController
{
#region Args
/// <summary>
/// userrole Service
/// </summary>
private readonly IUserroleService _userroleService;
/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
#endregion
#region constructor
/// <summary>
/// constructor
/// </summary>
/// <param name="userroleService">userrole Service</param>
/// <param name="stringLocalizer">Localizer</param>
public UserroleController(
IUserroleService userroleService
, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer
)
{
this._userroleService = userroleService;
this._stringLocalizer= stringLocalizer;
}
#endregion
#region Api
/// <summary>
/// save all records
/// </summary>
/// <param name="viewModels">viewmodel</param>
/// <returns></returns>
[HttpPost("save")]
public async Task<ResultModel<string>> SaveAllAsync(List<UserroleViewModel> viewModels)
{
var (flag,msg) = await _userroleService.BulkSaveAsync(viewModels, CurrentUser);
if(flag)
{
return ResultModel<string>.Success(msg);
}
return ResultModel<string>.Error(msg);
}
/// <summary>
/// get all records
/// </summary>
/// <returns>args</returns>
[HttpGet("all")]
public async Task<ResultModel<List<UserroleViewModel>>> GetAllAsync()
{
var data = await _userroleService.GetAllAsync(CurrentUser);
if (data.Any())
{
return ResultModel<List<UserroleViewModel>>.Success(data);
}
else
{
return ResultModel<List<UserroleViewModel>>.Success(new List<UserroleViewModel>());
}
}
/// <summary>
/// get a record by id
/// </summary>
/// <returns>args</returns>
[HttpGet]
public async Task<ResultModel<UserroleViewModel>> GetAsync(int id)
{
var data = await _userroleService.GetAsync(id);
if (data!=null)
{
return ResultModel<UserroleViewModel>.Success(data);
}
else
{
return ResultModel<UserroleViewModel>.Error(_stringLocalizer["exists_entity"]);
}
}
/// <summary>
/// add a new record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<int>> AddAsync(UserroleViewModel viewModel)
{
var (id, msg) = await _userroleService.AddAsync(viewModel,CurrentUser);
if (id > 0)
{
return ResultModel<int>.Success(id);
}
else
{
return ResultModel<int>.Error(msg);
}
}
/// <summary>
/// update a record
/// </summary>
/// <param name="viewModel">args</param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<bool>> UpdateAsync(UserroleViewModel viewModel)
{
var (flag, msg) = await _userroleService.UpdateAsync(viewModel, CurrentUser);
if (flag)
{
return ResultModel<bool>.Success(flag);
}
else
{
return ResultModel<bool>.Error(msg, 400, flag);
}
}
/// <summary>
/// delete a record
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[HttpDelete]
public async Task<ResultModel<string>> DeleteAsync(int id)
{
var (flag, msg) = await _userroleService.DeleteAsync(id);
if (flag)
{
return ResultModel<string>.Success(msg);
}
else
{
return ResultModel<string>.Error(msg);
}
}
#endregion
}
}

View file

@ -0,0 +1,132 @@
/*
* date2022-12-22
* developerAMo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// asn entity
/// </summary>
[Table("asn")]
public class AsnEntity : BaseModel
{
#region Property
/// <summary>
/// asn_no
/// </summary>
public string asn_no { get; set; } = string.Empty;
/// <summary>
/// asn_status
/// </summary>
public byte asn_status { get; set; } = 0;
/// <summary>
/// spu_id
/// </summary>
public int spu_id { get; set; } = 0;
/// <summary>
/// sku_id
/// </summary>
public int sku_id { get; set; } = 0;
/// <summary>
/// asn_qty
/// </summary>
public int asn_qty { get; set; } = 0;
/// <summary>
/// actual_qty
/// </summary>
public int actual_qty { get; set; } = 0;
/// <summary>
/// sorted_qty
/// </summary>
public int sorted_qty { get; set; } = 0;
/// <summary>
/// shortage_qty
/// </summary>
public int shortage_qty { get; set; } = 0;
/// <summary>
/// more_qty
/// </summary>
public int more_qty { get; set; } = 0;
/// <summary>
/// damage_qty
/// </summary>
public int damage_qty { get; set; } = 0;
/// <summary>
/// weight
/// </summary>
public decimal weight { get; set; } = 0;
/// <summary>
/// volume
/// </summary>
public decimal volume { get; set; } = 0;
/// <summary>
/// supplier_id
/// </summary>
public int supplier_id { get; set; } = 0;
/// <summary>
/// supplier_name
/// </summary>
public string supplier_name { get; set; } = string.Empty;
/// <summary>
/// goods_owner_id
/// </summary>
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// goods_owner_name
/// </summary>
public string goods_owner_name { get; set; } = string.Empty;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = DateTime.Now;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = true;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 1;
#endregion
}
}

View file

@ -0,0 +1,59 @@
/*
* date2022-12-30
* developerAMo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// asnsort entity
/// </summary>
[Table("asnsort")]
public class AsnsortEntity : BaseModel
{
#region Property
/// <summary>
/// asn_id
/// </summary>
public int asn_id { get; set; } = 0;
/// <summary>
/// sorted_qty
/// </summary>
public int sorted_qty { get; set; } = 0;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = DateTime.Now;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = true;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 1;
#endregion
}
}

View file

@ -0,0 +1,69 @@
using ModernWMS.Core.Models;
using System.ComponentModel.DataAnnotations.Schema;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// customer entity
/// </summary>
[Table("customer")]
public class CustomerEntity : BaseModel
{
#region Property
/// <summary>
/// customer name
/// </summary>
public string customer_name { get; set; } = string.Empty;
/// <summary>
/// city
/// </summary>
public string city { get; set; } = string.Empty;
/// <summary>
/// address
/// </summary>
public string address { get; set; } = string.Empty;
/// <summary>
/// email
/// </summary>
public string email { get; set; } = string.Empty;
/// <summary>
/// manager
/// </summary>
public string manager { get; set; } = string.Empty;
/// <summary>
/// contact tel
/// </summary>
public string contact_tel { get; set; } = string.Empty;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create time
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// last update time
/// </summary>
public DateTime last_update_time { get; set; } = DateTime.Now;
/// <summary>
/// valid
/// </summary>
public bool is_valid { get; set; } = true;
/// <summary>
/// the tenant id
/// </summary>
public long tenant_id { get; set; } = 1;
#endregion
}
}

View file

@ -0,0 +1,183 @@
/*
* date2022-12-22
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// dispatchlist entity
/// </summary>
[Table("dispatchlist")]
public class DispatchlistEntity : BaseModel
{
#region Property
/// <summary>
/// dispatch_no
/// </summary>
public string dispatch_no { get; set; } = string.Empty;
/// <summary>
/// dispatch_status
/// </summary>
public byte dispatch_status { get; set; } = 0;
/// <summary>
/// customer_id
/// </summary>
public int customer_id { get; set; } = 0;
/// <summary>
/// customer_name
/// </summary>
public string customer_name { get; set; } = string.Empty;
/// <summary>
/// sku_id
/// </summary>
public int sku_id { get; set; } = 0;
/// <summary>
/// qty
/// </summary>
public int qty { get; set; } = 0;
/// <summary>
/// weight
/// </summary>
public decimal weight { get; set; } = 0;
/// <summary>
/// volume
/// </summary>
public decimal volume { get; set; } = 0;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// damage_qty
/// </summary>
public int damage_qty { get; set; } = 0;
/// <summary>
/// lock_qty
/// </summary>
public int lock_qty { get; set; } = 0;
/// <summary>
/// picked_qty
/// </summary>
public int picked_qty { get; set; } = 0;
/// <summary>
/// intrasit_qty
/// </summary>
public int intrasit_qty { get; set; } = 0;
/// <summary>
/// package_qty
/// </summary>
public int package_qty { get; set; } = 0;
/// <summary>
/// weighing_qty
/// </summary>
public int weighing_qty { get; set; } = 0;
/// <summary>
/// actual_qty
/// </summary>
public int actual_qty { get; set; } = 0;
/// <summary>
/// sign_qty
/// </summary>
public int sign_qty { get; set; } = 0;
/// <summary>
/// package_no
/// </summary>
public string package_no { get; set; } = string.Empty;
/// <summary>
/// package_person
/// </summary>
public string package_person { get; set; } = string.Empty;
/// <summary>
/// package_time
/// </summary>
public DateTime package_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// weighing_no
/// </summary>
public string weighing_no { get; set; } = string.Empty;
/// <summary>
/// weighing_person
/// </summary>
public string weighing_person { get; set; } = string.Empty;
/// <summary>
/// weighing_weight
/// </summary>
public decimal weighing_weight { get; set; } = 0;
/// <summary>
/// waybill_no
/// </summary>
public string waybill_no { get; set; } = string.Empty;
/// <summary>
/// carrier
/// </summary>
public string carrier { get; set; } = string.Empty;
/// <summary>
/// freightfee
/// </summary>
public decimal freightfee { get; set; } = 0;
/// <summary>
/// last_update_time
/// </summary>
[ConcurrencyCheck]
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
#region detail table
/// <summary>
/// detail table
/// </summary>
public List<DispatchpicklistEntity> detailList { get; set; } = new List<DispatchpicklistEntity>(2);
#endregion
}
}

View file

@ -0,0 +1,76 @@
/*
* date2022-12-22
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// dispatchpicklist entity
/// </summary>
[Table("dispatchpicklist")]
public class DispatchpicklistEntity : BaseModel
{
#region foreign table
/// <summary>
/// foreign table
/// </summary>
[ForeignKey("dispatchlist_id")]
public DispatchlistEntity Dispatchlist { get; set; }
#endregion
#region Property
/// <summary>
/// dispatchlist_id
/// </summary>
public int dispatchlist_id { get; set; } = 0;
/// <summary>
/// goods_owner_id
/// </summary>
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// goods_location_id
/// </summary>
public int goods_location_id { get; set; } = 0;
/// <summary>
/// sku_id
/// </summary>
public int sku_id { get; set; } = 0;
/// <summary>
/// pick_qty
/// </summary>
public int pick_qty { get; set; } = 0;
/// <summary>
/// picked_qty
/// </summary>
public int picked_qty { get; set; } = 0;
/// <summary>
/// is_update_stock
/// </summary>
public bool is_update_stock { get; set; } = false;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
#endregion
}
}

View file

@ -0,0 +1,82 @@
/*
* date2022-12-22
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// freightfee entity
/// </summary>
[Table("freightfee")]
public class FreightfeeEntity : BaseModel
{
#region Property
/// <summary>
/// carrier
/// </summary>
public string carrier { get; set; } = string.Empty;
/// <summary>
/// departure_city
/// </summary>
public string departure_city { get; set; } = string.Empty;
/// <summary>
/// arrival_city
/// </summary>
public string arrival_city { get; set; } = string.Empty;
/// <summary>
/// price_per_weight
/// </summary>
public decimal price_per_weight { get; set; } = 0;
/// <summary>
/// price_per_volume
/// </summary>
public decimal price_per_volume { get; set; } = 0;
/// <summary>
/// min_payment
/// </summary>
public decimal min_payment { get; set; } = 0;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = false;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,64 @@
using ModernWMS.Core.Models;
using System.ComponentModel.DataAnnotations.Schema;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// goods owner entity
/// </summary>
[Table("goodsowner")]
public class GoodsownerEntity : BaseModel
{
#region Property
/// <summary>
/// goods owner name
/// </summary>
public string goods_owner_name { get; set; } = string.Empty;
/// <summary>
/// city
/// </summary>
public string city { get; set; } = string.Empty;
/// <summary>
/// address
/// </summary>
public string address { get; set; } = string.Empty;
/// <summary>
/// manager
/// </summary>
public string manager { get; set; } = string.Empty;
/// <summary>
/// contact tel
/// </summary>
public string contact_tel { get; set; } = string.Empty;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create time
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// last update time
/// </summary>
public DateTime last_update_time { get; set; } = DateTime.Now;
/// <summary>
/// valid
/// </summary>
public bool is_valid { get; set; } = true;
/// <summary>
/// the tenant id
/// </summary>
public long tenant_id { get; set; } = 1;
#endregion
}
}

View file

@ -0,0 +1,122 @@
/*
* date2022-12-21
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// goodslocation entity
/// </summary>
[Table("goodslocation")]
public class GoodslocationEntity : BaseModel
{
#region Property
/// <summary>
/// warehouse_id
/// </summary>
public int warehouse_id { get; set; } = 0;
/// <summary>
/// warehouse_name
/// </summary>
public string warehouse_name { get; set; } = string.Empty;
/// <summary>
/// warehouse_area_name
/// </summary>
public string warehouse_area_name { get; set; } = string.Empty;
/// <summary>
/// warehouse_area_property
/// </summary>
public byte warehouse_area_property { get; set; } = 0;
/// <summary>
/// location_name
/// </summary>
public string location_name { get; set; } = string.Empty;
/// <summary>
/// location_length
/// </summary>
public decimal location_length { get; set; } = 0;
/// <summary>
/// location_width
/// </summary>
public decimal location_width { get; set; } = 0;
/// <summary>
/// location_heigth
/// </summary>
public decimal location_heigth { get; set; } = 0;
/// <summary>
/// location_volume
/// </summary>
public decimal location_volume { get; set; } = 0;
/// <summary>
/// location_load
/// </summary>
public decimal location_load { get; set; } = 0;
/// <summary>
/// roadway_number
/// </summary>
public string roadway_number { get; set; } = string.Empty;
/// <summary>
/// shelf_number
/// </summary>
public string shelf_number { get; set; } = string.Empty;
/// <summary>
/// layer_number
/// </summary>
public string layer_number { get; set; } = string.Empty;
/// <summary>
/// tag_number
/// </summary>
public string tag_number { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = false;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
/// <summary>
/// warehouse_area_id
/// </summary>
public int warehouse_area_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,54 @@
using ModernWMS.Core.Models;
using System.ComponentModel.DataAnnotations.Schema;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// menu entity
/// </summary>
[Table("menu")]
public class MenuEntity : BaseModel
{
#region Property
/// <summary>
/// menu_name
/// </summary>
public string menu_name { get; set; } = string.Empty;
/// <summary>
/// module
/// </summary>
public string module { get; set; } = string.Empty;
/// <summary>
/// vue_path
/// </summary>
public string vue_path { get; set; } = string.Empty;
/// <summary>
/// vue_path_detail
/// </summary>
public string vue_path_detail { get; set; } = string.Empty;
/// <summary>
/// vue_directory
/// </summary>
public string vue_directory { get; set; } = string.Empty;
/// <summary>
/// sort
/// </summary>
public int sort { get; set; } = 0;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 1;
#endregion
}
}

View file

@ -0,0 +1,57 @@
/*
* date2022-12-20
* developerAMo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// rolemenu entity
/// </summary>
[Table("rolemenu")]
public class RolemenuEntity : BaseModel
{
#region Property
/// <summary>
/// userrole_id
/// </summary>
public int userrole_id { get; set; } = 0;
/// <summary>
/// menu_id
/// </summary>
public int menu_id { get; set; } = 0;
/// <summary>
/// authority
/// </summary>
public byte authority { get; set; } = 1;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 1;
#endregion
}
}

View file

@ -0,0 +1,59 @@
/*
* date2022-12-20
* developerAMo
*/
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
using System.ComponentModel.DataAnnotations.Schema;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// category entity
/// </summary>
[Table("category")]
public class CategoryEntity : BaseModel
{
#region Property
/// <summary>
/// category_name
/// </summary>
public string category_name { get; set; } = string.Empty;
/// <summary>
/// parent_id
/// </summary>
public int parent_id { get; set; } = 0;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = true;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 1;
#endregion
}
}

View file

@ -0,0 +1,100 @@
/*
* date2022-12-21
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// sku entity
/// </summary>
[Table("sku")]
public class SkuEntity : BaseModel
{
#region navigational properties
/// <summary>
/// navigational properties
/// </summary>
[ForeignKey("spu_id")]
public SpuEntity Spu { get; set; }
#endregion
#region Property
/// <summary>
/// spu_id
/// </summary>
public int spu_id { get; set; } = 0;
/// <summary>
/// sku_code
/// </summary>
public string sku_code { get; set; } = string.Empty;
/// <summary>
/// sku_name
/// </summary>
public string sku_name { get; set; } = string.Empty;
/// <summary>
/// weight
/// </summary>
public decimal weight { get; set; } = 0;
/// <summary>
/// lenght
/// </summary>
public decimal lenght { get; set; } = 0;
/// <summary>
/// width
/// </summary>
public decimal width { get; set; } = 0;
/// <summary>
/// height
/// </summary>
public decimal height { get; set; } = 0;
/// <summary>
/// volume
/// </summary>
public decimal volume { get; set; } = 0;
/// <summary>
/// unit
/// </summary>
public string unit { get; set; } = string.Empty;
/// <summary>
/// cost
/// </summary>
public decimal cost { get; set; } = 0;
/// <summary>
/// price
/// </summary>
public decimal price { get; set; } = 0;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
#endregion
}
}

View file

@ -0,0 +1,118 @@
/*
* date2022-12-21
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// spu entity
/// </summary>
[Table("spu")]
public class SpuEntity : BaseModel
{
#region Property
/// <summary>
/// spu_code
/// </summary>
public string spu_code { get; set; } = string.Empty;
/// <summary>
/// spu_name
/// </summary>
public string spu_name { get; set; } = string.Empty;
/// <summary>
/// category_id
/// </summary>
public int category_id { get; set; } = 0;
/// <summary>
/// spu_description
/// </summary>
public string spu_description { get; set; } = string.Empty;
/// <summary>
/// bar_code
/// </summary>
public string bar_code { get; set; } = string.Empty;
/// <summary>
/// supplier_id
/// </summary>
public int supplier_id { get; set; } = 0;
/// <summary>
/// supplier_name
/// </summary>
public string supplier_name { get; set; } = string.Empty;
/// <summary>
/// brand
/// </summary>
public string brand { get; set; } = string.Empty;
/// <summary>
/// origin
/// </summary>
public string origin { get; set; } = string.Empty;
/// <summary>
/// length_unit
/// </summary>
public byte length_unit { get; set; } = 0;
/// <summary>
/// volume_unit
/// </summary>
public byte volume_unit { get; set; } = 0;
/// <summary>
/// weight_unit
/// </summary>
public byte weight_unit { get; set; } = 0;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = DateTime.Now;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = true;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 1;
#endregion
#region details
/// <summary>
/// sku
/// </summary>
public List<SkuEntity> detailList { get; set; } = new List<SkuEntity>();
#endregion
}
}

View file

@ -0,0 +1,63 @@
/*
* date2022-12-22
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// stock entity
/// </summary>
[Table("stock")]
public class StockEntity : BaseModel
{
#region Property
/// <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>
/// qty
/// </summary>
public int qty { get; set; } = 0;
/// <summary>
/// goods_owner_id
/// </summary>
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// is_freeze
/// </summary>
public bool is_freeze { get; set; } = false;
/// <summary>
/// last_update_time
/// </summary>
[ConcurrencyCheck]
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,87 @@
/*
* date2022-12-26
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// stockadjust entity
/// </summary>
[Table("stockadjust")]
public class StockadjustEntity : BaseModel
{
#region Property
/// <summary>
/// job_code
/// </summary>
public string job_code { get; set; } = string.Empty;
/// <summary>
/// sku_id
/// </summary>
public int sku_id { get; set; } = 0;
/// <summary>
/// goods_owner_id
/// </summary>
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// goods_location_id
/// </summary>
public int goods_location_id { get; set; } = 0;
/// <summary>
/// qty
/// </summary>
public int qty { get; set; } = 0;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
/// <summary>
/// is_update_stock
/// </summary>
public bool is_update_stock { get; set; } = false;
/// <summary>
/// job_type
/// </summary>
public byte job_type { get; set; } = 0;
/// <summary>
/// source_table_id
/// </summary>
public int source_table_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,72 @@
/*
* date2022-12-26
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// stockfreeze entity
/// </summary>
[Table("stockfreeze")]
public class StockfreezeEntity : BaseModel
{
#region Property
/// <summary>
/// job_code
/// </summary>
public string job_code { get; set; } = string.Empty;
/// <summary>
/// job_type
/// </summary>
public bool job_type { get; set; } = false;
/// <summary>
/// sku_id
/// </summary>
public int sku_id { get; set; } = 0;
/// <summary>
/// goods_owner_id
/// </summary>
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// goods_location_id
/// </summary>
public int goods_location_id { get; set; } = 0;
/// <summary>
/// handler
/// </summary>
public string handler { get; set; } = string.Empty;
/// <summary>
/// operate_time
/// </summary>
public DateTime handle_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,92 @@
/*
* date2022-12-27
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// stockmove entity
/// </summary>
[Table("stockmove")]
public class StockmoveEntity : BaseModel
{
#region Property
/// <summary>
/// job_code
/// </summary>
public string job_code { get; set; } = string.Empty;
/// <summary>
/// move_status
/// </summary>
public byte move_status { get; set; } = 0;
/// <summary>
/// sku_id
/// </summary>
public int sku_id { get; set; } = 0;
/// <summary>
/// orig_goods_location_id
/// </summary>
public int orig_goods_location_id { get; set; } = 0;
/// <summary>
/// dest_googs_location_id
/// </summary>
public int dest_googs_location_id { get; set; } = 0;
/// <summary>
/// qty
/// </summary>
public int qty { get; set; } = 0;
/// <summary>
/// goods_owner_id
/// </summary>
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// handler
/// </summary>
public string handler { get; set; } = string.Empty;
/// <summary>
/// handle_time
/// </summary>
public DateTime handle_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,82 @@
/*
* date2022-12-23
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// stockprocess entity
/// </summary>
[Table("stockprocess")]
public class StockprocessEntity : BaseModel
{
#region Property
/// <summary>
/// job_code
/// </summary>
public string job_code { get; set; } = string.Empty;
/// <summary>
/// job_type
/// </summary>
public bool job_type { get; set; } = false;
/// <summary>
/// process_status
/// </summary>
public bool process_status { get; set; } = false;
/// <summary>
/// processor
/// </summary>
public string processor { get; set; } = string.Empty;
/// <summary>
/// process_time
/// </summary>
public DateTime process_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
#region detail table
/// <summary>
/// detail table
/// </summary>
public List<StockprocessdetailEntity> detailList { get; set; } = new List<StockprocessdetailEntity>(2);
#endregion
}
}

View file

@ -0,0 +1,79 @@
/*
* date2022-12-23
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// stockprocessdetail entity
/// </summary>
[Table("stockprocessdetail")]
public class StockprocessdetailEntity : BaseModel
{
#region foreign table
/// <summary>
/// foreign table
/// </summary>
[ForeignKey("stock_process_id")]
public StockprocessEntity Stockprocess { get; set; }
#endregion
#region Property
/// <summary>
/// stock_process_id
/// </summary>
public int stock_process_id { get; set; } = 0;
/// <summary>
/// sku_id
/// </summary>
public int sku_id { get; set; } = 0;
/// <summary>
/// goods_owner_id
/// </summary>
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// goods_location_id
/// </summary>
public int goods_location_id { get; set; } = 0;
/// <summary>
/// qty
/// </summary>
public int qty { get; set; } = 0;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
/// <summary>
/// is_source
/// </summary>
public bool is_source { get; set; } = false;
/// <summary>
/// is_update_stock
/// </summary>
public bool is_update_stock { get; set; } = false;
#endregion
}
}

View file

@ -0,0 +1,96 @@
/*
* date2022-12-30
* developerAMo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// stocktaking entity
/// </summary>
[Table("stocktaking")]
public class StocktakingEntity : BaseModel
{
#region Property
/// <summary>
/// job_code
/// </summary>
public string job_code { get; set; } = string.Empty;
/// <summary>
/// job_status
/// </summary>
public bool job_status { get; set; } = false;
/// <summary>
/// sku_id
/// </summary>
public int sku_id { get; set; } = 0;
/// <summary>
/// goods_owner_id
/// </summary>
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// goods_location_id
/// </summary>
public int goods_location_id { get; set; } = 0;
/// <summary>
/// book_qty
/// </summary>
public int book_qty { get; set; } = 0;
/// <summary>
/// counted_qty
/// </summary>
public int counted_qty { get; set; } = 0;
/// <summary>
/// difference_qty
/// </summary>
public int difference_qty { get; set; } = 0;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = DateTime.Now;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 1;
/// <summary>
/// handler
/// </summary>
public string handler { get; set; } = string.Empty;
/// <summary>
/// handle_time
/// </summary>
public DateTime handle_time { get; set; } = UtilConvert.MinDate;
#endregion
}
}

View file

@ -0,0 +1,82 @@
/*
* date2022-12-21
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// warehouse entity
/// </summary>
[Table("warehouse")]
public class WarehouseEntity : BaseModel
{
#region Property
/// <summary>
/// warehouse_name
/// </summary>
public string warehouse_name { get; set; } = string.Empty;
/// <summary>
/// city
/// </summary>
public string city { get; set; } = string.Empty;
/// <summary>
/// address
/// </summary>
public string address { get; set; } = string.Empty;
/// <summary>
/// email
/// </summary>
public string email { get; set; } = string.Empty;
/// <summary>
/// manager
/// </summary>
public string manager { get; set; } = string.Empty;
/// <summary>
/// contact_tel
/// </summary>
public string contact_tel { get; set; } = string.Empty;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = false;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,67 @@
/*
* date2022-12-21
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// warehousearea entity
/// </summary>
[Table("warehousearea")]
public class WarehouseareaEntity : BaseModel
{
#region Property
/// <summary>
/// warehouse_id
/// </summary>
public int warehouse_id { get; set; } = 0;
/// <summary>
/// area_name
/// </summary>
public string area_name { get; set; } = string.Empty;
/// <summary>
/// parent_id
/// </summary>
public int parent_id { get; set; } = 0;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = false;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
/// <summary>
/// area_property
/// </summary>
public byte area_property { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,52 @@
using ModernWMS.Core.Models;
using System.ComponentModel.DataAnnotations.Schema;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// company entity
/// </summary>
[Table("company")]
public class CompanyEntity: BaseModel
{
/// <summary>
/// company's Name
/// </summary>
public string company_name { get; set; } = string.Empty;
/// <summary>
/// city
/// </summary>
public string city { get; set; } = string.Empty;
/// <summary>
/// address
/// </summary>
public string address { get; set; } = string.Empty;
/// <summary>
/// manager
/// </summary>
public string manager { get; set; } = string.Empty;
/// <summary>
/// contact tel
/// </summary>
public string contact_tel { get; set; } = string.Empty;
/// <summary>
/// create time
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// last update time
/// </summary>
public DateTime last_update_time { get; set; } = DateTime.Now;
/// <summary>
/// the tenant id
/// </summary>
public long tenant_id { get; set; } = 1;
}
}

View file

@ -0,0 +1,82 @@
/*
* date2022-12-21
* developerNoNo
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Models;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.Models
{
/// <summary>
/// supplier entity
/// </summary>
[Table("supplier")]
public class SupplierEntity : BaseModel
{
#region Property
/// <summary>
/// supplier_name
/// </summary>
public string supplier_name { get; set; } = string.Empty;
/// <summary>
/// city
/// </summary>
public string city { get; set; } = string.Empty;
/// <summary>
/// address
/// </summary>
public string address { get; set; } = string.Empty;
/// <summary>
/// email
/// </summary>
public string email { get; set; } = string.Empty;
/// <summary>
/// manager
/// </summary>
public string manager { get; set; } = string.Empty;
/// <summary>
/// contact_tel
/// </summary>
public string contact_tel { get; set; } = string.Empty;
/// <summary>
/// creator
/// </summary>
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
public DateTime create_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// last_update_time
/// </summary>
public DateTime last_update_time { get; set; } = UtilConvert.MinDate;
/// <summary>
/// is_valid
/// </summary>
public bool is_valid { get; set; } = false;
/// <summary>
/// tenant_id
/// </summary>
public long tenant_id { get; set; } = 0;
#endregion
}
}

View file

@ -0,0 +1,48 @@
/*
* date2022-12-22
* developerAMo
*/
using System.ComponentModel.DataAnnotations;
namespace ModernWMS.WMS.Entities.ViewModels
{
/// <summary>
/// asn bulk modify goods owner input view model
/// </summary>
public class AsnBulkModifyGoodsOwnerViewModel
{
#region constructor
/// <summary>
/// constructor
/// </summary>
public AsnBulkModifyGoodsOwnerViewModel()
{
}
#endregion
#region Property
/// <summary>
/// goods_owner_id
/// </summary>
[Display(Name = "goods_owner_id")]
[Required(ErrorMessage = "Required")]
public int goods_owner_id { get; set; } = 0;
/// <summary>
/// goods_owner_name
/// </summary>
[Display(Name = "goods_owner_name")]
[Required(ErrorMessage = "Required")]
[MaxLength(256, ErrorMessage = "MaxLength")]
public string goods_owner_name { get; set; } = string.Empty;
/// <summary>
/// selected asn id
/// </summary>
public List<int> idList { get; set; } = new List<int>();
#endregion
}
}

View file

@ -0,0 +1,218 @@
/*
* date2022-12-22
* developerAMo
*/
using System;
using System.ComponentModel.DataAnnotations;
using ModernWMS.Core.Utility;
namespace ModernWMS.WMS.Entities.ViewModels
{
/// <summary>
/// asn viewModel
/// </summary>
public class AsnViewModel
{
#region constructor
/// <summary>
/// constructor
/// </summary>
public AsnViewModel()
{
}
#endregion
#region Property
/// <summary>
/// id
/// </summary>
[Display(Name = "id")]
public int id { get; set; } = 0;
/// <summary>
/// asn_no
/// </summary>
[Display(Name = "asn_no")]
[MaxLength(32, ErrorMessage = "MaxLength")]
public string asn_no { get; set; } = string.Empty;
/// <summary>
/// asn_status
/// </summary>
[Display(Name = "asn_status")]
public byte asn_status { get; set; } = 0;
/// <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")]
[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>
/// actual_qty
/// </summary>
[Display(Name = "actual_qty")]
public int actual_qty { get; set; } = 0;
/// <summary>
/// sorted_qty
/// </summary>
[Display(Name = "sorted_qty")]
public int sorted_qty { get; set; } = 0;
/// <summary>
/// shortage_qty
/// </summary>
[Display(Name = "shortage_qty")]
public int shortage_qty { get; set; } = 0;
/// <summary>
/// more_qty
/// </summary>
[Display(Name = "more_qty")]
public int more_qty { get; set; } = 0;
/// <summary>
/// damage_qty
/// </summary>
[Display(Name = "damage_qty")]
public int damage_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")]
[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>
/// creator
/// </summary>
[Display(Name = "creator")]
[MaxLength(64, ErrorMessage = "MaxLength")]
public string creator { get; set; } = string.Empty;
/// <summary>
/// create_time
/// </summary>
[Display(Name = "create_time")]
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// last_update_time
/// </summary>
[Display(Name = "last_update_time")]
public DateTime last_update_time { get; set; } = DateTime.Now;
/// <summary>
/// is_valid
/// </summary>
[Display(Name = "is_valid")]
public bool is_valid { get; set; } = true;
#endregion
}
}

Some files were not shown because too many files have changed in this diff Show more