mirror of
https://github.com/fjykTec/ModernWMS.git
synced 2024-09-20 06:56:08 +08:00
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:
parent
4742218402
commit
fe23c5959d
388
.gitignore
vendored
Normal file
388
.gitignore
vendored
Normal 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
198
README.md
Normal 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).必须遵守此协议。
|
138
backend/ModernWMS.Core/Controller/AccountController.cs
Normal file
138
backend/ModernWMS.Core/Controller/AccountController.cs
Normal 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
|
||||
}
|
||||
}
|
40
backend/ModernWMS.Core/Controller/BaseController.cs
Normal file
40
backend/ModernWMS.Core/Controller/BaseController.cs
Normal 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()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
30
backend/ModernWMS.Core/DBContext/CallContext.cs
Normal file
30
backend/ModernWMS.Core/DBContext/CallContext.cs
Normal 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;
|
||||
}
|
||||
}
|
128
backend/ModernWMS.Core/DBContext/SqlDBContext.cs
Normal file
128
backend/ModernWMS.Core/DBContext/SqlDBContext.cs
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
7
backend/ModernWMS.Core/DI/IDependency.cs
Normal file
7
backend/ModernWMS.Core/DI/IDependency.cs
Normal file
|
@ -0,0 +1,7 @@
|
|||
|
||||
namespace ModernWMS.Core.DI
|
||||
{
|
||||
public interface IDependency
|
||||
{
|
||||
}
|
||||
}
|
120
backend/ModernWMS.Core/DynamicSearch/QueryCollection.cs
Normal file
120
backend/ModernWMS.Core/DynamicSearch/QueryCollection.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
71
backend/ModernWMS.Core/DynamicSearch/QueryOptions.cs
Normal file
71
backend/ModernWMS.Core/DynamicSearch/QueryOptions.cs
Normal 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; }
|
||||
}
|
||||
}
|
55
backend/ModernWMS.Core/DynamicSearch/SearchObject.cs
Normal file
55
backend/ModernWMS.Core/DynamicSearch/SearchObject.cs
Normal 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>();
|
||||
|
||||
}
|
||||
}
|
62
backend/ModernWMS.Core/Extentions/JsonStringTrimConverter.cs
Normal file
62
backend/ModernWMS.Core/Extentions/JsonStringTrimConverter.cs
Normal 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
292
backend/ModernWMS.Core/Extentions/StartupExtensions.cs
Normal file
292
backend/ModernWMS.Core/Extentions/StartupExtensions.cs
Normal 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
|
||||
|
||||
|
||||
}
|
||||
}
|
85
backend/ModernWMS.Core/JWT/ApiResponseHandler.cs
Normal file
85
backend/ModernWMS.Core/JWT/ApiResponseHandler.cs
Normal 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)));
|
||||
}
|
||||
}
|
||||
}
|
152
backend/ModernWMS.Core/JWT/CacheManger.cs
Normal file
152
backend/ModernWMS.Core/JWT/CacheManger.cs
Normal 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
|
||||
}
|
||||
}
|
||||
|
13
backend/ModernWMS.Core/JWT/ClaimValueTypes.cs
Normal file
13
backend/ModernWMS.Core/JWT/ClaimValueTypes.cs
Normal 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";
|
||||
}
|
||||
}
|
34
backend/ModernWMS.Core/JWT/CurrentUser.cs
Normal file
34
backend/ModernWMS.Core/JWT/CurrentUser.cs
Normal 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;
|
||||
}
|
||||
}
|
36
backend/ModernWMS.Core/JWT/ITokenManager.cs
Normal file
36
backend/ModernWMS.Core/JWT/ITokenManager.cs
Normal 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);
|
||||
}
|
||||
}
|
182
backend/ModernWMS.Core/JWT/TokenManager.cs
Normal file
182
backend/ModernWMS.Core/JWT/TokenManager.cs
Normal 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)
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
26
backend/ModernWMS.Core/JWT/TokenSettings.cs
Normal file
26
backend/ModernWMS.Core/JWT/TokenSettings.cs
Normal 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; }
|
||||
}
|
||||
}
|
61
backend/ModernWMS.Core/Middleware/CorsMiddleware.cs
Normal file
61
backend/ModernWMS.Core/Middleware/CorsMiddleware.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
105
backend/ModernWMS.Core/Middleware/GlobalExceptionMiddleware.cs
Normal file
105
backend/ModernWMS.Core/Middleware/GlobalExceptionMiddleware.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
138
backend/ModernWMS.Core/Middleware/RequestResponseMiddleware.cs
Normal file
138
backend/ModernWMS.Core/Middleware/RequestResponseMiddleware.cs
Normal 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}";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
78
backend/ModernWMS.Core/Middleware/ViewModelActionFiter.cs
Normal file
78
backend/ModernWMS.Core/Middleware/ViewModelActionFiter.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
16
backend/ModernWMS.Core/Models/BaseModel.cs
Normal file
16
backend/ModernWMS.Core/Models/BaseModel.cs
Normal 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;
|
||||
|
||||
}
|
||||
}
|
13
backend/ModernWMS.Core/Models/BatchOperationViewModel.cs
Normal file
13
backend/ModernWMS.Core/Models/BatchOperationViewModel.cs
Normal 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>();
|
||||
}
|
||||
}
|
32
backend/ModernWMS.Core/Models/FormSelectItem.cs
Normal file
32
backend/ModernWMS.Core/Models/FormSelectItem.cs
Normal 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;
|
||||
}
|
||||
}
|
25
backend/ModernWMS.Core/Models/LoginInputViewModel.cs
Normal file
25
backend/ModernWMS.Core/Models/LoginInputViewModel.cs
Normal 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;
|
||||
}
|
||||
}
|
57
backend/ModernWMS.Core/Models/LoginOutputViewModel.cs
Normal file
57
backend/ModernWMS.Core/Models/LoginOutputViewModel.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
12
backend/ModernWMS.Core/Models/MultiLanguage.cs
Normal file
12
backend/ModernWMS.Core/Models/MultiLanguage.cs
Normal 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
|
||||
{
|
||||
}
|
||||
}
|
636
backend/ModernWMS.Core/Models/MultiLanguage.en-us.resx
Normal file
636
backend/ModernWMS.Core/Models/MultiLanguage.en-us.resx
Normal 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>
|
636
backend/ModernWMS.Core/Models/MultiLanguage.zh-cn.resx
Normal file
636
backend/ModernWMS.Core/Models/MultiLanguage.zh-cn.resx
Normal 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>
|
24
backend/ModernWMS.Core/Models/PageData.cs
Normal file
24
backend/ModernWMS.Core/Models/PageData.cs
Normal 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;
|
||||
}
|
||||
}
|
30
backend/ModernWMS.Core/Models/PageSearch.cs
Normal file
30
backend/ModernWMS.Core/Models/PageSearch.cs
Normal 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>();
|
||||
}
|
||||
}
|
22
backend/ModernWMS.Core/Models/RefreshTokenInPutViewModel.cs
Normal file
22
backend/ModernWMS.Core/Models/RefreshTokenInPutViewModel.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
51
backend/ModernWMS.Core/Models/ResultModel.cs
Normal file
51
backend/ModernWMS.Core/Models/ResultModel.cs
Normal 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 };
|
||||
}
|
||||
}
|
||||
}
|
52
backend/ModernWMS.Core/Models/UserroleEntity.cs
Normal file
52
backend/ModernWMS.Core/Models/UserroleEntity.cs
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* date:2022-12-20
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
83
backend/ModernWMS.Core/Models/userEntity.cs
Normal file
83
backend/ModernWMS.Core/Models/userEntity.cs
Normal 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
|
||||
|
||||
}
|
||||
}
|
53
backend/ModernWMS.Core/ModernWMS.Core.csproj
Normal file
53
backend/ModernWMS.Core/ModernWMS.Core.csproj
Normal 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>
|
14
backend/ModernWMS.Core/MultiTenancy/ITenantProvider.cs
Normal file
14
backend/ModernWMS.Core/MultiTenancy/ITenantProvider.cs
Normal 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();
|
||||
}
|
||||
}
|
17
backend/ModernWMS.Core/MultiTenancy/Tenant.cs
Normal file
17
backend/ModernWMS.Core/MultiTenancy/Tenant.cs
Normal 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";
|
||||
}
|
||||
}
|
46
backend/ModernWMS.Core/MultiTenancy/TenantProvider.cs
Normal file
46
backend/ModernWMS.Core/MultiTenancy/TenantProvider.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
78
backend/ModernWMS.Core/Services/AccountService.cs
Normal file
78
backend/ModernWMS.Core/Services/AccountService.cs
Normal 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"];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
18
backend/ModernWMS.Core/Services/BaseService.cs
Normal file
18
backend/ModernWMS.Core/Services/BaseService.cs
Normal 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
|
||||
{
|
||||
|
||||
}
|
||||
}
|
24
backend/ModernWMS.Core/Services/IAccountService.cs
Normal file
24
backend/ModernWMS.Core/Services/IAccountService.cs
Normal 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();
|
||||
}
|
||||
}
|
16
backend/ModernWMS.Core/Services/IBaseService.cs
Normal file
16
backend/ModernWMS.Core/Services/IBaseService.cs
Normal 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
|
||||
{
|
||||
|
||||
}
|
||||
}
|
25
backend/ModernWMS.Core/Swagger/CustomApiVersion.cs
Normal file
25
backend/ModernWMS.Core/Swagger/CustomApiVersion.cs
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
38
backend/ModernWMS.Core/Swagger/SwaggerSettings.cs
Normal file
38
backend/ModernWMS.Core/Swagger/SwaggerSettings.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
120
backend/ModernWMS.Core/Swagger/index.html
Normal file
120
backend/ModernWMS.Core/Swagger/index.html
Normal 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>
|
31
backend/ModernWMS.Core/Utility/GlobalConsts.cs
Normal file
31
backend/ModernWMS.Core/Utility/GlobalConsts.cs
Normal 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;
|
||||
|
||||
|
||||
}
|
||||
}
|
63
backend/ModernWMS.Core/Utility/JsonHelper.cs
Normal file
63
backend/ModernWMS.Core/Utility/JsonHelper.cs
Normal 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
|
||||
|
||||
}
|
||||
}
|
32
backend/ModernWMS.Core/Utility/Md5Helper.cs
Normal file
32
backend/ModernWMS.Core/Utility/Md5Helper.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
106
backend/ModernWMS.Core/Utility/ModelConvertHelper.cs
Normal file
106
backend/ModernWMS.Core/Utility/ModelConvertHelper.cs
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
285
backend/ModernWMS.Core/Utility/UtilConvert.cs
Normal file
285
backend/ModernWMS.Core/Utility/UtilConvert.cs
Normal 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");
|
||||
}
|
||||
}
|
326
backend/ModernWMS.WMS/Controllers/Asn/AsnController.cs
Normal file
326
backend/ModernWMS.WMS/Controllers/Asn/AsnController.cs
Normal file
|
@ -0,0 +1,326 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
}
|
||||
}
|
||||
|
179
backend/ModernWMS.WMS/Controllers/Customer/CustomerController.cs
Normal file
179
backend/ModernWMS.WMS/Controllers/Customer/CustomerController.cs
Normal 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
|
||||
}
|
||||
}
|
|
@ -0,0 +1,343 @@
|
|||
/*
|
||||
* date:2022-12-27
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,182 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
181
backend/ModernWMS.WMS/Controllers/Rolemenu/RolemenuController.cs
Normal file
181
backend/ModernWMS.WMS/Controllers/Rolemenu/RolemenuController.cs
Normal file
|
@ -0,0 +1,181 @@
|
|||
/*
|
||||
* date:2022-12-20
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
||||
|
147
backend/ModernWMS.WMS/Controllers/Sku/CategoryController.cs
Normal file
147
backend/ModernWMS.WMS/Controllers/Sku/CategoryController.cs
Normal file
|
@ -0,0 +1,147 @@
|
|||
/*
|
||||
* date:2022-12-20
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
||||
|
164
backend/ModernWMS.WMS/Controllers/Sku/SpuController.cs
Normal file
164
backend/ModernWMS.WMS/Controllers/Sku/SpuController.cs
Normal file
|
@ -0,0 +1,164 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
122
backend/ModernWMS.WMS/Controllers/Stock/StockController.cs
Normal file
122
backend/ModernWMS.WMS/Controllers/Stock/StockController.cs
Normal file
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// stock controller
|
||||
/// </summary>
|
||||
[Route("stock")]
|
||||
[ApiController]
|
||||
[ApiExplorerSettings(GroupName = "WMS")]
|
||||
public class StockController : BaseController
|
||||
{
|
||||
#region Args
|
||||
|
||||
/// <summary>
|
||||
/// stock Service
|
||||
/// </summary>
|
||||
private readonly IStockService _stockService;
|
||||
|
||||
/// <summary>
|
||||
/// Localizer Service
|
||||
/// </summary>
|
||||
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;
|
||||
#endregion
|
||||
|
||||
#region constructor
|
||||
/// <summary>
|
||||
/// constructor
|
||||
/// </summary>
|
||||
/// <param name="stockService">stock Service</param>
|
||||
/// <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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* date:2022-12-26
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,164 @@
|
|||
/*
|
||||
* date:2022-12-26
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,164 @@
|
|||
/*
|
||||
* date:2022-12-27
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,201 @@
|
|||
/*
|
||||
* date:2022-12-23
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
/*
|
||||
* date:2022-12-30
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,195 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
142
backend/ModernWMS.WMS/Controllers/company/CompanyController.cs
Normal file
142
backend/ModernWMS.WMS/Controllers/company/CompanyController.cs
Normal 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
|
||||
|
||||
}
|
||||
}
|
183
backend/ModernWMS.WMS/Controllers/supplier/SupplierController.cs
Normal file
183
backend/ModernWMS.WMS/Controllers/supplier/SupplierController.cs
Normal file
|
@ -0,0 +1,183 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
248
backend/ModernWMS.WMS/Controllers/user/UserController.cs
Normal file
248
backend/ModernWMS.WMS/Controllers/user/UserController.cs
Normal file
|
@ -0,0 +1,248 @@
|
|||
/*
|
||||
* date:2022-12-20
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
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
|
||||
|
||||
}
|
||||
}
|
||||
|
163
backend/ModernWMS.WMS/Controllers/userrole/UserroleController.cs
Normal file
163
backend/ModernWMS.WMS/Controllers/userrole/UserroleController.cs
Normal file
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
* date:2022-12-20
|
||||
* developer:NoNo
|
||||
*/
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using ModernWMS.Core.Controller;
|
||||
using ModernWMS.Core.Models;
|
||||
using ModernWMS.WMS.Entities.ViewModels;
|
||||
using ModernWMS.WMS.IServices;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace ModernWMS.WMS.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 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
|
||||
|
||||
}
|
||||
}
|
||||
|
132
backend/ModernWMS.WMS/Entities/Models/Asn/AsnEntity.cs
Normal file
132
backend/ModernWMS.WMS/Entities/Models/Asn/AsnEntity.cs
Normal file
|
@ -0,0 +1,132 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
59
backend/ModernWMS.WMS/Entities/Models/Asn/AsnsortEntity.cs
Normal file
59
backend/ModernWMS.WMS/Entities/Models/Asn/AsnsortEntity.cs
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* date:2022-12-30
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -0,0 +1,183 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
54
backend/ModernWMS.WMS/Entities/Models/Rolemenu/MenuEntity.cs
Normal file
54
backend/ModernWMS.WMS/Entities/Models/Rolemenu/MenuEntity.cs
Normal 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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* date:2022-12-20
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
59
backend/ModernWMS.WMS/Entities/Models/Sku/CategoryEntity.cs
Normal file
59
backend/ModernWMS.WMS/Entities/Models/Sku/CategoryEntity.cs
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* date:2022-12-20
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
100
backend/ModernWMS.WMS/Entities/Models/Sku/SkuEntity.cs
Normal file
100
backend/ModernWMS.WMS/Entities/Models/Sku/SkuEntity.cs
Normal file
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
118
backend/ModernWMS.WMS/Entities/Models/Sku/SpuEntity.cs
Normal file
118
backend/ModernWMS.WMS/Entities/Models/Sku/SpuEntity.cs
Normal file
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
}
|
||||
}
|
63
backend/ModernWMS.WMS/Entities/Models/Stock/StockEntity.cs
Normal file
63
backend/ModernWMS.WMS/Entities/Models/Stock/StockEntity.cs
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* date:2022-12-26
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* date:2022-12-26
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
* date:2022-12-27
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* date:2022-12-23
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* date:2022-12-23
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
* date:2022-12-30
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* date:2022-12-21
|
||||
* developer:NoNo
|
||||
*/
|
||||
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
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:AMo
|
||||
*/
|
||||
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
|
||||
}
|
||||
}
|
218
backend/ModernWMS.WMS/Entities/ViewModels/Asn/AsnViewModel.cs
Normal file
218
backend/ModernWMS.WMS/Entities/ViewModels/Asn/AsnViewModel.cs
Normal file
|
@ -0,0 +1,218 @@
|
|||
/*
|
||||
* date:2022-12-22
|
||||
* developer:AMo
|
||||
*/
|
||||
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
Loading…
Reference in a new issue